mirror of
git://git.musl-libc.org/musl
synced 2024-12-16 03:35:06 +00:00
simplify vasprintf implementation
the old implementation preallocated a buffer in order to try to avoid calling vsnprintf more than once. not only did this potentially lead to memory fragmentation from trimming with realloc; it also pulled in realloc/free, which otherwise might not be needed in a static linked program.
This commit is contained in:
parent
bdad2fefb2
commit
6a25313c11
@ -3,26 +3,13 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define GUESS 240U
|
||||
|
||||
int vasprintf(char **s, const char *fmt, va_list ap)
|
||||
{
|
||||
va_list ap2;
|
||||
char *a;
|
||||
int l=GUESS;
|
||||
|
||||
if (!(a=malloc(GUESS))) return -1;
|
||||
|
||||
va_copy(ap2, ap);
|
||||
l=vsnprintf(a, GUESS, fmt, ap2);
|
||||
int l = vsnprintf(0, 0, fmt, ap2);
|
||||
va_end(ap2);
|
||||
|
||||
if (l<GUESS) {
|
||||
char *b = realloc(a, l+1U);
|
||||
*s = b ? b : a;
|
||||
return l;
|
||||
}
|
||||
free(a);
|
||||
if (l<0 || !(*s=malloc(l+1U))) return -1;
|
||||
return vsnprintf(*s, l+1U, fmt, ap);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user