Skip to main content

luaur_vm/functions/
numusearray.rs

1use crate::enums::lua_type::lua_Type;
2use crate::macros::maxbits::MAXBITS;
3use crate::macros::ttisnil::ttisnil;
4use crate::records::lua_table::LuaTable;
5
6pub(crate) unsafe fn numusearray(
7    t: *const LuaTable,
8    nums: *mut core::ffi::c_int,
9) -> core::ffi::c_int {
10    let mut lg: core::ffi::c_int;
11    let mut ttlg: core::ffi::c_int; // 2^lg
12    let mut ause: core::ffi::c_int = 0; // summation of `nums'
13    let mut i: core::ffi::c_int = 1; // count to traverse all array keys
14
15    lg = 0;
16    ttlg = 1;
17    while lg <= MAXBITS {
18        let mut lc: core::ffi::c_int = 0; // counter
19        let mut lim: core::ffi::c_int = ttlg;
20
21        if lim > (*t).sizearray {
22            lim = (*t).sizearray; // adjust upper limit
23            if i > lim {
24                break; // no more elements to count
25            }
26        }
27
28        // count elements in range (2^(lg-1), 2^lg]
29        while i <= lim {
30            if !ttisnil!((*t).array.offset((i - 1) as isize)) {
31                lc += 1;
32            }
33            i += 1;
34        }
35
36        *nums.offset(lg as isize) += lc;
37        ause += lc;
38
39        lg += 1;
40        ttlg *= 2;
41    }
42
43    ause
44}