luaur_vm/functions/
buffer_readstring.rs1use crate::functions::lua_l_checkbuffer::lua_l_checkbuffer;
2use crate::functions::lua_l_checkinteger::lua_l_checkinteger;
3use crate::functions::lua_l_error_l::lua_l_error_l;
4use crate::functions::lua_pushlstring::lua_pushlstring;
5use crate::macros::isoutofbounds::isoutofbounds;
6use crate::macros::lua_l_argcheck::luaL_argcheck;
7use crate::type_aliases::lua_state::lua_State;
8use core::ffi::{c_char, c_int, c_void};
9
10pub fn buffer_readstring(L: *mut lua_State) -> c_int {
11 let mut len: usize = 0;
12 let buf = lua_l_checkbuffer(L, 1, &mut len);
13 let offset = lua_l_checkinteger(L, 2);
14 let size = lua_l_checkinteger(L, 3);
15
16 luaL_argcheck!(L, size >= 0, 3, "size");
17
18 if isoutofbounds(offset, len, size as usize) {
19 let msg = b"buffer access out of bounds\0";
20 unsafe {
21 lua_l_error_l(
22 L,
23 msg.as_ptr() as *const c_char,
24 core::format_args!("buffer access out of bounds"),
25 );
26 }
27 }
28
29 unsafe {
30 let data_ptr = (buf as *const c_char).add(offset as usize);
31 lua_pushlstring(L, data_ptr, size as usize);
32 }
33
34 1
35}