X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/7a1ed62033184b79388b541258a14bc579389bdb..dab74a42d544d3f45777eff471f1ee0166b4aaae:/avr/command.c diff --git a/avr/command.c b/avr/command.c index e88e2f3..b4a972c 100644 --- a/avr/command.c +++ b/avr/command.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2014, 2016 Leo C. + * (C) Copyright 2014, 2016, 2018 Leo C. * * (C) Copyright 2000-2009 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -13,8 +13,6 @@ #include "command.h" #include "common.h" -#include -#include #include #include @@ -24,6 +22,11 @@ #include "env.h" #include "debug.h" +#define DEBUG_CMD 1 /* set to 1 to debug */ + +#define debug_cmd(fmt, args...) \ + debug_cond(DEBUG_CMD, fmt, ##args) + jmp_buf cmd_jbuf; @@ -66,7 +69,17 @@ int cmd_tbl_item_count(cmd_tbl_t *p) int count = 0; while (p->name != NULL) { - p++; count++; + if (p->subcmd) { + cmd_tbl_t *sub = p->subcmd; + while (sub->name != NULL) { + if (sub->flags & CTBL_SUBCMDAUTO) + count++; + sub++; + } + } + if ((p->flags & CTBL_SUBCMDAUTO) == 0) + count++; + p++; } return count; } @@ -104,9 +117,9 @@ cmd_tbl_t *_find_cmd (const char *cmd, cmd_tbl_t *table, find_cmd_para_t *para) cmdtp_ret = cmdtp; /* abbreviated command ? */ n_found++; - } else if (cmdtp->subcmd && cmdtp->flags & CTBL_SUBCMDAUTO) { + } else if (cmdtp->subcmd) { 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 +179,57 @@ 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) { + if (tp->subcmd) { + cmd_tbl_t *sub = tp->subcmd; + while (sub->name != NULL) { + if (sub->flags & CTBL_SUBCMDAUTO) { + uint_fast8_t len = strlen_P(sub->name); + if (len > maxlen_cmd) + maxlen_cmd = len; + cmd_list[i++] = sub; + } + sub++; + } + } + if ((tp->flags & CTBL_SUBCMDAUTO) == 0) { + uint_fast8_t len = strlen_P(tp->name); + if (len > maxlen_cmd) + maxlen_cmd = len; + cmd_list[i++] = tp; + } + 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 +238,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 +252,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);