diff options
Diffstat (limited to 'epan/wmem/wmem_strbuf.c')
-rw-r--r-- | epan/wmem/wmem_strbuf.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/epan/wmem/wmem_strbuf.c b/epan/wmem/wmem_strbuf.c index bd074e7584..0a0f1a5f56 100644 --- a/epan/wmem/wmem_strbuf.c +++ b/epan/wmem/wmem_strbuf.c @@ -29,6 +29,10 @@ #include "wmem_core.h" #include "wmem_strbuf.h" +#ifdef _WIN32 +#include <stdio.h> +#endif + #define DEFAULT_MINIMUM_LEN 16 /* Holds a wmem-allocated string-buffer. @@ -154,6 +158,7 @@ wmem_strbuf_append(wmem_strbuf_t *strbuf, const gchar *str) strbuf->len = MIN(strbuf->len + append_len, strbuf->alloc_len - 1); } +#ifndef _WIN32 static void wmem_strbuf_append_vprintf(wmem_strbuf_t *strbuf, const gchar *fmt, va_list ap) { @@ -176,6 +181,37 @@ wmem_strbuf_append_vprintf(wmem_strbuf_t *strbuf, const gchar *fmt, va_list ap) strbuf->len = MIN(strbuf->len + append_len, strbuf->alloc_len - 1); } +#else /* _WIN32 */ +/* + * GLib's v*printf routines are surprisingly slow on Windows, at least with + * GLib 2.40.0. This appears to be due to GLib using the gnulib version of + * vasnprintf when compiled under MinGW. If GLib ever ends up using the + * native Windows v*printf routines this can be removed. + */ +static void +wmem_strbuf_append_vprintf(wmem_strbuf_t *strbuf, const gchar *fmt, va_list ap) +{ + va_list ap2; + gsize append_len; + gsize printed_len; + + G_VA_COPY(ap2, ap); + + append_len = _vscprintf(fmt, ap); + + wmem_strbuf_grow(strbuf, append_len); + + printed_len = vsnprintf_s(&strbuf->str[strbuf->len], + (gulong) WMEM_STRBUF_RAW_ROOM(strbuf), + _TRUNCATE, + fmt, ap2); + if (printed_len > -1) append_len = printed_len; + + va_end(ap2); + + strbuf->len = MIN(strbuf->len + append_len, strbuf->alloc_len - 1); +} +#endif /* _WIN32 */ void wmem_strbuf_append_printf(wmem_strbuf_t *strbuf, const gchar *format, ...) |