Skip to main content

luaur_vm/functions/
lua_v_lessequal.rs

1use crate::enums::tms::TMS;
2use crate::functions::call_order_tm::call_orderTM;
3use crate::functions::lua_g_ordererror::luaG_ordererror;
4use crate::functions::lua_v_strcmp::luaV_strcmp;
5use crate::macros::luai_numle::luai_numle;
6use crate::macros::nvalue::nvalue;
7use crate::macros::tsvalue::tsvalue;
8use crate::macros::ttisnumber::ttisnumber;
9use crate::macros::ttisstring::ttisstring;
10use crate::macros::ttype::ttype;
11use crate::records::lua_state::lua_State;
12use crate::type_aliases::t_value::TValue;
13
14#[allow(non_snake_case)]
15pub unsafe fn lua_v_lessequal(L: *mut lua_State, l: *const TValue, r: *const TValue) -> i32 {
16    let mut res: i32 = 0;
17
18    if ttype!(l) != ttype!(r) {
19        luaG_ordererror(L, l, r, TMS::TM_LE);
20    } else if ttisnumber!(l) {
21        return luai_numle(nvalue!(l), nvalue!(r)) as i32;
22    } else if ttisstring!(l) {
23        return (luaV_strcmp(tsvalue!(l), tsvalue!(r)) <= 0) as i32;
24    } else if {
25        res = call_orderTM(L, l, r, TMS::TM_LE, false);
26        res != -1
27    } {
28        // first try `le'
29        return res;
30    } else if {
31        res = call_orderTM(L, r, l, TMS::TM_LT, false);
32        res == -1
33    } {
34        // error if not `lt'
35        luaG_ordererror(L, l, r, TMS::TM_LE);
36    }
37
38    (res == 0) as i32
39}
40
41#[export_name = "luaV_lessequal"]
42pub unsafe extern "C" fn lua_v_lessequal_export(
43    L: *mut lua_State,
44    l: *const TValue,
45    r: *const TValue,
46) -> i32 {
47    lua_v_lessequal(L, l, r)
48}