From 04b82729dc2d8b5e2edfaf9def83a962727b8ae6 Mon Sep 17 00:00:00 2001 From: Aswin C Date: Fri, 19 Feb 2021 17:47:40 +0530 Subject: [PATCH 01/10] Refactor types: extract API for `ttc` and `tt` ##refactor --- librz/core/cmd.c | 3 +- librz/core/cmd_type.c | 166 ++++++++++++++++++++-------------------- librz/include/rz_core.h | 3 + 3 files changed, 90 insertions(+), 82 deletions(-) diff --git a/librz/core/cmd.c b/librz/core/cmd.c index 124f9388adf..a6e19a0f479 100644 --- a/librz/core/cmd.c +++ b/librz/core/cmd.c @@ -380,7 +380,8 @@ static bool lastcmd_repeat(RzCore *core, int next) { case '$': if (!strncmp(core->lastcmd, "pd", 2)) { if (core->lastcmd[2] == ' ') { - rz_core_cmdf(core, "so %s", core->lastcmd + 3); + ut64 addr = rz_num_math(core->num, core->lastcmd + 3); + rz_core_seek_opcode(core, addr, false); } else { rz_core_cmd0(core, "so `pi~?`"); } diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index bcb51de8218..d48d59fe294 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -176,10 +176,6 @@ static const char *help_msg_tu[] = { NULL }; -static void show_help(RzCore *core) { - rz_core_cmd_help(core, help_msg_t); -} - static void __core_cmd_tcc(RzCore *core, const char *input) { switch (*input) { case '?': @@ -235,7 +231,7 @@ static void __core_cmd_tcc(RzCore *core, const char *input) { rz_list_free(list); } break; case 'k': - rz_core_cmd0(core, "afck"); + rz_core_kuery_print(core, "analysis/cc/*"); break; case ' ': if (strchr(input, '(')) { @@ -729,6 +725,76 @@ static void set_offset_hint(RzCore *core, RzAnalysisOp *op, const char *type, ut } } +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB) { + PJ *pj = NULL; + if (input[1] == 'j') { + pj = pj_new(); + pj_o(pj); + } + char *name = NULL; + SdbKv *kv; + SdbListIter *iter; + SdbList *l = sdb_foreach_list(TDB, true); + ls_foreach (l, iter, kv) { + if (!strcmp(sdbkv_value(kv), "typedef")) { + if (!name || strcmp(sdbkv_value(kv), name)) { + free(name); + name = strdup(sdbkv_key(kv)); + if (!input[1]) { + rz_cons_println(name); + } else { + const char *q = sdb_fmt("typedef.%s", name); + const char *res = sdb_const_get(TDB, q, 0); + pj_ks(pj, name, res); + } + } + } + } + if (input[1] == 'j') { + pj_end(pj); + } + if (pj) { + rz_cons_printf("%s\n", pj_string(pj)); + pj_free(pj); + } + free(name); + ls_free(l); +} + +RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *input, Sdb *TDB) { + char *name = NULL; + SdbKv *kv; + SdbListIter *iter; + SdbList *l = sdb_foreach_list(TDB, true); + const char *arg = rz_str_trim_head_ro(input + 2); + bool match = false; + ls_foreach (l, iter, kv) { + if (!strcmp(sdbkv_value(kv), "typedef")) { + if (!name || strcmp(sdbkv_value(kv), name)) { + free(name); + name = strdup(sdbkv_key(kv)); + if (name && (arg && *arg)) { + if (!strcmp(arg, name)) { + match = true; + } else { + continue; + } + } + const char *q = sdb_fmt("typedef.%s", name); + const char *res = sdb_const_get(TDB, q, 0); + if (res) { + rz_cons_printf("%s %s %s;\n", sdbkv_value(kv), res, name); + } + if (match) { + break; + } + } + } + } + free(name); + ls_free(l); +} + RZ_API int rz_core_get_stacksz(RzCore *core, ut64 from, ut64 to) { int stack = 0, maxstack = 0; ut64 at = from; @@ -973,13 +1039,13 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { print_struct_union_list_json(TDB, stdifunion); } break; - case 'c': + case 'c': // "tuc" print_struct_union_in_c_format(TDB, stdifunion, rz_str_trim_head_ro(input + 2), true); break; - case 'd': + case 'd': // "tud" print_struct_union_in_c_format(TDB, stdifunion, rz_str_trim_head_ro(input + 2), false); break; - case ' ': + case ' ': // "tu " showFormat(core, rz_str_trim_head_ro(input + 1), 0); break; case 0: @@ -1010,15 +1076,15 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { if (name && type) { name++; // skip the '.' if (rz_str_startswith(type, "struct")) { - rz_core_cmdf(core, "tsc %s", name); + print_struct_union_in_c_format(TDB, stdifstruct, rz_str_trim_head_ro(input + 2), true); } else if (rz_str_startswith(type, "union")) { - rz_core_cmdf(core, "tuc %s", name); + print_struct_union_in_c_format(TDB, stdifunion, rz_str_trim_head_ro(input + 2), true); } else if (rz_str_startswith(type, "enum")) { - rz_core_cmdf(core, "tec %s", name); + print_enum_in_c_format(TDB, rz_str_trim_head_ro(input + 2), true); } else if (rz_str_startswith(type, "typedef")) { - rz_core_cmdf(core, "ttc %s", name); + rz_core_list_typename_alias_c(core, input, TDB); } else if (rz_str_startswith(type, "func")) { - rz_core_cmdf(core, "tfc %s", name); + printFunctionTypeC(core, input + 3); } } break; @@ -1627,78 +1693,16 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { break; } break; - case 't': { + case 't': { // "tt" if (!input[1] || input[1] == 'j') { - PJ *pj = NULL; - if (input[1] == 'j') { - pj = pj_new(); - pj_o(pj); - } - char *name = NULL; - SdbKv *kv; - SdbListIter *iter; - SdbList *l = sdb_foreach_list(TDB, true); - ls_foreach (l, iter, kv) { - if (!strcmp(sdbkv_value(kv), "typedef")) { - if (!name || strcmp(sdbkv_value(kv), name)) { - free(name); - name = strdup(sdbkv_key(kv)); - if (!input[1]) { - rz_cons_println(name); - } else { - const char *q = sdb_fmt("typedef.%s", name); - const char *res = sdb_const_get(TDB, q, 0); - pj_ks(pj, name, res); - } - } - } - } - if (input[1] == 'j') { - pj_end(pj); - } - if (pj) { - rz_cons_printf("%s\n", pj_string(pj)); - pj_free(pj); - } - free(name); - ls_free(l); + rz_core_list_loaded_typedefs(core, input, TDB); break; } - if (input[1] == 'c') { - char *name = NULL; - SdbKv *kv; - SdbListIter *iter; - SdbList *l = sdb_foreach_list(TDB, true); - const char *arg = rz_str_trim_head_ro(input + 2); - bool match = false; - ls_foreach (l, iter, kv) { - if (!strcmp(sdbkv_value(kv), "typedef")) { - if (!name || strcmp(sdbkv_value(kv), name)) { - free(name); - name = strdup(sdbkv_key(kv)); - if (name && (arg && *arg)) { - if (!strcmp(arg, name)) { - match = true; - } else { - continue; - } - } - const char *q = sdb_fmt("typedef.%s", name); - const char *res = sdb_const_get(TDB, q, 0); - if (res) { - rz_cons_printf("%s %s %s;\n", sdbkv_value(kv), res, name); - } - if (match) { - break; - } - } - } - } - free(name); - ls_free(l); + if (input[1] == 'c') { // "ttc" + rz_core_list_typename_alias_c(core, input, TDB); break; } - if (input[1] == '?') { + if (input[1] == '?') { // "tt?" rz_core_cmd_help(core, help_msg_tt); break; } @@ -1717,7 +1721,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { free(s); } break; case '?': - show_help(core); + rz_core_cmd_help(core, help_msg_t); break; } return true; diff --git a/librz/include/rz_core.h b/librz/include/rz_core.h index 1abdf3b8d56..2a1baa409d9 100644 --- a/librz/include/rz_core.h +++ b/librz/include/rz_core.h @@ -840,6 +840,9 @@ typedef struct { RzCoreAnalStatsItem *block; } RzCoreAnalStats; +RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *input, Sdb *TDB); +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB); + RZ_API char *rz_core_analysis_hasrefs(RzCore *core, ut64 value, int mode); RZ_API char *rz_core_analysis_get_comments(RzCore *core, ut64 addr); RZ_API RzCoreAnalStats *rz_core_analysis_get_stats(RzCore *a, ut64 from, ut64 to, ut64 step); From 0d3d4f4135347a11c5f264ff38ed11f82ac9b3c9 Mon Sep 17 00:00:00 2001 From: Aswin C Date: Fri, 19 Feb 2021 19:48:33 +0530 Subject: [PATCH 02/10] Pass a predifined variable on `tc` --- librz/core/cmd_type.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index d48d59fe294..924ea3f906f 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -1076,11 +1076,11 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { if (name && type) { name++; // skip the '.' if (rz_str_startswith(type, "struct")) { - print_struct_union_in_c_format(TDB, stdifstruct, rz_str_trim_head_ro(input + 2), true); + print_struct_union_in_c_format(TDB, stdifstruct, name, true); } else if (rz_str_startswith(type, "union")) { - print_struct_union_in_c_format(TDB, stdifunion, rz_str_trim_head_ro(input + 2), true); + print_struct_union_in_c_format(TDB, stdifunion, name, true); } else if (rz_str_startswith(type, "enum")) { - print_enum_in_c_format(TDB, rz_str_trim_head_ro(input + 2), true); + print_enum_in_c_format(TDB, name, true); } else if (rz_str_startswith(type, "typedef")) { rz_core_list_typename_alias_c(core, input, TDB); } else if (rz_str_startswith(type, "func")) { From d3eacb777df2f7d946dfa44d785199ff6e6fcf9e Mon Sep 17 00:00:00 2001 From: Aswin C Date: Sat, 20 Feb 2021 20:50:07 +0530 Subject: [PATCH 03/10] Add tests for `tfc` and `tsc` --- librz/core/cmd_type.c | 2 +- test/db/cmd/cmd_tc | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index 924ea3f906f..488ab1df9f5 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -1084,7 +1084,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { } else if (rz_str_startswith(type, "typedef")) { rz_core_list_typename_alias_c(core, input, TDB); } else if (rz_str_startswith(type, "func")) { - printFunctionTypeC(core, input + 3); + printFunctionTypeC(core, name); } } break; diff --git a/test/db/cmd/cmd_tc b/test/db/cmd/cmd_tc index 44459980505..9304aa788e8 100644 --- a/test/db/cmd/cmd_tc +++ b/test/db/cmd/cmd_tc @@ -252,3 +252,37 @@ EXPECT=< Date: Sun, 21 Feb 2021 10:50:52 +0530 Subject: [PATCH 04/10] Add a test for `tc` displaying an enum after loading with `td` --- test/db/cmd/cmd_tc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/db/cmd/cmd_tc b/test/db/cmd/cmd_tc index 9304aa788e8..95124d9a668 100644 --- a/test/db/cmd/cmd_tc +++ b/test/db/cmd/cmd_tc @@ -277,7 +277,6 @@ RUN NAME=test cmd tfc FILE=bins/mach0/objc-employee CMDS=< Date: Sun, 21 Feb 2021 11:08:04 +0530 Subject: [PATCH 05/10] Add a test for `tuc` --- test/db/cmd/cmd_tc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/db/cmd/cmd_tc b/test/db/cmd/cmd_tc index 95124d9a668..4b305da2ae4 100644 --- a/test/db/cmd/cmd_tc +++ b/test/db/cmd/cmd_tc @@ -286,11 +286,11 @@ void entry0 (); EOF RUN -NAME=test cmd tc with enum +NAME=test cmd tec FILE=- CMDS=< Date: Mon, 22 Feb 2021 07:28:40 +0530 Subject: [PATCH 06/10] Use a predefined variable to pass in the case of typedefs too on `tc` --- librz/core/cmd_type.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index 488ab1df9f5..c5cf79c2542 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -1082,7 +1082,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { } else if (rz_str_startswith(type, "enum")) { print_enum_in_c_format(TDB, name, true); } else if (rz_str_startswith(type, "typedef")) { - rz_core_list_typename_alias_c(core, input, TDB); + rz_core_list_typename_alias_c(core, name, TDB); } else if (rz_str_startswith(type, "func")) { printFunctionTypeC(core, name); } From 7f98812890bc08c97ef2f5c043124ab13518e847 Mon Sep 17 00:00:00 2001 From: Aswin C Date: Mon, 22 Feb 2021 18:41:09 +0530 Subject: [PATCH 07/10] Use RzOutputMode `rz_core_list_loaded_typedefs()` and change its definitions accordingly --- librz/core/cmd_type.c | 17 ++++++++++++----- librz/include/rz_core.h | 2 +- test/db/cmd/cmd_tc | 11 +++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index c5cf79c2542..fb566c69e42 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -725,9 +725,9 @@ static void set_offset_hint(RzCore *core, RzAnalysisOp *op, const char *type, ut } } -RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB) { +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB, RzOutputMode mode) { PJ *pj = NULL; - if (input[1] == 'j') { + if (mode == RZ_OUTPUT_MODE_JSON) { pj = pj_new(); pj_o(pj); } @@ -750,7 +750,7 @@ RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *T } } } - if (input[1] == 'j') { + if (mode == RZ_OUTPUT_MODE_JSON) { pj_end(pj); } if (pj) { @@ -1694,8 +1694,10 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { } break; case 't': { // "tt" - if (!input[1] || input[1] == 'j') { - rz_core_list_loaded_typedefs(core, input, TDB); + RzOutputMode mode; + if (input[1] == 'j') { // "ttj" + mode = RZ_OUTPUT_MODE_JSON; + rz_core_list_loaded_typedefs(core, input, TDB, mode); break; } if (input[1] == 'c') { // "ttc" @@ -1706,6 +1708,11 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { rz_core_cmd_help(core, help_msg_tt); break; } + if (input[1] == ' ') { // "tt" + mode = RZ_OUTPUT_MODE_STANDARD; + rz_core_list_loaded_typedefs(core, input, TDB, mode); + break; + } char *s = strdup(input + 2); const char *istypedef; istypedef = sdb_const_get(TDB, s, 0); diff --git a/librz/include/rz_core.h b/librz/include/rz_core.h index ff7dfaf5f80..08454f5f315 100644 --- a/librz/include/rz_core.h +++ b/librz/include/rz_core.h @@ -842,7 +842,7 @@ typedef struct { } RzCoreAnalStats; RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *input, Sdb *TDB); -RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB); +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB, RzOutputMode mode); RZ_API char *rz_core_analysis_hasrefs(RzCore *core, ut64 value, int mode); RZ_API char *rz_core_analysis_get_comments(RzCore *core, ut64 addr); diff --git a/test/db/cmd/cmd_tc b/test/db/cmd/cmd_tc index 4b305da2ae4..f43dfcb7fb4 100644 --- a/test/db/cmd/cmd_tc +++ b/test/db/cmd/cmd_tc @@ -253,6 +253,17 @@ typedef char * string; EOF RUN +NAME=ttj typedef +FILE=- +CMDS=< Date: Mon, 22 Feb 2021 22:32:21 +0530 Subject: [PATCH 08/10] Refactor `rz_core_list_loaded_typedefs()` and address changes * Stop passing TDB, use core->analysis->sdb_types instead * Changed the name of the argument to typedef_name * Clean the `RZ_OUTPUT_MODE_JSON` case --- librz/core/cmd_type.c | 25 ++++++++++++++----------- librz/include/rz_core.h | 4 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index fb566c69e42..59bcc07e5be 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -725,10 +725,14 @@ static void set_offset_hint(RzCore *core, RzAnalysisOp *op, const char *type, ut } } -RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB, RzOutputMode mode) { +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, RzOutputMode mode) { PJ *pj = NULL; + Sdb *TDB = core->analysis->sdb_types; if (mode == RZ_OUTPUT_MODE_JSON) { pj = pj_new(); + if (!pj) { + return; + } pj_o(pj); } char *name = NULL; @@ -740,7 +744,7 @@ RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *T if (!name || strcmp(sdbkv_value(kv), name)) { free(name); name = strdup(sdbkv_key(kv)); - if (!input[1]) { + if (mode == RZ_OUTPUT_MODE_STANDARD) { rz_cons_println(name); } else { const char *q = sdb_fmt("typedef.%s", name); @@ -752,21 +756,20 @@ RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *T } if (mode == RZ_OUTPUT_MODE_JSON) { pj_end(pj); - } - if (pj) { - rz_cons_printf("%s\n", pj_string(pj)); + rz_cons_println(pj_string(pj)); pj_free(pj); } free(name); ls_free(l); } -RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *input, Sdb *TDB) { +RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *typedef_name) { char *name = NULL; SdbKv *kv; SdbListIter *iter; + Sdb *TDB = core->analysis->sdb_types; SdbList *l = sdb_foreach_list(TDB, true); - const char *arg = rz_str_trim_head_ro(input + 2); + const char *arg = rz_str_trim_head_ro(typedef_name + 2); bool match = false; ls_foreach (l, iter, kv) { if (!strcmp(sdbkv_value(kv), "typedef")) { @@ -1082,7 +1085,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { } else if (rz_str_startswith(type, "enum")) { print_enum_in_c_format(TDB, name, true); } else if (rz_str_startswith(type, "typedef")) { - rz_core_list_typename_alias_c(core, name, TDB); + rz_core_list_typename_alias_c(core, name); } else if (rz_str_startswith(type, "func")) { printFunctionTypeC(core, name); } @@ -1697,11 +1700,11 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { RzOutputMode mode; if (input[1] == 'j') { // "ttj" mode = RZ_OUTPUT_MODE_JSON; - rz_core_list_loaded_typedefs(core, input, TDB, mode); + rz_core_list_loaded_typedefs(core, mode); break; } if (input[1] == 'c') { // "ttc" - rz_core_list_typename_alias_c(core, input, TDB); + rz_core_list_typename_alias_c(core, input); break; } if (input[1] == '?') { // "tt?" @@ -1710,7 +1713,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { } if (input[1] == ' ') { // "tt" mode = RZ_OUTPUT_MODE_STANDARD; - rz_core_list_loaded_typedefs(core, input, TDB, mode); + rz_core_list_loaded_typedefs(core, mode); break; } char *s = strdup(input + 2); diff --git a/librz/include/rz_core.h b/librz/include/rz_core.h index 08454f5f315..6a189e22b2b 100644 --- a/librz/include/rz_core.h +++ b/librz/include/rz_core.h @@ -841,8 +841,8 @@ typedef struct { RzCoreAnalStatsItem *block; } RzCoreAnalStats; -RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *input, Sdb *TDB); -RZ_API void rz_core_list_loaded_typedefs(RzCore *core, const char *input, Sdb *TDB, RzOutputMode mode); +RZ_API void rz_core_list_typename_alias_c(RzCore *core, const char *typedef_name); +RZ_API void rz_core_list_loaded_typedefs(RzCore *core, RzOutputMode mode); RZ_API char *rz_core_analysis_hasrefs(RzCore *core, ut64 value, int mode); RZ_API char *rz_core_analysis_get_comments(RzCore *core, ut64 addr); From 0c11e0fc07e2facd2deba679dbc8722e9dd7a950 Mon Sep 17 00:00:00 2001 From: Riccardo Schirone Date: Mon, 22 Feb 2021 19:18:22 +0100 Subject: [PATCH 09/10] Update librz/core/cmd_type.c --- librz/core/cmd_type.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index 59bcc07e5be..cc2eff747ed 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -1712,8 +1712,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { break; } if (input[1] == ' ') { // "tt" - mode = RZ_OUTPUT_MODE_STANDARD; - rz_core_list_loaded_typedefs(core, mode); + rz_core_list_loaded_typedefs(core, RZ_OUTPUT_MODE_STANDARD); break; } char *s = strdup(input + 2); From c94fff0a57b3fe13f7cf7a8fb34d10e6bddfeb68 Mon Sep 17 00:00:00 2001 From: Aswin C Date: Tue, 23 Feb 2021 12:21:29 +0530 Subject: [PATCH 10/10] Revert how `tt` was handled and called to the old case --- librz/core/cmd_type.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librz/core/cmd_type.c b/librz/core/cmd_type.c index cc2eff747ed..7ae39071dd6 100644 --- a/librz/core/cmd_type.c +++ b/librz/core/cmd_type.c @@ -1711,7 +1711,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) { rz_core_cmd_help(core, help_msg_tt); break; } - if (input[1] == ' ') { // "tt" + if (!input[1]) { // "tt" rz_core_list_loaded_typedefs(core, RZ_OUTPUT_MODE_STANDARD); break; }