1use crate::functions::buffer_copy::buffer_copy;
2use crate::functions::buffer_create::buffer_create;
3use crate::functions::buffer_fill::buffer_fill;
4use crate::functions::buffer_fromstring::buffer_fromstring;
5use crate::functions::buffer_len::buffer_len;
6use crate::functions::buffer_readbits::buffer_readbits;
7use crate::functions::buffer_readfp::buffer_readfp;
8use crate::functions::buffer_readinteger::buffer_readinteger;
9use crate::functions::buffer_readlong::buffer_readlong;
10use crate::functions::buffer_readstring::buffer_readstring;
11use crate::functions::buffer_tostring::buffer_tostring;
12use crate::functions::buffer_writebits::buffer_writebits;
13use crate::functions::buffer_writefp::buffer_writefp;
14use crate::functions::buffer_writeinteger::buffer_writeinteger;
15use crate::functions::buffer_writelong::buffer_writelong;
16use crate::functions::buffer_writestring::buffer_writestring;
17use crate::functions::lua_l_register::lua_l_register;
18use crate::records::lua_l_reg::LuaLReg;
19use crate::type_aliases::lua_state::lua_State;
20use luaur_common::FFlag;
21
22struct SyncLuaLReg<const N: usize>([LuaLReg; N]);
23unsafe impl<const N: usize> Sync for SyncLuaLReg<N> {}
24
25static BUFFER_LIB: SyncLuaLReg<29> = SyncLuaLReg([
26 LuaLReg {
27 name: c"create".as_ptr(),
28 func: Some(buffer_create),
29 },
30 LuaLReg {
31 name: c"fromstring".as_ptr(),
32 func: Some(buffer_fromstring),
33 },
34 LuaLReg {
35 name: c"tostring".as_ptr(),
36 func: Some(buffer_tostring),
37 },
38 LuaLReg {
39 name: c"readi8".as_ptr(),
40 func: Some(buffer_readinteger::<i8>),
41 },
42 LuaLReg {
43 name: c"readu8".as_ptr(),
44 func: Some(buffer_readinteger::<u8>),
45 },
46 LuaLReg {
47 name: c"readi16".as_ptr(),
48 func: Some(buffer_readinteger::<i16>),
49 },
50 LuaLReg {
51 name: c"readu16".as_ptr(),
52 func: Some(buffer_readinteger::<u16>),
53 },
54 LuaLReg {
55 name: c"readi32".as_ptr(),
56 func: Some(buffer_readinteger::<i32>),
57 },
58 LuaLReg {
59 name: c"readu32".as_ptr(),
60 func: Some(buffer_readinteger::<u32>),
61 },
62 LuaLReg {
63 name: c"readf32".as_ptr(),
64 func: Some(buffer_readfp::<f32, u32>),
65 },
66 LuaLReg {
67 name: c"readf64".as_ptr(),
68 func: Some(buffer_readfp::<f64, u64>),
69 },
70 LuaLReg {
71 name: c"writei8".as_ptr(),
72 func: Some(buffer_writeinteger::<i8>),
73 },
74 LuaLReg {
75 name: c"writeu8".as_ptr(),
76 func: Some(buffer_writeinteger::<u8>),
77 },
78 LuaLReg {
79 name: c"writei16".as_ptr(),
80 func: Some(buffer_writeinteger::<i16>),
81 },
82 LuaLReg {
83 name: c"writeu16".as_ptr(),
84 func: Some(buffer_writeinteger::<u16>),
85 },
86 LuaLReg {
87 name: c"writei32".as_ptr(),
88 func: Some(buffer_writeinteger::<i32>),
89 },
90 LuaLReg {
91 name: c"writeu32".as_ptr(),
92 func: Some(buffer_writeinteger::<u32>),
93 },
94 LuaLReg {
95 name: c"writef32".as_ptr(),
96 func: Some(buffer_writefp::<f32, u32>),
97 },
98 LuaLReg {
99 name: c"writef64".as_ptr(),
100 func: Some(buffer_writefp::<f64, u64>),
101 },
102 LuaLReg {
103 name: c"readstring".as_ptr(),
104 func: Some(buffer_readstring),
105 },
106 LuaLReg {
107 name: c"writestring".as_ptr(),
108 func: Some(buffer_writestring),
109 },
110 LuaLReg {
111 name: c"len".as_ptr(),
112 func: Some(buffer_len),
113 },
114 LuaLReg {
115 name: c"copy".as_ptr(),
116 func: Some(buffer_copy),
117 },
118 LuaLReg {
119 name: c"fill".as_ptr(),
120 func: Some(buffer_fill),
121 },
122 LuaLReg {
123 name: c"readbits".as_ptr(),
124 func: Some(buffer_readbits),
125 },
126 LuaLReg {
127 name: c"writebits".as_ptr(),
128 func: Some(buffer_writebits),
129 },
130 LuaLReg {
131 name: c"readinteger".as_ptr(),
132 func: Some(buffer_readlong),
133 },
134 LuaLReg {
135 name: c"writeinteger".as_ptr(),
136 func: Some(buffer_writelong),
137 },
138 LuaLReg {
139 name: core::ptr::null(),
140 func: None,
141 },
142]);
143
144static BUFFER_LIB_NO_INTEGER: SyncLuaLReg<27> = SyncLuaLReg([
145 LuaLReg {
146 name: c"create".as_ptr(),
147 func: Some(buffer_create),
148 },
149 LuaLReg {
150 name: c"fromstring".as_ptr(),
151 func: Some(buffer_fromstring),
152 },
153 LuaLReg {
154 name: c"tostring".as_ptr(),
155 func: Some(buffer_tostring),
156 },
157 LuaLReg {
158 name: c"readi8".as_ptr(),
159 func: Some(buffer_readinteger::<i8>),
160 },
161 LuaLReg {
162 name: c"readu8".as_ptr(),
163 func: Some(buffer_readinteger::<u8>),
164 },
165 LuaLReg {
166 name: c"readi16".as_ptr(),
167 func: Some(buffer_readinteger::<i16>),
168 },
169 LuaLReg {
170 name: c"readu16".as_ptr(),
171 func: Some(buffer_readinteger::<u16>),
172 },
173 LuaLReg {
174 name: c"readi32".as_ptr(),
175 func: Some(buffer_readinteger::<i32>),
176 },
177 LuaLReg {
178 name: c"readu32".as_ptr(),
179 func: Some(buffer_readinteger::<u32>),
180 },
181 LuaLReg {
182 name: c"readf32".as_ptr(),
183 func: Some(buffer_readfp::<f32, u32>),
184 },
185 LuaLReg {
186 name: c"readf64".as_ptr(),
187 func: Some(buffer_readfp::<f64, u64>),
188 },
189 LuaLReg {
190 name: c"writei8".as_ptr(),
191 func: Some(buffer_writeinteger::<i8>),
192 },
193 LuaLReg {
194 name: c"writeu8".as_ptr(),
195 func: Some(buffer_writeinteger::<u8>),
196 },
197 LuaLReg {
198 name: c"writei16".as_ptr(),
199 func: Some(buffer_writeinteger::<i16>),
200 },
201 LuaLReg {
202 name: c"writeu16".as_ptr(),
203 func: Some(buffer_writeinteger::<u16>),
204 },
205 LuaLReg {
206 name: c"writei32".as_ptr(),
207 func: Some(buffer_writeinteger::<i32>),
208 },
209 LuaLReg {
210 name: c"writeu32".as_ptr(),
211 func: Some(buffer_writeinteger::<u32>),
212 },
213 LuaLReg {
214 name: c"writef32".as_ptr(),
215 func: Some(buffer_writefp::<f32, u32>),
216 },
217 LuaLReg {
218 name: c"writef64".as_ptr(),
219 func: Some(buffer_writefp::<f64, u64>),
220 },
221 LuaLReg {
222 name: c"readstring".as_ptr(),
223 func: Some(buffer_readstring),
224 },
225 LuaLReg {
226 name: c"writestring".as_ptr(),
227 func: Some(buffer_writestring),
228 },
229 LuaLReg {
230 name: c"len".as_ptr(),
231 func: Some(buffer_len),
232 },
233 LuaLReg {
234 name: c"copy".as_ptr(),
235 func: Some(buffer_copy),
236 },
237 LuaLReg {
238 name: c"fill".as_ptr(),
239 func: Some(buffer_fill),
240 },
241 LuaLReg {
242 name: c"readbits".as_ptr(),
243 func: Some(buffer_readbits),
244 },
245 LuaLReg {
246 name: c"writebits".as_ptr(),
247 func: Some(buffer_writebits),
248 },
249 LuaLReg {
250 name: core::ptr::null(),
251 func: None,
252 },
253]);
254
255pub unsafe fn luaopen_buffer(L: *mut lua_State) -> core::ffi::c_int {
256 let buffer_lib = if FFlag::LuauIntegerLibrary.get() {
257 BUFFER_LIB.0.as_ptr()
258 } else {
259 BUFFER_LIB_NO_INTEGER.0.as_ptr()
260 };
261
262 lua_l_register(L, c"buffer".as_ptr(), buffer_lib);
263 1
264}