From c42d25c2550d51c8aed6f0aa3635d5baec5b1948 Mon Sep 17 00:00:00 2001 From: Vanellope Date: Sat, 11 May 2019 17:09:17 +0900 Subject: [PATCH] Improve visual mark ##visual --- libr/core/cmd_flag.c | 9 ++++++--- libr/core/visual.c | 28 ++++++++++++++++++++++++++-- libr/core/vmarks.c | 25 ++++++++++++++++++++++--- libr/include/r_core.h | 3 ++- 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/libr/core/cmd_flag.c b/libr/core/cmd_flag.c index 1ed33e9781..6d109bbe23 100644 --- a/libr/core/cmd_flag.c +++ b/libr/core/cmd_flag.c @@ -562,9 +562,12 @@ rep: break; case ' ': { - const char *arg = strchr (input+2, ' '); - ut64 addr = arg? r_num_math (core->num, arg): core->offset; - r_core_visual_mark_set (core, atoi (input+1), addr); + const int ASCII_MAX = 127; + if (atoi (input+1) + ASCII_MAX + 1 < UT8_MAX) { + const char *arg = strchr (input+2, ' '); + ut64 addr = arg? r_num_math (core->num, arg): core->offset; + r_core_visual_mark_set (core, atoi (input+1) + ASCII_MAX + 1, addr); + } } break; case '?': diff --git a/libr/core/visual.c b/libr/core/visual.c index b9d59ceba4..343459e5aa 100644 --- a/libr/core/visual.c +++ b/libr/core/visual.c @@ -3074,10 +3074,34 @@ R_API int r_core_visual_cmd(RCore *core, const char *arg) { //r_core_cmd0 (core, "=H"); break; case 'm': - r_core_visual_mark (core, r_cons_readchar ()); + { + r_cons_gotoxy (0, 0); + r_cons_printf (R_CONS_CLEAR_LINE"Set shortcut key for 0x%"PFMT64x"\n", core->offset); + r_cons_flush (); + int ch = r_cons_readchar (); + r_core_visual_mark (core, ch); + } + break; + case 'M': + { + r_cons_gotoxy (0, 0); + if (r_core_visual_mark_dump (core)) { + r_cons_printf (R_CONS_CLEAR_LINE"Remove a shortcut key from the list\n"); + r_cons_flush (); + int ch = r_cons_readchar (); + r_core_visual_mark_del (core, ch); + } + } break; case '\'': - r_core_visual_mark_seek (core, r_cons_readchar ()); + { + r_cons_gotoxy (0, 0); + if (r_core_visual_mark_dump (core)) { + r_cons_flush (); + int ch = r_cons_readchar (); + r_core_visual_mark_seek (core, ch); + } + } break; case 'y': if (core->print->ocur == -1) { diff --git a/libr/core/vmarks.c b/libr/core/vmarks.c index ac95b1ed82..508a8c1a6d 100644 --- a/libr/core/vmarks.c +++ b/libr/core/vmarks.c @@ -2,6 +2,8 @@ #include +#define ASCII_MAX 127 + /* maybe move this into RCore */ static bool marks_init = false; static ut64 marks[UT8_MAX + 1]; @@ -14,16 +16,23 @@ R_API void r_core_visual_mark_reset(RCore *core) { } } -R_API void r_core_visual_mark_dump(RCore *core) { +R_API bool r_core_visual_mark_dump(RCore *core) { int i; + bool out = false; if (!marks_init) { - return; + return out; } for (i = 0; i < UT8_MAX; i++) { if (marks[i] != UT64_MAX) { - r_cons_printf ("fV %d 0x%"PFMT64x"\n", i, marks[i]); + if (i > ASCII_MAX) { + r_cons_printf ("fV %d 0x%"PFMT64x"\n", i - ASCII_MAX - 1, marks[i]); + } else { + r_cons_printf ("fV %c 0x%"PFMT64x"\n", i, marks[i]); + } + out = true; } } + return out; } R_API void r_core_visual_mark_set(RCore *core, ut8 ch, ut64 addr) { @@ -33,7 +42,17 @@ R_API void r_core_visual_mark_set(RCore *core, ut8 ch, ut64 addr) { marks[ch] = addr; } +R_API void r_core_visual_mark_del(RCore *core, ut8 ch) { + if (!marks_init) { + return; + } + marks[ch] = UT64_MAX; +} + R_API void r_core_visual_mark(RCore *core, ut8 ch) { + if (IS_DIGIT (ch)) { + ch += ASCII_MAX + 1; + } r_core_visual_mark_set (core, ch, core->offset); } diff --git a/libr/include/r_core.h b/libr/include/r_core.h index 15a1add1ab..a65331ca73 100644 --- a/libr/include/r_core.h +++ b/libr/include/r_core.h @@ -442,7 +442,8 @@ R_API void r_core_visual_list(RCore *core, RList* list, ut64 seek, ut64 len, int R_API void r_core_visual_mark_seek(RCore *core, ut8 ch); R_API void r_core_visual_mark(RCore *core, ut8 ch); R_API void r_core_visual_mark_set(RCore *core, ut8 ch, ut64 addr); -R_API void r_core_visual_mark_dump(RCore *core); +R_API void r_core_visual_mark_del(RCore *core, ut8 ch); +R_API bool r_core_visual_mark_dump(RCore *core); R_API void r_core_visual_mark_reset(RCore *core); R_API int r_core_search_cb(RCore *core, ut64 from, ut64 to, RCoreSearchCallback cb);