R_API int r_core_project_list(RCore *core, int mode) { PJ *pj = NULL; RListIter *iter; RList *list; char *foo, *path = r_file_abspath (r_config_get (core->config, "dir.projects")); if (!path) { return 0; } list = r_sys_dir (path); switch (mode) { case 'j': pj = pj_new (); if (!pj) { break; } pj_a (pj); r_list_foreach (list, iter, foo) { // todo. escape string if (r_core_is_project (core, foo)) { pj_s (pj, foo); } } pj_end (pj); r_cons_printf ("%s\n", pj_string (pj)); pj_free (pj); break; default: r_list_foreach (list, iter, foo) { if (r_core_is_project (core, foo)) { r_cons_println (foo); } } break; } r_list_free (list); free (path); return 0; }
R_API void r_anal_xrefs_list(RAnal *anal, int rad) { RListIter *iter; RAnalRef *ref; PJ *pj = NULL; RList *list = r_anal_ref_list_new(); listxrefs (anal->dict_refs, UT64_MAX, list); if (rad == 'j') { pj = pj_new (); if (!pj) { return; } pj_a (pj); } r_list_foreach (list, iter, ref) { int t = ref->type ? ref->type: ' '; switch (rad) { case '*': anal->cb_printf ("ax%c 0x%"PFMT64x" 0x%"PFMT64x"\n", t, ref->addr, ref->at); break; case '\0': { char *name = anal->coreb.getNameDelta (anal->coreb.core, ref->at); if (name) { r_str_replace_ch (name, ' ', 0, true); anal->cb_printf ("%40s", name); free (name); } else { anal->cb_printf ("%40s", "?"); } anal->cb_printf (" 0x%"PFMT64x" -> %9s -> 0x%"PFMT64x, ref->at, r_anal_xrefs_type_tostring (t), ref->addr); name = anal->coreb.getNameDelta (anal->coreb.core, ref->addr); if (name) { r_str_replace_ch (name, ' ', 0, true); anal->cb_printf (" %s\n", name); free (name); } else { anal->cb_printf ("\n"); } } break; case 'q': anal->cb_printf ("0x%08"PFMT64x" -> 0x%08"PFMT64x" %s\n", ref->at, ref->addr, r_anal_xrefs_type_tostring (t)); break; case 'j': { pj_o (pj); char *name = anal->coreb.getNameDelta (anal->coreb.core, ref->at); if (name) { r_str_replace_ch (name, ' ', 0, true); pj_ks (pj, "name", name); free (name); } pj_kn (pj, "from", ref->at); pj_ks (pj, "type", r_anal_xrefs_type_tostring (t)); pj_kn (pj, "addr", ref->addr); name = anal->coreb.getNameDelta (anal->coreb.core, ref->addr); if (name) { r_str_replace_ch (name, ' ', 0, true); pj_ks (pj, "refname", name); free (name); } pj_end (pj); } break; default: break; } }