shell: Refactor command execution to enable raw arguments

Added special flag that can be used to indicate that optional
arguments are passed without any parsing (e.g. quotation marks
removal). Modified execute command to parse command line buffer
argument by argument.

After this change it is possible to forward whole command to
command handler (using select).

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2020-04-14 09:01:57 +02:00 committed by Kumar Gala
commit 512de5ecac
5 changed files with 184 additions and 113 deletions

View file

@ -393,8 +393,9 @@ static int cmd_select(const struct shell *shell, size_t argc, char **argv)
argc--;
argv = argv + 1;
candidate = shell_get_last_command(shell, argc, argv, &matching_argc,
&entry, true);
candidate = shell_get_last_command(shell->ctx->selected_cmd,
argc, (const char **)argv,
&matching_argc, &entry, true);
if ((candidate != NULL) && !no_args(candidate)
&& (argc == matching_argc)) {
@ -453,10 +454,12 @@ SHELL_STATIC_SUBCMD_SET_CREATE(m_sub_resize,
SHELL_CMD_ARG_REGISTER(clear, NULL, SHELL_HELP_CLEAR, cmd_clear, 1, 0);
SHELL_CMD_REGISTER(shell, &m_sub_shell, SHELL_HELP_SHELL, NULL);
SHELL_CMD_ARG_REGISTER(help, NULL, SHELL_HELP_HELP, cmd_help, 1, 255);
SHELL_CMD_ARG_REGISTER(help, NULL, SHELL_HELP_HELP, cmd_help,
1, SHELL_OPT_ARG_CHECK_SKIP);
SHELL_COND_CMD_ARG_REGISTER(CONFIG_SHELL_HISTORY, history, NULL,
SHELL_HELP_HISTORY, cmd_history, 1, 0);
SHELL_COND_CMD_ARG_REGISTER(CONFIG_SHELL_CMDS_RESIZE, resize, &m_sub_resize,
SHELL_HELP_RESIZE, cmd_resize, 1, 1);
SHELL_COND_CMD_ARG_REGISTER(CONFIG_SHELL_CMDS_SELECT, select, NULL,
SHELL_HELP_SELECT, cmd_select, 2, 255);
SHELL_HELP_SELECT, cmd_select, 2,
SHELL_OPT_ARG_CHECK_SKIP);