Skip to main content

luaur_vm/functions/
lua_v_strcmp.rs

1use crate::macros::getstr::getstr;
2use crate::type_aliases::t_string::TString;
3
4#[allow(non_snake_case)]
5pub fn lua_v_strcmp(ls: *const TString, rs: *const TString) -> core::ffi::c_int {
6    if ls == rs {
7        return 0;
8    }
9
10    unsafe {
11        let l = getstr(ls);
12        let r = getstr(rs);
13
14        // always safe to read one character because even empty strings are nul terminated
15        let bl = *l as u8;
16        let br = *r as u8;
17
18        if bl != br {
19            return (bl as core::ffi::c_int) - (br as core::ffi::c_int);
20        }
21
22        let ll = (*ls).len as usize;
23        let lr = (*rs).len as usize;
24        let lmin = if ll < lr { ll } else { lr };
25
26        let res = libc::memcmp(
27            l as *const core::ffi::c_void,
28            r as *const core::ffi::c_void,
29            lmin,
30        );
31
32        if res != 0 {
33            return res;
34        }
35
36        if ll == lr {
37            0
38        } else if ll < lr {
39            -1
40        } else {
41            1
42        }
43    }
44}
45
46mod libc {
47    extern "C" {
48        pub fn memcmp(
49            s1: *const core::ffi::c_void,
50            s2: *const core::ffi::c_void,
51            n: usize,
52        ) -> core::ffi::c_int;
53    }
54}
55
56#[allow(non_snake_case)]
57pub use lua_v_strcmp as luaV_strcmp;