luaur_ast/functions/
parse_double.rs1use crate::enums::constant_number_parse_result::ConstantNumberParseResult;
2use crate::functions::parse_integer::parse_integer;
3
4pub fn parse_double(result: &mut f64, data: &str) -> ConstantNumberParseResult {
5 let bytes = data.as_bytes();
6
7 if bytes.len() >= 3 && bytes[0] == b'0' && (bytes[1] == b'b' || bytes[1] == b'B') {
9 return parse_integer(result, &data[2..], 2);
10 }
11
12 if bytes.len() >= 3 && bytes[0] == b'0' && (bytes[1] == b'x' || bytes[1] == b'X') {
14 return parse_integer(result, data, 16);
16 }
17
18 let value = match data.parse::<f64>() {
22 Ok(v) => v,
23 Err(_) => return ConstantNumberParseResult::Malformed,
24 };
25
26 *result = value;
27
28 if value >= (1u64 << 53) as f64 && data.chars().all(|c| c.is_ascii_digit()) {
31 let repr = format!("{:.0}", value);
33
34 if repr != data {
35 return ConstantNumberParseResult::Imprecise;
36 }
37 }
38
39 ConstantNumberParseResult::Ok
40}