Cross-platform bugs:
- ncomplib.c: fseek was called as fseek(f, whence, offset) instead of
fseek(f, offset, whence). Seeks only worked correctly when offset
happened to numerically equal a valid whence constant.
- neonucleus.c: nn_realloc passed memory pointer instead of ctx to
nn_alloc in the NULL and sentinel paths. Any call with memory=NULL
dereferences NULL as a context struct and crashes. Confirmed by
test_realloc.c which crashes before fix and passes after.
- neonucleus.h: NN_TiB was defined as (1024 * NN_TiB), referencing
itself. Fixed to ((size_t)1024 * NN_GiB).
- luaarch.c: unicode functions were registered on the component Lua
table instead of the unicode table. Wrong stack index variable was
used in all five lua_setfield calls.
- neonucleus.c: NN_ATOMIC_NONE versions of nn_incRef/nn_decRef took
1 argument but were called with 2 everywhere. Added the missing
size_t n parameter.
Windows build:
- neonucleus.c: NN_LOCK_CREATE in NN_THREAD_WINDOWS was missing a
return statement, falling through into NN_LOCK_DESTROY and
immediately closing the freshly created mutex handle.
- ncomplib.c: Added Windows implementations for opendir, readdir,
closedir, stat, mkdir and directory removal using FindFirstFileA,
FindNextFileA, _stat, _mkdir and _rmdir.
- main.c: Fall back to USERNAME env var when USER is not set.
- neonucleus.h: Added NN_VLA macro. Expands to a plain VLA on
GCC/Clang, uses _alloca on MSVC. Applied in luaarch.c and
neonucleus.c where VLAs were used.
- neonucleus.h: Added NN_INIT macro. Expands to a compound literal
cast on GCC/Clang, expands to nothing on MSVC which does not
support compound literals as constant initializers at file scope.
Applied to all global struct initializers in neonucleus.c.
- neonucleus.c: Auto-define NN_ATOMIC_NONE on MSVC in C mode since
MSVC does not provide stdatomic.h outside of C++ mode.