diff options
author | Stef Walter <stefw@gnome.org> | 2013-03-03 09:54:59 +0100 |
---|---|---|
committer | Stef Walter <stefw@gnome.org> | 2013-03-03 10:07:14 +0100 |
commit | 193f0043a546e0ef186addb2a0487d09e690d5b1 (patch) | |
tree | 2788d3662230edea60878dc453672a1663744995 /common | |
parent | 66ee55e5947682d10eed7a36b9da72a8cf6a40f2 (diff) |
Add compat vasprintf() and asprintf() functions
These are not available on Win32 and ancient unixes
Diffstat (limited to 'common')
-rw-r--r-- | common/compat.c | 66 | ||||
-rw-r--r-- | common/compat.h | 17 |
2 files changed, 83 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__ */ |