summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2017-09-08 16:41:16 -0600
committerBrian Paul <[email protected]>2017-09-28 10:41:33 -0600
commit864148d69e1ecf6e8ff07b0587627e41823f1cb4 (patch)
tree234ac8356efc6e46a535d6c7956768a9927c7955
parent76a4209dc0418890bc7a01196c582f90d4c5c021 (diff)
util: add util_vasprintf() for Windows (v2)
We don't have vasprintf() on Windows so we need to implement it ourselves. v2: compute actual length of output string, per Nicolai Hähnle. Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/util/u_string.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/util/u_string.h b/src/util/u_string.h
index e88e13f42c6..48f1125ccf1 100644
--- a/src/util/u_string.h
+++ b/src/util/u_string.h
@@ -110,6 +110,27 @@ util_sprintf(char *str, const char *format, ...)
va_end(ap);
}
+static inline int
+util_vasprintf(char **ret, const char *format, va_list ap)
+{
+ va_list ap_copy;
+
+ /* Compute length of output string first */
+ va_copy(ap_copy, ap);
+ int r = util_vsnprintf(NULL, 0, format, ap);
+ va_end(ap_copy);
+
+ if (r < 0)
+ return -1;
+
+ *ret = (char *) malloc(r + 1);
+ if (!ret)
+ return -1;
+
+ /* Print to buffer */
+ return util_vsnprintf(*ret, r + 1, format, ap);
+}
+
static inline char *
util_strchr(const char *s, char c)
{
@@ -186,6 +207,7 @@ util_strstr(const char *haystack, const char *needle)
#define util_vsnprintf vsnprintf
#define util_snprintf snprintf
#define util_vsprintf vsprintf
+#define util_vasprintf vasprintf
#define util_sprintf sprintf
#define util_strchr strchr
#define util_strcmp strcmp