From 00fce4b80e929c73134e81cd1b55674a06a86671 Mon Sep 17 00:00:00 2001 From: cyanpencil Date: Thu, 12 Jul 2018 14:51:59 +0200 Subject: [PATCH] Compacting XREFS in single line if with same closest flag --- libr/core/disasm.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/libr/core/disasm.c b/libr/core/disasm.c index e7a9f28068ba8..4650520af6e89 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -1185,23 +1185,34 @@ static void ds_show_xrefs(RDisasmState *ds) { RList *addrs = r_list_new (); RAnalFunction *fun, *next_fun; + RFlagItem *f, *next_f; r_list_foreach (xrefs, iter, refi) { if (refi->at == ds->at) { - fun = fcnIn (ds, refi->addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + fun = fcnIn (ds, refi->addr, -1); if (fun) { name = strdup (fun->name); if (iter != xrefs->tail) { ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; - next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); if (next_fun && next_fun->addr == fun->addr) { r_list_append (addrs, refi->addr); continue; } } + r_list_append (addrs, refi->addr); } else { - RFlagItem *f = r_flag_get_at (core->flags, refi->addr, true); + f = r_flag_get_at (core->flags, refi->addr, true); if (f) { - name = r_str_newf ("%s + %d", f->name, refi->addr - f->offset); + name = strdup (f->name); + if (iter != xrefs->tail) { + ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; + next_f = r_flag_get_at (core->flags, next_addr, true); + if (next_f && f->offset == next_f->offset) { + r_list_append (addrs, refi->addr - f->offset); + continue; + } + } + r_list_append (addrs, refi->addr - f->offset); } else { name = strdup ("unk"); } @@ -1213,17 +1224,17 @@ static void ds_show_xrefs(RDisasmState *ds) { name = tmp; } } - r_list_append (addrs, refi->addr); ds_begin_json_line (ds); ds_pre_xrefs (ds, false); - ds_comment (ds, false, "%s; %s XREF from %s (", - COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), name); + char* plural = r_list_length (addrs) > 1 ? "S" : ""; + char* plus = fun ? "" : "+"; + ds_comment (ds, false, "%s; %s XREF%s from %s (", + COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), plural, name); r_list_foreach (addrs, it, addr) { - ds_comment (ds, false, "%s0x%"PFMT64x, it == addrs->head ? "" : ", ", addr); + ds_comment (ds, false, "%s%s0x%"PFMT64x, it == addrs->head ? "" : ", ", plus, addr); } ds_comment (ds, false, ")%s", COLOR_RESET (ds)); ds_newline (ds); - r_list_purge (addrs); R_FREE (name); } else {