Skip to content

Commit

Permalink
Optimize r_core_bin_export_info ##bin
Browse files Browse the repository at this point in the history
  • Loading branch information
radare committed Feb 17, 2024
1 parent a394936 commit ad6b755
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 48 deletions.
124 changes: 82 additions & 42 deletions libr/core/cbin.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ R_API bool r_core_bin_set_by_fd(RCore *core, ut64 bin_fd) {
return false;
}

// XXX its not passing the tests!
#define RUNSCRIPT 0

R_API void r_core_bin_export_info(RCore *core, int mode) {
char *flagname = NULL, *offset = NULL;
SdbList *ls = NULL;
Expand All @@ -121,39 +124,55 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
if (!db) {
return;
}
// output must be grouped in 3 blocks, so lets buffer that
RStrBuf *s0 = r_strbuf_new ("");
RStrBuf *s1 = r_strbuf_new ("");
RStrBuf *s2 = r_strbuf_new ("");

SdbListIter *iter;
SdbKv *kv;
#if RUNSCRIPT
r_strbuf_append (s0, "fs format\n");
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("fs format\n");
r_strbuf_append (s0, "fs format\n");
} else if (IS_MODE_SET (mode)) {
// just run the script, not the api
r_flag_space_push (core->flags, "format");
}
if (!r_config_get_b (core->config, "bin.types")) {
goto leave;
}
#endif

// iterate over all keys
ls = sdb_foreach_list (db, false);
ls_foreach (ls, iter, kv) {
char *k = sdbkv_key (kv);
char *v = sdbkv_value (kv);
char *dup = strdup (k);
//printf ("?e (%s) (%s)\n", k, v);
if ((flagname = strstr (dup, ".offset"))) {
*flagname = 0;
flagname = dup;
// 1
if ((flagname = strstr (k, ".offset"))) {
#if RUNSCRIPT
r_strbuf_appendf (s0, "f %s @ %s\n", k, v);
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("f %s @ %s\n", flagname, v);
r_strbuf_appendf (s0, "f %s @ %s\n", k, v);
} else if (IS_MODE_SET (mode)) {
ut64 nv = r_num_math (core->num, v);
r_flag_set (core->flags, flagname, nv, 0);
if (!r_flag_get (core->flags, k)) {
r_flag_set (core->flags, k, nv, 0);
}
}
#endif
free (offset);
offset = strdup (v);
}
if (strstr (dup, ".cparse")) {
} else if (strstr (k, ".cparse")) {
#if RUNSCRIPT
r_strbuf_appendf (s1, "\"td %s\"\n", v);
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("\"td %s\"\n", v);
r_strbuf_appendf (s1, "\"td %s\"\n", v);
} else if (IS_MODE_SET (mode)) {
char *code = r_str_newf ("%s;", v);
char *errmsg = NULL;
Expand All @@ -168,49 +187,42 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
free (out);
}
}
}
free (dup);
}
R_FREE (offset);
ls_foreach (ls, iter, kv) {
char *k = sdbkv_key (kv);
char *v = sdbkv_value (kv);
char *dup = strdup (k);
if ((flagname = strstr (dup, ".format"))) {
#endif
} else if ((flagname = strstr (k, ".format"))) {
// 2
*flagname = 0;
if (!offset) {
offset = strdup ("0");
}
flagname = dup;
#if RUNSCRIPT
r_strbuf_appendf (s1, "pf.%s %s\n", k, v);
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("pf.%s %s\n", flagname, v);
r_strbuf_appendf (s1, "pf.%s %s\n", k, v);
} else if (IS_MODE_SET (mode)) {
sdb_set (core->print->formats, flagname, v, 0);
sdb_set (core->print->formats, k, v, 0);
}
}
free (dup);
}
ls_foreach (ls, iter, kv) {
char *k = sdbkv_key (kv);
char *v = sdbkv_value (kv);
char *dup = strdup (k);
if ((flagname = strstr (dup, ".format"))) {
#endif
} else if ((flagname = strstr (k, ".format"))) {
// 3
*flagname = 0;
if (!offset) {
offset = strdup ("0");
}
flagname = dup;
int fmtsize = r_print_format_struct_size (core->print, v, 0, 0);
char *offset_key = r_str_newf ("%s.offset", flagname);
char *offset_key = r_str_newf ("%s.offset", k);
const char *off = sdb_const_get (db, offset_key, 0);
if (fmtsize < 1) {
continue;
}
fmtsize += 4; // increase buffer to fix a bug in compuatation for pf.elf_header size doesnt harms other cases but should be fixed
free (offset_key);
if (off) {
#if RUNSCRIPT
r_strbuf_appendf (s2, "Cf %d %s @ %s\n", fmtsize, v, off);
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("Cf %d %s @ %s\n", fmtsize, v, off);
r_strbuf_appendf (s2, "Cf %d %s @ %s\n", fmtsize, v, off);
} else if (IS_MODE_SET (mode)) {
ut64 addr = r_num_get (NULL, off);
ut8 *buf = malloc (fmtsize);
Expand All @@ -224,27 +236,55 @@ R_API void r_core_bin_export_info(RCore *core, int mode) {
}
}
}
#endif
}
}
if ((flagname = strstr (dup, ".size"))) {
*flagname = 0;
flagname = dup;
} else if ((flagname = strstr (k, ".size"))) {
#if RUNSCRIPT
r_strbuf_appendf (s2, "fl %s %s\n", k, v);
#else
if (IS_MODE_RAD (mode)) {
r_cons_printf ("fl %s %s\n", flagname, v);
r_strbuf_appendf (s2, "fl %s %s\n", k, v);
} else if (IS_MODE_SET (mode)) {
RFlagItem *fi = r_flag_get (core->flags, flagname);
#if 0
char *s = r_core_cmd_str ("k bin/cur/pe_overlay.size");
free (s);
#else
RFlagItem *fi = r_flag_get (core->flags, k);
if (fi) {
fi->size = r_num_math (core->num, v);
} else {
R_LOG_ERROR ("Cannot find flag named '%s'", flagname);
char *s = strdup (k);
char *kk = r_str_replace (s, ".size", ".offset", 0);
const char *addr = sdb_const_get (db, kk, 0);
if (R_STR_ISEMPTY (addr)) {
R_LOG_ERROR ("Cannot find flag named '%s'", k);
} else {
ut64 naddr = r_num_math (NULL, addr);
ut64 size = r_num_math (NULL, v);
r_flag_set (core->flags, k, naddr, size);
// r_core_cmdf (core, "fl %s %s@%s", k, v, addr);
}
free (kk);
}
#endif
}
#endif
}
free (dup);
}
leave:
free (offset);
R_FREE (offset);
ls_free (ls);
r_strbuf_append_strbuf (s0, s1);
r_strbuf_append_strbuf (s0, s2);
char *s = r_strbuf_drain (s0);
if (IS_MODE_RAD (mode)) {
r_cons_print (s);
} else if (IS_MODE_SET (mode)) {
r_core_cmd_lines (core, s);
}
free (s);
r_strbuf_free (s1);
r_strbuf_free (s2);
if (IS_MODE_SET (mode)) {
r_flag_space_pop (core->flags);
}
Expand Down
5 changes: 3 additions & 2 deletions libr/core/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -6169,7 +6169,7 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
#else
const bool istty = true;
#endif
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;
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;
size_t current_line = 0;
nl = strchr (odata, '\n');
if (nl) {
Expand All @@ -6180,6 +6180,7 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
}
if (r_cons_is_breaked ()) {
free (odata);
R_LOG_INFO ("cmd.lines is breaked");
r_cons_break_pop ();
return ret;
}
Expand All @@ -6188,9 +6189,9 @@ R_API int r_core_cmd_lines(RCore *core, const char *lines) {
if (r < 0) {
data = nl + 1;
ret = -1;
R_LOG_INFO ("cmd.lines '%s' fails", data);
break;
}
r_cons_flush ();
if (data[0] == 'q') {
if (data[1] == '!') {
ret = -1;
Expand Down
12 changes: 8 additions & 4 deletions libr/core/cmd_flag.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1164,10 +1164,14 @@ static int cmd_flag(void *data, const char *input) {
p = strchr (arg, ' ');
if (p) {
*p++ = 0;
item = r_flag_get_i (core->flags,
r_num_math (core->num, arg));
if (item)
item->size = r_num_math (core->num, p);
ut64 narg = r_num_math (core->num, arg);
item = r_flag_get_i (core->flags, narg);
ut64 nsize = r_num_math (core->num, p);
if (item) {
item->size = nsize;
} else {
r_flag_set (core->flags, arg, core->offset, nsize);
}
} else {
if (*arg) {
item = r_flag_get_i (core->flags, core->offset);
Expand Down
1 change: 1 addition & 0 deletions libr/include/r_util/r_strbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ R_API const char *r_strbuf_setf(RStrBuf *sb, const char *fmt, ...) R_PRINTF_CHEC
R_API const char *r_strbuf_vsetf(RStrBuf *sb, const char *fmt, va_list ap); // return = the string or NULL on fail
R_API bool r_strbuf_append(RStrBuf *sb, const char *s);
R_API bool r_strbuf_append_n(RStrBuf *sb, const char *s, size_t l);
R_API bool r_strbuf_append_strbuf(RStrBuf *sb, RStrBuf *ss);
R_API bool r_strbuf_prepend(RStrBuf *sb, const char *s);
R_API bool r_strbuf_appendf(RStrBuf *sb, const char *fmt, ...) R_PRINTF_CHECK(2, 3);
R_API bool r_strbuf_vappendf(RStrBuf *sb, const char *fmt, va_list ap);
Expand Down
8 changes: 8 additions & 0 deletions libr/util/strbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,14 @@ R_API bool r_strbuf_append(RStrBuf *sb, const char *s) {
return r_strbuf_append_n (sb, s, l);
}

R_API bool r_strbuf_append_strbuf(RStrBuf *sb, RStrBuf *ss) {
r_return_val_if_fail (sb && ss, false);

const char *s = r_strbuf_get (ss);
int l = strlen (s);
return r_strbuf_append_n (sb, s, l);
}

R_API bool r_strbuf_append_n(RStrBuf *sb, const char *s, size_t l) {
r_return_val_if_fail (sb && s, false);

Expand Down

0 comments on commit ad6b755

Please sign in to comment.