Added ability to rename variables far from cursor (#10309)
This commit is contained in:
parent
7083c3385a
commit
b77e26a341
|
@ -83,13 +83,13 @@ static char *colorize_asm_string(RCore *core, const char *buf_asm, int optype) {
|
||||||
if (!scol2) {
|
if (!scol2) {
|
||||||
scol2 = strdup ("");
|
scol2 = strdup ("");
|
||||||
}
|
}
|
||||||
source = malloc (strlen(scol1) + strlen(scol2) + 2 + 1); // reuse source variable
|
source = r_str_newf ("%s||%s", scol1, scol2); // reuse source variable
|
||||||
sprintf (source, "%s||%s", scol1, scol2);
|
sprintf (source, "%s||%s", scol1, scol2);
|
||||||
free (scol1);
|
free (scol1);
|
||||||
free (scol2);
|
free (scol2);
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
char *res = strdup("");
|
char *res = strdup ("");
|
||||||
res = r_str_append (res, r_print_color_op_type (core->print, optype));
|
res = r_str_append (res, r_print_color_op_type (core->print, optype));
|
||||||
tmp = r_print_colorize_opcode (core->print, source, color_reg, color_num, false);
|
tmp = r_print_colorize_opcode (core->print, source, color_reg, color_num, false);
|
||||||
res = r_str_append (res, tmp);
|
res = r_str_append (res, tmp);
|
||||||
|
@ -1263,7 +1263,7 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||||
}
|
}
|
||||||
if ((i >= option - delta) && ((i < option + delta)|| \
|
if ((i >= option - delta) && ((i < option + delta)|| \
|
||||||
((option < delta) && (i < (delta << 1))))) {
|
((option < delta) && (i < (delta << 1))))) {
|
||||||
r_cons_printf(" %c %02d %c %s\n",
|
r_cons_printf (" %c %02d %c %s\n",
|
||||||
(option==i)?'>':' ', j,
|
(option==i)?'>':' ', j,
|
||||||
(i==core->flags->space_idx)?'*':' ',
|
(i==core->flags->space_idx)?'*':' ',
|
||||||
core->flags->spaces[i]);
|
core->flags->spaces[i]);
|
||||||
|
@ -1702,7 +1702,7 @@ R_API void r_core_visual_config(RCore *core) {
|
||||||
if (show) {
|
if (show) {
|
||||||
if (option == i) hit = 1;
|
if (option == i) hit = 1;
|
||||||
if ( (i >=option-delta) && ((i<option+delta)||((option<delta)&&(i<(delta<<1))))) {
|
if ( (i >=option-delta) && ((i<option+delta)||((option<delta)&&(i<(delta<<1))))) {
|
||||||
r_cons_printf(" %c %s\n", (option==i)?'>':' ', old);
|
r_cons_printf (" %c %s\n", (option == i)?'>':' ', old);
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -1816,7 +1816,7 @@ R_API void r_core_visual_config(RCore *core) {
|
||||||
break;
|
break;
|
||||||
case ':':
|
case ':':
|
||||||
r_cons_show_cursor (true);
|
r_cons_show_cursor (true);
|
||||||
r_cons_set_raw(0);
|
r_cons_set_raw (0);
|
||||||
{
|
{
|
||||||
char *cmd = prompt (":> ", NULL);
|
char *cmd = prompt (":> ", NULL);
|
||||||
r_core_cmd (core, cmd, 1);
|
r_core_cmd (core, cmd, 1);
|
||||||
|
@ -1873,7 +1873,7 @@ R_API void r_core_visual_mounts(RCore *core) {
|
||||||
} else r_cons_printf ("Cannot read partition\n");
|
} else r_cons_printf ("Cannot read partition\n");
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
r_cons_printf ("Types:\n\n");
|
r_cons_printf ("Types:\n\n");
|
||||||
for(i=0;;i++) {
|
for (i=0;;i++) {
|
||||||
n = r_fs_partition_type_get (i);
|
n = r_fs_partition_type_get (i);
|
||||||
if (!n) break;
|
if (!n) break;
|
||||||
r_cons_printf ("%s%s\n", (i==partition)?" > ":" ", n);
|
r_cons_printf ("%s%s\n", (i==partition)?" > ":" ", n);
|
||||||
|
@ -2378,7 +2378,7 @@ static ut64 r_core_visual_anal_refresh (RCore *core) {
|
||||||
r_cons_printf ("Press 'q' to quit call refs\n");
|
r_cons_printf ("Press 'q' to quit call refs\n");
|
||||||
r_cons_printf ("-[ calls ]----------------------- 0x%08"PFMT64x" (TODO)\n", addr);
|
r_cons_printf ("-[ calls ]----------------------- 0x%08"PFMT64x" (TODO)\n", addr);
|
||||||
// TODO: filter only the callrefs. but we cant grep here
|
// TODO: filter only the callrefs. but we cant grep here
|
||||||
sprintf(old, "afi @ 0x%08"PFMT64x, addr);
|
sprintf (old, "afi @ 0x%08"PFMT64x, addr);
|
||||||
r_core_cmd0 (core, old);
|
r_core_cmd0 (core, old);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -2761,6 +2761,7 @@ R_API void r_core_visual_define (RCore *core, const char *args) {
|
||||||
," s set string"
|
," s set string"
|
||||||
," S set strings in current block"
|
," S set strings in current block"
|
||||||
," u undefine metadata here"
|
," u undefine metadata here"
|
||||||
|
," v rename variable at offset that matches some hex digits"
|
||||||
," x find xrefs to current address (./r)"
|
," x find xrefs to current address (./r)"
|
||||||
," w set as 32bit word"
|
," w set as 32bit word"
|
||||||
," W set as 64bit word"
|
," W set as 64bit word"
|
||||||
|
@ -2856,8 +2857,8 @@ repeat:
|
||||||
if (man) {
|
if (man) {
|
||||||
char *p = strstr (man, "INODE");
|
char *p = strstr (man, "INODE");
|
||||||
if (p) *p = 0;
|
if (p) *p = 0;
|
||||||
r_cons_clear();
|
r_cons_clear ();
|
||||||
r_cons_flush();
|
r_cons_flush ();
|
||||||
r_sys_cmdf ("man %s", man);
|
r_sys_cmdf ("man %s", man);
|
||||||
free (man);
|
free (man);
|
||||||
}
|
}
|
||||||
|
@ -3130,6 +3131,77 @@ repeat:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
{
|
||||||
|
RAnalOp op;
|
||||||
|
ut64 N;
|
||||||
|
char *endptr;
|
||||||
|
char *end_off = r_cons_input ("Last hexadecimal digits of instruction: ");
|
||||||
|
if (end_off) {
|
||||||
|
N = strtoull(end_off, &endptr, 16);
|
||||||
|
}
|
||||||
|
if (!end_off || end_off == endptr) {
|
||||||
|
eprintf ("Invalid numeric input\n");
|
||||||
|
r_cons_any_key (NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free (end_off);
|
||||||
|
|
||||||
|
ut64 incr = 0x10;
|
||||||
|
ut64 tmp_N = N >> 4;
|
||||||
|
while (tmp_N > 0) {
|
||||||
|
tmp_N = tmp_N >> 4;
|
||||||
|
incr = incr << 4;
|
||||||
|
}
|
||||||
|
ut64 mask = incr - 1;
|
||||||
|
|
||||||
|
ut64 start_off;
|
||||||
|
if ((off & mask) <= N) {
|
||||||
|
start_off = (off & ~mask) ^ N;
|
||||||
|
} else {
|
||||||
|
start_off = ((off & ~mask) ^ incr) ^ N;
|
||||||
|
}
|
||||||
|
|
||||||
|
ut64 try_off;
|
||||||
|
bool found = false;
|
||||||
|
for (try_off = start_off; try_off < start_off + incr*16; try_off += incr) {
|
||||||
|
r_anal_op (core->anal, &op, try_off,
|
||||||
|
core->block + try_off - core->offset, 32, R_ANAL_OP_MASK_ALL);
|
||||||
|
if (op.var) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, off, 0);
|
||||||
|
if (fcn) {
|
||||||
|
RAnalVar *bar = r_anal_var_get_byname (core->anal, fcn, op.var->name);
|
||||||
|
if (bar) {
|
||||||
|
char *newname = r_cons_input (sdb_fmt ("New variable name for '%s': ", bar->name));
|
||||||
|
if (newname) {
|
||||||
|
if (*newname) {
|
||||||
|
r_anal_var_rename (core->anal, fcn->addr, bar->scope,
|
||||||
|
bar->kind, bar->name, newname);
|
||||||
|
}
|
||||||
|
free (newname);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eprintf ("Cannot find variable\n");
|
||||||
|
r_cons_any_key (NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eprintf ("Cannot find function\n");
|
||||||
|
r_cons_any_key (NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eprintf ("Cannot find instruction with a variable\n");
|
||||||
|
r_cons_any_key (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
r_anal_op_fini (&op);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'Q':
|
case 'Q':
|
||||||
case 'q':
|
case 'q':
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue