Convert 'e' commands to newshell ##newshell

This commit is contained in:
Riccardo Schirone 2021-01-04 11:56:29 +01:00 committed by Anton Kochkov
parent 296b64e2e9
commit 0abb2c8bfc
9 changed files with 573 additions and 200 deletions

View file

@ -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) {

View file

@ -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 },
};

View file

@ -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);

View file

@ -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);

View file

@ -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"

View file

@ -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;
}

View file

@ -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;
/**

View file

@ -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 */

View file

@ -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);