Skip to main content

luaur_vm/functions/
buffutfchar.rs

1use crate::functions::lua_l_checkinteger::luaL_checkinteger;
2use crate::functions::lua_o_utf_8_esc::lua_o_utf_8_esc;
3use crate::macros::cast_to::cast_to;
4
5use crate::macros::lua_l_argcheck::luaL_argcheck;
6use crate::type_aliases::lua_state::lua_State;
7
8use core::ffi::{c_char, c_int};
9
10const MAXUNICODE: c_int = 0x10FFFF;
11const UTF8BUFFSZ: usize = 8;
12
13pub fn buffutfchar(
14    l: *mut lua_State,
15    arg: c_int,
16    buff: *mut c_char,
17    charstr: *mut *const c_char,
18) -> c_int {
19    let code = luaL_checkinteger(l, arg);
20    luaL_argcheck!(
21        l,
22        0 <= code && code <= MAXUNICODE,
23        arg,
24        "value out of range"
25    );
26
27    let buff_slice = unsafe { core::slice::from_raw_parts_mut(buff, UTF8BUFFSZ) };
28    let lval = lua_o_utf_8_esc(
29        buff_slice.try_into().expect("UTF8BUFFSZ mismatch"),
30        cast_to!(i64, code) as u32,
31    );
32
33    unsafe {
34        *charstr = buff.add(UTF8BUFFSZ).wrapping_sub(lval as usize) as *const c_char;
35    }
36
37    lval
38}