]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/command.c
Enable execution of individual sub commands on top level
[z180-stamp.git] / avr / command.c
index e88e2f37083041823ce05857f4c20c10dc73ab8f..c9137eabc83e3f4cf23636f88124d49087afc928 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2014, 2016 Leo C. <erbl259-lmu@yahoo.de>
+ * (C) Copyright 2014, 2016, 2018 Leo C. <erbl259-lmu@yahoo.de>
  *
  * (C) Copyright 2000-2009
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -13,8 +13,6 @@
 
 #include "command.h"
 #include "common.h"
-#include <stdlib.h>
-#include <string.h>
 #include <ctype.h>
 #include <setjmp.h>
 
@@ -66,6 +64,14 @@ int cmd_tbl_item_count(cmd_tbl_t *p)
        int count = 0;
 
        while (p->name != NULL) {
+               if (p->subcmd && p->flags & CTBL_SUBCMDAUTO) {
+                       cmd_tbl_t *sub = p->subcmd;
+                       while (sub->name != NULL) {
+                               if (sub->flags & CTBL_SUBCMDAUTO)
+                                       count++;
+                               sub++;
+                       }
+               }
                p++; count++;
        }
        return count;
@@ -106,7 +112,7 @@ cmd_tbl_t *_find_cmd (const char *cmd, cmd_tbl_t *table, find_cmd_para_t *para)
                        n_found++;
                } else if (cmdtp->subcmd && cmdtp->flags & CTBL_SUBCMDAUTO) {
                        cmd_tbl_t *sub = _find_cmd(cmd, cmdtp->subcmd, para);
-                       if (sub) {
+                       if (sub && sub->flags & CTBL_SUBCMDAUTO) {
                                cmdtp_ret = sub;
                                ++n_found;
                        }
@@ -166,39 +172,55 @@ command_ret_t do_help(cmd_tbl_t *cmdtp, uint_fast8_t flag UNUSED, int argc, char
 
        if (argc == 1) {        /*show list of commands */
                int cmd_items = cmd_tbl_item_count(tbl_start);
-               cmd_tbl_t *cmd_array[cmd_items];
-               cmd_tbl_t *tp = tbl_start;
-               uint_fast8_t max_len = 0;
+               cmd_tbl_t **cmd_list = (cmd_tbl_t **) malloc(cmd_items * sizeof(cmd_tbl_t *));
+               uint_fast8_t maxlen_cmd = 0;
 
-               /* Make array of commands from .uboot_cmd section */
-               for (int i = 0; i < cmd_items; i++) {
-                       cmd_array[i] = tp++;
-                       uint_fast8_t l = strlen_P(cmd_array[i]->name);
-                       if (l > max_len)
-                               max_len = l;
+               /* Make array of commands */
+               cmd_tbl_t *tp = tbl_start;
+               int i = 0;
+               while (tp->name != NULL) {
+                       uint_fast8_t len;
+                       if (tp->subcmd && tp->flags & CTBL_SUBCMDAUTO) {
+                               cmd_tbl_t *sub = tp->subcmd;
+                               while (sub->name != NULL) {
+                                       if (sub->flags & CTBL_SUBCMDAUTO) {
+                                               len = strlen_P(sub->name);
+                                               if (len > maxlen_cmd)
+                                                       maxlen_cmd = len;
+                                               cmd_list[i++] = sub;
+                                       }
+                                       sub++;
+                               }
+                       }
+                       len = strlen_P(tp->name);
+                       if (len > maxlen_cmd)
+                               maxlen_cmd = len;
+                       cmd_list[i++] = tp++;
                }
-
                /* Sort command list */
-               qsort(cmd_array, cmd_items, sizeof (cmd_tbl_t *), cmpstring_PP);
+               qsort(cmd_list, cmd_items, sizeof (cmd_tbl_t *), cmpstring_PP);
 
                /* print short help (usage) */
                for (int i = 0; i < cmd_items; i++) {
-                       if (opt_debug || !(cmd_array[i]->flags & CTBL_DBG)) {
-                               const FLASH char *usage = cmd_array[i]->usage;
+                       if (opt_debug || !(cmd_list[i]->flags & CTBL_DBG)) {
+                               const FLASH char *usage = cmd_list[i]->usage;
 
                                /* allow user abort */
-                               if (ctrlc ())
+                               if (ctrlc ()) {
+                                       free(cmd_list);
                                        return CMD_RET_FAILURE;
+                               }
                                if (usage == NULL)
                                        continue;
 #if defined(GCC_BUG_61443) || 1
-                               print_usage_line(cmd_array[i]->name, max_len, usage);
+                               print_usage_line(cmd_list[i]->name, maxlen_cmd, usage);
 #else
                                printf_P(PSTR("%-" stringify(8) /*FIXME*/ "S - %S\n"),
-                                               cmd_array[i]->name, usage);
+                                               cmd_list[i]->name, usage);
 #endif
                        }
                }
+               free(cmd_list);
                return CMD_RET_SUCCESS;
        }
 
@@ -207,7 +229,7 @@ command_ret_t do_help(cmd_tbl_t *cmdtp, uint_fast8_t flag UNUSED, int argc, char
         */
        for (uint8_t i = 1; i < argc; ++i) {
                if ((cmdtp = find_cmd(argv[i], tbl_start, NULL)) != NULL &&
-                                       (opt_debug || cmdtp->name[0] != '!')) {
+                                       (opt_debug || !(cmdtp->flags & CTBL_DBG))) {
                        cmd_usage(cmdtp);
                } else {
                        printf_P(PSTR("Unknown command '%s' - try 'help'"
@@ -221,7 +243,7 @@ command_ret_t do_help(cmd_tbl_t *cmdtp, uint_fast8_t flag UNUSED, int argc, char
 }
 
 
-command_ret_t cmd_usage(const FLASH cmd_tbl_t *cmdtp)
+command_ret_t cmd_usage(cmd_tbl_t *cmdtp)
 {
 //     printf("%s - %s\n\n", cmdtp->name, cmdtp->usage);
        print_usage_line(cmdtp->name, 0, cmdtp->usage);