]> git.sur5r.net Git - openocd/commitdiff
- fix broken JTAG error handling
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 18 Feb 2008 15:41:38 +0000 (15:41 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 18 Feb 2008 15:41:38 +0000 (15:41 +0000)
- 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

src/helper/command.c
src/jtag/jtag.c

index 9f756d412a102afea06307ec3101b392dcf1bba1..8b7ad36eaaa1fe398e7e207ada11e7ff7f422927 100644 (file)
@@ -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)
        {
index 11011a160bc7a6160aa319331d814470c76e6d75..47031b7eb8aaf0f5390b9efa45d3e7c28a4cc5c6 100644 (file)
@@ -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,