From e7084a0c873c0fe4f89a4574bbe85c0014124fe2 Mon Sep 17 00:00:00 2001
From: ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Mon, 18 Feb 2008 15:41:38 +0000
Subject: - 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
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
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(-)

(limited to 'src')

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) <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,
-- 
cgit v1.2.3