From: Boris Brezillon <boris.brezillon@bootlin.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 4/6] command: commands: Add macros to declare commands with subcmds
Date: Thu, 29 Nov 2018 16:22:19 +0100 [thread overview]
Message-ID: <20181129162219.4fb6f464@bbrezillon> (raw)
In-Reply-To: <20181128233921.16675-5-boris.brezillon@bootlin.com>
On Thu, 29 Nov 2018 00:39:19 +0100
Boris Brezillon <boris.brezillon@bootlin.com> wrote:
> Most cmd/xxx.c source files expose several commands through a single
> entry point. Some of them are doing the sub-command parsing manually in
> their do_<cmd>() function, others are declaring a table of sub-commands
> and then use find_cmd_tbl() to delegate the request to the sub command
> handler.
>
> In both case, the amount of code to do that is not negligible and
^cases
> repetitive, not to mention that almost no commands are implementing
> a auto-completion hook, which means most u-boot lack auto-completion.
^the ^commands
>
> Provide several macros to easily define sub-commands and commands
> exposing such sub-commands.
"
Provide several macros to easily define commands exposing sub-commands.
"
>
> Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
> ---
> Changes in v2:
> - Remove _maxargs argument
> ---
> include/command.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 78 insertions(+)
>
> diff --git a/include/command.h b/include/command.h
> index bb93f022c514..461b17447c0d 100644
> --- a/include/command.h
> +++ b/include/command.h
> @@ -209,6 +209,70 @@ int board_run_command(const char *cmdline);
> # define _CMD_HELP(x)
> #endif
>
> +#ifdef CONFIG_NEEDS_MANUAL_RELOC
> +#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
> + static void _cmdname##_subcmds_reloc(void) \
> + { \
> + static int relocated; \
> + \
> + if (relocated) \
> + return; \
> + \
> + fixup_cmdtable(_cmdname##_subcmds, \
> + ARRAY_SIZE(_cmdname##_subcmds)); \
> + relocated = 1; \
> + }
> +#else
> +#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
> + static void _cmdname##_subcmds_reloc(void) { }
> +#endif
> +
> +#define U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
> + static int do_##_cmdname(cmd_tbl_t *cmdtp, int flag, int argc, \
> + char * const argv[], int *repeatable) \
> + { \
> + cmd_tbl_t *subcmd; \
> + \
> + _cmdname##_subcmds_reloc(); \
> + \
> + /* We need at least the cmd and subcmd names. */ \
> + if (argc < 2 || argc > CONFIG_SYS_MAXARGS) \
> + return CMD_RET_USAGE; \
> + \
> + subcmd = find_cmd_tbl(argv[1], _cmdname##_subcmds, \
> + ARRAY_SIZE(_cmdname##_subcmds)); \
> + if (!subcmd || argc - 1 > subcmd->maxargs) \
> + return CMD_RET_USAGE; \
> + \
> + if (flag == CMD_FLAG_REPEAT && \
> + !cmd_is_repeatable(subcmd)) \
> + return CMD_RET_SUCCESS; \
> + \
> + return subcmd->cmd_rep(subcmd, flag, argc - 1, \
> + argv + 1, repeatable); \
> + }
> +
> +#ifdef CONFIG_AUTO_COMPLETE
> +#define U_BOOT_SUBCMDS_COMPLETE(_cmdname) \
> + static int complete_##_cmdname(int argc, char * const argv[], \
> + char last_char, int maxv, \
> + char *cmdv[]) \
> + { \
> + return complete_subcmdv(_cmdname##_subcmds, \
> + ARRAY_SIZE(_cmdname##_subcmds), \
> + argc - 1, argv + 1, last_char, \
> + maxv, cmdv); \
> + }
> +#else
> +#define U_BOOT_SUBCMDS_COMPLETE(_cmdname)
> +#endif
> +
> +#define U_BOOT_SUBCMDS(_cmdname, ...) \
> + static cmd_tbl_t _cmdname##_subcmds[] = { __VA_ARGS__ }; \
> + U_BOOT_SUBCMDS_RELOC(_cmdname) \
> + U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
> + U_BOOT_SUBCMDS_COMPLETE(_cmdname)
> +
> #ifdef CONFIG_CMDLINE
> #define U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
> _usage, _help, _comp) \
> @@ -271,4 +335,18 @@ int board_run_command(const char *cmdline);
> U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
> _usage, _help, NULL)
>
> +#define U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
> + _comp) \
> + U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
> + "", "", _comp)
> +
> +#define U_BOOT_SUBCMD_MKENT(_name, _maxargs, _rep, _do_cmd) \
> + U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
> + NULL)
> +
> +#define U_BOOT_CMD_WITH_SUBCMDS(_name, _usage, _help, ...) \
> + U_BOOT_SUBCMDS(_name, __VA_ARGS__) \
> + U_BOOT_CMDREP_COMPLETE(_name, CONFIG_SYS_MAXARGS, do_##_name, \
> + _usage, _help, complete_##_name)
> +
> #endif /* __COMMAND_H */
next prev parent reply other threads:[~2018-11-29 15:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-28 23:39 [U-Boot] [PATCH v2 0/6] cmd: Simplify support for sub-commands Boris Brezillon
2018-11-28 23:39 ` [U-Boot] [PATCH v2 1/6] common: command: Fix command auto-completion Boris Brezillon
2018-11-29 14:19 ` Tom Rini
2018-11-28 23:39 ` [U-Boot] [PATCH v2 2/6] common: command: Expose a generic helper to auto-complete sub commands Boris Brezillon
2018-11-29 14:19 ` Tom Rini
2018-11-29 15:16 ` Boris Brezillon
2018-11-28 23:39 ` [U-Boot] [PATCH v2 3/6] common: command: Rework the 'cmd is repeatable' logic Boris Brezillon
2018-11-29 14:19 ` Tom Rini
2018-11-28 23:39 ` [U-Boot] [PATCH v2 4/6] command: commands: Add macros to declare commands with subcmds Boris Brezillon
2018-11-29 14:20 ` Tom Rini
2018-11-29 15:22 ` Boris Brezillon [this message]
2018-11-28 23:39 ` [U-Boot] [PATCH v2 5/6] cmd: mtd: Use the subcmd infrastructure to declare mtd sub-commands Boris Brezillon
2018-11-29 14:21 ` Tom Rini
2018-11-28 23:39 ` [U-Boot] [PATCH v2 6/6] cmd: adc: Use the sub-command infrastructure Boris Brezillon
2018-11-29 14:21 ` Tom Rini
2018-11-29 15:26 ` [U-Boot] [PATCH v2 0/6] cmd: Simplify support for sub-commands Boris Brezillon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181129162219.4fb6f464@bbrezillon \
--to=boris.brezillon@bootlin.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox