luaur_vm/functions/
lua_v_strcmp.rs1use 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 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;