public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
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 */

  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