Convert 'e' commands to newshell ##newshell
This commit is contained in:
parent
296b64e2e9
commit
0abb2c8bfc
9 changed files with 573 additions and 200 deletions
|
|
@ -233,7 +233,9 @@ RZ_API void rz_config_list(RzConfig *cfg, const char *str, int rad) {
|
|||
break;
|
||||
case 'q':
|
||||
rz_list_foreach (cfg->nodes, iter, node) {
|
||||
cfg->cb_printf ("%s\n", node->name);
|
||||
if (!str || (str && (!strncmp (str, node->name, len)))) {
|
||||
cfg->cb_printf ("%s\n", node->name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'J':
|
||||
|
|
@ -310,11 +312,19 @@ RZ_API const char* rz_config_get(RzConfig *cfg, const char *name) {
|
|||
|
||||
RZ_API bool rz_config_toggle(RzConfig *cfg, const char *name) {
|
||||
RzConfigNode *node = rz_config_node_get (cfg, name);
|
||||
if (node && rz_config_node_is_bool (node)) {
|
||||
(void)rz_config_set_i (cfg, name, !node->i_value);
|
||||
return true;
|
||||
if (!node) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
if (!rz_config_node_is_bool (node)) {
|
||||
eprintf ("(error: '%s' is not a boolean variable)\n", name);
|
||||
return false;
|
||||
}
|
||||
if (rz_config_node_is_ro (node)) {
|
||||
eprintf ("(error: '%s' config key is read only)\n", name);
|
||||
return false;
|
||||
}
|
||||
(void)rz_config_set_i (cfg, name, !node->i_value);
|
||||
return true;
|
||||
}
|
||||
|
||||
RZ_API ut64 rz_config_get_i(RzConfig *cfg, const char *name) {
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ static const struct argv_modes_t {
|
|||
{ "q", " (quiet mode)", RZ_OUTPUT_MODE_QUIET },
|
||||
{ "k", " (sdb mode)", RZ_OUTPUT_MODE_SDB },
|
||||
{ "l", " (verbose mode)", RZ_OUTPUT_MODE_LONG },
|
||||
{ "J", " (verbose JSON mode)", RZ_OUTPUT_MODE_LONG_JSON },
|
||||
{ "t", " (table mode)", RZ_OUTPUT_MODE_TABLE },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
static const RzCmdDescDetail hash_bang_details[2];
|
||||
static const RzCmdDescDetail pointer_details[2];
|
||||
static const RzCmdDescDetail eval_getset_details[2];
|
||||
static const RzCmdDescDetail env_details[3];
|
||||
static const RzCmdDescDetail wB_details[2];
|
||||
static const RzCmdDescDetail wv_details[2];
|
||||
|
|
@ -46,6 +47,13 @@ static const RzCmdDescArg remote_rap_args[3];
|
|||
static const RzCmdDescArg remote_tcp_args[3];
|
||||
static const RzCmdDescArg remote_rap_bg_args[2];
|
||||
static const RzCmdDescArg push_escaped_args[2];
|
||||
static const RzCmdDescArg eval_getset_args[2];
|
||||
static const RzCmdDescArg eval_list_args[2];
|
||||
static const RzCmdDescArg eval_bool_invert_args[2];
|
||||
static const RzCmdDescArg eval_editor_args[2];
|
||||
static const RzCmdDescArg eval_readonly_args[2];
|
||||
static const RzCmdDescArg eval_spaces_args[2];
|
||||
static const RzCmdDescArg eval_type_args[2];
|
||||
static const RzCmdDescArg env_args[3];
|
||||
static const RzCmdDescArg ls_args[2];
|
||||
static const RzCmdDescArg project_save_args[2];
|
||||
|
|
@ -476,9 +484,110 @@ static const RzCmdDescHelp cmd_debug_help = {
|
|||
.summary = "Debugger commands",
|
||||
};
|
||||
|
||||
static const RzCmdDescHelp cmd_eval_help = {
|
||||
static const RzCmdDescHelp e_help = {
|
||||
.summary = "List/get/set config evaluable vars",
|
||||
};
|
||||
static const RzCmdDescDetailEntry eval_getset_Examples_detail_entries[] = {
|
||||
{ .text = "e", .arg_str = " asm.bytes", .comment = "Show current value of config variable `asm.bytes`" },
|
||||
{ .text = "e", .arg_str = " asm.bytes=true", .comment = "Set config variable `asm.bytes` to `true`" },
|
||||
{ .text = "e", .arg_str = " search.in=?", .comment = "Show all possible values for config variable `search.in`" },
|
||||
{ .text = "e", .arg_str = " search.in=??", .comment = "Show all possible values for config variable `search.in` together with description" },
|
||||
{ .text = "e", .arg_str = " asm.bytes=true asm.offset=false", .comment = "Set asm.bytes to true and asm.offset to false" },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescDetail eval_getset_details[] = {
|
||||
{ .name = "Examples", .entries = eval_getset_Examples_detail_entries },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescArg eval_getset_args[] = {
|
||||
{ .name = "key=value", .type = RZ_CMD_ARG_TYPE_EVAL_FULL, .flags = RZ_CMD_ARG_FLAG_ARRAY, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_getset_help = {
|
||||
.summary = "Get/Set value of config variable <key>",
|
||||
.args_str = " <key>[=<val|?>] [<key>[=<val|?>] ...]]",
|
||||
.details = eval_getset_details,
|
||||
.args = eval_getset_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_list_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, .optional = true, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_list_help = {
|
||||
.summary = "List config variables with their descriptions",
|
||||
.args = eval_list_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_reset_args[] = {
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_reset_help = {
|
||||
.summary = "Reset config variables",
|
||||
.args = eval_reset_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_bool_invert_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_bool_invert_help = {
|
||||
.summary = "Invert the boolean value of config variable <var>",
|
||||
.args = eval_bool_invert_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_color_args[] = {
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_color_help = {
|
||||
.summary = "Set color for given key (prompt, offset, ...)",
|
||||
.args = eval_color_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_editor_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_editor_help = {
|
||||
.summary = "Open editor to change the value of config variable <var>",
|
||||
.args = eval_editor_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg editor_rizinrc_args[] = {
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp editor_rizinrc_help = {
|
||||
.summary = "Open editor to change ~/.rizinrc",
|
||||
.args = editor_rizinrc_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_readonly_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_readonly_help = {
|
||||
.summary = "Set config variable <var> as read-only",
|
||||
.args = eval_readonly_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_spaces_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, .optional = true, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_spaces_help = {
|
||||
.summary = "List all config variable spaces or sub-keys/sub-spaces if a <key> is provided",
|
||||
.args = eval_spaces_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescArg eval_type_args[] = {
|
||||
{ .name = "key", .type = RZ_CMD_ARG_TYPE_EVAL_KEY, },
|
||||
{ 0 },
|
||||
};
|
||||
static const RzCmdDescHelp eval_type_help = {
|
||||
.summary = "Show type of given config variable <var>",
|
||||
.args = eval_type_args,
|
||||
};
|
||||
|
||||
static const RzCmdDescDetailEntry env_Examples_detail_entries[] = {
|
||||
{ .text = "%", .arg_str = NULL, .comment = "List all environment variables" },
|
||||
{ .text = "%", .arg_str = "SHELL", .comment = "Print value of SHELL variable" },
|
||||
|
|
@ -487,7 +596,7 @@ static const RzCmdDescDetailEntry env_Examples_detail_entries[] = {
|
|||
{ 0 },
|
||||
};
|
||||
|
||||
static const RzCmdDescDetailEntry env_environment_detail_entries[] = {
|
||||
static const RzCmdDescDetailEntry env_Environment_detail_entries[] = {
|
||||
{ .text = "RZ_FILE", .arg_str = NULL, .comment = "currently opened file name" },
|
||||
{ .text = "RZ_OFFSET", .arg_str = NULL, .comment = "10base offset 64bit value" },
|
||||
{ .text = "RZ_BYTES", .arg_str = NULL, .comment = "TODO: variable with bytes in curblock" },
|
||||
|
|
@ -507,7 +616,7 @@ static const RzCmdDescDetailEntry env_environment_detail_entries[] = {
|
|||
};
|
||||
static const RzCmdDescDetail env_details[] = {
|
||||
{ .name = "Examples", .entries = env_Examples_detail_entries },
|
||||
{ .name = "environment", .entries = env_environment_detail_entries },
|
||||
{ .name = "Environment", .entries = env_Environment_detail_entries },
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
|
|
@ -1565,8 +1674,26 @@ RZ_IPI void newshell_cmddescs_init(RzCore *core) {
|
|||
rz_warn_if_fail (cmd_meta_cd);
|
||||
RzCmdDesc *cmd_debug_cd = rz_cmd_desc_oldinput_new (core->rcmd, root_cd, "d", rz_cmd_debug, &cmd_debug_help);
|
||||
rz_warn_if_fail (cmd_debug_cd);
|
||||
RzCmdDesc *cmd_eval_cd = rz_cmd_desc_oldinput_new (core->rcmd, root_cd, "e", rz_cmd_eval, &cmd_eval_help);
|
||||
rz_warn_if_fail (cmd_eval_cd); RzCmdDesc *env_cd = rz_cmd_desc_argv_new (core->rcmd, cmd_eval_cd, "env", rz_env_handler, &env_help);
|
||||
RzCmdDesc *e_cd = rz_cmd_desc_group_new (core->rcmd, root_cd, "e", rz_eval_getset_handler, &eval_getset_help, &e_help);
|
||||
rz_warn_if_fail (e_cd); RzCmdDesc *eval_list_cd = rz_cmd_desc_argv_modes_new (core->rcmd, e_cd, "el", RZ_OUTPUT_MODE_STANDARD | RZ_OUTPUT_MODE_RIZIN | RZ_OUTPUT_MODE_JSON | RZ_OUTPUT_MODE_QUIET | RZ_OUTPUT_MODE_LONG | RZ_OUTPUT_MODE_LONG_JSON, rz_eval_list_handler, &eval_list_help);
|
||||
rz_warn_if_fail (eval_list_cd);
|
||||
RzCmdDesc *eval_reset_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "e-", rz_eval_reset_handler, &eval_reset_help);
|
||||
rz_warn_if_fail (eval_reset_cd);
|
||||
RzCmdDesc *eval_bool_invert_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "e!", rz_eval_bool_invert_handler, &eval_bool_invert_help);
|
||||
rz_warn_if_fail (eval_bool_invert_cd);
|
||||
RzCmdDesc *eval_color_cd = rz_cmd_desc_oldinput_new (core->rcmd, e_cd, "ec", rz_eval_color, &eval_color_help);
|
||||
rz_warn_if_fail (eval_color_cd);
|
||||
RzCmdDesc *eval_editor_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "ee", rz_eval_editor_handler, &eval_editor_help);
|
||||
rz_warn_if_fail (eval_editor_cd);
|
||||
RzCmdDesc *editor_rizinrc_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "ed", rz_editor_rizinrc_handler, &editor_rizinrc_help);
|
||||
rz_warn_if_fail (editor_rizinrc_cd);
|
||||
RzCmdDesc *eval_readonly_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "er", rz_eval_readonly_handler, &eval_readonly_help);
|
||||
rz_warn_if_fail (eval_readonly_cd);
|
||||
RzCmdDesc *eval_spaces_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "es", rz_eval_spaces_handler, &eval_spaces_help);
|
||||
rz_warn_if_fail (eval_spaces_cd);
|
||||
RzCmdDesc *eval_type_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "et", rz_eval_type_handler, &eval_type_help);
|
||||
rz_warn_if_fail (eval_type_cd);
|
||||
RzCmdDesc *env_cd = rz_cmd_desc_argv_new (core->rcmd, e_cd, "env", rz_env_handler, &env_help);
|
||||
rz_warn_if_fail (env_cd);
|
||||
RzCmdDesc *cmd_flag_cd = rz_cmd_desc_oldinput_new (core->rcmd, root_cd, "f", rz_cmd_flag, &cmd_flag_help);
|
||||
rz_warn_if_fail (cmd_flag_cd);
|
||||
|
|
|
|||
|
|
@ -55,8 +55,17 @@ RZ_IPI int rz_cmd_bsize(void *data, const char *input);
|
|||
RZ_IPI int rz_cmd_cmp(void *data, const char *input);
|
||||
RZ_IPI int rz_cmd_meta(void *data, const char *input);
|
||||
RZ_IPI int rz_cmd_debug(void *data, const char *input);
|
||||
RZ_IPI RzCmdStatus rz_eval_getset_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_eval_list_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
|
||||
RZ_IPI RzCmdStatus rz_eval_reset_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_eval_bool_invert_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI int rz_eval_color(void *data, const char *input);
|
||||
RZ_IPI RzCmdStatus rz_eval_editor_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_editor_rizinrc_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_eval_readonly_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_eval_spaces_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_eval_type_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI RzCmdStatus rz_env_handler(RzCore *core, int argc, const char **argv);
|
||||
RZ_IPI int rz_cmd_eval(void *data, const char *input);
|
||||
RZ_IPI int rz_cmd_flag(void *data, const char *input);
|
||||
RZ_IPI int rz_cmd_egg(void *data, const char *input);
|
||||
RZ_IPI int rz_cmd_info(void *data, const char *input);
|
||||
|
|
|
|||
|
|
@ -384,10 +384,92 @@
|
|||
summary: Debugger commands
|
||||
type: RZ_CMD_DESC_TYPE_OLDINPUT
|
||||
- name: e
|
||||
cname: cmd_eval
|
||||
summary: List/get/set config evaluable vars
|
||||
type: RZ_CMD_DESC_TYPE_OLDINPUT
|
||||
subcommands:
|
||||
- name: e
|
||||
cname: eval_getset
|
||||
summary: Get/Set value of config variable <key>
|
||||
args_str: " <key>[=<val|?>] [<key>[=<val|?>] ...]]"
|
||||
args:
|
||||
- name: key=value
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_FULL
|
||||
flags: RZ_CMD_ARG_FLAG_ARRAY
|
||||
details:
|
||||
- name: Examples
|
||||
entries:
|
||||
- text: e
|
||||
arg_str: " asm.bytes"
|
||||
comment: "Show current value of config variable `asm.bytes`"
|
||||
- text: e
|
||||
arg_str: " asm.bytes=true"
|
||||
comment: "Set config variable `asm.bytes` to `true`"
|
||||
- text: e
|
||||
arg_str: " search.in=?"
|
||||
comment: "Show all possible values for config variable `search.in`"
|
||||
- text: e
|
||||
arg_str: " search.in=??"
|
||||
comment: "Show all possible values for config variable `search.in` together with description"
|
||||
- text: e
|
||||
arg_str: " asm.bytes=true asm.offset=false"
|
||||
comment: "Set asm.bytes to true and asm.offset to false"
|
||||
- name: el
|
||||
cname: eval_list
|
||||
summary: List config variables with their descriptions
|
||||
modes:
|
||||
- RZ_OUTPUT_MODE_STANDARD
|
||||
- RZ_OUTPUT_MODE_RIZIN
|
||||
- RZ_OUTPUT_MODE_JSON
|
||||
- RZ_OUTPUT_MODE_QUIET
|
||||
- RZ_OUTPUT_MODE_LONG
|
||||
- RZ_OUTPUT_MODE_LONG_JSON
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
optional: true
|
||||
- name: e-
|
||||
cname: eval_reset
|
||||
summary: Reset config variables
|
||||
args: []
|
||||
- name: e!
|
||||
cname: eval_bool_invert
|
||||
summary: Invert the boolean value of config variable <var>
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
- name: ec
|
||||
cname: eval_color
|
||||
summary: Set color for given key (prompt, offset, ...)
|
||||
type: RZ_CMD_DESC_TYPE_OLDINPUT
|
||||
args: []
|
||||
- name: ee
|
||||
cname: eval_editor
|
||||
summary: Open editor to change the value of config variable <var>
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
- name: ed
|
||||
cname: editor_rizinrc
|
||||
summary: Open editor to change ~/.rizinrc
|
||||
args: []
|
||||
- name: er
|
||||
cname: eval_readonly
|
||||
summary: Set config variable <var> as read-only
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
- name: es
|
||||
cname: eval_spaces
|
||||
summary: List all config variable spaces or sub-keys/sub-spaces if a <key> is provided
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
optional: true
|
||||
- name: et
|
||||
cname: eval_type
|
||||
summary: Show type of given config variable <var>
|
||||
args:
|
||||
- name: key
|
||||
type: RZ_CMD_ARG_TYPE_EVAL_KEY
|
||||
- name: env
|
||||
cname: env
|
||||
summary: Get/set environment variables
|
||||
|
|
@ -413,7 +495,7 @@
|
|||
- text: "env"
|
||||
arg_str: " SHELL"
|
||||
comment: Same as `%SHELL`
|
||||
- name: environment
|
||||
- name: Environment
|
||||
entries:
|
||||
- text: "RZ_FILE"
|
||||
comment: "currently opened file name"
|
||||
|
|
|
|||
|
|
@ -326,6 +326,191 @@ RZ_API void rz_core_echo(RzCore *core, const char *input) {
|
|||
}
|
||||
}
|
||||
|
||||
RZ_IPI int rz_eval_color(void *data, const char *input) {
|
||||
RzCore *core = (RzCore *)data;
|
||||
switch (input[0]) {
|
||||
case 'd': // "ecd"
|
||||
rz_cons_pal_init (core->cons->context);
|
||||
break;
|
||||
case '?':
|
||||
rz_core_cmd_help (core, help_msg_ec);
|
||||
break;
|
||||
case 'o': // "eco"
|
||||
if (input[1] == 'j') {
|
||||
nextpal (core, 'j');
|
||||
} else if (input[1] == ' ') {
|
||||
cmd_load_theme (core, input + 2);
|
||||
} else if (input[1] == 'o') {
|
||||
cmd_load_theme (core, rz_core_get_theme ());
|
||||
} else if (input[1] == 'c' || input[1] == '.') {
|
||||
rz_cons_printf ("%s\n", rz_core_get_theme ());
|
||||
} else if (input[1] == '?') {
|
||||
rz_core_cmd_help (core, help_msg_eco);
|
||||
} else if (input[1] == 'q') {
|
||||
RzList *themes_list = rz_core_list_themes (core);
|
||||
RzListIter *th_iter;
|
||||
const char *th;
|
||||
rz_list_foreach (themes_list, th_iter, th) {
|
||||
rz_cons_printf ("%s\n", th);
|
||||
}
|
||||
} else {
|
||||
RzList *themes_list = rz_core_list_themes (core);
|
||||
RzListIter *th_iter;
|
||||
const char *th;
|
||||
rz_list_foreach (themes_list, th_iter, th) {
|
||||
if (curtheme && !strcmp (curtheme, th)) {
|
||||
rz_cons_printf ("> %s\n", th);
|
||||
} else {
|
||||
rz_cons_printf (" %s\n", th);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 's': rz_cons_pal_show (); break; // "ecs"
|
||||
case '*': rz_cons_pal_list (1, NULL); break; // "ec*"
|
||||
case 'h': // echo
|
||||
if (input[1] == 'o') {
|
||||
rz_core_echo (core, input + 2);
|
||||
} else {
|
||||
rz_cons_pal_list ('h', NULL);
|
||||
}
|
||||
break;
|
||||
case 'j': // "ecj"
|
||||
rz_cons_pal_list ('j', NULL);
|
||||
break;
|
||||
case 'c': // "ecc"
|
||||
rz_cons_pal_list ('c', input + 1);
|
||||
break;
|
||||
case '\0': // "ec"
|
||||
rz_cons_pal_list (0, NULL);
|
||||
break;
|
||||
case 'r': // "ecr"
|
||||
rz_cons_pal_random ();
|
||||
break;
|
||||
case 'n': // "ecn"
|
||||
nextpal (core, 'n');
|
||||
break;
|
||||
case 'p': // "ecp"
|
||||
nextpal (core, 'p');
|
||||
break;
|
||||
case 'H': { // "ecH"
|
||||
char *color_code = NULL;
|
||||
char *word = NULL;
|
||||
int argc = 0;
|
||||
int delta = (input[1])? 2: 1;
|
||||
char** argv = rz_str_argv (rz_str_trim_head_ro (input + delta), &argc);
|
||||
switch (input[1]) {
|
||||
case '?': {
|
||||
const char *helpmsg[] = {
|
||||
"Usage ecH[iw-?]","","",
|
||||
"ecHi","[color]","highlight current instruction with 'color' background",
|
||||
"ecHw","[word] [color]","highlight 'word ' in current instruction with 'color' background",
|
||||
"ecH","","list all the highlight rules",
|
||||
"ecH.","","show highlight rule in current offset",
|
||||
"ecH-","*","remove all the highlight hints",
|
||||
"ecH-","","remove all highlights on current instruction",
|
||||
NULL
|
||||
};
|
||||
rz_core_cmd_help (core, helpmsg);
|
||||
}
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '-': // ecH-
|
||||
if (input[2] == '*') {
|
||||
rz_meta_del (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0, UT64_MAX);
|
||||
} else {
|
||||
rz_meta_del (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, 1);
|
||||
// rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, "");
|
||||
}
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '.':
|
||||
rz_meta_print_list_in_function (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0, core->offset);
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '\0':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0);
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case 'j':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, 'j');
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '*':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, '*');
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case ' ':
|
||||
case 'i': // "ecHi"
|
||||
if (argc) {
|
||||
char *dup = rz_str_newf ("bgonly %s", argv[0]);
|
||||
color_code = rz_cons_pal_parse (dup, NULL);
|
||||
RZ_FREE (dup);
|
||||
if (!color_code) {
|
||||
eprintf ("Unknown color %s\n", argv[0]);
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'w': // "ecHw"
|
||||
if (!argc) {
|
||||
eprintf ("Usage: ecHw word [color]\n");
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
word = strdup (argv[0]);
|
||||
if (argc > 1) {
|
||||
char *dup = rz_str_newf ("bgonly %s", argv[1]);
|
||||
color_code = rz_cons_pal_parse (dup, NULL);
|
||||
RZ_FREE (dup);
|
||||
if (!color_code) {
|
||||
eprintf ("Unknown color %s\n", argv[1]);
|
||||
rz_str_argv_free (argv);
|
||||
free (word);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
eprintf ("See ecH?\n");
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, "");
|
||||
const char *str = rz_meta_get_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset);
|
||||
char *dup = rz_str_newf ("%s \"%s%s\"", str?str:"", word?word:"", color_code?color_code:rz_cons_singleton ()->context->pal.wordhl);
|
||||
rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, dup);
|
||||
rz_str_argv_free (argv);
|
||||
RZ_FREE (word);
|
||||
RZ_FREE (dup);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
char *p = strdup (input + 1);
|
||||
char *q = strchr (p, '=');
|
||||
if (!q) {
|
||||
q = strchr (p, ' ');
|
||||
}
|
||||
if (q) {
|
||||
// Set color
|
||||
*q++ = 0;
|
||||
if (rz_cons_pal_set (p, q)) {
|
||||
rz_cons_pal_update_event ();
|
||||
}
|
||||
} else {
|
||||
char color[32];
|
||||
RzColor rcolor = rz_cons_pal_get (p);
|
||||
rz_cons_rgb_str (color, sizeof (color), &rcolor);
|
||||
eprintf ("(%s)(%sCOLOR"Color_RESET")\n", p, color);
|
||||
}
|
||||
free (p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
RZ_IPI int rz_cmd_eval(void *data, const char *input) {
|
||||
RzCore *core = (RzCore *)data;
|
||||
switch (input[0]) {
|
||||
|
|
@ -397,185 +582,7 @@ RZ_IPI int rz_cmd_eval(void *data, const char *input) {
|
|||
rz_config_list (core->config, NULL, 'q');
|
||||
break;
|
||||
case 'c': // "ec"
|
||||
switch (input[1]) {
|
||||
case 'd': // "ecd"
|
||||
rz_cons_pal_init (core->cons->context);
|
||||
break;
|
||||
case '?':
|
||||
rz_core_cmd_help (core, help_msg_ec);
|
||||
break;
|
||||
case 'o': // "eco"
|
||||
if (input[2] == 'j') {
|
||||
nextpal (core, 'j');
|
||||
} else if (input[2] == ' ') {
|
||||
cmd_load_theme (core, input + 3);
|
||||
} else if (input[2] == 'o') {
|
||||
cmd_load_theme (core, rz_core_get_theme ());
|
||||
} else if (input[2] == 'c' || input[2] == '.') {
|
||||
rz_cons_printf ("%s\n", rz_core_get_theme ());
|
||||
} else if (input[2] == '?') {
|
||||
rz_core_cmd_help (core, help_msg_eco);
|
||||
} else if (input[2] == 'q') {
|
||||
RzList *themes_list = rz_core_list_themes (core);
|
||||
RzListIter *th_iter;
|
||||
const char *th;
|
||||
rz_list_foreach (themes_list, th_iter, th) {
|
||||
rz_cons_printf ("%s\n", th);
|
||||
}
|
||||
} else {
|
||||
RzList *themes_list = rz_core_list_themes (core);
|
||||
RzListIter *th_iter;
|
||||
const char *th;
|
||||
rz_list_foreach (themes_list, th_iter, th) {
|
||||
if (curtheme && !strcmp (curtheme, th)) {
|
||||
rz_cons_printf ("> %s\n", th);
|
||||
} else {
|
||||
rz_cons_printf (" %s\n", th);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 's': rz_cons_pal_show (); break; // "ecs"
|
||||
case '*': rz_cons_pal_list (1, NULL); break; // "ec*"
|
||||
case 'h': // echo
|
||||
if (input[2] == 'o') {
|
||||
rz_core_echo (core, input + 3);
|
||||
} else {
|
||||
rz_cons_pal_list ('h', NULL);
|
||||
}
|
||||
break;
|
||||
case 'j': // "ecj"
|
||||
rz_cons_pal_list ('j', NULL);
|
||||
break;
|
||||
case 'c': // "ecc"
|
||||
rz_cons_pal_list ('c', input + 2);
|
||||
break;
|
||||
case '\0': // "ec"
|
||||
rz_cons_pal_list (0, NULL);
|
||||
break;
|
||||
case 'r': // "ecr"
|
||||
rz_cons_pal_random ();
|
||||
break;
|
||||
case 'n': // "ecn"
|
||||
nextpal (core, 'n');
|
||||
break;
|
||||
case 'p': // "ecp"
|
||||
nextpal (core, 'p');
|
||||
break;
|
||||
case 'H': { // "ecH"
|
||||
char *color_code = NULL;
|
||||
char *word = NULL;
|
||||
int argc = 0;
|
||||
int delta = (input[2])? 3: 2;
|
||||
char** argv = rz_str_argv (rz_str_trim_head_ro (input + delta), &argc);
|
||||
switch (input[2]) {
|
||||
case '?': {
|
||||
const char *helpmsg[] = {
|
||||
"Usage ecH[iw-?]","","",
|
||||
"ecHi","[color]","highlight current instruction with 'color' background",
|
||||
"ecHw","[word] [color]","highlight 'word ' in current instruction with 'color' background",
|
||||
"ecH","","list all the highlight rules",
|
||||
"ecH.","","show highlight rule in current offset",
|
||||
"ecH-","*","remove all the highlight hints",
|
||||
"ecH-","","remove all highlights on current instruction",
|
||||
NULL
|
||||
};
|
||||
rz_core_cmd_help (core, helpmsg);
|
||||
}
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '-': // ecH-
|
||||
if (input[3] == '*') {
|
||||
rz_meta_del (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0, UT64_MAX);
|
||||
} else {
|
||||
rz_meta_del (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, 1);
|
||||
// rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, "");
|
||||
}
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '.':
|
||||
rz_meta_print_list_in_function (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0, core->offset);
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '\0':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, 0);
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case 'j':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, 'j');
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case '*':
|
||||
rz_meta_print_list_all (core->analysis, RZ_META_TYPE_HIGHLIGHT, '*');
|
||||
rz_str_argv_free (argv);
|
||||
return false;
|
||||
case ' ':
|
||||
case 'i': // "ecHi"
|
||||
if (argc) {
|
||||
char *dup = rz_str_newf ("bgonly %s", argv[0]);
|
||||
color_code = rz_cons_pal_parse (dup, NULL);
|
||||
RZ_FREE (dup);
|
||||
if (!color_code) {
|
||||
eprintf ("Unknown color %s\n", argv[0]);
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'w': // "ecHw"
|
||||
if (!argc) {
|
||||
eprintf ("Usage: ecHw word [color]\n");
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
word = strdup (argv[0]);
|
||||
if (argc > 1) {
|
||||
char *dup = rz_str_newf ("bgonly %s", argv[1]);
|
||||
color_code = rz_cons_pal_parse (dup, NULL);
|
||||
RZ_FREE (dup);
|
||||
if (!color_code) {
|
||||
eprintf ("Unknown color %s\n", argv[1]);
|
||||
rz_str_argv_free (argv);
|
||||
free (word);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
eprintf ("See ecH?\n");
|
||||
rz_str_argv_free (argv);
|
||||
return true;
|
||||
}
|
||||
rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, "");
|
||||
const char *str = rz_meta_get_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset);
|
||||
char *dup = rz_str_newf ("%s \"%s%s\"", str?str:"", word?word:"", color_code?color_code:rz_cons_singleton ()->context->pal.wordhl);
|
||||
rz_meta_set_string (core->analysis, RZ_META_TYPE_HIGHLIGHT, core->offset, dup);
|
||||
rz_str_argv_free (argv);
|
||||
RZ_FREE (word);
|
||||
RZ_FREE (dup);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
char *p = strdup (input + 2);
|
||||
char *q = strchr (p, '=');
|
||||
if (!q) {
|
||||
q = strchr (p, ' ');
|
||||
}
|
||||
if (q) {
|
||||
// Set color
|
||||
*q++ = 0;
|
||||
if (rz_cons_pal_set (p, q)) {
|
||||
rz_cons_pal_update_event ();
|
||||
}
|
||||
} else {
|
||||
char color[32];
|
||||
RzColor rcolor = rz_cons_pal_get (p);
|
||||
rz_cons_rgb_str (color, sizeof (color), &rcolor);
|
||||
eprintf ("(%s)(%sCOLOR"Color_RESET")\n", p, color);
|
||||
}
|
||||
free (p);
|
||||
}
|
||||
}
|
||||
rz_eval_color (core, input + 1);
|
||||
break;
|
||||
case 'd': // "ed"
|
||||
if (input[1] == '?') {
|
||||
|
|
@ -660,3 +667,135 @@ RZ_IPI int rz_cmd_eval(void *data, const char *input) {
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_getset_handler(RzCore *core, int argc, const char **argv) {
|
||||
if (argc == 1) {
|
||||
rz_config_list (core->config, NULL, 0);
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 1; i < argc; i++) {
|
||||
RzList *l = rz_str_split_duplist_n (argv[i], "=", 2, false);
|
||||
if (!l) {
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
size_t llen = rz_list_length (l);
|
||||
if (!llen) {
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
char *key = rz_list_get_n (l, 0);
|
||||
|
||||
if (llen == 1 && rz_str_endswith (key, ".")) {
|
||||
// no value was set, only key with ".". List possible sub-keys.
|
||||
rz_config_list (core->config, key, false);
|
||||
} else if (llen == 1) {
|
||||
// no value was set, show the value of the key
|
||||
rz_cons_printf ("%s\n", rz_config_get (core->config, key));
|
||||
} else if (llen == 2) {
|
||||
char *value = rz_list_get_n (l, 1);
|
||||
rz_config_set (core->config, key, value);
|
||||
}
|
||||
|
||||
rz_list_free (l);
|
||||
}
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_list_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode) {
|
||||
switch (mode) {
|
||||
case RZ_OUTPUT_MODE_STANDARD:
|
||||
rz_config_list (core->config, argv[1], 2);
|
||||
break;
|
||||
case RZ_OUTPUT_MODE_JSON:
|
||||
rz_config_list (core->config, argv[1], 'j');
|
||||
break;
|
||||
case RZ_OUTPUT_MODE_RIZIN:
|
||||
rz_config_list (core->config, argv[1], 1);
|
||||
break;
|
||||
case RZ_OUTPUT_MODE_QUIET:
|
||||
rz_config_list (core->config, argv[1], 'q');
|
||||
break;
|
||||
case RZ_OUTPUT_MODE_LONG:
|
||||
rz_config_list (core->config, argv[1], 'v');
|
||||
break;
|
||||
case RZ_OUTPUT_MODE_LONG_JSON: {
|
||||
char *a = rz_str_newf ("j%s", argc > 1? argv[1]: "");
|
||||
rz_config_list (core->config, a, 'v');
|
||||
free (a);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_reset_handler(RzCore *core, int argc, const char **argv) {
|
||||
return rz_core_config_init (core)? RZ_CMD_STATUS_OK: RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_bool_invert_handler(RzCore *core, int argc, const char **argv) {
|
||||
if (!rz_config_toggle (core->config, argv[1])) {
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_editor_handler(RzCore *core, int argc, const char **argv) {
|
||||
const char *val = rz_config_get (core->config, argv[1]);
|
||||
if (!val) {
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
char *p = rz_core_editor (core, NULL, val);
|
||||
if (!p) {
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
rz_str_replace_char (p, '\n', ';');
|
||||
rz_config_set (core->config, argv[1], p);
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_editor_rizinrc_handler(RzCore *core, int argc, const char **argv) {
|
||||
char *file = rz_str_home (".rizinrc");
|
||||
if (rz_cons_is_interactive ()) {
|
||||
rz_file_touch (file);
|
||||
char *res = rz_cons_editor (file, NULL);
|
||||
if (res) {
|
||||
}
|
||||
}
|
||||
if (rz_cons_yesno ('y', "Reload? (Y/n)")) {
|
||||
rz_core_run_script (core, file);
|
||||
}
|
||||
free (file);
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_readonly_handler(RzCore *core, int argc, const char **argv) {
|
||||
if (!rz_config_readonly (core->config, argv[1])) {
|
||||
eprintf ("rz_config: cannot make eval '%s' readonly.\n", argv[1]);
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_spaces_handler(RzCore *core, int argc, const char **argv) {
|
||||
rz_config_list (core->config, argv[1], 's');
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_eval_type_handler(RzCore *core, int argc, const char **argv) {
|
||||
RzConfigNode *node = rz_config_node_get (core->config, argv[1]);
|
||||
if (!node) {
|
||||
eprintf ("rz_config: cannot find eval '%s'.\n", argv[1]);
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
|
||||
const char *type = rz_config_node_type (node);
|
||||
if (!type) {
|
||||
eprintf ("rz_config: cannot find type of eval '%s'.\n", argv[1]);
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
rz_cons_println (type);
|
||||
return RZ_CMD_STATUS_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ typedef enum rz_cmd_arg_type_t {
|
|||
RZ_CMD_ARG_TYPE_OPTION, ///< Argument is an option, prefixed with `-`. It is present or not. No argument.
|
||||
RZ_CMD_ARG_TYPE_CMD, ///< Argument is an rizin command
|
||||
RZ_CMD_ARG_TYPE_MACRO, ///< Argument is the name of a pre-defined macro
|
||||
RZ_CMD_ARG_TYPE_EVAL_KEY, ///< Argument is the name of a evaluable variable (e.g. `et` command)
|
||||
RZ_CMD_ARG_TYPE_EVAL_FULL, ///< Argument is the name+(optional)value of a evaluable variable (e.g. `e` command)
|
||||
} RzCmdArgType;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ typedef enum {
|
|||
RZ_OUTPUT_MODE_QUIET = 1 << 3,
|
||||
RZ_OUTPUT_MODE_SDB = 1 << 4,
|
||||
RZ_OUTPUT_MODE_LONG = 1 << 5,
|
||||
RZ_OUTPUT_MODE_TABLE = 1 << 6,
|
||||
RZ_OUTPUT_MODE_LONG_JSON = 1 << 6,
|
||||
RZ_OUTPUT_MODE_TABLE = 1 << 7,
|
||||
} RzOutputMode;
|
||||
|
||||
#define RZ_IN /* do not use, implicit */
|
||||
|
|
|
|||
|
|
@ -524,28 +524,30 @@ bool test_cmd_argv_modes(void) {
|
|||
|
||||
RzCmd *cmd = rz_cmd_new (false);
|
||||
RzCmdDesc *root = rz_cmd_get_root (cmd);
|
||||
RzCmdDesc *z_cd = rz_cmd_desc_argv_modes_new (cmd, root, "z", RZ_OUTPUT_MODE_STANDARD | RZ_OUTPUT_MODE_JSON | RZ_OUTPUT_MODE_QUIET, z_modes_handler, &z_help);
|
||||
RzCmdDesc *z_cd = rz_cmd_desc_argv_modes_new (cmd, root, "z", RZ_OUTPUT_MODE_STANDARD | RZ_OUTPUT_MODE_JSON | RZ_OUTPUT_MODE_QUIET | RZ_OUTPUT_MODE_LONG_JSON, z_modes_handler, &z_help);
|
||||
|
||||
mu_assert_ptreq (rz_cmd_get_desc (cmd, "z"), z_cd, "z is found");
|
||||
mu_assert_ptreq (rz_cmd_get_desc (cmd, "zj"), z_cd, "zj is handled by z");
|
||||
mu_assert_ptreq (rz_cmd_get_desc (cmd, "zq"), z_cd, "zq is handled by z");
|
||||
mu_assert_ptreq (rz_cmd_get_desc (cmd, "zJ"), z_cd, "zJ is handled by z");
|
||||
mu_assert_null (rz_cmd_get_desc (cmd, "z*"), "z* was not defined");
|
||||
|
||||
RzCmdParsedArgs *pa = rz_cmd_parsed_args_newcmd ("?");
|
||||
char *h = rz_cmd_get_help (cmd, pa, false);
|
||||
char *exp_h = "Usage: [.][times][cmd][~grep][@[@iter]addr!size][|>pipe] ; ...\n"
|
||||
"| z[jq] # z summary\n";
|
||||
mu_assert_streq (h, exp_h, "zj and zq are considered in the help");
|
||||
"| z[jqJ] # z summary\n";
|
||||
mu_assert_streq (h, exp_h, "zj, zJ and zq are considered in the help");
|
||||
free (h);
|
||||
rz_cmd_parsed_args_free (pa);
|
||||
|
||||
pa = rz_cmd_parsed_args_newcmd ("z?");
|
||||
h = rz_cmd_get_help (cmd, pa, false);
|
||||
exp_h = "Usage: z[jq] # z summary\n"
|
||||
exp_h = "Usage: z[jqJ] # z summary\n"
|
||||
"| z # z summary\n"
|
||||
"| zj # z summary (JSON mode)\n"
|
||||
"| zq # z summary (quiet mode)\n";
|
||||
mu_assert_streq (h, exp_h, "zj and zq are considered in the sub help");
|
||||
"| zq # z summary (quiet mode)\n"
|
||||
"| zJ # z summary (verbose JSON mode)\n";
|
||||
mu_assert_streq (h, exp_h, "zj, zJ and zq are considered in the sub help");
|
||||
free (h);
|
||||
rz_cmd_parsed_args_free (pa);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue