Maintainers of win32 DLLs can opt to provide libraries with
'decorated' function names (Google "stdcall name decoration"). To
pull a function pointer out of one of these DLLs, you have to pass a
decorated name to getProcAddress. This is painful for the authors
of NIM DLL wrappers - they have to pass manually-decorated strings
to "importc", but only on win32.
This commit adds auto-decoration to nimGetProcAddress. This function
will probe the DLL for the undecorated name, and if that fails, it
will automatically add decoration and try again. That way, the author
of the wrapper doesn't have to deal with it.
Set operations used "1<<n" style shifts, which led to undefined
behavior if the signed shift overflowed. Similarly, the right-hand
side of the operator sometimes used a mix of signed and unsigned
integers that were combined with "&". This patch attempts to provide
a consistent implementation that uses unsigned integers everywhere.
Rather than issuing echo "cmd..." then cmd... itself, we enable shell trace
facility via set -x, which is POSIX shell standard command and is compatible
with all UNIX shells.
This effectively cuts build.sh size twice, since we don't need to double stuff
there, also making it human readable.
We are also setting PS4 (trace prefix) to none, instead final echo "SUCCESS",
we issue : SUCCESS command which outputs its contents in trace.
Previously it was not possible to use template arguments in template body as
the symbols were not resolved correctly leading to Error: undeclared
identifier: 'XX', eg.:
template defaultOf[T](t: T): expr = (var d: T; d)
echo defaultOf(1) #<- invalid identifier, but should output 0
I am not sure since which version OS X does include the libiconv library
without the `lib` prefix. But it seems this is the case for some years
now. If there are ways to check for the OS X version at compile time
this may be needed to support older OS X versions. But I guess thats not
needed for most users working with Nim anyway.