summary refs log tree commit diff stats
path: root/lib/system
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2016-03-31 02:14:51 +0200
committerAndreas Rumpf <rumpf_a@web.de>2016-03-31 02:14:51 +0200
commitd836028fe7b18c93c9a9751f470da387eab09af1 (patch)
treee0c4a49bb156c38a455c8a484f899bc829115e5b /lib/system
parent9306846df3e871d1a6145350e2aca08cbb560415 (diff)
parent40f4fe997f73176cc2d8bab755c37c90196a046e (diff)
downloadNim-d836028fe7b18c93c9a9751f470da387eab09af1.tar.gz
Merge pull request #4018 from cheatfate/dyncalls_change
Replace csprintf() in windows version of nimGetProcAddr
Diffstat (limited to 'lib/system')
-rw-r--r--lib/system/dyncalls.nim25
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim
index 3b3d1f87d..61777e514 100644
--- a/lib/system/dyncalls.nim
+++ b/lib/system/dyncalls.nim
@@ -109,9 +109,30 @@ elif defined(windows) or defined(dos):
   proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr =
     result = getProcAddress(cast[THINSTANCE](lib), name)
     if result != nil: return
-    var decorated: array[250, char]
+    const decorated_length = 250
+    var decorated: array[decorated_length, char]
+    decorated[0] = '_'
+    var m = 1
+    while m < (decorated_length - 5):
+      if name[m - 1] == '\x00': break
+      decorated[m] = name[m - 1]
+      inc(m)
+    decorated[m] = '@'
     for i in countup(0, 50):
-      discard csprintf(decorated, "_%s@%ld", name, i*4)
+      var k = i * 4
+      if k div 100 == 0: 
+        if k div 10 == 0:
+          m = m + 1
+        else:
+          m = m + 2
+      else:
+        m = m + 3
+      decorated[m + 1] = '\x00'
+      while true:
+        decorated[m] = chr(ord('0') + (k %% 10))
+        dec(m)
+        k = k div 10
+        if k == 0: break
       result = getProcAddress(cast[THINSTANCE](lib), decorated)
       if result != nil: return
     procAddrError(name)