mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-03 04:05:06 +00:00
Fix #3827 - Implement r_anal_var_delete_byname()
This commit is contained in:
parent
8347a07eda
commit
e91024c279
@ -156,6 +156,50 @@ R_API int r_anal_var_delete (RAnal *a, ut64 addr, const char kind, int scope, in
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API bool r_anal_var_delete_byname (RAnal *a, RAnalFunction *fcn, int kind, const char *name) {
|
||||
char *varlist;
|
||||
RList *list;
|
||||
if (!a || !fcn) {
|
||||
return false;
|
||||
}
|
||||
list = r_list_new ();
|
||||
varlist = sdb_get (DB, sdb_fmt (0, "fcn.0x%"PFMT64x".%c",
|
||||
fcn->addr, kind), 0);
|
||||
if (varlist) {
|
||||
char *next, *ptr = varlist;
|
||||
if (varlist && *varlist) {
|
||||
do {
|
||||
char *word = sdb_anext (ptr, &next);
|
||||
char *vardef = sdb_get (DB, sdb_fmt (1,
|
||||
"var.0x%"PFMT64x".%c.%s",
|
||||
fcn->addr, kind, word), 0);
|
||||
int delta = strlen(word)<3? -1: atoi (word+2);
|
||||
if (vardef) {
|
||||
const char *p = strchr (vardef, ',');
|
||||
if (p) {
|
||||
p = strchr (p + 1, ',');
|
||||
if (p) {
|
||||
p = strchr (p + 1, ',');
|
||||
if (p) {
|
||||
int mykind = vardef[0];
|
||||
if (!strcmp (p+1, name)) {
|
||||
return r_anal_var_delete (a, fcn->addr,
|
||||
mykind, 1, delta);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
eprintf ("Inconsistent Sdb storage, Cannot find '%s'\n", word);
|
||||
}
|
||||
ptr = next;
|
||||
} while (next);
|
||||
}
|
||||
}
|
||||
free (varlist);
|
||||
return false;
|
||||
}
|
||||
|
||||
R_API RAnalVar *r_anal_var_get (RAnal *a, ut64 addr, char kind, int scope, int delta) {
|
||||
RAnalVar *av;
|
||||
struct VarType vt;
|
||||
|
@ -63,9 +63,9 @@ static void var_help(RCore *core, char ch) {
|
||||
}
|
||||
|
||||
static int var_cmd(RCore *core, const char *str) {
|
||||
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
|
||||
char *p, *ostr;
|
||||
int delta, type = *str, res = true;
|
||||
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
|
||||
|
||||
ostr = p = strdup (str);
|
||||
str = (const char *)ostr;
|
||||
@ -101,12 +101,16 @@ static int var_cmd(RCore *core, const char *str) {
|
||||
case '.':
|
||||
r_anal_var_list_show (core->anal, fcn, core->offset, 0);
|
||||
break;
|
||||
case '-':
|
||||
case '-': // "afv-"
|
||||
if (str[2] == '*') {
|
||||
r_anal_var_delete_all (core->anal, fcn->addr, type);
|
||||
} else {
|
||||
r_anal_var_delete (core->anal, fcn->addr,
|
||||
type, 1, (int)r_num_math (core->num, str + 1));
|
||||
if (IS_NUMBER (str[2])) {
|
||||
r_anal_var_delete (core->anal, fcn->addr,
|
||||
type, 1, (int)r_num_math (core->num, str + 1));
|
||||
} else {
|
||||
r_anal_var_delete_byname (core->anal, fcn, type, str + 2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'n': {
|
||||
|
Loading…
x
Reference in New Issue
Block a user