Fix #3827 - Implement r_anal_var_delete_byname()

This commit is contained in:
pancake 2015-12-28 01:47:16 +01:00
parent 8347a07eda
commit e91024c279
2 changed files with 52 additions and 4 deletions

View File

@ -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;

View File

@ -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': {