cli: Enables using modern hush parser as command line parser

If one defines HUSH_MODERN_PARSER, it is then possible to use modern parser with:
=> cli get
old
=> cli set modern
=> cli get
modern

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
This commit is contained in:
Francis Laniel
2023-12-22 22:02:32 +01:00
committed by Tom Rini
parent 6bb39f5d16
commit 9a06837731
10 changed files with 184 additions and 20 deletions

View File

@@ -33,6 +33,18 @@ config HUSH_OLD_PARSER
2005.
It is actually the default U-Boot shell when decided to use hush as shell.
config HUSH_MODERN_PARSER
bool "Use hush modern parser"
help
This option enables the new flavor of hush based on hush upstream
Busybox.
This parser is experimental and not well tested.
config HUSH_SELECTABLE
bool
default y if HUSH_OLD_PARSER && HUSH_MODERN_PARSER
endmenu
config CMDLINE_EDITING

View File

@@ -229,7 +229,7 @@ obj-$(CONFIG_CMD_AVB) += avb.o
# Foundries.IO SCP03
obj-$(CONFIG_CMD_SCP03) += scp03.o
obj-$(CONFIG_HUSH_PARSER) += cli.o
obj-$(CONFIG_HUSH_SELECTABLE) += cli.o
obj-$(CONFIG_ARM) += arm/
obj-$(CONFIG_RISCV) += riscv/

View File

@@ -12,6 +12,8 @@ static const char *gd_flags_to_parser_name(void)
{
if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
return "old";
if (gd->flags & GD_FLG_HUSH_MODERN_PARSER)
return "modern";
return NULL;
}
@@ -34,18 +36,31 @@ static int parser_string_to_gd_flags(const char *parser)
{
if (!strcmp(parser, "old"))
return GD_FLG_HUSH_OLD_PARSER;
if (!strcmp(parser, "modern"))
return GD_FLG_HUSH_MODERN_PARSER;
return -1;
}
static int gd_flags_to_parser_config(int flag)
{
if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
return CONFIG_VAL(HUSH_OLD_PARSER);
if (gd->flags & GD_FLG_HUSH_MODERN_PARSER)
return CONFIG_VAL(HUSH_MODERN_PARSER);
return -1;
}
static void reset_parser_gd_flags(void)
{
gd->flags &= ~GD_FLG_HUSH_OLD_PARSER;
gd->flags &= ~GD_FLG_HUSH_MODERN_PARSER;
}
static int do_cli_set(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
char *parser_name;
int parser_config;
int parser_flag;
if (argc < 2)
@@ -59,9 +74,14 @@ static int do_cli_set(struct cmd_tbl *cmdtp, int flag, int argc,
return CMD_RET_USAGE;
}
if (parser_flag == GD_FLG_HUSH_OLD_PARSER &&
!CONFIG_IS_ENABLED(HUSH_OLD_PARSER)) {
printf("Want to set current parser to old, but its code was not compiled!\n");
parser_config = gd_flags_to_parser_config(parser_flag);
switch (parser_config) {
case -1:
printf("Bad value for parser flags: %d\n", parser_flag);
return CMD_RET_FAILURE;
case 0:
printf("Want to set current parser to %s, but its code was not compiled!\n",
parser_name);
return CMD_RET_FAILURE;
}
@@ -102,7 +122,7 @@ static int do_cli(struct cmd_tbl *cmdtp, int flag, int argc,
#if CONFIG_IS_ENABLED(SYS_LONGHELP)
static char cli_help_text[] =
"get - print current cli\n"
"set - set the current cli, possible value is: old"
"set - set the current cli, possible value are: old, modern"
;
#endif