summaryrefslogtreecommitdiff
path: root/epan/wmem/wmem_strbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/wmem/wmem_strbuf.c')
-rw-r--r--epan/wmem/wmem_strbuf.c36
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, ...)