X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/f766ff54545eab2b2d5dde4b51f4183390b48453..8a500c7f3634212263ab1291c139d9c6a8967b8b:/avr/command.c diff --git a/avr/command.c b/avr/command.c index ff52757..8eb5bb7 100644 --- a/avr/command.c +++ b/avr/command.c @@ -22,6 +22,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 +101,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 +113,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 +262,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) { @@ -414,8 +421,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') @@ -686,6 +692,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 @@ -698,7 +705,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; @@ -760,6 +767,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; } @@ -780,3 +789,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); + } +}