diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-03-31 02:14:51 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-03-31 02:14:51 +0200 |
commit | d836028fe7b18c93c9a9751f470da387eab09af1 (patch) | |
tree | e0c4a49bb156c38a455c8a484f899bc829115e5b /lib | |
parent | 9306846df3e871d1a6145350e2aca08cbb560415 (diff) | |
parent | 40f4fe997f73176cc2d8bab755c37c90196a046e (diff) | |
download | Nim-d836028fe7b18c93c9a9751f470da387eab09af1.tar.gz |
Merge pull request #4018 from cheatfate/dyncalls_change
Replace csprintf() in windows version of nimGetProcAddr
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/dyncalls.nim | 25 |
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) |