Skip to main content

luaur_vm/functions/
getnum.rs

1use crate::functions::digit::digit;
2use crate::macros::lua_l_error::luaL_error;
3use crate::records::header::Header;
4use core::ffi::{c_char, c_int};
5
6#[allow(non_snake_case)]
7pub fn getnum(h: *mut Header, fmt: *mut *const c_char, df: i32) -> i32 {
8    unsafe {
9        if digit(**fmt as c_int) == 0 {
10            // no number?
11            df // return default value
12        } else {
13            let mut a: i32 = 0;
14            let mut fmt_ptr = *fmt;
15            loop {
16                let digit_val = (*fmt_ptr as c_int) - b'0' as c_int;
17                a = a * 10 + digit_val;
18                fmt_ptr = fmt_ptr.add(1);
19
20                if digit(*fmt_ptr as c_int) == 0 || a > (i32::MAX - 9) / 10 {
21                    break;
22                }
23            }
24            *fmt = fmt_ptr;
25
26            if a > 1073741824 || digit(*fmt_ptr as c_int) != 0 {
27                luaL_error!((*h).L, "size specifier is too large");
28            }
29            a
30        }
31    }
32}