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:
parent
03d35bacf4
commit
ab54c861dc
30
src/utils.c
30
src/utils.c
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user