diff --git a/binr/radiff2/radiff2.c b/binr/radiff2/radiff2.c index bff66a2274..70aed133dd 100644 --- a/binr/radiff2/radiff2.c +++ b/binr/radiff2/radiff2.c @@ -364,25 +364,39 @@ static ut8 *slurp(RCore **c, const char *file, int *sz) { return (ut8*)r_file_slurp (file, sz); } -// TODO: sort and uniq() https://github.com/radare/radare2/issues/6461 +static int import_cmp(const RBinImport* a, const RBinImport* b) { + return strcmp (a->name, b->name); +} + static ut8 *get_imports(RCore *c, int *len) { RList *list = r_bin_get_imports (c->bin); RListIter *iter; - RBinImport *str; + RBinImport *str, *old = NULL; ut8 *buf, *ptr; + r_list_sort (list, (RListComparator)import_cmp); + *len = 0; r_list_foreach (list, iter, str) { - *len += strlen (str->name) + 1; + if (!old || (old && import_cmp (old, str) != 0)) { + *len += strlen (str->name) + 1; + old = str; + } } ptr = buf = malloc (*len + 1); + old = NULL; + r_list_foreach (list, iter, str) { + if (old && import_cmp (old, str) == 0) { + continue; + } int namelen = strlen (str->name); memcpy (ptr, str->name, namelen); ptr += namelen; *ptr++ = '\n'; + old = str; } *ptr = 0; @@ -390,26 +404,43 @@ static ut8 *get_imports(RCore *c, int *len) { return buf; } -// TODO: sort and uniq() https://github.com/radare/radare2/issues/6461 +static int bs_cmp(const RBinString* a, const RBinString* b) { + int diff = a->length - b->length; + return diff == 0 ? strncmp (a->string, b->string, a->length) : diff; +} + static ut8 *get_strings(RCore *c, int *len) { RList *list = r_bin_get_strings (c->bin); RListIter *iter; - RBinString *str; + RBinString *str, *old = NULL; ut8 *buf, *ptr; + r_list_sort (list, (RListComparator)bs_cmp); + *len = 0; r_list_foreach (list, iter, str) { - *len += str->length + 1; + if (!old || (old && bs_cmp (old, str) != 0)) { + *len += str->length + 1; + old = str; + } } ptr = buf = malloc (*len + 1); + old = NULL; + r_list_foreach (list, iter, str) { + if (old && bs_cmp (old, str) == 0) { + continue; + } memcpy (ptr, str->string, str->length); ptr += str->length; *ptr++ = '\n'; + old = str; } + *ptr = 0; + *len = strlen ((const char *)buf); return buf; }