| #ifndef __vasprintf_compat_h |
| #define __vasprintf_compat_h |
| |
| /** |
| * @file |
| * @brief Do not use, json-c internal, may be changed or removed at any time. |
| */ |
| |
| #include "snprintf_compat.h" |
| |
| #ifndef WIN32 |
| #include <stdarg.h> |
| #endif /* !defined(WIN32) */ |
| #include <stdint.h> |
| #include <stdlib.h> |
| |
| #if !defined(HAVE_VASPRINTF) |
| /* CAW: compliant version of vasprintf */ |
| static int vasprintf(char **buf, const char *fmt, va_list ap) |
| { |
| #ifndef WIN32 |
| static char _T_emptybuffer = '\0'; |
| va_list ap2; |
| #endif /* !defined(WIN32) */ |
| int chars; |
| char *b; |
| |
| if (!buf) |
| { |
| return -1; |
| } |
| |
| #ifdef WIN32 |
| chars = _vscprintf(fmt, ap); |
| #else /* !defined(WIN32) */ |
| /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite |
| * our buffer like on some 64bit sun systems... but hey, it's time to move on |
| */ |
| va_copy(ap2, ap); |
| chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap2); |
| va_end(ap2); |
| #endif /* defined(WIN32) */ |
| if (chars < 0 || (size_t)chars + 1 > SIZE_MAX / sizeof(char)) |
| { |
| return -1; |
| } |
| |
| b = (char *)malloc(sizeof(char) * ((size_t)chars + 1)); |
| if (!b) |
| { |
| return -1; |
| } |
| |
| if ((chars = vsprintf(b, fmt, ap)) < 0) |
| { |
| free(b); |
| } |
| else |
| { |
| *buf = b; |
| } |
| |
| return chars; |
| } |
| #endif /* !HAVE_VASPRINTF */ |
| |
| #endif /* __vasprintf_compat_h */ |