X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/c646b5a9585d4c83df048be9198b0662a5881dcb..c82e9b3342cb1971d2d6e66d4537f2ae3ba6c72c:/avr/command.c diff --git a/avr/command.c b/avr/command.c index b579a5e..8a4ca02 100644 --- a/avr/command.c +++ b/avr/command.c @@ -13,7 +13,6 @@ #include "command.h" #include "common.h" -#include #include #include "config.h" @@ -22,6 +21,7 @@ #include "env.h" #include "debug.h" #include "getopt-min.h" +#include "strerror.h" #define DEBUG_CMD 0 /* set to 1 to debug */ @@ -100,7 +100,7 @@ static cmd_tbl_t *get_cmd_tbl_parent(cmd_tbl_t *child) return NULL; } -static int print_name_prefix(cmd_tbl_t *p) +static int print_nameprefix(cmd_tbl_t *p) { cmd_tbl_t *top = get_cmd_tbl_parent(p); @@ -112,13 +112,22 @@ static int print_name_prefix(cmd_tbl_t *p) return width; } +static int print_prefixed_name(cmd_tbl_t *p) +{ + int len; + + len = print_nameprefix(p); + len += strlen_P(p->name); + my_puts_P(p->name); + + return len; +} + static void print_usage_line(cmd_tbl_t *p, int width) { - width -= strlen_P(p->name); - width -= print_name_prefix(p); + width -= print_prefixed_name(p); if (width < 0) width = 0; - my_puts_P(p->name); print_blanks(width); my_puts_P(PSTR(" - ")); puts_P(p->usage); @@ -252,9 +261,6 @@ command_ret_t do_help(cmd_tbl_t *cmdtp, uint_fast8_t flag UNUSED, int argc, char #define OPT_USAGE 0x08 #define OPT_LONG 0x10 - /* reset getopt() */ - optind = 0; - int opt; while ((opt = getopt(argc, argv, PSTR("afk"))) != -1) { switch (opt) { @@ -380,11 +386,20 @@ command_ret_t do_help(cmd_tbl_t *cmdtp, uint_fast8_t flag UNUSED, int argc, char /* command help (long version) */ for (uint_fast8_t argi = 0; argi < argc; ++argi) { uint_fast8_t got = 0; - - for (uint_fast8_t cmdi = 0; cmdi < cmd_items; cmdi++) { - if (strcmp_P(argv[argi], cmd_list[cmdi]->name) == 0) { - cmd_usage(cmd_list[cmdi]); - got = 1; + cmd_tbl_t *tp = find_cmd(argv[argi], tbl_start); + if (tp) { + cmd_usage(tp); + got = 1; + } + if (options & OPT_ALL) { + for (cmd_tbl_t *sub = tbl_start; sub->name != NULL; sub++) { + if (sub->subcmd) { + tp = find_cmd(argv[argi], sub->subcmd); + if (tp) { + cmd_usage(tp); + got = 1; + } + } } } if (!got) { @@ -405,8 +420,7 @@ command_ret_t cmd_usage(cmd_tbl_t *cmdtp) print_usage_line(cmdtp, 0); #ifdef CONFIG_SYS_LONGHELP my_puts_P(PSTR("Usage:\n")); - print_name_prefix(cmdtp); - my_puts_P(cmdtp->name); + print_prefixed_name(cmdtp); my_puts_P(PSTR(" ")); if (cmdtp->help && *cmdtp->help != '\0') @@ -677,6 +691,7 @@ int cmd_auto_complete(const FLASH char *const prompt, char *buf, int *np, int *c #endif /* CONFIG_AUTO_COMPLETE */ +static cmd_tbl_t *cmd_invocation_ptr; /** * Call a command function. This should be the only route in U-Boot to call @@ -689,7 +704,7 @@ int cmd_auto_complete(const FLASH char *const prompt, char *buf, int *np, int *c * @param argv Arguments * @return 0 if command succeeded, else non-zero (CMD_RET_...) */ -command_ret_t cmd_call(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +static command_ret_t cmd_call(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { command_ret_t result; @@ -751,6 +766,8 @@ command_ret_t cmd_process(uint_fast8_t flag, int argc, char * const argv[], /* If OK so far, then do the command */ if (!rc) { + optind = 0; /* reset getopt() */ + cmd_invocation_ptr = cmdtp; rc = cmd_call(cmdtp, flag, argc, argv); *repeatable &= (cmdtp->flags & CTBL_RPT) != 0; } @@ -771,3 +788,25 @@ int cmd_process_error(cmd_tbl_t *cmdtp, int err) return 0; } + +void cmd_error(int status, int errnum, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + print_prefixed_name(cmd_invocation_ptr); + if (fmt != NULL) { + my_puts_P(PSTR(": ")); + vfprintf_P(stdout, fmt, ap); + } + va_end(ap); + + if (errnum != 0) + printf_P(PSTR(": %S"), my_strerror_P(errnum)); + + putchar('\n'); + _delay_ms(20); + + if (status != 0) { + longjmp(cmd_jbuf, 1); + } +}