Use newshell for to commands

This commit is contained in:
Anton Kochkov 2021-02-26 18:27:00 +08:00 committed by Anton Kochkov
parent 284a13904b
commit f3dc8385e8
4 changed files with 172 additions and 66 deletions

View file

@ -121,6 +121,9 @@ static const RzCmdDescArg type_function_c_args[2];
static const RzCmdDescArg type_kuery_args[2];
static const RzCmdDescArg type_list_noreturn_args[2];
static const RzCmdDescArg type_noreturn_del_args[2];
static const RzCmdDescArg type_open_file_args[2];
static const RzCmdDescArg type_open_editor_args[2];
static const RzCmdDescArg type_open_sdb_args[2];
static const RzCmdDescArg type_list_typedef_args[2];
static const RzCmdDescArg type_typedef_c_args[2];
static const RzCmdDescArg type_list_union_args[2];
@ -2250,6 +2253,50 @@ static const RzCmdDescHelp type_noreturn_del_all_help = {
.args = type_noreturn_del_all_args,
};
static const RzCmdDescHelp to_help = {
.summary = "Open C header file and load types from it",
};
static const RzCmdDescArg type_open_file_args[] = {
{
.name = "file",
.type = RZ_CMD_ARG_TYPE_FILE,
},
{ 0 },
};
static const RzCmdDescHelp type_open_file_help = {
.summary = "Open C header file and load types from it",
.args = type_open_file_args,
};
static const RzCmdDescArg type_open_editor_args[] = {
{
.name = "type",
.type = RZ_CMD_ARG_TYPE_STRING,
.flags = RZ_CMD_ARG_FLAG_LAST,
.optional = true,
},
{ 0 },
};
static const RzCmdDescHelp type_open_editor_help = {
.summary = "Open cfg.editor to edit types",
.args = type_open_editor_args,
};
static const RzCmdDescArg type_open_sdb_args[] = {
{
.name = "file",
.type = RZ_CMD_ARG_TYPE_FILE,
},
{ 0 },
};
static const RzCmdDescHelp type_open_sdb_help = {
.summary = "Open SDB file and load types from it",
.args = type_open_sdb_args,
};
static const RzCmdDescHelp tt_help = {
.summary = "List loaded typedefs",
};
@ -3860,6 +3907,14 @@ RZ_IPI void newshell_cmddescs_init(RzCore *core) {
RzCmdDesc *type_noreturn_del_all_cd = rz_cmd_desc_argv_new(core->rcmd, tn_cd, "tn-*", rz_type_noreturn_del_all_handler, &type_noreturn_del_all_help);
rz_warn_if_fail(type_noreturn_del_all_cd);
RzCmdDesc *to_cd = rz_cmd_desc_group_new(core->rcmd, cmd_type_cd, "to", rz_type_open_file_handler, &type_open_file_help, &to_help);
rz_warn_if_fail(to_cd);
RzCmdDesc *type_open_editor_cd = rz_cmd_desc_argv_new(core->rcmd, to_cd, "toe", rz_type_open_editor_handler, &type_open_editor_help);
rz_warn_if_fail(type_open_editor_cd);
RzCmdDesc *type_open_sdb_cd = rz_cmd_desc_argv_new(core->rcmd, to_cd, "tos", rz_type_open_sdb_handler, &type_open_sdb_help);
rz_warn_if_fail(type_open_sdb_cd);
RzCmdDesc *tt_cd = rz_cmd_desc_group_modes_new(core->rcmd, cmd_type_cd, "tt", RZ_OUTPUT_MODE_STANDARD | RZ_OUTPUT_MODE_JSON, rz_type_list_typedef_handler, &type_list_typedef_help, &tt_help);
rz_warn_if_fail(tt_cd);
RzCmdDesc *type_typedef_c_cd = rz_cmd_desc_argv_new(core->rcmd, tt_cd, "ttc", rz_type_typedef_c_handler, &type_typedef_c_help);

View file

@ -167,6 +167,9 @@ RZ_IPI RzCmdStatus rz_type_kuery_handler(RzCore *core, int argc, const char **ar
RZ_IPI RzCmdStatus rz_type_list_noreturn_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_type_noreturn_del_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_noreturn_del_all_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_open_file_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_open_editor_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_open_sdb_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_list_typedef_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_type_typedef_c_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_type_list_union_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);

View file

@ -150,6 +150,28 @@ commands:
cname: type_noreturn_del_all
summary: Remove all noreturn references
args: []
- name: to
summary: Open C header file and load types from it
subcommands:
- name: to
cname: type_open_file
summary: Open C header file and load types from it
args:
- name: file
type: RZ_CMD_ARG_TYPE_FILE
- name: toe
cname: type_open_editor
summary: Open cfg.editor to edit types
args:
- name: type
type: RZ_CMD_ARG_TYPE_STRING
optional: true
- name: tos
cname: type_open_sdb
summary: Open SDB file and load types from it
args:
- name: file
type: RZ_CMD_ARG_TYPE_FILE
- name: tt
summary: List loaded typedefs
subcommands:

View file

@ -1251,6 +1251,78 @@ static void type_define(RzCore *core, const char *type) {
}
}
static void types_open_file(RzCore *core, const char *path) {
const char *dir = rz_config_get(core->config, "dir.types");
char *homefile = NULL;
if (*path == '~') {
if (path[1] && path[2]) {
homefile = rz_str_home(path + 2);
path = homefile;
}
}
if (!strcmp(path, "-")) {
char *tmp = rz_core_editor(core, "*.h", "");
if (tmp) {
char *error_msg = NULL;
char *out = rz_parse_c_string(core->analysis, tmp, &error_msg);
if (out) {
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
fprintf(stderr, "%s", error_msg);
free(error_msg);
}
free(tmp);
}
} else {
char *error_msg = NULL;
char *out = rz_parse_c_file(core->analysis, path, dir, &error_msg);
if (out) {
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
fprintf(stderr, "%s", error_msg);
free(error_msg);
}
}
free(homefile);
}
static void types_open_editor(RzCore *core, const char *typename) {
Sdb *TDB = core->analysis->sdb_types;
char *str = rz_core_cmd_strf(core, "tc %s", typename ? typename : "");
char *tmp = rz_core_editor(core, "*.h", str);
if (tmp) {
char *error_msg = NULL;
char *out = rz_parse_c_string(core->analysis, tmp, &error_msg);
if (out) {
// remove previous types and save new edited types
sdb_reset(TDB);
rz_parse_c_reset(core->parser);
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
eprintf("%s\n", error_msg);
free(error_msg);
}
free(tmp);
}
free(str);
}
static void types_open_sdb(RzCore *core, const char *path) {
Sdb *TDB = core->analysis->sdb_types;
if (rz_file_exists(path)) {
Sdb *db_tmp = sdb_new(0, path, 0);
sdb_merge(TDB, db_tmp);
sdb_close(db_tmp);
sdb_free(db_tmp);
}
}
RZ_IPI int rz_cmd_type(void *data, const char *input) {
RzCore *core = (RzCore *)data;
Sdb *TDB = core->analysis->sdb_types;
@ -1462,45 +1534,7 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) {
break;
}
if (input[1] == ' ') {
const char *dir = rz_config_get(core->config, "dir.types");
const char *filename = input + 2;
char *homefile = NULL;
if (*filename == '~') {
if (filename[1] && filename[2]) {
homefile = rz_str_home(filename + 2);
filename = homefile;
}
}
if (!strcmp(filename, "-")) {
char *tmp = rz_core_editor(core, "*.h", "");
if (tmp) {
char *error_msg = NULL;
char *out = rz_parse_c_string(core->analysis, tmp, &error_msg);
if (out) {
// rz_cons_strcat (out);
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
fprintf(stderr, "%s", error_msg);
free(error_msg);
}
free(tmp);
}
} else {
char *error_msg = NULL;
char *out = rz_parse_c_file(core->analysis, filename, dir, &error_msg);
if (out) {
//rz_cons_strcat (out);
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
fprintf(stderr, "%s", error_msg);
free(error_msg);
}
}
free(homefile);
types_open_file(core, input + 2);
} else if (input[1] == 'u') {
// "tou" "touch"
char *arg = strchr(input, ' ');
@ -1509,34 +1543,10 @@ RZ_IPI int rz_cmd_type(void *data, const char *input) {
} else {
eprintf("Usage: touch [filename]");
}
} else if (input[1] == 's') {
const char *dbpath = input + 3;
if (rz_file_exists(dbpath)) {
Sdb *db_tmp = sdb_new(0, dbpath, 0);
sdb_merge(TDB, db_tmp);
sdb_close(db_tmp);
sdb_free(db_tmp);
}
} else if (input[1] == 's') { // "tos"
types_open_sdb(core, input + 3);
} else if (input[1] == 'e') { // "toe"
char *str = rz_core_cmd_strf(core, "tc %s", input + 2);
char *tmp = rz_core_editor(core, "*.h", str);
if (tmp) {
char *error_msg = NULL;
char *out = rz_parse_c_string(core->analysis, tmp, &error_msg);
if (out) {
// remove previous types and save new edited types
sdb_reset(TDB);
rz_parse_c_reset(core->parser);
rz_analysis_save_parsed_type(core->analysis, out);
free(out);
}
if (error_msg) {
eprintf("%s\n", error_msg);
free(error_msg);
}
free(tmp);
}
free(str);
types_open_editor(core, input + 2);
}
break;
// td - parse string with cparse engine and load types from it
@ -2049,6 +2059,22 @@ RZ_IPI RzCmdStatus rz_type_noreturn_del_all_handler(RzCore *core, int argc, cons
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_type_open_file_handler(RzCore *core, int argc, const char **argv) {
types_open_file(core, argv[1]);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_type_open_editor_handler(RzCore *core, int argc, const char **argv) {
const char *typename = argc > 1 ? argv[1] : NULL;
types_open_editor(core, typename);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_type_open_sdb_handler(RzCore *core, int argc, const char **argv) {
types_open_sdb(core, argv[1]);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_type_list_typedef_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode) {
const char *typename = argc > 1 ? argv[1] : NULL;
if (typename) {