Add (v)asprintf compatibility functions

In case they are not available on the platform.
This commit is contained in:
Romain Vimont 2021-11-24 19:55:00 +01:00
parent d6c0054545
commit d5f6697f3a
3 changed files with 46 additions and 0 deletions

View file

@ -138,6 +138,8 @@ endif
check_functions = [
'strdup',
'asprintf',
'vasprintf',
]
foreach f : check_functions

View file

@ -2,7 +2,10 @@
#include "config.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#ifndef HAVE_STRDUP
@ -15,3 +18,36 @@ char *strdup(const char *s) {
return dup;
}
#endif
#ifndef HAVE_ASPRINTF
int asprintf(char **strp, const char *fmt, ...) {
va_list va;
va_start(va, fmt);
int ret = vasprintf(strp, fmt, va);
va_end(va);
return ret;
}
#endif
#ifndef HAVE_VASPRINTF
int vasprintf(char **strp, const char *fmt, va_list ap) {
va_list va;
va_copy(va, ap);
int len = vsnprintf(NULL, 0, fmt, va);
va_end(va);
char *str = malloc(len + 1);
if (!str) {
return -1;
}
va_copy(va, ap);
int len2 = vsnprintf(str, len + 1, fmt, va);
(void) len2;
assert(len == len2);
va_end(va);
*strp = str;
return len;
}
#endif

View file

@ -58,4 +58,12 @@
char *strdup(const char *s);
#endif
#ifndef HAVE_ASPRINTF
int asprintf(char **strp, const char *fmt, ...);
#endif
#ifndef HAVE_VASPRINTF
int vasprintf(char **strp, const char *fmt, va_list ap);
#endif
#endif