From 52ec6c3717a32cfda57dc0d8fb661a5c29454f66 Mon Sep 17 00:00:00 2001 From: pancake Date: Mon, 14 Nov 2022 14:20:29 +0100 Subject: [PATCH] Optimize r_core_bin_export_info ##bin --- libr/core/cbin.c | 124 ++++++++++++++++++++++----------- libr/core/cmd.c | 5 +- libr/core/cmd_flag.c | 12 ++-- libr/include/r_util/r_strbuf.h | 1 + libr/util/strbuf.c | 8 +++ 5 files changed, 102 insertions(+), 48 deletions(-) diff --git a/libr/core/cbin.c b/libr/core/cbin.c index 626c3b3d2345d..7d42618f52dc1 100644 --- a/libr/core/cbin.c +++ b/libr/core/cbin.c @@ -155,6 +155,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; @@ -166,39 +169,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; @@ -213,40 +232,30 @@ 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; @@ -254,8 +263,11 @@ R_API void r_core_bin_export_info(RCore *core, int mode) { 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); @@ -269,27 +281,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); } diff --git a/libr/core/cmd.c b/libr/core/cmd.c index 2b5cce137969b..bdc76c96e2223 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -6044,7 +6044,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) { @@ -6055,6 +6055,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; } @@ -6063,9 +6064,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; diff --git a/libr/core/cmd_flag.c b/libr/core/cmd_flag.c index 7c4cca62eb6ad..8e80419d6bdf2 100644 --- a/libr/core/cmd_flag.c +++ b/libr/core/cmd_flag.c @@ -1141,10 +1141,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); diff --git a/libr/include/r_util/r_strbuf.h b/libr/include/r_util/r_strbuf.h index 41e8682a9d8c3..f0dc3abd2be9b 100644 --- a/libr/include/r_util/r_strbuf.h +++ b/libr/include/r_util/r_strbuf.h @@ -24,6 +24,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); diff --git a/libr/util/strbuf.c b/libr/util/strbuf.c index 42c0c754d1725..2280d99021603 100644 --- a/libr/util/strbuf.c +++ b/libr/util/strbuf.c @@ -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);