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 char *pj_fmt(PrintfCallback p, const char *fmt, ...) { va_list ap; va_start (ap, fmt); char ch[2] = { 0 }; PJ *j = pj_new (); while (*fmt) { j->is_first = true; ch[0] = *fmt; switch (*fmt) { case '\\': fmt++; switch (*fmt) { // TODO: add \x, and \e case 'e': pj_raw (j, "\x1b"); break; case 'r': pj_raw (j, "\r"); break; case 'n': pj_raw (j, "\n"); break; case 'b': pj_raw (j, "\b"); break; } break; case '\'': pj_raw (j, "\""); break; case '%': fmt++; switch (*fmt) { case 'b': pj_b (j, va_arg (ap, int)); break; case 's': pj_s (j, va_arg (ap, const char *)); break; case 'S': { const char *s = va_arg (ap, const char *); char *es = r_base64_encode_dyn (s, -1); pj_s (j, es); free (es); } break; case 'n': pj_n (j, va_arg (ap, ut64)); break; case 'd': pj_d (j, va_arg (ap, double)); break; case 'i': pj_i (j, va_arg (ap, int)); break; default: eprintf ("Invalid format\n"); break; } break; default: ch[0] = *fmt; pj_raw (j, ch); break; } fmt++; } char *ret = NULL; if (p) { p ("%s", r_strbuf_get (j->sb)); pj_free (j); } else { ret = pj_drain (j); } va_end (ap); return ret; }
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; } }