Reimplement asprintf() using dynamic strings

Use the new string implementation to simplify asprintf().

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
Lukas Fleischer 2016-01-11 19:49:17 +01:00
parent 03d35bacf4
commit ab54c861dc

View File

@ -1564,39 +1564,17 @@ void print_todo(const char *format, struct todo *todo)
} }
} }
#define VASPRINTF_INITIAL_BUFSIZE 128
int
vasprintf(char **str, const char *format, va_list ap)
{
va_list ap2;
int n;
va_copy(ap2, ap);
*str = mem_malloc(VASPRINTF_INITIAL_BUFSIZE);
n = vsnprintf(*str, VASPRINTF_INITIAL_BUFSIZE, format, ap);
if (n >= VASPRINTF_INITIAL_BUFSIZE) {
*str = mem_realloc(*str, 1, n + 1);
n = vsnprintf(*str, n + 1, format, ap2);
}
if (n < 0) {
mem_free(*str);
*str = NULL;
}
return n;
}
int int
asprintf(char **str, const char *format, ...) asprintf(char **str, const char *format, ...)
{ {
struct string s;
va_list ap; va_list ap;
int n; int n;
va_start(ap, format); va_start(ap, format);
n = vasprintf(str, format, ap); string_init(&s);
n = string_vcatf(&s, format, ap);
*str = string_buf(&s);
va_end(ap); va_end(ap);
return n; return n;