From d3e643a4de8fb2cbd54d030a0ecc658e5749e947 Mon Sep 17 00:00:00 2001 From: Riccardo Schirone Date: Fri, 12 Feb 2021 14:23:03 +0100 Subject: [PATCH] core/cmd_analysis: extract API for agg commands --- librz/core/agraph.c | 93 +++++++++++++++++++++++++++++++++++++++ librz/core/cmd_analysis.c | 89 ++++++------------------------------- librz/core/core_private.h | 9 ++++ 3 files changed, 115 insertions(+), 76 deletions(-) diff --git a/librz/core/agraph.c b/librz/core/agraph.c index 4412775df1..dfef7e6b5a 100644 --- a/librz/core/agraph.c +++ b/librz/core/agraph.c @@ -4982,3 +4982,96 @@ RZ_IPI void rz_core_agraph_del_edge(RzCore *core, const char *un, const char *vn } rz_agraph_del_edge(core->graph, u, v); } + +RZ_IPI void rz_core_agraph_print_custom(RzCore *core) { + core->graph->can->linemode = rz_config_get_i(core->config, "graph.linemode"); + core->graph->can->color = rz_config_get_i(core->config, "scr.color"); + rz_agraph_set_title(core->graph, rz_config_get(core->config, "graph.title")); + rz_agraph_print(core->graph); +} + +RZ_IPI void rz_core_agraph_print_tiny(RzCore *core) { + core->graph->is_tiny = true; + int e = rz_config_get_i(core->config, "graph.edges"); + rz_config_set_i(core->config, "graph.edges", 0); + rz_core_visual_graph(core, core->graph, NULL, false); + rz_config_set_i(core->config, "graph.edges", e); + core->graph->is_tiny = false; +} + +RZ_IPI void rz_core_agraph_print_sdb(RzCore *core) { + Sdb *db = rz_agraph_get_sdb(core->graph); + char *o = sdb_querys(db, "null", 0, "*"); + rz_cons_print(o); + free(o); +} + +RZ_IPI void rz_core_agraph_print_interactive(RzCore *core) { + RzANode *ran = rz_agraph_get_first_node(core->graph); + if (!ran) { + eprintf("This graph contains no nodes\n"); + return; + } + + ut64 oseek = core->offset; + rz_agraph_set_title(core->graph, rz_config_get(core->config, "graph.title")); + rz_agraph_set_curnode(core->graph, ran); + core->graph->force_update_seek = true; + core->graph->need_set_layout = true; + core->graph->layout = rz_config_get_i(core->config, "graph.layout"); + bool ov = rz_cons_is_interactive(); + core->graph->need_update_dim = true; + int update_seek = rz_core_visual_graph(core, core->graph, NULL, true); + rz_config_set_i(core->config, "scr.interactive", ov); + rz_cons_show_cursor(true); + rz_cons_enable_mouse(false); + if (update_seek != -1) { + rz_core_seek(core, oseek, false); + } +} + +RZ_IPI void rz_core_agraph_print_dot(RzCore *core) { + const char *font = rz_config_get(core->config, "graph.font"); + rz_cons_printf("digraph code {\nrankdir=LR;\noutputorder=edgesfirst\ngraph [bgcolor=azure];\n" + "edge [arrowhead=normal, color=\"#3030c0\" style=bold weight=2];\n" + "node [fillcolor=white, style=filled shape=box " + "fontname=\"%s\" fontsize=\"8\"];\n", + font); + rz_agraph_foreach(core->graph, agraph_print_node_dot, NULL); + rz_agraph_foreach_edge(core->graph, agraph_print_edge_dot, NULL); + rz_cons_printf("}\n"); +} + +RZ_IPI void rz_core_agraph_print_rizin(RzCore *core) { + rz_agraph_foreach(core->graph, agraph_print_node, NULL); + rz_agraph_foreach_edge(core->graph, agraph_print_edge, NULL); +} + +RZ_IPI void rz_core_agraph_print_json(RzCore *core) { + PJ *pj = pj_new(); + if (!pj) { + return; + } + pj_o(pj); + pj_k(pj, "nodes"); + pj_a(pj); + rz_agraph_print_json(core->graph, pj); + pj_end(pj); + pj_end(pj); + rz_cons_println(pj_string(pj)); + pj_free(pj); +} + +RZ_IPI void rz_core_agraph_print_gml(RzCore *core) { + rz_cons_printf("graph\n[\n" + "hierarchic 1\n" + "label \"\"\n" + "directed 1\n"); + rz_agraph_foreach(core->graph, agraph_print_node_gml, NULL); + rz_agraph_foreach_edge(core->graph, agraph_print_edge_gml, NULL); + rz_cons_print("]\n"); +} + +RZ_IPI void rz_core_agraph_print_write(RzCore *core, const char *filename) { + convert_dotcmd_to_image(core, "aggd", filename); +} diff --git a/librz/core/cmd_analysis.c b/librz/core/cmd_analysis.c index a608ef64ee..e3db49585e 100644 --- a/librz/core/cmd_analysis.c +++ b/librz/core/cmd_analysis.c @@ -7642,97 +7642,34 @@ RZ_API void rz_core_agraph_print(RzCore *core, int use_utf, const char *input) { } switch (*input) { case 0: - core->graph->can->linemode = rz_config_get_i(core->config, "graph.linemode"); - core->graph->can->color = rz_config_get_i(core->config, "scr.color"); - rz_agraph_set_title(core->graph, - rz_config_get(core->config, "graph.title")); - rz_agraph_print(core->graph); + rz_core_agraph_print_custom(core); break; - case 't': { // "aggt" - tiny graph - core->graph->is_tiny = true; - int e = rz_config_get_i(core->config, "graph.edges"); - rz_config_set_i(core->config, "graph.edges", 0); - rz_core_visual_graph(core, core->graph, NULL, false); - rz_config_set_i(core->config, "graph.edges", e); - core->graph->is_tiny = false; + case 't': // "aggt" - tiny graph + rz_core_agraph_print_tiny(core); break; - } case 'k': // "aggk" - { - Sdb *db = rz_agraph_get_sdb(core->graph); - char *o = sdb_querys(db, "null", 0, "*"); - rz_cons_print(o); - free(o); + rz_core_agraph_print_sdb(core); break; - } case 'v': // "aggv" case 'i': // "aggi" - open current core->graph in interactive mode - { - RzANode *ran = rz_agraph_get_first_node(core->graph); - if (ran) { - ut64 oseek = core->offset; - rz_agraph_set_title(core->graph, rz_config_get(core->config, "graph.title")); - rz_agraph_set_curnode(core->graph, ran); - core->graph->force_update_seek = true; - core->graph->need_set_layout = true; - core->graph->layout = rz_config_get_i(core->config, "graph.layout"); - bool ov = rz_cons_is_interactive(); - core->graph->need_update_dim = true; - int update_seek = rz_core_visual_graph(core, core->graph, NULL, true); - rz_config_set_i(core->config, "scr.interactive", ov); - rz_cons_show_cursor(true); - rz_cons_enable_mouse(false); - if (update_seek != -1) { - rz_core_seek(core, oseek, false); - } - } else { - eprintf("This graph contains no nodes\n"); - } + rz_core_agraph_print_interactive(core); break; - } - case 'd': { // "aggd" - dot format - const char *font = rz_config_get(core->config, "graph.font"); - rz_cons_printf("digraph code {\nrankdir=LR;\noutputorder=edgesfirst\ngraph [bgcolor=azure];\n" - "edge [arrowhead=normal, color=\"#3030c0\" style=bold weight=2];\n" - "node [fillcolor=white, style=filled shape=box " - "fontname=\"%s\" fontsize=\"8\"];\n", - font); - rz_agraph_foreach(core->graph, agraph_print_node_dot, NULL); - rz_agraph_foreach_edge(core->graph, agraph_print_edge_dot, NULL); - rz_cons_printf("}\n"); + case 'd': // "aggd" - dot format + rz_core_agraph_print_dot(core); break; - } case '*': // "agg*" - - rz_agraph_foreach(core->graph, agraph_print_node, NULL); - rz_agraph_foreach_edge(core->graph, agraph_print_edge, NULL); + rz_core_agraph_print_rizin(core); break; case 'J': // "aggJ" - case 'j': { // "aggj" - PJ *pj = pj_new(); - if (!pj) { - return; - } - pj_o(pj); - pj_k(pj, "nodes"); - pj_a(pj); - rz_agraph_print_json(core->graph, pj); - pj_end(pj); - pj_end(pj); - rz_cons_println(pj_string(pj)); - pj_free(pj); - } break; + case 'j': // "aggj" + rz_core_agraph_print_json(core); + break; case 'g': // "aggg" - rz_cons_printf("graph\n[\n" - "hierarchic 1\n" - "label \"\"\n" - "directed 1\n"); - rz_agraph_foreach(core->graph, agraph_print_node_gml, NULL); - rz_agraph_foreach_edge(core->graph, agraph_print_edge_gml, NULL); - rz_cons_print("]\n"); + rz_core_agraph_print_gml(core); break; case 'w': { // "aggw" const char *filename = rz_str_trim_head_ro(input + 1); - convert_dotcmd_to_image(core, "aggd", filename); + rz_core_agraph_print_write(core, filename); break; } default: diff --git a/librz/core/core_private.h b/librz/core/core_private.h index f14c9ce998..a3cdde3cad 100644 --- a/librz/core/core_private.h +++ b/librz/core/core_private.h @@ -16,6 +16,15 @@ RZ_IPI void rz_core_agraph_add_node(RzCore *core, const char *title, const char RZ_IPI void rz_core_agraph_del_node(RzCore *core, const char *title); RZ_IPI void rz_core_agraph_add_edge(RzCore *core, const char *un, const char *vn); RZ_IPI void rz_core_agraph_del_edge(RzCore *core, const char *un, const char *vn); +RZ_IPI void rz_core_agraph_print_custom(RzCore *core); +RZ_IPI void rz_core_agraph_print_tiny(RzCore *core); +RZ_IPI void rz_core_agraph_print_sdb(RzCore *core); +RZ_IPI void rz_core_agraph_print_interactive(RzCore *core); +RZ_IPI void rz_core_agraph_print_dot(RzCore *core); +RZ_IPI void rz_core_agraph_print_rizin(RzCore *core); +RZ_IPI void rz_core_agraph_print_json(RzCore *core); +RZ_IPI void rz_core_agraph_print_gml(RzCore *core); +RZ_IPI void rz_core_agraph_print_write(RzCore *core, const char *filename); /* cdebug.c */ RZ_IPI bool rz_core_debug_reg_set(RzCore *core, const char *regname, ut64 val, const char *strval);