Skip to main content

luaur_vm/functions/
lua_l_pushresult.rs

1use crate::functions::lua_pushlstring::lua_pushlstring;
2use crate::functions::lua_s_buffinish::lua_s_buffinish;
3use crate::functions::lua_s_newlstr::luaS_newlstr;
4use crate::macros::lua_c_check_gc::luaC_checkGC;
5use crate::macros::setsvalue::setsvalue;
6use crate::records::lua_l_strbuf::LuaLStrbuf;
7use crate::records::t_string::TString;
8use crate::type_aliases::lua_state::lua_State;
9
10#[allow(non_snake_case)]
11pub unsafe fn lua_l_pushresult(B: *mut LuaLStrbuf) {
12    let L = (*B).L;
13    let storage = (*B).storage;
14
15    if !storage.is_null() {
16        luaC_checkGC!(L);
17
18        let p = (*B).p;
19        let end = (*B).end;
20
21        if p == end {
22            setsvalue!(L, (*L).top.offset(-1), lua_s_buffinish(L, storage));
23        } else {
24            let storage_data = (*storage).data.as_ptr();
25            let len = (p as usize).wrapping_sub(storage_data as usize);
26            setsvalue!(L, (*L).top.offset(-1), luaS_newlstr(L, storage_data, len));
27        }
28    } else {
29        let p = (*B).p;
30        let buffer = (*B).buffer.as_ptr();
31        let len = (p as usize).wrapping_sub(buffer as usize);
32        lua_pushlstring(L, buffer, len);
33    }
34}