R_API int r_meta_del(RAnal *a, int type, ut64 addr, ut64 size, const char *str) { char key[100], *dtr, *s, *p, *next; #if 0 char key2[100]; #endif const char *ptr; int i; if (size == UT64_MAX) { // FULL CLEANUP // XXX: this thing ignores the type if (type == R_META_TYPE_ANY) { sdb_reset (DB); } else { snprintf (key, sizeof (key)-1, "meta.%c.count", type); int last = (ut64)sdb_num_get (DB, key, NULL)/K; for (i=0; i<last; i++) { snprintf (key, sizeof (key)-1, "meta.%c.%d", type, i); dtr = sdb_get (DB, key, 0); for (p = dtr; p; p = next) { s = sdb_anext (p, &next); snprintf (key, sizeof (key)-1, "meta.%c.0x%"PFMT64x, type, sdb_atoi (s)); eprintf ("--> %s\n", key); sdb_unset (DB, key, 0); if (!next) break; } free (dtr); } } return false; } meta_inrange_del (a, addr, size); snprintf (key, sizeof (key)-1, type == R_META_TYPE_COMMENT ? "meta.C.0x%"PFMT64x : "meta.0x%"PFMT64x, addr); ptr = sdb_const_get (DB, key, 0); if (ptr) { sdb_unset (DB, key, 0); #if 0 // This code is wrong, but i guess it's necessary in case type is ANY for (i=0; ptr[i]; i++) { if (ptr[i] != SDB_RS) { snprintf (key2, sizeof (key2)-1, "meta.%c.0x%"PFMT64x, ptr[i], addr); printf ("UNSET (%s)\n", key2); sdb_unset (DB, key2, 0); } } #endif } sdb_unset (DB, key, 0); return false; }
R_API int r_meta_del(RAnal *a, int type, ut64 addr, ut64 size, const char *str) { char key[100], key2[100], *dtr, *s, *p, *next; const char *ptr; int i; if (size == UT64_MAX) { // FULL CLEANUP // XXX: this thing ignores the type if (type == R_META_TYPE_ANY) { sdb_reset (DB); } else { snprintf (key, sizeof (key)-1, "meta.%c", type); dtr = sdb_get (DB, key, 0); for (p = dtr; p; p = next) { s = sdb_anext (p, &next); snprintf (key, sizeof (key)-1, "meta.%c.0x%"PFMT64x, type, sdb_atoi (s)); eprintf ("--> %s\n", key); sdb_unset (DB, key, 0); if (!next) break; } free (dtr); } return R_FALSE; } meta_inrange_del (a, addr, size); snprintf (key, sizeof (key)-1, type==R_META_TYPE_COMMENT ? "meta.C.0x%"PFMT64x : "meta.0x%"PFMT64x, addr); ptr = sdb_const_get (DB, key, 0); if (ptr) { for (i=0; ptr[i]; i++) { if (ptr[i] != SDB_RS) { snprintf (key2, sizeof (key2)-1, "meta.%c.0x%"PFMT64x, ptr[i], addr); sdb_unset (DB, key2, 0); } } } sdb_unset (DB, key, 0); return R_FALSE; }
R_API int r_meta_del(RAnal *a, int type, ut64 addr, ut64 size) { char key[100], *dtr, *s, *p, *next; const char *val; int i; if (size == UT64_MAX) { // FULL CLEANUP // XXX: this thing ignores the type if (type == R_META_TYPE_ANY) { sdb_reset (DB); } else { snprintf (key, sizeof (key)-1, "meta.%c.count", type); int last = (ut64)sdb_num_get (DB, key, NULL)/K; for (i=0; i<last; i++) { snprintf (key, sizeof (key)-1, "meta.%c.%d", type, i); dtr = sdb_get (DB, key, 0); for (p = dtr; p; p = next) { s = sdb_anext (p, &next); snprintf (key, sizeof (key)-1, "meta.%c.0x%"PFMT64x, type, sdb_atoi (s)); sdb_unset (DB, key, 0); if (!next) break; } free (dtr); } } return false; } if (type == R_META_TYPE_ANY) { /* special case */ r_meta_del (a, R_META_TYPE_COMMENT, addr, size); r_meta_del (a, R_META_TYPE_VARTYPE, addr, size); } if (type == R_META_TYPE_COMMENT || type == R_META_TYPE_VARTYPE) { snprintf (key, sizeof (key)-1, "meta.%c.0x%"PFMT64x, type, addr); } else { snprintf (key, sizeof (key)-1, "meta.0x%"PFMT64x, addr); } meta_inrange_del (a, addr, size); val = sdb_const_get (DB, key, 0); if (val) { if (type == R_META_TYPE_ANY) { char item_key[100]; const char *ptr = val; while (*ptr) { snprintf (item_key, sizeof (item_key), "meta.%c.0x%" PFMT64x, *ptr, addr); sdb_unset (DB, item_key, 0); ptr++; if (*ptr) { ptr++; } } sdb_unset (DB, key, 0); return false; } if (strchr (val, ',')) { char type_fld[] = "##"; if (val[0] == type) { type_fld[0] = type; type_fld[1] = ','; } else { type_fld[0] = ','; type_fld[1] = type; } sdb_uncat (DB, key, type_fld, 0); } else { sdb_unset (DB, key, 0); } snprintf (key, sizeof (key), "meta.%c.0x%" PFMT64x, type, addr); sdb_unset (DB, key, 0); } sdb_unset (DB, key, 0); return false; }