Skip to main content

luaur_vm/functions/
buffer_readstring.rs

1use 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}