diff options
author | Brian Paul <[email protected]> | 2017-09-08 16:41:16 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-09-28 10:41:33 -0600 |
commit | 864148d69e1ecf6e8ff07b0587627e41823f1cb4 (patch) | |
tree | 234ac8356efc6e46a535d6c7956768a9927c7955 /src/util | |
parent | 76a4209dc0418890bc7a01196c582f90d4c5c021 (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]>
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/u_string.h | 22 |
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 |