luaur_vm/functions/
lua_l_register.rs1use core::ffi::c_char;
5
6use crate::functions::libsize::libsize;
7use crate::functions::lua_getfield::lua_getfield;
8use crate::functions::lua_l_error_l::lua_l_error_l;
9use crate::functions::lua_l_findtable::luaL_findtable;
10use crate::functions::lua_pushvalue::lua_pushvalue;
11use crate::functions::lua_remove::lua_remove;
12use crate::functions::lua_setfield::lua_setfield;
13use crate::functions::lua_type::lua_type;
14use crate::macros::lua_globalsindex::LUA_GLOBALSINDEX;
15use crate::macros::lua_pop::lua_pop;
16use crate::macros::lua_pushcfunction::LUA_PUSHCFUNCTION;
17use crate::macros::lua_registryindex::LUA_REGISTRYINDEX;
18use crate::records::lua_l_reg::LuaLReg;
19use crate::type_aliases::lua_state::lua_State;
20
21#[allow(non_snake_case)]
22pub unsafe fn lua_l_register(L: *mut lua_State, libname: *const c_char, mut l: *const LuaLReg) {
23 if !libname.is_null() {
24 let size = libsize(l);
25 luaL_findtable(L, LUA_REGISTRYINDEX, c"_LOADED".as_ptr(), 1);
26 lua_getfield(L, -1, libname);
27 if lua_type(L, -1) != crate::enums::lua_type::lua_Type::LUA_TTABLE as i32 {
28 lua_pop(L, 1);
29 if !luaL_findtable(L, LUA_GLOBALSINDEX, libname, size).is_null() {
30 let name = core::ffi::CStr::from_ptr(libname).to_string_lossy();
31 lua_l_error_l(
32 L,
33 c"name conflict for module '%s'".as_ptr(),
34 format_args!("name conflict for module '{}'", name),
35 );
36 }
37 lua_pushvalue(L, -1);
38 lua_setfield(L, -3, libname);
39 }
40 lua_remove(L, -2);
41 }
42
43 while !(*l).name.is_null() {
44 LUA_PUSHCFUNCTION(L, (*l).func, (*l).name);
45 lua_setfield(L, -2, (*l).name);
46 l = l.add(1);
47 }
48}