Skip to content

Commit d9d8391

Browse files
kazarmyradare
authored andcommitted
Revert to old coloring for asm.filter'd flags (radareorg#7192)
* Revert to old coloring for asm.filter'd flags * Fixed r_parse_filter output for pc relative addrs when color is involved * Small fix to prevent oob memory access * Proper handling if esc char not found
1 parent 12eed54 commit d9d8391

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

libr/core/disasm.c

+1-7
Original file line numberDiff line numberDiff line change
@@ -748,16 +748,10 @@ static void ds_build_op_str(RDisasmState *ds) {
748748
core->parser->relsub_addr = num;
749749
}
750750
}
751-
r_parse_filter (core->parser, core->flags, ds->opstr, ds->str, sizeof (ds->str), core->print->big_endian);
751+
r_parse_filter (core->parser, core->flags, asm_str, ds->str, sizeof (ds->str), core->print->big_endian);
752752
core->parser->flagspace = ofs;
753753
free (ds->opstr);
754754
ds->opstr = strdup (ds->str);
755-
asm_str = colorize_asm_string (core, ds);
756-
if (asm_str) {
757-
free (ds->opstr);
758-
ds->opstr = strdup (asm_str);
759-
}
760-
//core->parser->flagspace = ofs; // ???
761755
} else {
762756
if (!ds->opstr) {
763757
ds->opstr = strdup (asm_str? asm_str: "");

libr/parse/parse.c

+35
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,41 @@ static int filter(RParse *p, RFlag *f, char *data, char *str, int len, bool big_
253253
*ptr = 0;
254254
snprintf (str, len, "%s%s%s", data, flag->name,
255255
(ptr != ptr2) ? ptr2 : "");
256+
257+
if (p->relsub_addr) {
258+
int flag_len = strlen (flag->name);
259+
char *ptr_end = str + strlen (data) + flag_len - 1;
260+
char *ptr_right = ptr_end + 1, *ptr_left, *ptr_esc;
261+
bool ansi_found = false;
262+
int copied_len;
263+
while (*ptr_right) {
264+
if (*ptr_right == 0x1b) {
265+
while (*ptr_right && *ptr_right != 'm') ptr_right++;
266+
if (*ptr_right) ptr_right++;
267+
ansi_found = true;
268+
continue;
269+
} else if (*ptr_right == ']') {
270+
ptr_left = ptr_esc = ptr_end - flag_len;
271+
while (ptr_left >= str) {
272+
if (*ptr_left == '[' &&
273+
(ptr_left == str || *(ptr_left - 1) != 0x1b)) break;
274+
ptr_left--;
275+
}
276+
if (ptr_left < str) break;
277+
278+
for (; ptr_esc >= str && *ptr_esc != 0x1b; ptr_esc--);
279+
if (ptr_esc < str) ptr_esc = ptr_end - flag_len + 1;
280+
281+
copied_len = ptr_end - ptr_esc + 1;
282+
memmove (ptr_left, ptr_esc, copied_len);
283+
sprintf (ptr_left + copied_len, "%s%s",
284+
ansi_found && ptr_right - ptr_end + 1 >= 4 ? "\x1b[0m" : "",
285+
ptr_right + 1);
286+
break;
287+
} else break;
288+
}
289+
}
290+
256291
return true;
257292
}
258293
}

0 commit comments

Comments
 (0)