Skip to main content

luaur_vm/functions/
lua_l_addvalueany.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/laux.cpp:529:luaL_addvalueany`
2//! Source: `VM/src/laux.cpp:529-582` (hand-ported)
3
4use crate::enums::lua_type::lua_Type;
5use crate::functions::lua_l_addlstring::lua_l_addlstring;
6use crate::functions::lua_l_addvalue::lua_l_addvalue;
7use crate::functions::lua_l_tolstring::lua_l_tolstring;
8use crate::functions::lua_toboolean::lua_toboolean;
9use crate::functions::lua_tointeger_64::lua_tointeger_64;
10use crate::functions::lua_tolstring::lua_tolstring;
11use crate::functions::lua_tonumberx::lua_tonumberx;
12use crate::functions::lua_type::lua_type;
13use crate::functions::luai_int_2_str::luai_int2str;
14use crate::functions::luai_num_2_str::luai_num2str;
15use crate::macros::luai_maxint_2_str::LUAI_MAXINT2STR;
16use crate::macros::luai_maxnum_2_str::LUAI_MAXNUM2STR;
17use crate::records::lua_l_strbuf::LuaLStrbuf;
18use core::ffi::{c_char, c_int};
19
20/// C++ `void luaL_addvalueany(luaL_Strbuf *B, int idx)` —
21/// converts the value at stack index `idx` to its string representation
22/// and appends it to buffer `B`.
23pub fn lua_l_addvalueany(B: *mut LuaLStrbuf, idx: c_int) {
24    unsafe {
25        let L = (*B).L;
26
27        match lua_type(L, idx) {
28            x if x == lua_Type::LUA_TNONE as c_int => {
29                panic!("expected value");
30            }
31            x if x == lua_Type::LUA_TNIL as c_int => {
32                lua_l_addlstring(B, c"nil".as_ptr(), 3);
33            }
34            x if x == lua_Type::LUA_TBOOLEAN as c_int => {
35                if lua_toboolean(L, idx) != 0 {
36                    lua_l_addlstring(B, c"true".as_ptr(), 4);
37                } else {
38                    lua_l_addlstring(B, c"false".as_ptr(), 5);
39                }
40            }
41            x if x == lua_Type::LUA_TNUMBER as c_int => {
42                let mut isnum: c_int = 0;
43                let n = lua_tonumberx(L, idx, &mut isnum);
44                let mut s = [0 as c_char; LUAI_MAXNUM2STR as usize];
45                let e = luai_num2str(s.as_mut_ptr(), n);
46                lua_l_addlstring(B, s.as_ptr(), e.offset_from(s.as_ptr()) as usize);
47            }
48            x if x == lua_Type::LUA_TSTRING as c_int => {
49                let mut len: usize = 0;
50                let s = lua_tolstring(L, idx, &mut len);
51                lua_l_addlstring(B, s, len);
52            }
53            x if x == lua_Type::LUA_TINTEGER as c_int => {
54                let n = lua_tointeger_64(L, idx, core::ptr::null_mut());
55                let mut s = [0 as c_char; LUAI_MAXINT2STR as usize];
56                let e = luai_int2str(s.as_mut_ptr(), n);
57                lua_l_addlstring(B, s.as_ptr(), e.offset_from(s.as_ptr()) as usize);
58            }
59            _ => {
60                // note: luaL_addlstring assumes box is stored at top of stack, so we can't call it here
61                // instead we use luaL_addvalue which will take the string from the top of the stack and add that
62                let mut len: usize = 0;
63                lua_l_tolstring(L, idx, &mut len);
64                lua_l_addvalue(B);
65            }
66        }
67    }
68}