From e7084a0c873c0fe4f89a4574bbe85c0014124fe2 Mon Sep 17 00:00:00 2001 From: ntfreak Date: Mon, 18 Feb 2008 15:41:38 +0000 Subject: [PATCH] =?utf8?q?-=20fix=20broken=20JTAG=20error=20handling=20-?= =?utf8?q?=20Allow=20all=20commands=20to=20be=20executed=20during=20config?= =?utf8?q?=20stage=20-=20Help=20now=20works=20for=20config=20commands=20-?= =?utf8?q?=20make=20var=20args=20handling=20follow=20the=20rules=20more=20?= =?utf8?q?closely=20Thanks=20=C3=98yvind=20Harboe?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: svn://svn.berlios.de/openocd/trunk@305 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/helper/command.c | 51 ++++++++++++++++++++++---------------------- src/jtag/jtag.c | 4 +++- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/helper/command.c b/src/helper/command.c index 9f756d41..8b7ad36e 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -258,27 +258,33 @@ int parse_line(char *line, char *words[], int max_words) void command_print(command_context_t *context, char *format, ...) { - va_list ap; char *buffer = NULL; int n, size = 0; char *p; - va_start(ap, format); - /* process format string */ - /* TODO: possible bug. va_list is undefined after the first call to vsnprintf */ - while (!buffer || (n = vsnprintf(buffer, size, format, ap)) >= size) - { - /* increase buffer until it fits the whole string */ - if (!(p = realloc(buffer, size += 4096))) + for (;;) + { + va_list ap; + va_start(ap, format); + if (!buffer || (n = vsnprintf(buffer, size, format, ap)) >= size) { - /* gotta free up */ - if (buffer) - free(buffer); - return; + /* increase buffer until it fits the whole string */ + if (!(p = realloc(buffer, size += 4096))) + { + /* gotta free up */ + if (buffer) + free(buffer); + return; + } + + buffer = p; + + va_end(ap); + continue; } - - buffer = p; + va_end(ap); + break; } /* vsnprintf failed */ @@ -306,8 +312,6 @@ void command_print(command_context_t *context, char *format, ...) if (buffer) free(buffer); - - va_end(ap); } int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word) @@ -329,7 +333,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char * if (strncasecmp(c->name, words[start_word], strlen(words[start_word]))) continue; - if ((c->mode == context->mode) || (c->mode == COMMAND_ANY)) + if ((context->mode == COMMAND_CONFIG) || (c->mode == COMMAND_ANY) || (c->mode == context->mode) ) { if (!c->children) { @@ -479,15 +483,12 @@ void command_print_help_line(command_context_t* context, struct command_s *comma } indents[i*2] = 0; - if ((command->mode == COMMAND_EXEC) || (command->mode == COMMAND_ANY)) - { - if (command->help) - help = command->help; + if (command->help) + help = command->help; - snprintf(name_buf, 64, command->name); - strncat(name_buf, indents, 64); - command_print(context, "%20s\t%s", name_buf, help); - } + snprintf(name_buf, 64, command->name); + strncat(name_buf, indents, 64); + command_print(context, "%20s\t%s", name_buf, help); if (command->children) { diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 11011a16..47031b7e 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -1067,6 +1067,8 @@ int jtag_check_value(u8 *captured, void *priv, scan_field_t *field) free(captured_char); free(in_check_value_char); + + retval = ERROR_JTAG_QUEUE_FAILED; } } @@ -1310,7 +1312,7 @@ int jtag_register_commands(struct command_context_s *cmd_ctx) register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command, COMMAND_ANY, "set jtag speed (if supported) "); register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command, - COMMAND_CONFIG, NULL); + COMMAND_CONFIG, "jtag_device "); register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, COMMAND_CONFIG, NULL); register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command, -- 2.39.5