From 5f33adbd836404f00673fa0cd1043138e54a9851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20=C3=80lvarez=20i=20Capilla?= Date: Wed, 27 Oct 2021 00:39:09 +0200 Subject: [PATCH] Implement RCore.visual_slides() ##visual * Add clearkeys() helper and r2slides example --- doc/r2slides.txt | 40 +++++++++++ libr/core/Makefile | 2 +- libr/core/cmd.c | 6 ++ libr/core/core.c | 4 +- libr/core/meson.build | 1 + libr/core/vslides.c | 158 ++++++++++++++++++++++++++++++++++++++++++ libr/include/r_core.h | 1 + libr/util/sstext.c | 4 +- 8 files changed, 211 insertions(+), 5 deletions(-) create mode 100644 doc/r2slides.txt create mode 100644 libr/core/vslides.c diff --git a/doc/r2slides.txt b/doc/r2slides.txt new file mode 100644 index 0000000000..c52af5c468 --- /dev/null +++ b/doc/r2slides.txt @@ -0,0 +1,40 @@ +# Welcome to radare2 +--label:title + +This is an introductory course to radare2 + +`?E Welcome to r2land` + +`o;pd 4` + +--gotokey:i:insert +Press 'n' for next slide (or the spacebar) +Press 'p' to see clippy moving + + +--pancake + +# Contents + +We will cover the following topics: + +* What is radare2? +* How to install it +* Basic shell usage +* Scripting examples + +# Insertion +--label:insert + +To insert stuff press : to enter shell and then +use the 'w' command to write a string. + +`?ef w hello world` + +# Questions + +Please send me an email + +In this course we will see: + +--pancake diff --git a/libr/core/Makefile b/libr/core/Makefile index ea6d23e4c1..89b962af22 100644 --- a/libr/core/Makefile +++ b/libr/core/Makefile @@ -9,7 +9,7 @@ R2DEPS+=r_reg r_search r_syscall r_socket r_fs r_magic r_crypto OBJS=core.o cmd.o cfile.o cconfig.o visual.o cio.o yank.o libs.o agraph.o OBJS+=fortune.o hack.o vasm.o patch.o cbin.o corelog.o rtr.o cmd_api.o OBJS+=carg.o canal.o project.o gdiff.o casm.o disasm.o cplugin.o rvc.o -OBJS+=vmenus.o vmenus_graph.o vmenus_zigns.o zdiff.o citem.o +OBJS+=vmenus.o vmenus_graph.o vmenus_zigns.o zdiff.o citem.o vslides.o OBJS+=task.o panels.o pseudo.o vmarks.o anal_tp.o anal_objc.o blaze.o cundo.o OBJS+=cproject.o diff --git a/libr/core/cmd.c b/libr/core/cmd.c index 8a2b128b92..5d577886cb 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -327,6 +327,7 @@ static const char *help_msg_v[] = { "Usage:", "v[*i]", "", "v", "", "open visual panels", "v", " test", "load saved layout with name test", + "v.", " [file]", "load visual script (also known as slides)", "v=", " test", "save current layout with name test", "vi", " test", "open the file test in 'cfg.editor'", NULL @@ -2424,6 +2425,11 @@ static int cmd_panels(void *data, const char *input) { if (core->vmode) { return false; } + if (*input == '.') { + const char *f = r_str_trim_head_ro (input + 1); + r_core_visual_slides (core, f); + return false; + } if (*input == '?') { r_core_cmd_help (core, help_msg_v); return false; diff --git a/libr/core/core.c b/libr/core/core.c index 4fdd60d10b..5d8e0e11c6 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -1091,7 +1091,7 @@ static const char *radare_argv[] = { "tu?", "tu", "tuj", "tu*", "tuc", "tt?", "tt", "ttj", "ttc", "T?", "T", "T*", "T-", "Tl", "Tj", "Tm", "Ts", "TT", "T=", "T=.", "T=&", "u?", "u", "uw", "us", "uc", - "v", "V", "v!", "vv", "vV", "vVV", "VV", + "v", "v.", "V", "v!", "vv", "vV", "vVV", "VV", "w?", "w", "w1+", "w1-", "w2+", "w2-", "w4+", "w4-", "w8+", "w8-", "w0", "w", "w6", "w6d", "w6e", "wa", "wa*", "waf", "wao?", "wao", "wA?", "wA", "wB", "wB-", "wc", "wcj", "wc-", "wc+", "wc*", "wcr", "wci", "wcp", "wcp*", "wcpi", @@ -2574,7 +2574,7 @@ static void __init_autocomplete_default (RCore* core) { "db-", "dbc", "dbC", "dbd", "dbe", "dbs", "dbi", "dbte", "dbtd", "dbts", NULL }; const char *files[] = { - ".", "..", ".*", ":. ", "/F", "/m", "!", "!!", "#!c", "#!v", "#!cpipe", "#!vala", + ".", "..", ".*", ":. ", "/F", "/m", "!", "!!", "#!c", "#!v", "#!cpipe", "#!vala", "v.", "#!rust", "#!zig", "#!pipe", "#!python", "aeli", "arp", "arpg", "dmd", "drp", "drpg", "o", "idp", "idpi", "L", "obf", "o+", "oc", "r2", "rabin2", "rasm2", "rahash2", "rax2", "rafind2", "cd", "ls", "on", "op", "wf", "rm", "wF", "wp", "Sd", "Sl", "to", "pm", diff --git a/libr/core/meson.build b/libr/core/meson.build index 0646d098db..7fdfe9ae3d 100644 --- a/libr/core/meson.build +++ b/libr/core/meson.build @@ -60,6 +60,7 @@ r_core_sources = [ 'task.c', 'vasm.c', 'visual.c', + 'vslides.c', 'vmarks.c', 'vmenus.c', 'vmenus_graph.c', diff --git a/libr/core/vslides.c b/libr/core/vslides.c new file mode 100644 index 0000000000..701a93aced --- /dev/null +++ b/libr/core/vslides.c @@ -0,0 +1,158 @@ +/* radare - LGPL - Copyright 2021 - pancake */ + +#include + +static char *keys[256] = {0}; + +static void clearkeys(void) { + int i; + for (i = 0; i < 256; i++) { + free (keys[i]); + keys[i] = NULL; + } +} + +static int findpage(RList *list, const char *pagename) { + int count = 0; + RListIter *iter; + char *s; + r_list_foreach (list, iter, s) { + if (!strncmp (s, "# ", 2)) { + count++; + } else if (r_str_startswith (s, "--label:")) { + const char *label = s + strlen ("--label:"); + if (!strcmp (pagename, label)) { + return count; + } + } + } + return -1; +} + +static int gotokey(RList *list, int ch, int page) { + if (keys[ch]) { + int npage = findpage (list, keys[ch]); + if (npage != -1) { + return npage; + } + } + return page; +} + +static void render(RCore *core, RList *list, int page) { + char *s; + if (page < 0) { + page = 0; + } + int count = 0; + RListIter *iter; + r_list_foreach (list, iter, s) { + if (!strncmp (s, "# ", 2)) { + count++; + } + if (count == page) { + if (*s == '`') { + char *cmd = r_str_ndup (s + 1, strlen (s) -2); + char *res = r_core_cmd_str (core, cmd); + r_cons_printf ("%s", res); + free (res); + free (cmd); + } else if (r_str_startswith (s, "--gotokey:")) { + char *kv = strdup (s + strlen ("--gotokey:")); + if (kv[0] && kv[1]) { + kv[1] = 0; + int k = kv[0]; + R_FREE (keys[k]); + if (kv[2]) { + keys[k] = strdup (kv + 2); + } + } + free (kv); + } else if (!strncmp (s, "--", 2)) { + // directive, do not print + + } else if (*s == '#') { + char *ss = r_str_ss (s, 0); + r_cons_printf ("%s\n", ss); + free (ss); + } else { + r_cons_printf (" %s\n", s); + } + } + } +} + +R_API void r_core_visual_slides(RCore *core, const char *file) { + bool having_fun = true; + char *data = r_file_slurp (file, NULL); + if (!data) { + eprintf ("Cannot open file.\n"); + return; + } + RList *list = r_str_split_list (data, "\n", 0); + + int ch; + int page = 1; + while (having_fun) { + clearkeys (); + r_cons_clear00 (); + render (core, list, page); + r_cons_flush (); + r_cons_enable_mouse (false); + ch = r_cons_readchar (); + ch = r_cons_arrow_to_hjkl (ch); + switch (ch) { + case 'q': + having_fun = false; + break; + case ' ': + case 'n': + page++; + break; + case 'p': + page--; + if (page < 1) { + page = 1; + } + break; + case '!': + // + { + r_core_cmdf (core, "vim %s", file); + char *ndata = r_file_slurp (file, NULL); + if (ndata) { + r_list_free (list); + free (data); + data = ndata; + list = r_str_split_list (data, "\n", 0); + } + } + break; + case ':': + r_cons_show_cursor (true); + r_cons_set_raw (0); + while (1) { + char cmd[1024]; + *cmd = 0; + r_line_set_prompt (":> "); + if (r_cons_fgets (cmd, sizeof (cmd), 0, NULL) < 0) { + cmd[0] = '\0'; + } + r_core_cmd0 (core, cmd); + if (!cmd[0]) { + break; + } + r_cons_flush (); + } + r_cons_show_cursor (false); + r_cons_set_raw (1); + r_cons_clear (); + break; + default: + page = gotokey (list, ch, page); + break; + } + } + r_list_free (list); + free (data); +} diff --git a/libr/include/r_core.h b/libr/include/r_core.h index 685e179e21..6bb3d9ff9b 100644 --- a/libr/include/r_core.h +++ b/libr/include/r_core.h @@ -504,6 +504,7 @@ R_API void r_core_anal_paths(RCore *core, ut64 from, ut64 to, bool followCalls, R_API void r_core_list_io(RCore *core); R_API RListInfo *r_listinfo_new (const char *name, RInterval pitv, RInterval vitv, int perm, const char *extra); R_API void r_listinfo_free (RListInfo *info); +R_API void r_core_visual_slides(RCore *core, const char *file); /* visual marks */ R_API void r_core_visual_mark_seek(RCore *core, ut8 ch); R_API void r_core_visual_mark(RCore *core, ut8 ch); diff --git a/libr/util/sstext.c b/libr/util/sstext.c index a3e4c33e23..00f23d6002 100644 --- a/libr/util/sstext.c +++ b/libr/util/sstext.c @@ -175,8 +175,8 @@ static const SevenSegments ss[] = { "| |"} }, { 'n', {" ", - " __ ", - "| |"} + "|\\ |", + "| \\|"} }, { 'o', {" ", " __ ",