[libxslt] Correctly emulate snprintf on older MSVC versions



commit e75b5da121cdc67cb2303b1e2b77d5dd1cdf2784
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Wed Feb 24 16:47:40 2016 +0100

    Correctly emulate snprintf on older MSVC versions
    
    This uses the code taken from http://stackoverflow.com/a/8712996/1956010
    
    Fixes bug #756691
    https://bugzilla.gnome.org/show_bug.cgi?id=756691

 libxslt/win32config.h |   43 +++++++++++++++++++++++++++++++++++--------
 xsltproc/xsltproc.c   |    3 ---
 2 files changed, 35 insertions(+), 11 deletions(-)
---
diff --git a/libxslt/win32config.h b/libxslt/win32config.h
index 33bc570..8fe7042 100644
--- a/libxslt/win32config.h
+++ b/libxslt/win32config.h
@@ -77,14 +77,41 @@ static int isnan (double d) {
 #endif /* _MSC_VER */
 
 #include <direct.h>
-#if defined(_MSC_VER) || defined(__MINGW32__)
-#if _MSC_VER < 1900
-#define snprintf _snprintf
-#endif
-#if _MSC_VER < 1500
-#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a)
-#endif
-#endif
+
+/* snprintf emulation taken from http://stackoverflow.com/a/8712996/1956010 */
+#if defined(_MSC_VER) && _MSC_VER < 1900
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define snprintf c99_snprintf
+#define vsnprintf c99_vsnprintf
+
+__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
+{
+    int count = -1;
+
+    if (size != 0)
+        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
+    if (count == -1)
+        count = _vscprintf(format, ap);
+
+    return count;
+}
+
+__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
+{
+    int count;
+    va_list ap;
+
+    va_start(ap, format);
+    count = c99_vsnprintf(outBuf, size, format, ap);
+    va_end(ap);
+
+    return count;
+}
+
+#endif /* defined(_MSC_VER) && _MSC_VER < 1900 */
 
 #define HAVE_SYS_STAT_H
 #define HAVE__STAT
diff --git a/xsltproc/xsltproc.c b/xsltproc/xsltproc.c
index 9bd725d..e8b4f34 100644
--- a/xsltproc/xsltproc.c
+++ b/xsltproc/xsltproc.c
@@ -57,9 +57,6 @@
 #if defined(_MSC_VER) || defined(__MINGW32__)
 #include <winsock2.h>
 #define gettimeofday(p1,p2)
-#if _MSC_VER < 1900
-#define snprintf _snprintf
-#endif
 #endif /* _MS_VER */
 #else /* WIN32 */
 #if defined(HAVE_SYS_TIME_H)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]