Add vasprintf() and asprintf()

The new utils.c functions vasprintf() and asprintf() are analogs to
sprintf() and vsprintf(). However, instead of requiring a buffer that is
large enough to hold the output data, the functions allocate a string
and return a pointer to it.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2014-07-21 22:44:14 +02:00
parent 9d8d0c18b0
commit 6203966fbf
2 changed files with 40 additions and 0 deletions

View File

@ -1051,6 +1051,8 @@ void print_recur_apoint(const char *, long, unsigned,
struct recur_apoint *);
void print_recur_event(const char *, long, struct recur_event *);
void print_todo(const char *, struct todo *);
int vasprintf(char **, const char *, va_list);
int asprintf(char **, const char *, ...);
/* vars.c */
extern int col, row;

View File

@ -1473,3 +1473,41 @@ 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
asprintf(char **str, const char *format, ...)
{
va_list ap;
int n;
va_start(ap, format);
n = vasprintf(str, format, ap);
va_end(ap);
return n;
}