Use newshell for to commands
This commit is contained in:
parent
284a13904b
commit
f3dc8385e8
4 changed files with 172 additions and 66 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue