R_API int r_anal_fcn_label_del (RAnal *anal, RAnalFunction *fcn, const char *name, ut64 addr) { if (!anal || !fcn || !name) return R_FALSE; sdb_array_remove (DB, LABELS, ADDRLABEL (addr, name), 0); sdb_unset (DB, LABEL(name), 0); sdb_unset (DB, ADDR(addr), 0); return R_TRUE; }
bool test_sdb_array_add_remove(void) { Sdb *db = sdb_new (NULL, NULL, false); sdb_array_add (db, "foo", "foo", 0); sdb_array_add (db, "foo", "bar", 0); sdb_array_add (db, "foo", "cow", 0); mu_assert_streq (sdb_const_get (db, "foo", 0), "foo,bar,cow", "Not all items found"); sdb_array_remove (db, "foo", "bar", 0); mu_assert_streq (sdb_const_get (db, "foo", 0), "foo,cow", "bar was not deleted"); sdb_array_remove (db, "foo", "nothing", 0); mu_assert_streq (sdb_const_get (db, "foo", 0), "foo,cow", "nothing should be deleted"); sdb_array_remove (db, "foo", "cow", 0); sdb_array_remove (db, "foo", "foo", 0); mu_assert_eq ((int)(size_t)sdb_const_get (db, "foo", 0), (int)(size_t)NULL, "all elements should be deleted"); sdb_free (db); mu_end; }
R_API int r_anal_var_delete (RAnal *a, ut64 addr, const char kind, int scope, int delta) { if (delta<0) delta = -delta; RAnalVar *av = r_anal_var_get (a, addr, kind, scope, delta); if (scope>0) { char *fcn_key = sdb_fmt (1, "fcn.0x%"PFMT64x".%c", addr, kind); char *var_key = sdb_fmt (2, "var.0x%"PFMT64x".%c.%d.%d", addr, kind, scope, delta); char *name_key = sdb_fmt (3, "var.0x%"PFMT64x".%c.%d.%s", addr, kind, scope, av->name); char *shortvar = sdb_fmt (4, "%d.%d", scope, delta); sdb_array_remove (DB, fcn_key, shortvar, 0); sdb_unset (DB, var_key, 0); sdb_unset (DB, name_key, 0); } else { char *var_global = sdb_fmt (1, "var.0x%"PFMT64x, addr); char *var_def = sdb_fmt (2,"%c.%s,%d,%s", kind, av->type, av->size, av->name); sdb_array_remove (DB, var_global, var_def, 0); } r_anal_var_access_clear (a, addr, scope, delta); return true; }