Pavel Chromy: faster alloc_printf()
[fw/openocd] / src / helper / log.c
index b38987232eb290b06533bf03d367c0eb07a7e6ed..3d4f0389de7a36f608c637e91e7f7d197b0cdbde 100644 (file)
@@ -269,29 +269,31 @@ char *alloc_printf(const char *fmt, va_list ap)
        /* no buffer at the beginning, force realloc to do the job */
        char *string = NULL;
        
-       /* start with minimal length to exercise all the code paths */
-       int size = 1;
+       /* start with buffer size suitable for typical messages */
+       int size = 128;
 
        for (;;)
        {
-               size *= 2; /* double the buffer size */
+               char *t = string;
+               string = realloc(string, size);
+               if (string == NULL)
+               {
+                       if (t != NULL)
+                               free(t);
+                       return NULL;
+               }
+
+               va_list ap_copy;
+               va_copy(ap_copy, ap);
 
-                       char *t = string;
-                       string = realloc(string, size);
-                       if (string == NULL)
-                       {
-                               if (t != NULL)
-                                       free(t);
-                               return NULL;
-                       }
-       
                int ret;
-               ret = vsnprintf(string, size, fmt, ap);
+               ret = vsnprintf(string, size, fmt, ap_copy);
                /* NB! The result of the vsnprintf() might be an *EMPTY* string! */
                if ((ret >= 0) && ((ret + 1) < size))
                        break;
 
                /* 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 */