summaryrefslogtreecommitdiffstats
path: root/comm/third_party/json-c/vasprintf_compat.h
diff options
context:
space:
mode:
Diffstat (limited to 'comm/third_party/json-c/vasprintf_compat.h')
-rw-r--r--comm/third_party/json-c/vasprintf_compat.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/comm/third_party/json-c/vasprintf_compat.h b/comm/third_party/json-c/vasprintf_compat.h
new file mode 100644
index 0000000000..59b2e96074
--- /dev/null
+++ b/comm/third_party/json-c/vasprintf_compat.h
@@ -0,0 +1,67 @@
+#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 */