summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorandri lim <jangko128@gmail.com>2018-08-07 14:07:18 +0700
committerAndreas Rumpf <rumpf_a@web.de>2018-08-07 09:07:18 +0200
commitc3d5ec8eadf3aa887f34231c2d7b5818923818d4 (patch)
tree281055a93fc5f6fbc429c78a7e4b6b7624afe2d4 /compiler
parentbe4816f5097ce72e124e5e087ffa4d386fa17d4d (diff)
downloadNim-c3d5ec8eadf3aa887f34231c2d7b5818923818d4.tar.gz
fixes #8421, fixes #7968, Nim compiler compiles with MSVC C89 version (#8556)
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rodutils.nim21
1 files changed, 21 insertions, 0 deletions
diff --git a/compiler/rodutils.nim b/compiler/rodutils.nim
index 66d7f63c2..a774cdba7 100644
--- a/compiler/rodutils.nim
+++ b/compiler/rodutils.nim
@@ -10,6 +10,27 @@
 ## Serialization utilities for the compiler.
 import strutils, math
 
+# MSVC prior to 2013 doesn't have C99 functions
+when defined(windows) and (defined(vcc) or defined(bcc)):
+  {.emit: """#if defined(_MSC_VER) && _MSC_VER < 1900
+  #include <stdarg.h>
+  static 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;
+  }
+  int 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
+  """.}
+
 proc c_snprintf(s: cstring; n:uint; frmt: cstring): cint {.importc: "snprintf", header: "<stdio.h>", nodecl, varargs.}
 
 proc toStrMaxPrecision*(f: BiggestFloat, literalPostfix = ""): string =