luaur_vm/functions/
getnum.rs1use 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 df } 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}