Summary: passing of variable argument list reduced, strings sent to logging are now formatted just once - more efficient.

As a result, ugly string malloc+strcpy are not needed anymore.


git-svn-id: svn://svn.berlios.de/openocd/trunk@386 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe
2008-02-29 11:16:38 +00:00
parent 4febcd8313
commit 67e0aea258
7 changed files with 120 additions and 158 deletions

View File

@@ -260,66 +260,39 @@ int parse_line(char *line, char *words[], int max_words)
return nwords;
}
static void command_printv(command_context_t *context, char *format, va_list ap)
void command_print_n(command_context_t *context, char *format, ...)
{
char *buffer = NULL;
int n, size = 0;
char *p;
/* process format string */
for (;;)
{
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;
}
char *string;
buffer = p;
continue;
}
break;
}
/* vsnprintf failed */
if (n < 0)
{
if (buffer)
free(buffer);
return;
}
context->output_handler(context, buffer);
if (buffer)
free(buffer);
}
void command_print_sameline(command_context_t *context, char *format, ...)
{
va_list ap;
va_start(ap, format);
command_printv(context, format, ap);
string = alloc_printf(format, ap);
if (string != NULL)
{
context->output_handler(context, string);
free(string);
}
va_end(ap);
}
void command_print(command_context_t *context, char *format, ...)
{
char *t=malloc(strlen(format)+2);
strcpy(t, format);
strcat(t, "\n");
char *string;
va_list ap;
va_start(ap, format);
command_printv(context, t, ap);
string = alloc_printf(format, ap);
if (string != NULL)
{
strcat(string, "\n"); /* alloc_printf guaranteed the buffer to be at least one char longer */
context->output_handler(context, string);
free(string);
}
va_end(ap);
free(t);
}
int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)