R_API int r_anal_xrefs_from (RAnal *anal, RList *list, const char *kind, const RAnalRefType type, ut64 addr) { char *next, *s, *str, *ptr, key[256]; RAnalRef *ref = NULL; if (addr == UT64_MAX) { _type = type; _list = list; _kpfx = r_str_newf ("xref.%s", analref_toString (type)); sdb_foreach (DB, (SdbForeachCallback)xrefs_list_cb_any, anal); free (_kpfx); return true; } XREFKEY(key, sizeof (key), kind, type, addr); str = sdb_get (DB, key, 0); if (!str) { return false; } for (next = ptr = str; next; ptr = next) { s = sdb_anext (ptr, &next); if (!(ref = r_anal_ref_new ())) { return false; } ref->addr = r_num_get (NULL, s); ref->at = addr; ref->type = type; r_list_append (list, ref); } free (str); return true; }
static bool appendRef(void *u, const ut64 k, const void *v) { RList *list = (RList *)u; RAnalRef *ref = (RAnalRef *)v; RAnalRef *cloned = r_anal_ref_new (ref->addr, ref->at, ref->type); if (cloned) { r_list_append (list, cloned); return true; } return false; }
static int xrefs_list_cb_any(RAnal *anal, const char *k, const char *v) { //ut64 dst, src = r_num_get (NULL, v); if (!strncmp (_kpfx, k, strlen (_kpfx))) { RAnalRef *ref = r_anal_ref_new (); if (ref) { ref->addr = r_num_get (NULL, k + strlen (_kpfx) + 1); ref->at = r_num_get (NULL, v); // XXX ref->type = _type; r_list_append (_list, ref); } } return true; }
static void setxref(HtUP *m, ut64 from, ut64 to, int type) { bool found; HtUP *ht = ht_up_find (m, from, &found); if (!found) { ht = ht_up_new (NULL, xrefs_ref_free, NULL); if (!ht) { return; } ht_up_insert (m, from, ht); } RAnalRef *ref = r_anal_ref_new (to, from, type); if (ref) { ht_up_update (ht, to, ref); } }
R_API int r_anal_xrefs_from (RAnal *anal, RList *list, const char *kind, const char *type, ut64 addr) { char *s, *str, *ptr, key[256]; RAnalRef *ref = NULL; int hasnext = 1; snprintf (key, sizeof (key), "%s.%s.0x%"PFMT64x, kind, type, addr); str = sdb_get (DB, key, 0); if (!str) return R_FALSE; for (ptr=str; hasnext; ptr = (char *)sdb_anext (s)) { s = sdb_astring (ptr, &hasnext); if (!(ref = r_anal_ref_new ())) return R_FALSE; ref->addr = addr; ref->at = r_num_get (NULL, s); ref->type = (!strcmp (type, "code"))?'C':'d'; // XXX r_list_append (list, ref); } free (str); return R_TRUE; }