diff options
-rw-r--r-- | common/compat.c | 66 | ||||
-rw-r--r-- | common/compat.h | 17 | ||||
-rw-r--r-- | configure.ac | 1 |
3 files changed, 84 insertions, 0 deletions
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 <stdio.h> + +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 <stdarg.h> + +int vasprintf (char **strp, + const char *fmt, + va_list ap); + +#endif /* HAVE_VASPRINTF */ + #endif /* __COMPAT_H__ */ diff --git a/configure.ac b/configure.ac index 11ac492..ac049c9 100644 --- a/configure.ac +++ b/configure.ac @@ -77,6 +77,7 @@ if test "$os_unix" = "yes"; then AC_CHECK_MEMBERS([struct dirent.d_type],,,[#include <dirent.h>]) AC_CHECK_FUNCS([getprogname getexecname basename mkstemp mkdtemp]) AC_CHECK_FUNCS([strnstr memdup strndup]) + AC_CHECK_FUNCS([asprintf vasprintf vsnprintf]) # Check if these are declared and/or available to link against AC_CHECK_DECLS([program_invocation_short_name]) |