//
// This file was autogenerated.
//



WINVER :: 0x0501;

LUA_MULTILIB :: "lib";

LUA_LMULTILIB :: "lib";

LUA_LROOT :: "/usr/local";
LUA_LUADIR :: "/lua/5.1/";

LUA_JROOT :: LUA_LROOT;

LUA_PATH :: "LUA_PATH";
LUA_CPATH :: "LUA_CPATH";
LUA_INIT :: "LUA_INIT";

LUA_DIRSEP :: "/";

LUA_PATHSEP :: ";";
LUA_PATH_MARK :: "?";
LUA_EXECDIR :: "!";
LUA_IGMARK :: "-";

LUAI_MAXSTACK :: 65500;
LUAI_MAXCSTACK :: 8000;
LUAI_GCPAUSE :: 200;
LUAI_GCMUL :: 200;
LUA_MAXCAPTURES :: 32;

LUA_IDSIZE :: 60;

LUA_NUMBER_SCAN :: "%lf";
LUA_NUMBER_FMT :: "%.14g";

LUAI_MAXNUMBER2STR :: 32;
LUA_INTFRMLEN :: "l";

LUA_VERSION :: "Lua 5.1";
LUA_RELEASE :: "Lua 5.1.4";
LUA_VERSION_NUM :: 501;
LUA_COPYRIGHT :: "Copyright (C) 1994-2008 Lua.org, PUC-Rio";
LUA_AUTHORS :: "R. Ierusalimschy, L. H. de Figueiredo & W. Celes";

LUA_SIGNATURE :: "\033Lua";

LUA_MULTRET :: -1;

LUA_REGISTRYINDEX :: -10000;
LUA_ENVIRONINDEX :: -10001;
LUA_GLOBALSINDEX :: -10002;

LUA_OK :: 0;
LUA_YIELD :: 1;
LUA_ERRRUN :: 2;
LUA_ERRSYNTAX :: 3;
LUA_ERRMEM :: 4;
LUA_ERRERR :: 5;

LUA_TNONE :: -1;

LUA_TNIL :: 0;
LUA_TBOOLEAN :: 1;
LUA_TLIGHTUSERDATA :: 2;
LUA_TNUMBER :: 3;
LUA_TSTRING :: 4;
LUA_TTABLE :: 5;
LUA_TFUNCTION :: 6;
LUA_TUSERDATA :: 7;
LUA_TTHREAD :: 8;

LUA_MINSTACK :: 20;

LUA_GCSTOP :: 0;
LUA_GCRESTART :: 1;
LUA_GCCOLLECT :: 2;
LUA_GCCOUNT :: 3;
LUA_GCCOUNTB :: 4;
LUA_GCSTEP :: 5;
LUA_GCSETPAUSE :: 6;
LUA_GCSETSTEPMUL :: 7;
LUA_GCISRUNNING :: 9;

lua_Chunkreader :: Reader;
lua_Chunkwriter :: Writer;

LUA_HOOKCALL :: 0;
LUA_HOOKRET :: 1;
LUA_HOOKLINE :: 2;
LUA_HOOKCOUNT :: 3;
LUA_HOOKTAILRET :: 4;

LUA_MASKCALL :: 1 << LUA_HOOKCALL;
LUA_MASKRET :: 1 << LUA_HOOKRET;
LUA_MASKLINE :: 1 << LUA_HOOKLINE;
LUA_MASKCOUNT :: 1 << LUA_HOOKCOUNT;

LUAJIT_VERSION :: "LuaJIT 2.1.1744318430";
LUAJIT_VERSION_NUM :: 20199;
LUAJIT_VERSION_SYM :: JIT_version_2_1_1744318430;
LUAJIT_COPYRIGHT :: "Copyright (C) 2005-2025 Mike Pall";
LUAJIT_URL :: "https://luajit.org/";

LUAJIT_MODE_MASK :: 0x00ff;

LUAJIT_MODE_OFF :: 0x0000;
LUAJIT_MODE_ON :: 0x0100;
LUAJIT_MODE_FLUSH :: 0x0200;

LUA_FILEHANDLE :: "FILE*";

LUA_COLIBNAME :: "coroutine";
LUA_MATHLIBNAME :: "math";
LUA_STRLIBNAME :: "string";
LUA_TABLIBNAME :: "table";
LUA_IOLIBNAME :: "io";
LUA_OSLIBNAME :: "os";
LUA_LOADLIBNAME :: "package";
LUA_DBLIBNAME :: "debug";
LUA_BITLIBNAME :: "bit";
LUA_JITLIBNAME :: "jit";
LUA_FFILIBNAME :: "ffi";

LUA_ERRFILE :: LUA_ERRERR+1;

LUA_NOREF :: -2;
LUA_REFNIL :: -1;

State :: struct {}

CFunction :: #type (L: *State) -> s32 #c_call;

/*
** functions that read/write blocks when loading/dumping Lua chunks
*/
Reader :: #type (L: *State, ud: *void, sz: *u64) -> *u8 #c_call;

Writer :: #type (L: *State, p: *void, sz: u64, ud: *void) -> s32 #c_call;

/*
** prototype for memory-allocation functions
*/
Alloc :: #type (ud: *void, ptr: *void, osize: u64, nsize: u64) -> *void #c_call;

/* type of numbers in Lua */
Number :: float64;

/* type for integer functions */
Integer :: ptrdiff_t;

/*
** state manipulation
*/
newstate :: (f: Alloc, ud: *void) -> *State #foreign luajit_5_1 "lua_newstate";
close :: (L: *State) -> void #foreign luajit_5_1 "lua_close";
newthread :: (L: *State) -> *State #foreign luajit_5_1 "lua_newthread";

atpanic :: (L: *State, panicf: CFunction) -> CFunction #foreign luajit_5_1 "lua_atpanic";

/*
** basic stack manipulation
*/
gettop :: (L: *State) -> s32 #foreign luajit_5_1 "lua_gettop";
settop :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_settop";
pushvalue :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_pushvalue";
_remove :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_remove";
insert :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_insert";
replace :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_replace";
checkstack :: (L: *State, sz: s32) -> s32 #foreign luajit_5_1 "lua_checkstack";

xmove :: (from: *State, to: *State, n: s32) -> void #foreign luajit_5_1 "lua_xmove";

/*
** access functions (stack -> C)
*/
isnumber :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_isnumber";
isstring :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_isstring";
iscfunction :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_iscfunction";
isuserdata :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_isuserdata";
type :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_type";
typename :: (L: *State, tp: s32) -> *u8 #foreign luajit_5_1 "lua_typename";

equal :: (L: *State, idx1: s32, idx2: s32) -> s32 #foreign luajit_5_1 "lua_equal";
rawequal :: (L: *State, idx1: s32, idx2: s32) -> s32 #foreign luajit_5_1 "lua_rawequal";
lessthan :: (L: *State, idx1: s32, idx2: s32) -> s32 #foreign luajit_5_1 "lua_lessthan";

tonumber :: (L: *State, idx: s32) -> Number #foreign luajit_5_1 "lua_tonumber";
tointeger :: (L: *State, idx: s32) -> Integer #foreign luajit_5_1 "lua_tointeger";
toboolean :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_toboolean";
tolstring :: (L: *State, idx: s32, len: *u64) -> *u8 #foreign luajit_5_1 "lua_tolstring";
objlen :: (L: *State, idx: s32) -> u64 #foreign luajit_5_1 "lua_objlen";
tocfunction :: (L: *State, idx: s32) -> CFunction #foreign luajit_5_1 "lua_tocfunction";
touserdata :: (L: *State, idx: s32) -> *void #foreign luajit_5_1 "lua_touserdata";
tothread :: (L: *State, idx: s32) -> *State #foreign luajit_5_1 "lua_tothread";
topointer :: (L: *State, idx: s32) -> *void #foreign luajit_5_1 "lua_topointer";

/*
** push functions (C -> stack)
*/
pushnil :: (L: *State) -> void #foreign luajit_5_1 "lua_pushnil";
pushnumber :: (L: *State, n: Number) -> void #foreign luajit_5_1 "lua_pushnumber";
pushinteger :: (L: *State, n: Integer) -> void #foreign luajit_5_1 "lua_pushinteger";
pushlstring :: (L: *State, s: *u8, l: u64) -> void #foreign luajit_5_1 "lua_pushlstring";
pushstring :: (L: *State, s: *u8) -> void #foreign luajit_5_1 "lua_pushstring";

pushfstring_CFormat :: (L: *State, fmt: *u8, __args: ..Any) -> *u8 #foreign luajit_5_1 "lua_pushfstring";
pushfstring :: (L: *State, fmt: string, __args: ..Any) -> *u8 {
    push_allocator(temp);
    formatted_text_builder: String_Builder;
    print_to_builder(*formatted_text_builder, fmt, ..__args);
    append(*formatted_text_builder, "\0");
    formatted_text := builder_to_string(*formatted_text_builder);
    return pushfstring_CFormat(L, "%s", formatted_text.data);
} @PrintLike
pushcclosure :: (L: *State, fn: CFunction, n: s32) -> void #foreign luajit_5_1 "lua_pushcclosure";
pushboolean :: (L: *State, b: s32) -> void #foreign luajit_5_1 "lua_pushboolean";
pushlightuserdata :: (L: *State, p: *void) -> void #foreign luajit_5_1 "lua_pushlightuserdata";
pushthread :: (L: *State) -> s32 #foreign luajit_5_1 "lua_pushthread";

/*
** get functions (Lua -> stack)
*/
gettable :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_gettable";
getfield :: (L: *State, idx: s32, k: *u8) -> void #foreign luajit_5_1 "lua_getfield";
rawget :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_rawget";
rawgeti :: (L: *State, idx: s32, n: s32) -> void #foreign luajit_5_1 "lua_rawgeti";
createtable :: (L: *State, narr: s32, nrec: s32) -> void #foreign luajit_5_1 "lua_createtable";
newuserdata :: (L: *State, sz: u64) -> *void #foreign luajit_5_1 "lua_newuserdata";
getmetatable :: (L: *State, objindex: s32) -> s32 #foreign luajit_5_1 "lua_getmetatable";
getfenv :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_getfenv";

/*
** set functions (stack -> Lua)
*/
settable :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_settable";
setfield :: (L: *State, idx: s32, k: *u8) -> void #foreign luajit_5_1 "lua_setfield";
rawset :: (L: *State, idx: s32) -> void #foreign luajit_5_1 "lua_rawset";
rawseti :: (L: *State, idx: s32, n: s32) -> void #foreign luajit_5_1 "lua_rawseti";
setmetatable :: (L: *State, objindex: s32) -> s32 #foreign luajit_5_1 "lua_setmetatable";
setfenv :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_setfenv";

/*
** `load' and `call' functions (load and run Lua code)
*/
call :: (L: *State, nargs: s32, nresults: s32) -> void #foreign luajit_5_1 "lua_call";
pcall :: (L: *State, nargs: s32, nresults: s32, errfunc: s32) -> s32 #foreign luajit_5_1 "lua_pcall";
cpcall :: (L: *State, func: CFunction, ud: *void) -> s32 #foreign luajit_5_1 "lua_cpcall";
load :: (L: *State, reader: Reader, dt: *void, chunkname: *u8) -> s32 #foreign luajit_5_1 "lua_load";

dump :: (L: *State, writer: Writer, data: *void) -> s32 #foreign luajit_5_1 "lua_dump";

/*
** coroutine functions
*/
yield :: (L: *State, nresults: s32) -> s32 #foreign luajit_5_1 "lua_yield";
resume :: (L: *State, narg: s32) -> s32 #foreign luajit_5_1 "lua_resume";
status :: (L: *State) -> s32 #foreign luajit_5_1 "lua_status";

gc :: (L: *State, what: s32, data: s32) -> s32 #foreign luajit_5_1 "lua_gc";

/*
** miscellaneous functions
*/
error :: (L: *State) -> s32 #foreign luajit_5_1 "lua_error";

next :: (L: *State, idx: s32) -> s32 #foreign luajit_5_1 "lua_next";

concat :: (L: *State, n: s32) -> void #foreign luajit_5_1 "lua_concat";

getallocf :: (L: *State, ud: **void) -> Alloc #foreign luajit_5_1 "lua_getallocf";
setallocf :: (L: *State, f: Alloc, ud: *void) -> void #foreign luajit_5_1 "lua_setallocf";

/* Functions to be called by the debuger in specific events */
Hook :: #type (L: *State, ar: *Debug) -> void #c_call;

getstack :: (L: *State, level: s32, ar: *Debug) -> s32 #foreign luajit_5_1 "lua_getstack";
getinfo :: (L: *State, what: *u8, ar: *Debug) -> s32 #foreign luajit_5_1 "lua_getinfo";
getlocal :: (L: *State, ar: *Debug, n: s32) -> *u8 #foreign luajit_5_1 "lua_getlocal";
setlocal :: (L: *State, ar: *Debug, n: s32) -> *u8 #foreign luajit_5_1 "lua_setlocal";
getupvalue :: (L: *State, funcindex: s32, n: s32) -> *u8 #foreign luajit_5_1 "lua_getupvalue";
setupvalue :: (L: *State, funcindex: s32, n: s32) -> *u8 #foreign luajit_5_1 "lua_setupvalue";
sethook :: (L: *State, func: Hook, mask: s32, count: s32) -> s32 #foreign luajit_5_1 "lua_sethook";
gethook :: (L: *State) -> Hook #foreign luajit_5_1 "lua_gethook";
gethookmask :: (L: *State) -> s32 #foreign luajit_5_1 "lua_gethookmask";
gethookcount :: (L: *State) -> s32 #foreign luajit_5_1 "lua_gethookcount";

/* From Lua 5.2. */
upvalueid :: (L: *State, idx: s32, n: s32) -> *void #foreign luajit_5_1 "lua_upvalueid";
upvaluejoin :: (L: *State, idx1: s32, n1: s32, idx2: s32, n2: s32) -> void #foreign luajit_5_1 "lua_upvaluejoin";
loadx :: (L: *State, reader: Reader, dt: *void, chunkname: *u8, mode: *u8) -> s32 #foreign luajit_5_1 "lua_loadx";

version :: (L: *State) -> *Number #foreign luajit_5_1 "lua_version";
copy :: (L: *State, fromidx: s32, toidx: s32) -> void #foreign luajit_5_1 "lua_copy";
tonumberx :: (L: *State, idx: s32, isnum: *s32) -> Number #foreign luajit_5_1 "lua_tonumberx";
tointegerx :: (L: *State, idx: s32, isnum: *s32) -> Integer #foreign luajit_5_1 "lua_tointegerx";

/* From Lua 5.3. */
isyieldable :: (L: *State) -> s32 #foreign luajit_5_1 "lua_isyieldable";

Debug :: struct {
    event:           s32;
    name:            *u8; /* (n) */
    namewhat:        *u8; /* (n) `global', `local', `field', `method' */
    what:            *u8; /* (S) `Lua', `C', `main', `tail' */
    source:          *u8; /* (S) */
    currentline:     s32; /* (l) */
    nups:            s32; /* (u) number of upvalues */
    linedefined:     s32; /* (S) */
    lastlinedefined: s32; /* (S) */
    short_src:       [60] u8; /* (S) */

    i_ci:            s32; /* active function */
}

LUAJIT_MODE :: enum u32 {
    ENGINE     :: 0;
    DEBUG      :: 1;

    FUNC       :: 2;
    ALLFUNC    :: 3;
    ALLSUBFUNC :: 4;

    TRACE      :: 5;

    WRAPCFUNC  :: 16;

    MAX        :: 17;

    LUAJIT_MODE_ENGINE     :: ENGINE;
    LUAJIT_MODE_DEBUG      :: DEBUG;

    LUAJIT_MODE_FUNC       :: FUNC;
    LUAJIT_MODE_ALLFUNC    :: ALLFUNC;
    LUAJIT_MODE_ALLSUBFUNC :: ALLSUBFUNC;

    LUAJIT_MODE_TRACE      :: TRACE;

    LUAJIT_MODE_WRAPCFUNC  :: WRAPCFUNC;

    LUAJIT_MODE_MAX        :: MAX;
}

/* Control the JIT engine. */
JIT_setmode :: (L: *State, idx: s32, mode: s32) -> s32 #foreign luajit_5_1 "luaJIT_setmode";

/* Low-overhead profiling API. */
JIT_profile_callback :: #type (data: *void, L: *State, samples: s32, vmstate: s32) -> void #c_call;

JIT_profile_start :: (L: *State, mode: *u8, cb: JIT_profile_callback, data: *void) -> void #foreign luajit_5_1 "luaJIT_profile_start";

JIT_profile_stop :: (L: *State) -> void #foreign luajit_5_1 "luaJIT_profile_stop";
JIT_profile_dumpstack :: (L: *State, fmt: *u8, depth: s32, len: *u64) -> *u8 #foreign luajit_5_1 "luaJIT_profile_dumpstack";

/* Enforce (dynamic) linker error for version mismatches. Call from main. */
JIT_version_2_1_1744318430 :: () -> void #foreign luajit_5_1 "luaJIT_version_2_1_1744318430";

open_base :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_base";
open_math :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_math";
open_string :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_string";
open_table :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_table";
open_io :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_io";
open_os :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_os";
open_package :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_package";
open_debug :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_debug";
open_bit :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_bit";
open_jit :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_jit";
open_ffi :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_ffi";
open_string_buffer :: (L: *State) -> s32 #foreign luajit_5_1 "luaopen_string_buffer";

L_openlibs :: (L: *State) -> void #foreign luajit_5_1 "luaL_openlibs";

L_Reg :: struct {
    name: *u8;
    func: CFunction;
}

L_openlib :: (L: *State, libname: *u8, l: *L_Reg, nup: s32) -> void #foreign luajit_5_1 "luaL_openlib";

L_register :: (L: *State, libname: *u8, l: *L_Reg) -> void #foreign luajit_5_1 "luaL_register";

L_getmetafield :: (L: *State, obj: s32, e: *u8) -> s32 #foreign luajit_5_1 "luaL_getmetafield";
L_callmeta :: (L: *State, obj: s32, e: *u8) -> s32 #foreign luajit_5_1 "luaL_callmeta";
L_typerror :: (L: *State, narg: s32, tname: *u8) -> s32 #foreign luajit_5_1 "luaL_typerror";
L_argerror :: (L: *State, numarg: s32, extramsg: *u8) -> s32 #foreign luajit_5_1 "luaL_argerror";
L_checklstring :: (L: *State, numArg: s32, l: *u64) -> *u8 #foreign luajit_5_1 "luaL_checklstring";

L_optlstring :: (L: *State, numArg: s32, def: *u8, l: *u64) -> *u8 #foreign luajit_5_1 "luaL_optlstring";

L_checknumber :: (L: *State, numArg: s32) -> Number #foreign luajit_5_1 "luaL_checknumber";
L_optnumber :: (L: *State, nArg: s32, def: Number) -> Number #foreign luajit_5_1 "luaL_optnumber";

L_checkinteger :: (L: *State, numArg: s32) -> Integer #foreign luajit_5_1 "luaL_checkinteger";
L_optinteger :: (L: *State, nArg: s32, def: Integer) -> Integer #foreign luajit_5_1 "luaL_optinteger";

L_checkstack :: (L: *State, sz: s32, msg: *u8) -> void #foreign luajit_5_1 "luaL_checkstack";
L_checktype :: (L: *State, narg: s32, t: s32) -> void #foreign luajit_5_1 "luaL_checktype";
L_checkany :: (L: *State, narg: s32) -> void #foreign luajit_5_1 "luaL_checkany";

L_newmetatable :: (L: *State, tname: *u8) -> s32 #foreign luajit_5_1 "luaL_newmetatable";
L_checkudata :: (L: *State, ud: s32, tname: *u8) -> *void #foreign luajit_5_1 "luaL_checkudata";

L_where :: (L: *State, lvl: s32) -> void #foreign luajit_5_1 "luaL_where";
L_error_CFormat :: (L: *State, fmt: *u8, __args: ..Any) -> s32 #foreign luajit_5_1 "luaL_error";
L_error :: (L: *State, fmt: string, __args: ..Any) -> s32 {
    push_allocator(temp);
    formatted_text_builder: String_Builder;
    print_to_builder(*formatted_text_builder, fmt, ..__args);
    append(*formatted_text_builder, "\0");
    formatted_text := builder_to_string(*formatted_text_builder);
    return L_error_CFormat(L, "%s", formatted_text.data);
} @PrintLike

L_checkoption :: (L: *State, narg: s32, def: *u8, lst: **u8) -> s32 #foreign luajit_5_1 "luaL_checkoption";

L_ref :: (L: *State, t: s32) -> s32 #foreign luajit_5_1 "luaL_ref";
L_unref :: (L: *State, t: s32, ref: s32) -> void #foreign luajit_5_1 "luaL_unref";

L_loadfile :: (L: *State, filename: *u8) -> s32 #foreign luajit_5_1 "luaL_loadfile";
L_loadbuffer :: (L: *State, buff: *u8, sz: u64, name: *u8) -> s32 #foreign luajit_5_1 "luaL_loadbuffer";

L_loadstring :: (L: *State, s: *u8) -> s32 #foreign luajit_5_1 "luaL_loadstring";

L_newstate :: () -> *State #foreign luajit_5_1 "luaL_newstate";

L_gsub :: (L: *State, s: *u8, p: *u8, r: *u8) -> *u8 #foreign luajit_5_1 "luaL_gsub";

L_findtable :: (L: *State, idx: s32, fname: *u8, szhint: s32) -> *u8 #foreign luajit_5_1 "luaL_findtable";

/* From Lua 5.2. */
L_fileresult :: (L: *State, stat: s32, fname: *u8) -> s32 #foreign luajit_5_1 "luaL_fileresult";
L_execresult :: (L: *State, stat: s32) -> s32 #foreign luajit_5_1 "luaL_execresult";
L_loadfilex :: (L: *State, filename: *u8, mode: *u8) -> s32 #foreign luajit_5_1 "luaL_loadfilex";

L_loadbufferx :: (L: *State, buff: *u8, sz: u64, name: *u8, mode: *u8) -> s32 #foreign luajit_5_1 "luaL_loadbufferx";

L_traceback :: (L: *State, L1: *State, msg: *u8, level: s32) -> void #foreign luajit_5_1 "luaL_traceback";

L_setfuncs :: (L: *State, l: *L_Reg, nup: s32) -> void #foreign luajit_5_1 "luaL_setfuncs";
L_pushmodule :: (L: *State, modname: *u8, sizehint: s32) -> void #foreign luajit_5_1 "luaL_pushmodule";

L_testudata :: (L: *State, ud: s32, tname: *u8) -> *void #foreign luajit_5_1 "luaL_testudata";
L_setmetatable :: (L: *State, tname: *u8) -> void #foreign luajit_5_1 "luaL_setmetatable";

/*
** {======================================================
** Generic Buffer manipulation
** =======================================================
*/
L_Buffer :: struct {
    p:      *u8; /* current position in buffer */
    lvl:    s32; /* number of strings in the stack (level) */
    L:      *State;
    buffer: [1024] u8;
}

L_buffinit :: (L: *State, B: *L_Buffer) -> void #foreign luajit_5_1 "luaL_buffinit";
L_prepbuffer :: (B: *L_Buffer) -> *u8 #foreign luajit_5_1 "luaL_prepbuffer";
L_addlstring :: (B: *L_Buffer, s: *u8, l: u64) -> void #foreign luajit_5_1 "luaL_addlstring";
L_addstring :: (B: *L_Buffer, s: *u8) -> void #foreign luajit_5_1 "luaL_addstring";
L_addvalue :: (B: *L_Buffer) -> void #foreign luajit_5_1 "luaL_addvalue";
L_pushresult :: (B: *L_Buffer) -> void #foreign luajit_5_1 "luaL_pushresult";

#scope_file

#import "Basic"; // For assert, push_context


#run {
    {
        info := type_info(Debug);
        for info.members {
            if it.name == {
                case "event";
                    assert(it.offset_in_bytes == 0, "Debug.event has unexpected offset % instead of 0", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.event has unexpected size % instead of 4", it.type.runtime_size);
                case "name";
                    assert(it.offset_in_bytes == 8, "Debug.name has unexpected offset % instead of 8", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "Debug.name has unexpected size % instead of 8", it.type.runtime_size);
                case "namewhat";
                    assert(it.offset_in_bytes == 16, "Debug.namewhat has unexpected offset % instead of 16", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "Debug.namewhat has unexpected size % instead of 8", it.type.runtime_size);
                case "what";
                    assert(it.offset_in_bytes == 24, "Debug.what has unexpected offset % instead of 24", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "Debug.what has unexpected size % instead of 8", it.type.runtime_size);
                case "source";
                    assert(it.offset_in_bytes == 32, "Debug.source has unexpected offset % instead of 32", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "Debug.source has unexpected size % instead of 8", it.type.runtime_size);
                case "currentline";
                    assert(it.offset_in_bytes == 40, "Debug.currentline has unexpected offset % instead of 40", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.currentline has unexpected size % instead of 4", it.type.runtime_size);
                case "nups";
                    assert(it.offset_in_bytes == 44, "Debug.nups has unexpected offset % instead of 44", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.nups has unexpected size % instead of 4", it.type.runtime_size);
                case "linedefined";
                    assert(it.offset_in_bytes == 48, "Debug.linedefined has unexpected offset % instead of 48", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.linedefined has unexpected size % instead of 4", it.type.runtime_size);
                case "lastlinedefined";
                    assert(it.offset_in_bytes == 52, "Debug.lastlinedefined has unexpected offset % instead of 52", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.lastlinedefined has unexpected size % instead of 4", it.type.runtime_size);
                case "short_src";
                    assert(it.offset_in_bytes == 56, "Debug.short_src has unexpected offset % instead of 56", it.offset_in_bytes);
                    assert(it.type.runtime_size == 60, "Debug.short_src has unexpected size % instead of 60", it.type.runtime_size);
                case "i_ci";
                    assert(it.offset_in_bytes == 116, "Debug.i_ci has unexpected offset % instead of 116", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "Debug.i_ci has unexpected size % instead of 4", it.type.runtime_size);
            }
        }
        assert(size_of(Debug) == 120, "Debug has size % instead of 120", size_of(Debug));
    }

    {
        info := type_info(L_Reg);
        for info.members {
            if it.name == {
                case "name";
                    assert(it.offset_in_bytes == 0, "L_Reg.name has unexpected offset % instead of 0", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "L_Reg.name has unexpected size % instead of 8", it.type.runtime_size);
                case "func";
                    assert(it.offset_in_bytes == 8, "L_Reg.func has unexpected offset % instead of 8", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "L_Reg.func has unexpected size % instead of 8", it.type.runtime_size);
            }
        }
        assert(size_of(L_Reg) == 16, "L_Reg has size % instead of 16", size_of(L_Reg));
    }

    {
        info := type_info(L_Buffer);
        for info.members {
            if it.name == {
                case "p";
                    assert(it.offset_in_bytes == 0, "L_Buffer.p has unexpected offset % instead of 0", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "L_Buffer.p has unexpected size % instead of 8", it.type.runtime_size);
                case "lvl";
                    assert(it.offset_in_bytes == 8, "L_Buffer.lvl has unexpected offset % instead of 8", it.offset_in_bytes);
                    assert(it.type.runtime_size == 4, "L_Buffer.lvl has unexpected size % instead of 4", it.type.runtime_size);
                case "L";
                    assert(it.offset_in_bytes == 16, "L_Buffer.L has unexpected offset % instead of 16", it.offset_in_bytes);
                    assert(it.type.runtime_size == 8, "L_Buffer.L has unexpected size % instead of 8", it.type.runtime_size);
                case "buffer";
                    assert(it.offset_in_bytes == 24, "L_Buffer.buffer has unexpected offset % instead of 24", it.offset_in_bytes);
                    assert(it.type.runtime_size == 1024, "L_Buffer.buffer has unexpected size % instead of 1024", it.type.runtime_size);
            }
        }
        assert(size_of(L_Buffer) == 1048, "L_Buffer has size % instead of 1048", size_of(L_Buffer));
    }
}

