Change the command parsing code to ignore command table
entries with NULL names.  This makes it possible to disable a
command (say, for a supported but not connected memory) at
run time.

Signed-off-by: Josh Karabin <gkara...@vocollect.com>
---
 common/command.c |   43 +++++++++++++++++++++++++------------------
 1 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/common/command.c b/common/command.c
index c9a3f5b..ef2cbfc 100644
--- a/common/command.c
+++ b/common/command.c
@@ -243,15 +243,19 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, 
cmd_tbl_t * cmdtp, int
        if (argc == 1) {        /*show list of commands */
                cmd_tbl_t *cmd_array[cmd_items];
                int i, j, swaps;
+               int cmd_array_items;
 
                /* Make array of commands from .uboot_cmd section */
                cmdtp = cmd_start;
-               for (i = 0; i < cmd_items; i++) {
-                       cmd_array[i] = cmdtp++;
+               for (i = 0, cmd_array_items = 0; i < cmd_items; i++) {
+                       if (cmdtp->name) {
+                               cmd_array[i] = cmdtp++;
+                               cmd_array_items++;
+                       }
                }
 
                /* Sort command list (trivial bubble sort) */
-               for (i = cmd_items - 1; i > 0; --i) {
+               for (i = cmd_array_items - 1; i > 0; --i) {
                        swaps = 0;
                        for (j = 0; j < i; ++j) {
                                if (strcmp (cmd_array[j]->name,
@@ -268,7 +272,7 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, 
cmd_tbl_t * cmdtp, int
                }
 
                /* print short help (usage) */
-               for (i = 0; i < cmd_items; i++) {
+               for (i = 0; i < cmd_array_items; i++) {
                        const char *usage = cmd_array[i]->usage;
 
                        /* allow user abort */
@@ -298,7 +302,7 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, 
cmd_tbl_t * cmdtp, int
                        }
                        putc ('\n');
 #else  /* no long help available */
-                       if (cmdtp->usage)
+                       if (cmdtp->name && cmdtp->usage)
                                printf ("%s - %s\n", cmdtp->name, cmdtp->usage);
 #endif /* CONFIG_SYS_LONGHELP */
                } else {
@@ -365,7 +369,7 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, 
int table_len)
        for (cmdtp = table;
             cmdtp != table + table_len;
             cmdtp++) {
-               if (strncmp (cmd, cmdtp->name, len) == 0) {
+               if (cmdtp->name && (strncmp (cmd, cmdtp->name, len) == 0)) {
                        if (len == strlen (cmdtp->name))
                                return cmdtp;   /* full match */
 
@@ -453,7 +457,8 @@ static int complete_cmdv(int argc, char *argv[], char 
last_char, int maxv, char
                                cmdv[n_found++] = "...";
                                break;
                        }
-                       cmdv[n_found++] = cmdtp->name;
+                       if (cmdtp->name)
+                               cmdv[n_found++] = cmdtp->name;
                }
                cmdv[n_found] = NULL;
                return n_found;
@@ -483,20 +488,22 @@ static int complete_cmdv(int argc, char *argv[], char 
last_char, int maxv, char
        /* return the partial matches */
        for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
 
-               clen = strlen(cmdtp->name);
-               if (clen < len)
-                       continue;
+               if (cmdtp->name) {
+                       clen = strlen(cmdtp->name);
+                       if (clen < len)
+                               continue;
 
-               if (memcmp(cmd, cmdtp->name, len) != 0)
-                       continue;
+                       if (memcmp(cmd, cmdtp->name, len) != 0)
+                               continue;
 
-               /* too many! */
-               if (n_found >= maxv - 2) {
-                       cmdv[n_found++] = "...";
-                       break;
-               }
+                       /* too many! */
+                       if (n_found >= maxv - 2) {
+                               cmdv[n_found++] = "...";
+                               break;
+                       }
 
-               cmdv[n_found++] = cmdtp->name;
+                       cmdv[n_found++] = cmdtp->name;
+               }
        }
 
        cmdv[n_found] = NULL;
-- 
1.6.0.6

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to