Skip to content

Commit d8a7cee

Browse files
committed
Optimize r_core_bin_export_info ##bin
1 parent 5a74fc6 commit d8a7cee

File tree

4 files changed

+74
-42
lines changed

4 files changed

+74
-42
lines changed

libr/core/cbin.c

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ R_API bool r_core_bin_set_by_fd(RCore *core, ut64 bin_fd) {
153153
return false;
154154
}
155155

156+
// XXX its not passing the tests!
157+
#define RUNSCRIPT 0
158+
156159
R_API void r_core_bin_export_info(RCore *core, int mode) {
157160
char *flagname = NULL, *offset = NULL;
158161
SdbList *ls = NULL;
@@ -164,39 +167,53 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
164167
if (!db) {
165168
return;
166169
}
170+
// output must be grouped in 3 blocks, so lets buffer that
171+
RStrBuf *s0 = r_strbuf_new ("");
172+
RStrBuf *s1 = r_strbuf_new ("");
173+
RStrBuf *s2 = r_strbuf_new ("");
174+
167175
SdbListIter *iter;
168176
SdbKv *kv;
177+
#if RUNSCRIPT
178+
r_strbuf_append (s0, "fs format\n");
179+
#else
169180
if (IS_MODE_RAD (mode)) {
170-
r_cons_printf ("fs format\n");
181+
r_strbuf_append (s0, "fs format\n");
171182
} else if (IS_MODE_SET (mode)) {
183+
// just run the script, not the api
172184
r_flag_space_push (core->flags, "format");
173185
}
174186
if (!r_config_get_b (core->config, "bin.types")) {
175187
goto leave;
176188
}
189+
#endif
177190

178191
// iterate over all keys
179192
ls = sdb_foreach_list (db, false);
180193
ls_foreach (ls, iter, kv) {
181194
char *k = sdbkv_key (kv);
182195
char *v = sdbkv_value (kv);
183-
char *dup = strdup (k);
184196
//printf ("?e (%s) (%s)\n", k, v);
185-
if ((flagname = strstr (dup, ".offset"))) {
186-
*flagname = 0;
187-
flagname = dup;
197+
// 1
198+
if ((flagname = strstr (k, ".offset"))) {
199+
#if RUNSCRIPT
200+
r_strbuf_appendf (s0, "f %s @ %s\n", k, v);
201+
#else
188202
if (IS_MODE_RAD (mode)) {
189-
r_cons_printf ("f %s @ %s\n", flagname, v);
203+
r_strbuf_appendf (s0, "f %s @ %s\n", k, v);
190204
} else if (IS_MODE_SET (mode)) {
191205
ut64 nv = r_num_math (core->num, v);
192-
r_flag_set (core->flags, flagname, nv, 0);
206+
r_flag_set (core->flags, k, nv, 0);
193207
}
208+
#endif
194209
free (offset);
195210
offset = strdup (v);
196-
}
197-
if (strstr (dup, ".cparse")) {
211+
} else if (strstr (k, ".cparse")) {
212+
#if RUNSCRIPT
213+
r_strbuf_appendf (s1, "\"td %s\"\n", v);
214+
#else
198215
if (IS_MODE_RAD (mode)) {
199-
r_cons_printf ("\"td %s\"\n", v);
216+
r_strbuf_appendf (s1, "\"td %s\"\n", v);
200217
} else if (IS_MODE_SET (mode)) {
201218
char *code = r_str_newf ("%s;", v);
202219
char *errmsg = NULL;
@@ -211,49 +228,42 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
211228
free (out);
212229
}
213230
}
214-
}
215-
free (dup);
216-
}
217-
R_FREE (offset);
218-
ls_foreach (ls, iter, kv) {
219-
char *k = sdbkv_key (kv);
220-
char *v = sdbkv_value (kv);
221-
char *dup = strdup (k);
222-
if ((flagname = strstr (dup, ".format"))) {
231+
#endif
232+
} else if ((flagname = strstr (k, ".format"))) {
233+
// 2
223234
*flagname = 0;
224235
if (!offset) {
225236
offset = strdup ("0");
226237
}
227-
flagname = dup;
238+
#if RUNSCRIPT
239+
r_strbuf_appendf (s1, "pf.%s %s\n", k, v);
240+
#else
228241
if (IS_MODE_RAD (mode)) {
229-
r_cons_printf ("pf.%s %s\n", flagname, v);
242+
r_strbuf_appendf (s1, "pf.%s %s\n", k, v);
230243
} else if (IS_MODE_SET (mode)) {
231-
sdb_set (core->print->formats, flagname, v, 0);
244+
sdb_set (core->print->formats, k, v, 0);
232245
}
233-
}
234-
free (dup);
235-
}
236-
ls_foreach (ls, iter, kv) {
237-
char *k = sdbkv_key (kv);
238-
char *v = sdbkv_value (kv);
239-
char *dup = strdup (k);
240-
if ((flagname = strstr (dup, ".format"))) {
246+
#endif
247+
} else if ((flagname = strstr (k, ".format"))) {
248+
// 3
241249
*flagname = 0;
242250
if (!offset) {
243251
offset = strdup ("0");
244252
}
245-
flagname = dup;
246253
int fmtsize = r_print_format_struct_size (core->print, v, 0, 0);
247-
char *offset_key = r_str_newf ("%s.offset", flagname);
254+
char *offset_key = r_str_newf ("%s.offset", k);
248255
const char *off = sdb_const_get (db, offset_key, 0);
249256
if (fmtsize < 1) {
250257
continue;
251258
}
252259
fmtsize += 4; // increase buffer to fix a bug in compuatation for pf.elf_header size doesnt harms other cases but should be fixed
253260
free (offset_key);
254261
if (off) {
262+
#if RUNSCRIPT
263+
r_strbuf_appendf (s2, "Cf %d %s @ %s\n", fmtsize, v, off);
264+
#else
255265
if (IS_MODE_RAD (mode)) {
256-
r_cons_printf ("Cf %d %s @ %s\n", fmtsize, v, off);
266+
r_strbuf_appendf (s2, "Cf %d %s @ %s\n", fmtsize, v, off);
257267
} else if (IS_MODE_SET (mode)) {
258268
ut64 addr = r_num_get (NULL, off);
259269
ut8 *buf = malloc (fmtsize);
@@ -267,13 +277,14 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
267277
}
268278
}
269279
}
280+
#endif
270281
}
271-
}
272-
if ((flagname = strstr (dup, ".size"))) {
273-
*flagname = 0;
274-
flagname = dup;
282+
} else if ((flagname = strstr (k, ".size"))) {
283+
#if RUNSCRIPT
284+
r_strbuf_appendf (s2, "fl %s %s\n", k, v);
285+
#else
275286
if (IS_MODE_RAD (mode)) {
276-
r_cons_printf ("fl %s %s\n", flagname, v);
287+
r_strbuf_appendf (s2, "fl %s %s\n", flagname, v);
277288
} else if (IS_MODE_SET (mode)) {
278289
RFlagItem *fi = r_flag_get (core->flags, flagname);
279290
if (fi) {
@@ -282,12 +293,23 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
282293
R_LOG_ERROR ("Cannot find flag named '%s'", flagname);
283294
}
284295
}
296+
#endif
285297
}
286-
free (dup);
287298
}
288299
leave:
289-
free (offset);
300+
R_FREE (offset);
290301
ls_free (ls);
302+
r_strbuf_append_strbuf (s0, s1);
303+
r_strbuf_append_strbuf (s0, s2);
304+
char *s = r_strbuf_drain (s0);
305+
if (IS_MODE_RAD (mode)) {
306+
r_cons_print (s);
307+
} else if (IS_MODE_SET (mode)) {
308+
r_core_cmd_lines (core, s);
309+
}
310+
free (s);
311+
r_strbuf_free (s1);
312+
r_strbuf_free (s2);
291313
if (IS_MODE_SET (mode)) {
292314
r_flag_space_pop (core->flags);
293315
}

libr/core/cmd.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5876,7 +5876,7 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
58765876
#else
58775877
const bool istty = true;
58785878
#endif
5879-
const bool show_progress_bar = core->print->enable_progressbar && r_config_get_b (core->config, "scr.interactive") && r_config_get_i (core->config, "scr.progressbar") && istty;
5879+
const bool show_progress_bar = core->print->enable_progressbar && r_config_get_b (core->config, "scr.interactive") && r_config_get_b (core->config, "scr.progressbar") && istty;
58805880
size_t current_line = 0;
58815881
nl = strchr (odata, '\n');
58825882
if (nl) {
@@ -5887,6 +5887,7 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
58875887
}
58885888
if (r_cons_is_breaked ()) {
58895889
free (odata);
5890+
R_LOG_INFO ("cmd.lines is breaked");
58905891
r_cons_break_pop ();
58915892
return ret;
58925893
}
@@ -5895,9 +5896,9 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
58955896
if (r < 0) {
58965897
data = nl + 1;
58975898
ret = -1;
5899+
R_LOG_INFO ("cmd.lines '%s' fails", data);
58985900
break;
58995901
}
5900-
r_cons_flush ();
59015902
if (data[0] == 'q') {
59025903
if (data[1] == '!') {
59035904
ret = -1;

libr/include/r_util/r_strbuf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ R_API const char *r_strbuf_setf(RStrBuf *sb, const char *fmt, ...) R_PRINTF_CHEC
2424
R_API const char *r_strbuf_vsetf(RStrBuf *sb, const char *fmt, va_list ap); // return = the string or NULL on fail
2525
R_API bool r_strbuf_append(RStrBuf *sb, const char *s);
2626
R_API bool r_strbuf_append_n(RStrBuf *sb, const char *s, size_t l);
27+
R_API bool r_strbuf_append_strbuf(RStrBuf *sb, RStrBuf *ss);
2728
R_API bool r_strbuf_prepend(RStrBuf *sb, const char *s);
2829
R_API bool r_strbuf_appendf(RStrBuf *sb, const char *fmt, ...) R_PRINTF_CHECK(2, 3);
2930
R_API bool r_strbuf_vappendf(RStrBuf *sb, const char *fmt, va_list ap);

libr/util/strbuf.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,14 @@ R_API bool r_strbuf_append(RStrBuf *sb, const char *s) {
228228
return r_strbuf_append_n (sb, s, l);
229229
}
230230

231+
R_API bool r_strbuf_append_strbuf(RStrBuf *sb, RStrBuf *ss) {
232+
r_return_val_if_fail (sb && ss, false);
233+
234+
const char *s = r_strbuf_get (ss);
235+
int l = strlen (s);
236+
return r_strbuf_append_n (sb, s, l);
237+
}
238+
231239
R_API bool r_strbuf_append_n(RStrBuf *sb, const char *s, size_t l) {
232240
r_return_val_if_fail (sb && s, false);
233241

0 commit comments

Comments
 (0)