On 10/4/23 18:42, Francis Laniel wrote:
This command can be used to print the current parser with 'cli print'.

Please, provide a commit message that matches the code.

It can also be used to set the current parser with 'cli set'.
For the moment, only one value is valid for set: old.

If there is only one valid value, we should not provide the 'cli'
command to save code size. The patch seems to be in the wrong spot in
the series.


Signed-off-by: Francis Laniel <francis.lan...@amarulasolutions.com>
---
  cmd/Makefile          |   2 +
  cmd/cli.c             | 120 ++++++++++++++++++++++++++++++++++++++++++
  common/cli.c          |   3 +-
  doc/usage/cmd/cli.rst |  59 +++++++++++++++++++++
  doc/usage/index.rst   |   1 +
  5 files changed, 184 insertions(+), 1 deletion(-)
  create mode 100644 cmd/cli.c
  create mode 100644 doc/usage/cmd/cli.rst

diff --git a/cmd/Makefile b/cmd/Makefile
index 9bebf321c3..d468cc5065 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -226,6 +226,8 @@ obj-$(CONFIG_CMD_AVB) += avb.o
  # Foundries.IO SCP03
  obj-$(CONFIG_CMD_SCP03) += scp03.o

+obj-$(CONFIG_HUSH_PARSER) += cli.o

Don't waste binary code size. We only need the command if at least two
parsers are available.

ifeq ($(CONFIG_HUSH_OLD_PARSER)$(HUSH_2021_PARSER),yy)
obj-y += cli.o
endif

The symbol CONFIG_HUSH_PARSER should be eliminated.

+
  obj-$(CONFIG_ARM) += arm/
  obj-$(CONFIG_RISCV) += riscv/
  obj-$(CONFIG_SANDBOX) += sandbox/
diff --git a/cmd/cli.c b/cmd/cli.c
new file mode 100644
index 0000000000..7671785b83
--- /dev/null
+++ b/cmd/cli.c
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <cli.h>
+#include <command.h>
+#include <string.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const char *gd_flags_to_parser(void)
+{
+       if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
+               return "old";
+       return NULL;
+}
+
+static int do_cli_get(struct cmd_tbl *cmdtp, int flag, int argc,
+                        char *const argv[])
+{
+       const char *current = gd_flags_to_parser();
+
+       if (!current) {
+               printf("current cli value is not valid, this should not 
happen!\n");
+               return CMD_RET_FAILURE;
+       }
+
+       printf("%s\n", current);
+
+       return CMD_RET_SUCCESS;
+}
+

Please, describe this function (and all the others) in Sphinx style.

/**
 * parser_string_to_gd_flags() - converts parser name to bit mask
 *
 * @parser:     parser name
 * Return:      valid bit mask or -1
 */

+static int parser_string_to_gd_flags(const char *parser)
+{
+       if (!strcmp(parser, "old"))
+               return GD_FLG_HUSH_OLD_PARSER;

Please, do not return an invalid bit mask.

if (CONFIG_IS_ENABLED(HUSH_OLD_PARSER) && !strcmp(parser, "old"))
        return GD_FLG_HUSH_OLD_PARSER;
if (CONFIG_IS_ENABLED(HUSH_2021_PARSER) && !strcmp(parser, "2021"))
        return GD_FLG_HUSH_201_PARSER;

+       return -1;
+}
+
+static void reset_parser_gd_flags(void)
+{
+       gd->flags &= ~GD_FLG_HUSH_OLD_PARSER;

gd->flags &= ~(GD_FLG_HUSH_OLD_PARSER | GD_FLG_HUSH_2021_PARSER);

If there were only one parser, we wouldn't create this command.

+}
+
+static int do_cli_set(struct cmd_tbl *cmdtp, int flag, int argc,
+                     char *const argv[])
+{
+       char *parser_name;
+       int parser_flag;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
+       parser_name = argv[1];
+
+       parser_flag = parser_string_to_gd_flags(parser_name);

This function should return -1 for for any value that is not supported
be it 'foo', 'old', or '2021'. Then you can eliminate a bunch of error
checking code below.

+       if (parser_flag == -1) {
+               printf("Bad value for parser name: %s\n", parser_name);
+               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");
+               return CMD_RET_FAILURE;
+       }

Superfluous check, see above.

+
+       if (parser_flag == GD_FLG_HUSH_2021_PARSER &&
+               !CONFIG_IS_ENABLED(HUSH_2021_PARSER)) {
+               printf("Want to set current parser to 2021, but its code was not 
compiled!\n");
+               return CMD_RET_FAILURE;
+       }

Superfluous check, see above.

+
+       reset_parser_gd_flags();
+       gd->flags |= parser_flag;
+
+       cli_init();
+       cli_loop();
+
+       /* cli_loop() should never return. */
+       return CMD_RET_FAILURE;

Consuming stack space for every invocation of the 'cli set' command
cannot be intended.

Why don't we define cli_loop as __noreturn and ensure that it has no
return statement? Then gcc can generate a simple jump without consuming
stack.

cli_loop should() invoke panic() instead of returning.

+}
+
+static struct cmd_tbl parser_sub[] = {
+       U_BOOT_CMD_MKENT(get, 1, 1, do_cli_get, "", ""),
+       U_BOOT_CMD_MKENT(set, 2, 1, do_cli_set, "", ""),
+};
+
+static int do_cli(struct cmd_tbl *cmdtp, int flag, int argc,
+                 char *const argv[])
+{
+       struct cmd_tbl *cp;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
+       /* drop initial "parser" arg */
+       argc--;
+       argv++;
+
+       cp = find_cmd_tbl(argv[0], parser_sub, ARRAY_SIZE(parser_sub));
+       if (cp)
+               return cp->cmd(cmdtp, flag, argc, argv);
+
+       return CMD_RET_USAGE;
+}
+
+#if CONFIG_IS_ENABLED(SYS_LONGHELP)
+static char cli_help_text[] =
+       "get - print current cli\n"

"get - display parser\n"

+       "set - set the current cli, possible value is: old"

'cli ' is only printed automatically in the first line.

"cli set - set parser to one of:\n"
#ifdef CONFIG_HUSH_OLD_PARSER
"\t- old\n"
#endif
#ifdef CONFIG_HUSH_2021_PARSER
"\t- 2021\n"
#endif

Why would we need the 'cli set' command at all if there is only one
parser enabled?
Should we better disable the sub-command in that case?

+       ;
+#endif
+
+U_BOOT_CMD(cli, 3, 1, do_cli,
+          "cli",
+#if CONFIG_IS_ENABLED(SYS_LONGHELP)
+          cli_help_text
+#endif

This is wrong. You must pass an empty string at least. Please, follow
the style of the other commands and place the #if in the long text.

+);
diff --git a/common/cli.c b/common/cli.c
index e5fe1060d0..d419671e8c 100644
--- a/common/cli.c
+++ b/common/cli.c
@@ -268,7 +268,8 @@ void cli_loop(void)
  void cli_init(void)
  {
  #ifdef CONFIG_HUSH_PARSER

This Kconfig symbol is superfluous when you already have
CONFIG_HUSH_OLD_PARSER and CONFIG_HUSH_2021_PARSER.

Please, remove CONFIG_HUSH_PARSER from Kconfig.

-       if (!(gd->flags & GD_FLG_HUSH_OLD_PARSER))
+       if (!(gd->flags & GD_FLG_HUSH_OLD_PARSER)

The first part of the if statement is superfluous.
There is no harm in setting the bit again.

+               && CONFIG_IS_ENABLED(HUSH_OLD_PARSER))
                gd->flags |= GD_FLG_HUSH_OLD_PARSER;
        u_boot_hush_start();
  #endif
diff --git a/doc/usage/cmd/cli.rst b/doc/usage/cmd/cli.rst
new file mode 100644
index 0000000000..89ece3203d
--- /dev/null
+++ b/doc/usage/cmd/cli.rst
@@ -0,0 +1,59 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+cli command
+===========
+
+Synopis
+-------
+
+::
+
+    cli get
+    cli set cli_flavor

We should show the available values here:

cli set [old|2021]

+
+Description
+-----------
+
+The cli command permits getting and changing the current parser at runtime.

The cli command permits displaying and setting the command line parsers.
Currently two parsers are implemented:

old
   The 'old' parser is what U-Boot provided until v2023.10.

2021
   The '2021' parser provides ....

Please, describe here why the '2021' parser might be preferable. Please,
describe which parser is the default.

+
+cli get
+~~~~~~~
+
+It shows the current value of the parser used by the CLI.

The command display the parser used by the command line interface ('old'
or '2021').

+
+cli set
+~~~~~~~
+
+It permits setting the value of the parser used by the CLI.

The command sets the parser used by the command line interface.

+
+Possible values are old and 2021.
+Note that, to use a specific parser its code should have been compiled, that
+is to say you need to enable the corresponding CONFIG_HUSH*.
+Otherwise, an error message is printed.

Should we use .. note:: here to highlight the information?

+
+Examples
+--------
+
+Get the current parser::
+
+    => cli get
+    old
+
+Change the current parser::
+
+    => cli set old

=> cli set 2021

Who would want to set the current value?

+
+Trying to set the current parser to an unknown value::
+
+    => cli set foo
+    Bad value for parser name: foo
+    cli - cli
+
+    Usage:
+    cli get - print current cli
+    set - set the current cli, possible value is: old

This looks like a bug. I would have expected at least two possible
values. Otherwise we would not need a 'cli' command.

Please, add a 'Configuration' section describing the relevant
configuration variables.

Best regards

Heinrich

+
+Return value
+------------
+
+The return value $? indicates whether the command succeeded.
diff --git a/doc/usage/index.rst b/doc/usage/index.rst
index fa702920fa..90a38c5713 100644
--- a/doc/usage/index.rst
+++ b/doc/usage/index.rst
@@ -42,6 +42,7 @@ Shell commands
     cmd/cat
     cmd/cbsysinfo
     cmd/cedit
+   cmd/cli
     cmd/cls
     cmd/cmp
     cmd/coninfo

Reply via email to