Skip to main content

luaur_vm/functions/
luaopen_string.rs

1use crate::functions::createmetatable_lstrlib::createmetatable_mut;
2use crate::functions::lua_l_register::lua_l_register;
3use crate::records::lua_l_reg::LuaLReg;
4use crate::type_aliases::lua_state::lua_State;
5
6use crate::functions::gmatch::gmatch;
7use crate::functions::str_byte::str_byte;
8use crate::functions::str_char::str_char;
9use crate::functions::str_find::str_find;
10use crate::functions::str_format::str_format;
11use crate::functions::str_gsub::str_gsub;
12use crate::functions::str_len::str_len;
13use crate::functions::str_lower::str_lower;
14use crate::functions::str_match::str_match;
15use crate::functions::str_pack::str_pack;
16use crate::functions::str_packsize::str_packsize;
17use crate::functions::str_rep::str_rep;
18use crate::functions::str_reverse::str_reverse;
19use crate::functions::str_split::str_split;
20use crate::functions::str_sub::str_sub;
21use crate::functions::str_unpack::str_unpack;
22use crate::functions::str_upper::str_upper;
23
24pub unsafe fn luaopen_string(l: *mut lua_State) -> core::ffi::c_int {
25    // Faithful port of the `strlib[]` registration array in lstrlib.cpp:
26    // {name, func} pairs ending in a {NULL, NULL} sentinel; lua_l_register
27    // copies each into the `string` table.
28    let strlib: [LuaLReg; 18] = [
29        LuaLReg {
30            name: c"byte".as_ptr(),
31            func: Some(str_byte),
32        },
33        LuaLReg {
34            name: c"char".as_ptr(),
35            func: Some(str_char),
36        },
37        LuaLReg {
38            name: c"find".as_ptr(),
39            func: Some(str_find),
40        },
41        LuaLReg {
42            name: c"format".as_ptr(),
43            func: Some(str_format),
44        },
45        LuaLReg {
46            name: c"gmatch".as_ptr(),
47            func: Some(gmatch),
48        },
49        LuaLReg {
50            name: c"gsub".as_ptr(),
51            func: Some(str_gsub),
52        },
53        LuaLReg {
54            name: c"len".as_ptr(),
55            func: Some(str_len),
56        },
57        LuaLReg {
58            name: c"lower".as_ptr(),
59            func: Some(str_lower),
60        },
61        LuaLReg {
62            name: c"match".as_ptr(),
63            func: Some(str_match),
64        },
65        LuaLReg {
66            name: c"rep".as_ptr(),
67            func: Some(str_rep),
68        },
69        LuaLReg {
70            name: c"reverse".as_ptr(),
71            func: Some(str_reverse),
72        },
73        LuaLReg {
74            name: c"sub".as_ptr(),
75            func: Some(str_sub),
76        },
77        LuaLReg {
78            name: c"upper".as_ptr(),
79            func: Some(str_upper),
80        },
81        LuaLReg {
82            name: c"split".as_ptr(),
83            func: Some(str_split),
84        },
85        LuaLReg {
86            name: c"pack".as_ptr(),
87            func: Some(str_pack),
88        },
89        LuaLReg {
90            name: c"packsize".as_ptr(),
91            func: Some(str_packsize),
92        },
93        LuaLReg {
94            name: c"unpack".as_ptr(),
95            func: Some(str_unpack),
96        },
97        LuaLReg {
98            name: core::ptr::null(),
99            func: None,
100        },
101    ];
102
103    lua_l_register(l, c"string".as_ptr(), strlib.as_ptr());
104    createmetatable_mut(l);
105
106    1
107}