From 193f0043a546e0ef186addb2a0487d09e690d5b1 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Sun, 3 Mar 2013 09:54:59 +0100 Subject: Add compat vasprintf() and asprintf() functions These are not available on Win32 and ancient unixes --- common/compat.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/compat.h | 17 +++++++++++++++ 2 files changed, 83 insertions(+) (limited to 'common') diff --git a/common/compat.c b/common/compat.c index ff8ee08..3aae490 100644 --- a/common/compat.c +++ b/common/compat.c @@ -485,3 +485,69 @@ strconcat (const char *first, } #endif /* HAVE_STRCONCAT */ + +#ifndef HAVE_ASPRINTF + +int +asprintf (char **strp, + const char *fmt, + ...) +{ + va_list va; + int ret; + + va_start (va, fmt); + ret = vasprintf (strp, fmt, va); + va_end (va); + + return ret; +} + +#endif /* HAVE_ASPRINTF */ + +#ifndef HAVE_VASPRINTF +#include + +int +vasprintf (char **strp, + const char *fmt, + va_list ap) +{ + char *buf = NULL; + char *nbuf; + int guess = 128; + int length = 0; + int ret; + + if (fmt == NULL) { + errno = EINVAL; + return -1; + } + + for (;;) { + nbuf = realloc (buf, guess); + if (!nbuf) { + free (buf); + return -1; + } + + buf = nbuf; + length = guess; + + ret = vsnprintf (buf, length, fmt, ap); + + if (ret < 0) + guess *= 2; + + else if (ret >= length) + guess = ret + 1; + + else + break; + } + + *strp = buf; + return ret; +} + +#endif /* HAVE_VASPRINTF */ diff --git a/common/compat.h b/common/compat.h index 27e4403..cb4d2ad 100644 --- a/common/compat.h +++ b/common/compat.h @@ -243,4 +243,21 @@ char * strconcat (const char *first, #endif /* HAVE_STRCONCAT */ +#ifndef HAVE_ASPRINTF + +int asprintf (char **strp, + const char *fmt, + ...); + +#endif /* HAVE_ASPRINTF */ + +#ifndef HAVE_VASPRINTF +#include + +int vasprintf (char **strp, + const char *fmt, + va_list ap); + +#endif /* HAVE_VASPRINTF */ + #endif /* __COMPAT_H__ */ -- cgit v1.1