- fix broken JTAG error handling
- Allow all commands to be executed during config stage - Help now works for config commands - make var args handling follow the rules more closely Thanks Øyvind Harboe git-svn-id: svn://svn.berlios.de/openocd/trunk@305 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
d36abc1cd6
commit
e7084a0c87
|
@ -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)
|
||||
for (;;)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
if (!buffer || (n = vsnprintf(buffer, size, format, ap)) >= size)
|
||||
{
|
||||
/* increase buffer until it fits the whole string */
|
||||
if (!(p = realloc(buffer, size += 4096)))
|
||||
{
|
||||
/* 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)
|
||||
{
|
||||
|
|
|
@ -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) <speed>");
|
||||
register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
|
||||
COMMAND_CONFIG, NULL);
|
||||
COMMAND_CONFIG, "jtag_device <ir_length> <ir_expected> <ir_mask>");
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue