X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/0c728c8de88d86247d2a75348e71f5af37838c28..refs/tags/hexrel-6.8.1:/avr/command.c diff --git a/avr/command.c b/avr/command.c index ed25dee..cd2ee39 100644 --- a/avr/command.c +++ b/avr/command.c @@ -1,29 +1,31 @@ /* - * (C) Copyright 2014 Leo C. + * (C) Copyright 2014, 2016 Leo C. * * (C) Copyright 2000-2009 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * - * SPDX-License-Identifier: GPL-2.0+ + * SPDX-License-Identifier: GPL-2.0 */ /* * Command Processor Table */ +#include "command.h" #include "common.h" #include #include #include +#include #include "config.h" #include "print-utils.h" #include "con-utils.h" -#ifdef CONFIG_AUTO_COMPLETE #include "env.h" -#endif #include "debug.h" -#include "command.h" + + +jmp_buf cmd_jbuf; static void print_usage_line(const FLASH char *name, int width, @@ -81,6 +83,9 @@ command_ret_t _do_help(cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, (void) flag; + char *optenv = getenv_str(PSTR("cmd")); + bool opt_debug = optenv && strstr_P(optenv, PSTR("debug")) != NULL; + if (argc == 1) { /*show list of commands */ cmd_tbl_t *cmd_array[cmd_items]; int i; @@ -99,19 +104,21 @@ command_ret_t _do_help(cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, /* print short help (usage) */ for (i = 0; i < cmd_items; i++) { - const FLASH char *usage = cmd_array[i]->usage; - - /* allow user abort */ - if (ctrlc ()) - return CMD_RET_FAILURE; - if (usage == NULL) - continue; + if (opt_debug || cmd_array[i]->name[0] != '!') { + const FLASH char *usage = cmd_array[i]->usage; + + /* allow user abort */ + if (ctrlc ()) + return CMD_RET_FAILURE; + if (usage == NULL) + continue; #ifdef GCC_BUG_61443 - print_usage_line(cmd_array[i]->name, max_len, usage); + print_usage_line(cmd_array[i]->name, max_len, usage); #else - printf_P(PSTR("%-" stringify(8) /*FIXME*/ "S - %S\n"), - cmd_array[i]->name, usage); + printf_P(PSTR("%-" stringify(8) /*FIXME*/ "S - %S\n"), + cmd_array[i]->name, usage); #endif + } } return CMD_RET_SUCCESS; } @@ -119,7 +126,8 @@ command_ret_t _do_help(cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, * command help (long version) */ for (i = 1; i < argc; ++i) { - if ((cmdtp = find_cmd_tbl (argv[i], cmd_start, cmd_items )) != NULL) { + if ((cmdtp = find_cmd_tbl (argv[i], cmd_start, cmd_items )) != NULL && + (opt_debug || cmdtp->name[0] != '!')) { cmd_usage(cmdtp); } else { printf_P(PSTR("Unknown command '%s' - try 'help'" @@ -141,6 +149,9 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len) size_t len; uint_fast8_t n_found = 0; + char *optenv = getenv_str(PSTR("cmd")); + bool opt_debug = optenv && strstr_P(optenv, PSTR("debug")) != NULL; + if (!cmd) return NULL; @@ -149,7 +160,8 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len) for (cmdtp = table; cmdtp != table + table_len; cmdtp++) { - if (strncmp_P(cmd, cmdtp->name, len) == 0) { + if (strncmp_P(cmd, cmdtp->name, len) == 0 && + (opt_debug || cmdtp->name[0] != '!')) { if (len == strlen_P(cmdtp->name)) return cmdtp; /* full match */ @@ -157,9 +169,8 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len) n_found++; } } - if (n_found == 1) { /* exactly one match */ + if (n_found == 1) /* exactly one match */ return cmdtp_temp; - } return NULL; /* not found or ambiguous command */ } @@ -476,8 +487,8 @@ command_ret_t cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] command_ret_t result; result = (cmdtp->cmd)(cmdtp, flag, argc, argv); - if (result != CMD_RET_SUCCESS) - debug("Command failed, result=%d\n", result); +// if (result != CMD_RET_SUCCESS) +// debug("Command failed, result=%d\n", result); return result; } @@ -514,6 +525,9 @@ command_ret_t cmd_process(int flag, int argc, char * const argv[], } #endif + if (setjmp(cmd_jbuf) != 0) + return CMD_RET_FAILURE; + /* If OK so far, then do the command */ if (!rc) { rc = cmd_call(cmdtp, flag, argc, argv);