NicyRuntime exports 85 functions with a stable extern "C-unwind" ABI. This includes 83 Lua C API wrappers for complete Luau state management and 2 error code utilities .
Include in your C/C++ project:
#include "NicyRuntime.h"
All functions use extern "C-unwind", allowing exceptions to propagate across FFI boundaries.
Function Signature
nicy_lua_gettopc_int(*l)
nicy_lua_settopvoid(*l, idx)
nicy_lua_pushvaluevoid(*l, idx)
nicy_lua_removevoid(*l, idx)
nicy_lua_insertvoid(*l, idx)
nicy_lua_absindexc_int(*l, idx)
nicy_lua_checkstackc_int(*l, extra)
nicy_lua_popvoid(*l, n) (macro: settop(l, -n-1))
Function Signature
nicy_lua_pushnilvoid(*l)
nicy_lua_pushbooleanvoid(*l, b: c_int)
nicy_lua_pushnumbervoid(*l, n: lua_Number)
nicy_lua_pushintegervoid(*l, n: lua_Integer)
nicy_lua_pushstringvoid(*l, s: *const c_char)
nicy_lua_pushlstringvoid(*l, s: *const c_char, len: usize)
nicy_lua_pushcfunctionvoid(*l, f: lua_CFunction)
nicy_lua_pushcclosurevoid(*l, f: lua_CFunction, n: c_int)
nicy_lua_pushlightuserdatavoid(*l, p: *mut c_void)
nicy_lua_newuserdata*mut c_void(*l, sz: usize)
nicy_lua_newthread*mut LuauState(*l)
Function Signature
nicy_lua_typec_int(*l, idx)
nicy_lua_typename*const c_char(*l, tp: c_int)
nicy_lua_isnilc_int(*l, idx)
nicy_lua_isbooleanc_int(*l, idx)
nicy_lua_isnumberc_int(*l, idx)
nicy_lua_isstringc_int(*l, idx)
nicy_lua_istablec_int(*l, idx)
nicy_lua_isfunctionc_int(*l, idx)
nicy_lua_isuserdatac_int(*l, idx)
nicy_lua_isthreadc_int(*l, idx)
nicy_lua_iscfunctionc_int(*l, idx)
nicy_lua_isintegerc_int(*l, idx)
Function Signature
nicy_lua_tostring*const c_char(*l, idx)
nicy_lua_tolstring*const c_char(*l, idx, len: *mut usize)
nicy_lua_tobooleanc_int(*l, idx)
nicy_lua_tonumberlua_Number(*l, idx)
nicy_lua_tointegerlua_Integer(*l, idx)
nicy_lua_touserdata*mut c_void(*l, idx)
Function Signature
nicy_lua_getfieldvoid(*l, idx, k: *const c_char)
nicy_lua_getglobalvoid(*l, k: *const c_char)
nicy_lua_setglobalvoid(*l, k: *const c_char)
nicy_lua_gettablevoid(*l, idx)
nicy_lua_settablevoid(*l, idx)
nicy_lua_rawgetvoid(*l, idx)
nicy_lua_rawgetivoid(*l, idx, n: lua_Integer)
nicy_lua_rawsetvoid(*l, idx)
nicy_lua_rawsetivoid(*l, idx, n: lua_Integer)
nicy_lua_getmetatablec_int(*l, idx)
nicy_lua_setmetatablec_int(*l, idx)
nicy_lua_createtablevoid(*l, narr: c_int, nrec: c_int)
nicy_lua_nextc_int(*l, idx)
Function Signature
nicy_lua_callvoid(*l, nargs: c_int, nresults: c_int)
nicy_lua_pcallc_int(*l, nargs, nresults, errfunc: c_int)
nicy_lua_errorc_int(*l)
nicy_lua_resumec_int(*l, from: *mut LuauState, nargs, nres: *mut c_int)
nicy_lua_yieldc_int(*l, nresults: c_int)
Function Signature
nicy_lua_equalc_int(*l, idx1, idx2)
nicy_lua_lessthanc_int(*l, idx1, idx2)
nicy_lua_rawequalc_int(*l, idx1, idx2)
nicy_lua_concatvoid(*l, n: c_int)
nicy_lua_gcc_int(*l, what: c_int, data: c_int)
nicy_lua_rawlenusize(*l, idx)
Function Signature
nicy_lua_getfenvvoid(*l, idx)
nicy_lua_setfenvc_int(*l, idx)
Function Signature
nicy_luaL_checkstring*const c_char(*l, narg: c_int)
nicy_luaL_checklstring*const c_char(*l, narg, len: *mut usize)
nicy_luaL_checknumberlua_Number(*l, narg)
nicy_luaL_checkbooleanc_int(*l, narg)
nicy_luaL_checkintegerlua_Integer(*l, narg)
nicy_luaL_checktypevoid(*l, narg, t: c_int)
nicy_luaL_checkanyvoid(*l, narg)
nicy_luaL_optstring*const c_char(*l, narg, d: *const c_char)
nicy_luaL_optintegerlua_Integer(*l, narg, d: lua_Integer)
nicy_luaL_optnumberlua_Number(*l, narg, d: lua_Number)
nicy_luaL_argerrorc_int(*l, narg, extramsg: *const c_char)
nicy_luaL_wherevoid(*l, lvl: c_int)
nicy_luaL_tracebackvoid(*l, l1: *mut LuauState, msg: *const c_char, level: c_int)
nicy_luaL_refc_int(*l, t: c_int)
nicy_luaL_unrefvoid(*l, t, r: c_int)
nicy_luaL_lenlua_Integer(*l, idx)
nicy_luaL_newmetatablec_int(*l, tname: *const c_char)
nicy_luaL_getmetatablec_int(*l, tname: *const c_char)
nicy_luaL_errorc_int(*l, msg: *const c_char)
These functions help FFI integrators work with NicyRuntime’s error codes:
Function Signature Description
nicy_error_name*const c_char(code: c_int)Convert error code to name string (e.g., 103 → "NICY_ERR_CYCLIC_REQUIRE")
nicy_is_nicy_errorc_int(code: c_int)Returns 1 if code is Nicy-specific (100+), 0 if standard Luau
int err = nicy_start("script.luau");
if (err != 0) {
const char* name = nicy_error_name(err);
int is_nicy = nicy_is_nicy_error(err);
if (is_nicy) {
fprintf(stderr, "Nicy error: %s\n", name);
} else {
fprintf(stderr, "Luau error: %s\n", name);
}
}