Fix usage/help search for subcommands.
authorDean Glazeski <dnglaze@gmail.com>
Thu, 31 Dec 2009 22:01:32 +0000 (16:01 -0600)
committerDavid Brownell <dbrownell@users.sourceforge.net>
Sat, 2 Jan 2010 10:10:55 +0000 (02:10 -0800)
This makes it so that the usage/help command properly uses the whole command,
including subcommand, in the search for help information.  This previously
caused erroneous output from the usage command handler.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
src/helper/command.c

index e55f9e73e48682fbb331c7fc5514b846416cae86..b4e31ea1a7e1d2a3a975ad5515999dcd1fd14306 100644 (file)
@@ -960,18 +960,45 @@ static COMMAND_HELPER(command_help_show, struct command *c, unsigned n,
 COMMAND_HANDLER(handle_help_command)
 {
        bool full = strcmp(CMD_NAME, "help") == 0;
 COMMAND_HANDLER(handle_help_command)
 {
        bool full = strcmp(CMD_NAME, "help") == 0;
-
+       int retval;
        struct command *c = CMD_CTX->commands;
        struct command *c = CMD_CTX->commands;
+       char *match = NULL;
 
 
-       const char *match = "";
        if (CMD_ARGC == 0)
                match = "";
        if (CMD_ARGC == 0)
                match = "";
-       else if (CMD_ARGC == 1)
-               match = CMD_ARGV[0]; 
-       else
+       else if (CMD_ARGC >= 1) {
+               unsigned i;
+
+               for (i = 0; i < CMD_ARGC; ++i) {
+                       if (NULL != match) {
+                               char *prev = match;
+
+                               match = alloc_printf("%s %s", match,
+                                               CMD_ARGV[i]);
+                               free(prev);
+                               if (NULL == match) {
+                                       LOG_ERROR("unable to build "
+                                                       "search string");
+                                       return -ENOMEM;
+                               }
+                       } else {
+                               match = alloc_printf("%s", CMD_ARGV[i]);
+                               if (NULL == match) {
+                                       LOG_ERROR("unable to build "
+                                                       "search string");
+                                       return -ENOMEM;
+                               }
+                       }
+               }
+       } else
                return ERROR_COMMAND_SYNTAX_ERROR;
                return ERROR_COMMAND_SYNTAX_ERROR;
-               
-       return CALL_COMMAND_HANDLER(command_help_show_list, c, 0, full, match);
+
+       retval = CALL_COMMAND_HANDLER(command_help_show_list,
+                       c, 0, full, match);
+
+       if (CMD_ARGC >= 1)
+               free(match);
+       return retval;
 }
 
 static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,
 }
 
 static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,