[PATCH v5 2/6] cmd: bcb: rework the command to U_BOOT_LONGHELP approach

Dmitry Rokosov <[email protected]>
Newsgroups io.groups.u-boot-amlogic,org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
U_BOOT_LONGHELP and U_BOOT_CMD_WITH_SUBCMDS offer numerous advantages,
including:
- common argument restrictions checking
- automatic subcommand matching
- improved usage and help handling

By utilizing the U_BOOT_LONGHELP approach, we can reduce the amount of
command management code and describe commands more succinctly.

Signed-off-by: Dmitry Rokosov <[email protected]>
---
 cmd/bcb.c | 151 ++++++++++++++++++--------------------------------------------
 1 file changed, 43 insertions(+), 108 deletions(-)

diff --git a/cmd/bcb.c b/cmd/bcb.c
index 97a96c009641cc094645607ef833575f3c03fe4b..98b2a71087a27b1721f4bed4160095d65ec75402 100644
--- a/cmd/bcb.c
+++ b/cmd/bcb.c
@@ -16,15 +16,6 @@
 #include <vsprintf.h>
 #include <linux/err.h>
 
-enum bcb_cmd {
-	BCB_CMD_LOAD,
-	BCB_CMD_FIELD_SET,
-	BCB_CMD_FIELD_CLEAR,
-	BCB_CMD_FIELD_TEST,
-	BCB_CMD_FIELD_DUMP,
-	BCB_CMD_STORE,
-};
-
 static const char * const fields[] = {
 	"command",
 	"status",
@@ -38,67 +29,9 @@ static struct disk_partition partition_data;
 static struct blk_desc *block;
 static struct disk_partition *partition = &partition_data;
 
-static int bcb_cmd_get(char *cmd)
-{
-	if (!strcmp(cmd, "load"))
-		return BCB_CMD_LOAD;
-	if (!strcmp(cmd, "set"))
-		return BCB_CMD_FIELD_SET;
-	if (!strcmp(cmd, "clear"))
-		return BCB_CMD_FIELD_CLEAR;
-	if (!strcmp(cmd, "test"))
-		return BCB_CMD_FIELD_TEST;
-	if (!strcmp(cmd, "store"))
-		return BCB_CMD_STORE;
-	if (!strcmp(cmd, "dump"))
-		return BCB_CMD_FIELD_DUMP;
-	else
-		return -1;
-}
-
-static int bcb_is_misused(int argc, char *const argv[])
+static int bcb_not_loaded(void)
 {
-	int cmd = bcb_cmd_get(argv[0]);
-
-	switch (cmd) {
-	case BCB_CMD_LOAD:
-		if (argc != 3 && argc != 4)
-			goto err;
-		break;
-	case BCB_CMD_FIELD_SET:
-		if (argc != 3)
-			goto err;
-		break;
-	case BCB_CMD_FIELD_TEST:
-		if (argc != 4)
-			goto err;
-		break;
-	case BCB_CMD_FIELD_CLEAR:
-		if (argc != 1 && argc != 2)
-			goto err;
-		break;
-	case BCB_CMD_STORE:
-		if (argc != 1)
-			goto err;
-		break;
-	case BCB_CMD_FIELD_DUMP:
-		if (argc != 2)
-			goto err;
-		break;
-	default:
-		printf("Error: 'bcb %s' not supported\n", argv[0]);
-		return -1;
-	}
-
-	if (cmd != BCB_CMD_LOAD && !block) {
-		printf("Error: Please, load BCB first!\n");
-		return -1;
-	}
-
-	return 0;
-err:
-	printf("Error: Bad usage of 'bcb %s'\n", argv[0]);
-
+	printf("Error: Please, load BCB first!\n");
 	return -1;
 }
 
@@ -216,6 +149,9 @@ static int do_bcb_load(struct cmd_tbl *cmdtp, int flag, int argc,
 	char *endp;
 	char *iface = "mmc";
 
+	if (argc < 3)
+		return CMD_RET_USAGE;
+
 	if (argc == 4) {
 		iface = argv[1];
 		argc--;
@@ -270,6 +206,12 @@ static int __bcb_set(const char *fieldp, const char *valp)
 static int do_bcb_set(struct cmd_tbl *cmdtp, int flag, int argc,
 		      char * const argv[])
 {
+	if (argc < 3)
+		return CMD_RET_USAGE;
+
+	if (!block)
+		return bcb_not_loaded();
+
 	return __bcb_set(argv[1], argv[2]);
 }
 
@@ -279,6 +221,9 @@ static int do_bcb_clear(struct cmd_tbl *cmdtp, int flag, int argc,
 	int size;
 	char *field;
 
+	if (!block)
+		return bcb_not_loaded();
+
 	if (argc == 1) {
 		memset(&bcb, 0, sizeof(bcb));
 		return CMD_RET_SUCCESS;
@@ -297,7 +242,15 @@ static int do_bcb_test(struct cmd_tbl *cmdtp, int flag, int argc,
 {
 	int size;
 	char *field;
-	char *op = argv[2];
+	char *op;
+
+	if (argc < 4)
+		return CMD_RET_USAGE;
+
+	if (!block)
+		return bcb_not_loaded();
+
+	op = argv[2];
 
 	if (bcb_field_get(argv[1], &field, &size))
 		return CMD_RET_FAILURE;
@@ -325,6 +278,12 @@ static int do_bcb_dump(struct cmd_tbl *cmdtp, int flag, int argc,
 	int size;
 	char *field;
 
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (!block)
+		return bcb_not_loaded();
+
 	if (bcb_field_get(argv[1], &field, &size))
 		return CMD_RET_FAILURE;
 
@@ -356,6 +315,9 @@ err:
 static int do_bcb_store(struct cmd_tbl *cmdtp, int flag, int argc,
 			char * const argv[])
 {
+	if (!block)
+		return bcb_not_loaded();
+
 	return __bcb_store();
 }
 
@@ -414,44 +376,7 @@ void bcb_reset(void)
 	__bcb_reset();
 }
 
-static struct cmd_tbl cmd_bcb_sub[] = {
-	U_BOOT_CMD_MKENT(load, CONFIG_SYS_MAXARGS, 1, do_bcb_load, "", ""),
-	U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 1, do_bcb_set, "", ""),
-	U_BOOT_CMD_MKENT(clear, CONFIG_SYS_MAXARGS, 1, do_bcb_clear, "", ""),
-	U_BOOT_CMD_MKENT(test, CONFIG_SYS_MAXARGS, 1, do_bcb_test, "", ""),
-	U_BOOT_CMD_MKENT(dump, CONFIG_SYS_MAXARGS, 1, do_bcb_dump, "", ""),
-	U_BOOT_CMD_MKENT(store, CONFIG_SYS_MAXARGS, 1, do_bcb_store, "", ""),
-};
-
-static int do_bcb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
-{
-	struct cmd_tbl *c;
-
-	if (argc < 2)
-		return CMD_RET_USAGE;
-
-	argc--;
-	argv++;
-
-	c = find_cmd_tbl(argv[0], cmd_bcb_sub, ARRAY_SIZE(cmd_bcb_sub));
-	if (!c)
-		return CMD_RET_USAGE;
-
-	if (bcb_is_misused(argc, argv)) {
-		/*
-		 * We try to improve the user experience by reporting the
-		 * root-cause of misusage, so don't return CMD_RET_USAGE,
-		 * since the latter prints out the full-blown help text
-		 */
-		return CMD_RET_FAILURE;
-	}
-
-	return c->cmd(cmdtp, flag, argc, argv);
-}
-
-U_BOOT_CMD(
-	bcb, CONFIG_SYS_MAXARGS, 1, do_bcb,
-	"Load/set/clear/test/dump/store Android BCB fields",
+U_BOOT_LONGHELP(bcb,
 	"load <interface> <dev> <part>  - load  BCB from <interface> <dev>:<part>\n"
 	"load <dev> <part>              - load  BCB from mmc <dev>:<part>\n"
 	"bcb set   <field> <val>        - set   BCB <field> to <val>\n"
@@ -472,3 +397,13 @@ U_BOOT_CMD(
 	"              NOTE: any ':' character in <val> will be replaced by line feed\n"
 	"              during 'bcb set' and used as separator by upper layers\n"
 );
+
+U_BOOT_CMD_WITH_SUBCMDS(bcb,
+	"Load/set/clear/test/dump/store Android BCB fields", bcb_help_text,
+	U_BOOT_SUBCMD_MKENT(load, 4, 1, do_bcb_load),
+	U_BOOT_SUBCMD_MKENT(set, 3, 1, do_bcb_set),
+	U_BOOT_SUBCMD_MKENT(clear, 2, 1, do_bcb_clear),
+	U_BOOT_SUBCMD_MKENT(test, 4, 1, do_bcb_test),
+	U_BOOT_SUBCMD_MKENT(dump, 2, 1, do_bcb_dump),
+	U_BOOT_SUBCMD_MKENT(store, 1, 1, do_bcb_store),
+);

-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.