From baf62a2566aa87eed42081e0fd881e89cb721415 Mon Sep 17 00:00:00 2001 From: pommicket Date: Tue, 9 Sep 2025 11:42:23 -0400 Subject: Start interpretation tests --- src/lib.rs | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index acd3eb1..363b132 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -195,27 +195,17 @@ pub type Result = core::result::Result; fn parse_int(location: &Location, string: &str) -> Result { let bad_int = || Error::BadInt(location.clone(), string.into()); - if !string - .bytes() - .all(|c| c.is_ascii_hexdigit() || c == b'x' || c == b'X' || c == b'-' || c == b'+') - { - return Err(bad_int()); + let mut sign = "+"; + let mut signless = string; + if let Some(s) = string.strip_prefix(['-', '+']) { + sign = &string[..1]; + signless = s; } - let signless = string.strip_prefix(['-', '+']).unwrap_or(string); - let mut base = 10; - let baseless = signless - .strip_prefix("0x") - .or_else(|| signless.strip_prefix("0X")) - .unwrap_or_else(|| { - base = 16; - signless - }); - for digit in baseless.bytes() { - if base == 10 && !digit.is_ascii_digit() { - return Err(bad_int()); - } + if signless.starts_with('+') { + return Err(bad_int()); } - string.parse().map_err(|_| bad_int()) + let uint = parse_uint(location, signless).map_err(|_| bad_int())? as i64; + if sign == "-" { Ok(-uint) } else { Ok(uint) } } fn parse_uint(location: &Location, string: &str) -> Result { @@ -227,20 +217,24 @@ fn parse_uint(location: &Location, string: &str) -> Result { return Err(bad_uint()); } let signless = string.strip_prefix('+').unwrap_or(string); - let mut base = 10; + let mut base = 16; let baseless = signless .strip_prefix("0x") .or_else(|| signless.strip_prefix("0X")) .unwrap_or_else(|| { - base = 16; + base = 10; signless }); + if baseless.len() > 1 && baseless.starts_with('0') && base == 10 { + // decimal leading zeroes are not allowed + return Err(bad_uint()); + } for digit in baseless.bytes() { if base == 10 && !digit.is_ascii_digit() { return Err(bad_uint()); } } - let val = signless.parse().map_err(|_| bad_uint())?; + let val = u64::from_str_radix(baseless, base).map_err(|_| bad_uint())?; if val > i64::MAX as u64 { return Err(bad_uint()); } @@ -648,7 +642,7 @@ impl Parser { impl Configuration { /// Load a configuration. /// - /// `reader` can be `&str`, `&[u8]`, or anything that implements [`std::io::BufRead`] + /// `reader` can be `&[u8]` or anything that implements [`std::io::BufRead`] /// (if the `std` feature is enabled) such as `std::io::BufReader`. /// /// `filename` is used in error messages. -- cgit v1.2.3