Pavel Chromy: faster alloc_printf()
git-svn-id: svn://svn.berlios.de/openocd/trunk@454 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
652a5b18b4
commit
2070559d95
|
@ -269,24 +269,22 @@ char *alloc_printf(const char *fmt, va_list ap)
|
||||||
/* no buffer at the beginning, force realloc to do the job */
|
/* no buffer at the beginning, force realloc to do the job */
|
||||||
char *string = NULL;
|
char *string = NULL;
|
||||||
|
|
||||||
/* start with minimal length to exercise all the code paths */
|
/* start with buffer size suitable for typical messages */
|
||||||
int size = 1;
|
int size = 128;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
size *= 2; /* double the buffer size */
|
char *t = string;
|
||||||
|
string = realloc(string, size);
|
||||||
|
if (string == NULL)
|
||||||
|
{
|
||||||
|
if (t != NULL)
|
||||||
|
free(t);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
char *t = string;
|
va_list ap_copy;
|
||||||
string = realloc(string, size);
|
va_copy(ap_copy, ap);
|
||||||
if (string == NULL)
|
|
||||||
{
|
|
||||||
if (t != NULL)
|
|
||||||
free(t);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_list ap_copy;
|
|
||||||
va_copy(ap_copy, ap);
|
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
ret = vsnprintf(string, size, fmt, ap_copy);
|
ret = vsnprintf(string, size, fmt, ap_copy);
|
||||||
|
@ -295,6 +293,7 @@ char *alloc_printf(const char *fmt, va_list ap)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* there was just enough or not enough space, allocate more in the next round */
|
/* there was just enough or not enough space, allocate more in the next round */
|
||||||
|
size *= 2; /* double the buffer size */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the returned buffer is by principle guaranteed to be at least one character longer */
|
/* the returned buffer is by principle guaranteed to be at least one character longer */
|
||||||
|
|
Loading…
Reference in New Issue