mirror of
https://github.com/radareorg/radare2.git
synced 2024-11-23 05:09:43 +00:00
Do more R2_600 pending changes
This commit is contained in:
parent
89ba6ec0bc
commit
dd22e8b01f
@ -4446,8 +4446,7 @@ static void nextword(RCore *core, RAGraph *g, const char *word) {
|
||||
}
|
||||
}
|
||||
|
||||
// R2_600 return bool
|
||||
R_API int r_core_visual_graph(RCore *core, RAGraph *g, RAnalFunction *_fcn, int mode) {
|
||||
R_API bool r_core_visual_graph(RCore *core, RAGraph *g, RAnalFunction *_fcn, int mode) {
|
||||
bool is_interactive = (mode != 0);
|
||||
if (is_interactive && !r_cons_is_interactive ()) {
|
||||
R_LOG_ERROR ("Interactive graph mode requires 'e scr.interactive=true'");
|
||||
@ -5339,7 +5338,7 @@ R_API int r_core_visual_graph(RCore *core, RAGraph *g, RAnalFunction *_fcn, int
|
||||
r_config_hold_restore (hc);
|
||||
r_config_hold_free (hc);
|
||||
if (must_update_seek) {
|
||||
return -1;
|
||||
return true; // -1
|
||||
}
|
||||
return !is_error;
|
||||
}
|
||||
|
@ -2306,84 +2306,6 @@ R_API int r_core_print_bb_custom(RCore *core, RAnalFunction *fcn) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// R2_600 - return bool
|
||||
R_API int r_core_print_bb_gml(RCore *core, RAnalFunction *fcn) {
|
||||
RAnalBlock *bb;
|
||||
RListIter *iter;
|
||||
if (!fcn) {
|
||||
return false;
|
||||
}
|
||||
int id = 0;
|
||||
HtUU *ht = ht_uu_new0 ();
|
||||
|
||||
r_cons_printf ("graph\n[\n" "hierarchic 1\n" "label \"\"\n" "directed 1\n");
|
||||
|
||||
r_list_foreach (fcn->bbs, iter, bb) {
|
||||
RFlagItem *flag = r_flag_get_i (core->flags, bb->addr);
|
||||
char *msg = flag? strdup (flag->name): r_str_newf ("0x%08"PFMT64x, bb->addr);
|
||||
// TODO char *str = r_str_escape_dot (msg);
|
||||
ht_uu_insert (ht, bb->addr, id);
|
||||
r_cons_printf (" node [\n"
|
||||
" id %d\n"
|
||||
" label \"%s\"\n"
|
||||
" ]\n", id, msg);
|
||||
id++;
|
||||
free (msg);
|
||||
}
|
||||
|
||||
r_list_foreach (fcn->bbs, iter, bb) {
|
||||
if (bb->addr == UT64_MAX) {
|
||||
continue;
|
||||
}
|
||||
if (bb->jump != UT64_MAX) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, bb->jump, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bb->fail != UT64_MAX) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, bb->fail, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bb->switch_op) {
|
||||
RListIter *it;
|
||||
RAnalCaseOp *cop;
|
||||
r_list_foreach (bb->switch_op->cases, it, cop) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, cop->addr, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
r_cons_printf ("]\n");
|
||||
ht_uu_free (ht);
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API void r_core_anal_datarefs(RCore *core, ut64 addr) {
|
||||
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, addr, -1);
|
||||
if (fcn) {
|
||||
|
@ -12204,6 +12204,83 @@ static void r_core_graph_print(RCore *core, RGraph /*<RGraphNodeInfo>*/ *graph,
|
||||
}
|
||||
}
|
||||
|
||||
static bool r_core_print_bb_gml(RCore *core, RAnalFunction *fcn) {
|
||||
RAnalBlock *bb;
|
||||
RListIter *iter;
|
||||
if (!fcn) {
|
||||
return false;
|
||||
}
|
||||
int id = 0;
|
||||
HtUU *ht = ht_uu_new0 ();
|
||||
|
||||
r_cons_printf ("graph\n[\n" "hierarchic 1\n" "label \"\"\n" "directed 1\n");
|
||||
|
||||
r_list_foreach (fcn->bbs, iter, bb) {
|
||||
RFlagItem *flag = r_flag_get_i (core->flags, bb->addr);
|
||||
char *msg = flag? strdup (flag->name): r_str_newf ("0x%08"PFMT64x, bb->addr);
|
||||
// TODO char *str = r_str_escape_dot (msg);
|
||||
ht_uu_insert (ht, bb->addr, id);
|
||||
r_cons_printf (" node [\n"
|
||||
" id %d\n"
|
||||
" label \"%s\"\n"
|
||||
" ]\n", id, msg);
|
||||
id++;
|
||||
free (msg);
|
||||
}
|
||||
|
||||
r_list_foreach (fcn->bbs, iter, bb) {
|
||||
if (bb->addr == UT64_MAX) {
|
||||
continue;
|
||||
}
|
||||
if (bb->jump != UT64_MAX) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, bb->jump, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bb->fail != UT64_MAX) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, bb->fail, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bb->switch_op) {
|
||||
RListIter *it;
|
||||
RAnalCaseOp *cop;
|
||||
r_list_foreach (bb->switch_op->cases, it, cop) {
|
||||
bool found;
|
||||
int i = ht_uu_find (ht, bb->addr, &found);
|
||||
if (found) {
|
||||
int i2 = ht_uu_find (ht, cop->addr, &found);
|
||||
if (found) {
|
||||
r_cons_printf (" edge [\n"
|
||||
" source %d\n"
|
||||
" target %d\n"
|
||||
" ]\n", i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
r_cons_printf ("]\n");
|
||||
ht_uu_free (ht);
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool mermaid_add_node_asm(RAnal *a, RAnalBlock *bb, RStrBuf *nodes) {
|
||||
ut8 *bb_buf = calloc (1, bb->size);
|
||||
if (!bb_buf) {
|
||||
|
@ -225,34 +225,35 @@ static bool get_keys(void *keylist_in, const void *k, const void *v) {
|
||||
}
|
||||
|
||||
R_API const char **r_cmd_alias_keys(RCmd *cmd) {
|
||||
AliasKeylist keylist;
|
||||
|
||||
keylist.keys = R_NEWS (const char *, cmd->aliases->count);
|
||||
AliasKeylist keylist = {
|
||||
.current_key = 0,
|
||||
.keys = R_NEWS (const char *, cmd->aliases->count)
|
||||
};
|
||||
if (!keylist.keys) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
keylist.current_key = 0;
|
||||
ht_pp_foreach (cmd->aliases, get_keys, &keylist);
|
||||
|
||||
// We don't need to return a count - it's already in cmd->aliases.
|
||||
return keylist.keys;
|
||||
}
|
||||
|
||||
R_API void r_cmd_alias_free(RCmd *cmd) {
|
||||
R_RETURN_IF_FAIL (cmd);
|
||||
ht_pp_free (cmd->aliases);
|
||||
cmd->aliases = NULL;
|
||||
}
|
||||
|
||||
R_API bool r_cmd_alias_del(RCmd *cmd, const char *k) {
|
||||
return ht_pp_delete(cmd->aliases, k);
|
||||
R_RETURN_VAL_IF_FAIL (cmd && k, false);
|
||||
return ht_pp_delete (cmd->aliases, k);
|
||||
}
|
||||
|
||||
R_API int r_cmd_alias_set_cmd(RCmd *cmd, const char *k, const char *v) {
|
||||
R_API bool r_cmd_alias_set_cmd(RCmd *cmd, const char *k, const char *v) {
|
||||
R_RETURN_VAL_IF_FAIL (cmd && k && v, false);
|
||||
RCmdAliasVal val;
|
||||
val.data = (ut8 *)v;
|
||||
if (!val.data) {
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
val.sz = strlen (v) + 1;
|
||||
val.is_str = true;
|
||||
@ -388,32 +389,31 @@ static ut8 *alias_append_internal(int *out_szp, const RCmdAliasVal *first, const
|
||||
return out;
|
||||
}
|
||||
|
||||
R_API int r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a) {
|
||||
R_API bool r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a) {
|
||||
R_RETURN_VAL_IF_FAIL (cmd && k && a, 1);
|
||||
RCmdAliasVal *v_old = r_cmd_alias_get (cmd, k);
|
||||
if (v_old) {
|
||||
if (!v_old->is_data) {
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
int new_len = 0;
|
||||
ut8* new = alias_append_internal (&new_len, v_old, (ut8 *)a, strlen (a) + 1);
|
||||
if (!new) {
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
r_cmd_alias_set_raw (cmd, k, new, new_len);
|
||||
free (new);
|
||||
} else {
|
||||
r_cmd_alias_set_str (cmd, k, a);
|
||||
}
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
// R2_600 - return bool instead
|
||||
R_API int r_cmd_alias_append_raw(RCmd *cmd, const char *k, const ut8 *a, int sz) {
|
||||
R_API bool r_cmd_alias_append_raw(RCmd *cmd, const char *k, const ut8 *a, int sz) {
|
||||
RCmdAliasVal *v_old = r_cmd_alias_get (cmd, k);
|
||||
if (v_old) {
|
||||
if (!v_old->is_data) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
int new_len = 0;
|
||||
ut8 *new = alias_append_internal (&new_len, v_old, a, sz);
|
||||
|
@ -42,200 +42,6 @@ static bool is_document(const char *name) {
|
||||
return r_str_endswith (name, ".r2s") || r_str_endswith (name, ".md") || r_str_endswith (name, ".txt");
|
||||
}
|
||||
|
||||
static void fill_line(RStrBuf *sb, int maxcol) {
|
||||
int i;
|
||||
if (maxcol < 1) {
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < maxcol; i++) {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
r_strbuf_append (sb, Color_RESET_BG);
|
||||
r_strbuf_append (sb, Color_RESET);
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
|
||||
// R2_600 - Rename to RStr.md2txt ?
|
||||
static char *unmarkdown(const char *page, bool usecolor) {
|
||||
char *b = r_file_slurp (page, NULL);
|
||||
RStrBuf *sb = r_strbuf_new ("");
|
||||
int col = 0;
|
||||
const int maxcol = 75;
|
||||
bool codeblock = false;
|
||||
bool contline = false;
|
||||
bool title = false;
|
||||
bool codeblockline = false;
|
||||
while (*b) {
|
||||
int ch = *b;
|
||||
repeat:
|
||||
switch (ch) {
|
||||
case 10:
|
||||
if (codeblock || title) {
|
||||
const int j = title? maxcol + 2: maxcol - 4;
|
||||
if (usecolor) {
|
||||
if (!contline) {
|
||||
fill_line (sb, j - col);
|
||||
}
|
||||
if (title) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
}
|
||||
}
|
||||
title = false;
|
||||
}
|
||||
if (contline) {
|
||||
contline = false;
|
||||
} else {
|
||||
col = 0;
|
||||
}
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_RESET);
|
||||
}
|
||||
if (!codeblock) {
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
if (codeblockline) {
|
||||
codeblock = false;
|
||||
codeblockline = false;
|
||||
}
|
||||
break;
|
||||
case '\t':
|
||||
if (col == 0) {
|
||||
codeblock = true;
|
||||
codeblockline = true;
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
// ignore
|
||||
break;
|
||||
default:
|
||||
if (col > maxcol) {
|
||||
ch = 10;
|
||||
if (*b == ' ') {
|
||||
b++;
|
||||
} else {
|
||||
if (codeblock) {
|
||||
col = 1;
|
||||
// nothing
|
||||
} else {
|
||||
r_strbuf_append (sb, "-");
|
||||
}
|
||||
#if 0
|
||||
contline = true;
|
||||
if (codeblock) {
|
||||
r_strbuf_append (sb, "\n");
|
||||
col = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
b--;
|
||||
goto repeat;
|
||||
}
|
||||
if (col == 0) {
|
||||
if (r_str_startswith (b, "```")) {
|
||||
while (*b && *b != '\n') {
|
||||
b++;
|
||||
}
|
||||
codeblock = !codeblock;
|
||||
if (!codeblock) {
|
||||
r_strbuf_append (sb, Color_RESET_BG);
|
||||
}
|
||||
continue;
|
||||
} else if (!codeblock && r_str_startswith (b, "###")) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
r_strbuf_append (sb, Color_BLUE);
|
||||
r_strbuf_append (sb, Color_BGCYAN);
|
||||
}
|
||||
r_strbuf_append (sb, " ");
|
||||
b += 3;
|
||||
title = true;
|
||||
} else if (!codeblock && r_str_startswith (b, "##")) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
}
|
||||
r_strbuf_append (sb, " ");
|
||||
ch = ' ';
|
||||
b += 2;
|
||||
title = true;
|
||||
} else if (!codeblock && r_str_startswith (b, "#")) {
|
||||
RStrBuf *sb2 = r_strbuf_new ("");
|
||||
while (*b) {
|
||||
if (*b == '\n') {
|
||||
b++;
|
||||
break;
|
||||
}
|
||||
r_strbuf_appendf (sb2, "%c", *b);
|
||||
b++;
|
||||
}
|
||||
char *sb2s = r_strbuf_drain (sb2);
|
||||
char *sb2ss = r_str_ss (sb2s, 0, 0);
|
||||
char *p = sb2ss;
|
||||
char *nextlist = strstr (p, "\n");
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGGREEN);
|
||||
}
|
||||
while (nextlist) {
|
||||
char *line = r_str_ndup (p, nextlist - p);
|
||||
r_strbuf_appendf (sb, "%s", line);
|
||||
int col = strlen (line);
|
||||
int i;
|
||||
for (i = col; i < maxcol + 1; i++) {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, " ");
|
||||
r_strbuf_append (sb, " "Color_RESET_BG""Color_RESET"\n"Color_BGGREEN""Color_BLACK);
|
||||
} else {
|
||||
r_strbuf_append (sb, " \n");
|
||||
}
|
||||
p = nextlist + 1;
|
||||
nextlist = strstr (p, "\n");
|
||||
}
|
||||
//r_strbuf_append (sb, sb2ss);
|
||||
free (sb2ss);
|
||||
free (sb2s);
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_RESET_BG""Color_RESET"\n");
|
||||
} else {
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
title = false;
|
||||
break;
|
||||
} else {
|
||||
if (codeblock) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, " "Color_BGYELLOW" "Color_BLACK);
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
col ++;
|
||||
r_strbuf_appendf (sb, "%c", ch);
|
||||
break;
|
||||
}
|
||||
b++;
|
||||
}
|
||||
char *s = r_strbuf_drain (sb);
|
||||
r_cons_printf ("%s", s);
|
||||
free (s);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *readman(RCore *core, const char *page) {
|
||||
const char *docdir = R2_DATDIR"/doc/radare2/";
|
||||
if (!strcmp (page, "?")) {
|
||||
@ -268,7 +74,8 @@ static char *readman(RCore *core, const char *page) {
|
||||
return NULL;
|
||||
}
|
||||
if (r_str_endswith (page, ".md")) {
|
||||
char *data = unmarkdown (n, r_config_get_i (core->config, "scr.color") > 0);
|
||||
const bool use_color = r_config_get_i (core->config, "scr.color") > 0;
|
||||
char *data = r_str_md2txt (n, use_color);
|
||||
free (n);
|
||||
return data;
|
||||
}
|
||||
|
@ -330,9 +330,8 @@ R_API char *r_core_cmd_call_str_at(RCore *core, ut64 addr, const char *cmd) {
|
||||
return retstr;
|
||||
}
|
||||
|
||||
// R2_600 - return void
|
||||
R_API int r_core_bind(RCore *core, RCoreBind *bnd) {
|
||||
R_RETURN_VAL_IF_FAIL (core && bnd, false);
|
||||
R_API void r_core_bind(RCore *core, RCoreBind *bnd) {
|
||||
R_RETURN_IF_FAIL (core && bnd);
|
||||
bnd->core = core;
|
||||
bnd->bphit = (RCoreDebugBpHit)r_core_debug_breakpoint_hit;
|
||||
bnd->syshit = (RCoreDebugSyscallHit)r_core_debug_syscall_hit;
|
||||
@ -353,7 +352,6 @@ R_API int r_core_bind(RCore *core, RCoreBind *bnd) {
|
||||
bnd->isMapped = (RCoreIsMapped)__isMapped;
|
||||
bnd->syncDebugMaps = (RCoreDebugMapsSync)__syncDebugMaps;
|
||||
bnd->pjWithEncoding = (RCorePJWithEncoding)r_core_pj_new;
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API RCore *r_core_ncast(ut64 p) {
|
||||
|
@ -318,8 +318,8 @@ R_API bool r_core_hack(RCore *core, const char *op) {
|
||||
if (core->blocksize < 4) {
|
||||
return false;
|
||||
}
|
||||
#if R2_600
|
||||
// R2_590 TODO: call RArch.patch() if available, otherwise just do this hack until all anal plugs are moved to arch
|
||||
#if 0
|
||||
// R2_600 TODO: call RArch.patch() if available, otherwise just do this hack until all anal plugs are moved to arch
|
||||
// r_arch_patch (aop, 0);
|
||||
RArchSession *acur = R_UNWRAP3 (core, rasm, acur);
|
||||
if (acur && acur->plugin->patch) {
|
||||
|
@ -101,14 +101,13 @@ static bool __core_patch_bracket(RCore *core, const char *str, ut64 *noff) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// R2_600 - return boolean
|
||||
R_API int r_core_patch(RCore *core, const char *patch) {
|
||||
R_API bool r_core_patch(RCore *core, const char *patch) {
|
||||
char *p, *p0, *str;
|
||||
ut64 noff = 0LL;
|
||||
|
||||
p = p0 = str = strdup (patch);
|
||||
if (!p) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
for (; *p; p++) {
|
||||
/* read until newline */
|
||||
@ -144,5 +143,6 @@ R_API int r_core_patch(RCore *core, const char *patch) {
|
||||
str = p;
|
||||
}
|
||||
free (p0);
|
||||
return 0;
|
||||
// TODO do some minimum error checking
|
||||
return true;
|
||||
}
|
||||
|
@ -278,12 +278,12 @@ R_API int r_cmd_macro_break(RCmdMacro *mac, const char *value);
|
||||
|
||||
R_API bool r_cmd_alias_del(RCmd *cmd, const char *k);
|
||||
R_API const char **r_cmd_alias_keys(RCmd *cmd);
|
||||
R_API int r_cmd_alias_set_cmd(RCmd *cmd, const char *k, const char *v);
|
||||
R_API bool r_cmd_alias_set_cmd(RCmd *cmd, const char *k, const char *v);
|
||||
R_API int r_cmd_alias_set_str(RCmd *cmd, const char *k, const char *v);
|
||||
R_API int r_cmd_alias_set_raw(RCmd *cmd, const char *k, const ut8 *v, int sz);
|
||||
R_API RCmdAliasVal *r_cmd_alias_get(RCmd *cmd, const char *k);
|
||||
R_API int r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a);
|
||||
R_API int r_cmd_alias_append_raw(RCmd *cmd, const char *k, const ut8 *a, int sz);
|
||||
R_API bool r_cmd_alias_append_str(RCmd *cmd, const char *k, const char *a);
|
||||
R_API bool r_cmd_alias_append_raw(RCmd *cmd, const char *k, const ut8 *a, int sz);
|
||||
R_API char *r_cmd_alias_val_strdup(RCmdAliasVal *v);
|
||||
R_API char *r_cmd_alias_val_strdup_b64(RCmdAliasVal *v);
|
||||
R_API void r_cmd_alias_free(RCmd *cmd);
|
||||
|
@ -437,8 +437,7 @@ typedef struct r_core_item_t {
|
||||
|
||||
R_API RCoreItem *r_core_item_at(RCore *core, ut64 addr);
|
||||
R_API void r_core_item_free(RCoreItem *ci);
|
||||
|
||||
R_API int r_core_bind(RCore *core, RCoreBind *bnd);
|
||||
R_API void r_core_bind(RCore *core, RCoreBind *bnd);
|
||||
|
||||
typedef struct r_core_cmpwatch_t {
|
||||
ut64 addr;
|
||||
@ -549,7 +548,7 @@ R_API int r_core_visual_anal_classes(RCore *core);
|
||||
R_API int r_core_visual_types(RCore *core);
|
||||
R_API int r_core_visual(RCore *core, const char *input);
|
||||
R_API void r_core_visual_find(RCore *core, RAGraph *g);
|
||||
R_API int r_core_visual_graph(RCore *core, RAGraph *g, RAnalFunction *_fcn, int mode);
|
||||
R_API bool r_core_visual_graph(RCore *core, RAGraph *g, RAnalFunction *_fcn, int mode);
|
||||
R_API void r_core_visual_browse(RCore *core, const char *arg);
|
||||
R_API int r_core_visual_cmd(RCore *core, const char *arg);
|
||||
R_API void r_core_visual_seek_animation(RCore *core, ut64 addr);
|
||||
@ -697,7 +696,6 @@ R_API ut64 r_core_anal_fcn_list_size(RCore *core);
|
||||
R_API void r_core_anal_fcn_labels(RCore *core, RAnalFunction *fcn, int rad);
|
||||
R_API int r_core_anal_fcn_clean(RCore *core, ut64 addr);
|
||||
R_API int r_core_print_bb_custom(RCore *core, RAnalFunction *fcn);
|
||||
R_API int r_core_print_bb_gml(RCore *core, RAnalFunction *fcn);
|
||||
R_API int r_core_anal_graph(RCore *core, ut64 addr, int opts);
|
||||
R_API int r_core_anal_graph_fcn(RCore *core, char *input, int opts);
|
||||
R_API RList* r_core_anal_graph_to(RCore *core, ut64 addr, int n);
|
||||
@ -884,7 +882,7 @@ R_API int r_core_search_preludes(RCore *core, bool log);
|
||||
R_API int r_core_search_prelude(RCore *core, ut64 from, ut64 to, const ut8 *buf, int blen, const ut8 *mask, int mlen);
|
||||
R_API RList* /*<RIOMap*>*/ r_core_get_boundaries_prot(RCore *core, int protection, const char *mode, const char *prefix);
|
||||
|
||||
R_API int r_core_patch(RCore *core, const char *patch);
|
||||
R_API bool r_core_patch(RCore *core, const char *patch);
|
||||
|
||||
R_API bool r_core_hack(RCore *core, const char *op);
|
||||
R_API bool r_core_dump(RCore *core, const char *file, ut64 addr, ut64 size, int append);
|
||||
|
@ -183,6 +183,7 @@ R_API char *r_str_word_get_first(const char *string);
|
||||
R_API void r_str_trim(char *str);
|
||||
R_API void r_str_trim_emptylines(char *str);
|
||||
R_API int r_str_ntrim(char *str, int n);
|
||||
R_API char *r_str_md2txt(const char *page, bool usecolor);
|
||||
R_API char *r_str_wrap(const char *str, int w);
|
||||
R_API char *r_str_trim_dup(const char *str);
|
||||
R_API char *r_str_trim_ndup(const char *str, size_t n);
|
||||
|
190
libr/util/str.c
190
libr/util/str.c
@ -4181,3 +4181,193 @@ R_API R_MUSTUSE char *r_str_after(char *s, char c) {
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void fill_line(RStrBuf *sb, int maxcol) {
|
||||
int i;
|
||||
if (maxcol < 1) {
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < maxcol; i++) {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
r_strbuf_append (sb, Color_RESET_BG);
|
||||
r_strbuf_append (sb, Color_RESET);
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
|
||||
R_API char *r_str_md2txt(const char *page, bool usecolor) {
|
||||
char *b = r_file_slurp (page, NULL);
|
||||
RStrBuf *sb = r_strbuf_new ("");
|
||||
int col = 0;
|
||||
const int maxcol = 75;
|
||||
bool codeblock = false;
|
||||
bool contline = false;
|
||||
bool title = false;
|
||||
bool codeblockline = false;
|
||||
while (*b) {
|
||||
int ch = *b;
|
||||
repeat:
|
||||
switch (ch) {
|
||||
case 10:
|
||||
if (codeblock || title) {
|
||||
const int j = title? maxcol + 2: maxcol - 4;
|
||||
if (usecolor) {
|
||||
if (!contline) {
|
||||
fill_line (sb, j - col);
|
||||
}
|
||||
if (title) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
}
|
||||
}
|
||||
title = false;
|
||||
}
|
||||
if (contline) {
|
||||
contline = false;
|
||||
} else {
|
||||
col = 0;
|
||||
}
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_RESET);
|
||||
}
|
||||
if (!codeblock) {
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
if (codeblockline) {
|
||||
codeblock = false;
|
||||
codeblockline = false;
|
||||
}
|
||||
break;
|
||||
case '\t':
|
||||
if (col == 0) {
|
||||
codeblock = true;
|
||||
codeblockline = true;
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
// ignore
|
||||
break;
|
||||
default:
|
||||
if (col > maxcol) {
|
||||
ch = 10;
|
||||
if (*b == ' ') {
|
||||
b++;
|
||||
} else {
|
||||
if (codeblock) {
|
||||
col = 1;
|
||||
// nothing
|
||||
} else {
|
||||
r_strbuf_append (sb, "-");
|
||||
}
|
||||
#if 0
|
||||
contline = true;
|
||||
if (codeblock) {
|
||||
r_strbuf_append (sb, "\n");
|
||||
col = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
b--;
|
||||
goto repeat;
|
||||
}
|
||||
if (col == 0) {
|
||||
if (r_str_startswith (b, "```")) {
|
||||
while (*b && *b != '\n') {
|
||||
b++;
|
||||
}
|
||||
codeblock = !codeblock;
|
||||
if (!codeblock) {
|
||||
r_strbuf_append (sb, Color_RESET_BG);
|
||||
}
|
||||
continue;
|
||||
} else if (!codeblock && r_str_startswith (b, "###")) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
r_strbuf_append (sb, Color_BLUE);
|
||||
r_strbuf_append (sb, Color_BGCYAN);
|
||||
}
|
||||
r_strbuf_append (sb, " ");
|
||||
b += 3;
|
||||
title = true;
|
||||
} else if (!codeblock && r_str_startswith (b, "##")) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
fill_line (sb, maxcol + 4);
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGBLUE);
|
||||
}
|
||||
r_strbuf_append (sb, " ");
|
||||
ch = ' ';
|
||||
b += 2;
|
||||
title = true;
|
||||
} else if (!codeblock && r_str_startswith (b, "#")) {
|
||||
RStrBuf *sb2 = r_strbuf_new ("");
|
||||
while (*b) {
|
||||
if (*b == '\n') {
|
||||
b++;
|
||||
break;
|
||||
}
|
||||
r_strbuf_appendf (sb2, "%c", *b);
|
||||
b++;
|
||||
}
|
||||
char *sb2s = r_strbuf_drain (sb2);
|
||||
char *sb2ss = r_str_ss (sb2s, 0, 0);
|
||||
char *p = sb2ss;
|
||||
char *nextlist = strstr (p, "\n");
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_BLACK);
|
||||
r_strbuf_append (sb, Color_BGGREEN);
|
||||
}
|
||||
while (nextlist) {
|
||||
char *line = r_str_ndup (p, nextlist - p);
|
||||
r_strbuf_appendf (sb, "%s", line);
|
||||
int col = strlen (line);
|
||||
int i;
|
||||
for (i = col; i < maxcol + 1; i++) {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, " ");
|
||||
r_strbuf_append (sb, " "Color_RESET_BG""Color_RESET"\n"Color_BGGREEN""Color_BLACK);
|
||||
} else {
|
||||
r_strbuf_append (sb, " \n");
|
||||
}
|
||||
p = nextlist + 1;
|
||||
nextlist = strstr (p, "\n");
|
||||
}
|
||||
//r_strbuf_append (sb, sb2ss);
|
||||
free (sb2ss);
|
||||
free (sb2s);
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, Color_RESET_BG""Color_RESET"\n");
|
||||
} else {
|
||||
r_strbuf_append (sb, "\n");
|
||||
}
|
||||
title = false;
|
||||
break;
|
||||
} else {
|
||||
if (codeblock) {
|
||||
if (usecolor) {
|
||||
r_strbuf_append (sb, " "Color_BGYELLOW" "Color_BLACK);
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
} else {
|
||||
r_strbuf_append (sb, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
col ++;
|
||||
r_strbuf_appendf (sb, "%c", ch);
|
||||
break;
|
||||
}
|
||||
b++;
|
||||
}
|
||||
return r_strbuf_drain (sb);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user