mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
Makes multiplier parsing system dependant
- multipler is now created as u128, then returned as usize after conversion. Errors due to overflow now depend on the system on which the code is run.
This commit is contained in:
+27
-27
@@ -293,33 +293,33 @@ impl std::str::FromStr for StatusLevel {
|
||||
}
|
||||
|
||||
fn parse_multiplier<'a>(s: &'a str) -> Result<usize, ParseError> {
|
||||
match s {
|
||||
"c" => Ok(1),
|
||||
"w" => Ok(2),
|
||||
"b" => Ok(512),
|
||||
"kB" => Ok(1000),
|
||||
"K" | "KiB" => Ok(1024),
|
||||
"MB" => Ok(1000 * 1000),
|
||||
"M" | "MiB" => Ok(1024 * 1024),
|
||||
"GB" => Ok(1000 * 1000 * 1000),
|
||||
"G" | "GiB" => Ok(1024 * 1024 * 1024),
|
||||
"TB" => Ok(1000 * 1000 * 1000 * 1000),
|
||||
"T" | "TiB" => Ok(1024 * 1024 * 1024 * 1024),
|
||||
"PB" => Ok(1000 * 1000 * 1000 * 1000 * 1000),
|
||||
"P" | "PiB" => Ok(1024 * 1024 * 1024 * 1024 * 1024),
|
||||
"EB" => Ok(1000 * 1000 * 1000 * 1000 * 1000 * 1000),
|
||||
"E" | "EiB" => Ok(1024 * 1024 * 1024 * 1024 * 1024 * 1024),
|
||||
// The following would overflow on my x64 system
|
||||
// "ZB" =>
|
||||
// Ok(1000*1000*1000*1000*1000*1000*1000),
|
||||
// "Z" | "ZiB" =>
|
||||
// Ok(1024*1024*1024*1024*1024*1024*1024),
|
||||
// "YB" =>
|
||||
// Ok(1000*1000*1000*1000*1000*1000*1000*1000),
|
||||
// "Y" | "YiB" =>
|
||||
// Ok(1024*1024*1024*1024*1024*1024*1024*1024),
|
||||
_ => Err(ParseError::NoMatchingMultiplier(s.to_string())),
|
||||
}
|
||||
let mult: u128 = match s {
|
||||
"c" => 1,
|
||||
"w" => 2,
|
||||
"b" => 512,
|
||||
"kB" => 1000,
|
||||
"K" | "KiB" => 1024,
|
||||
"MB" => 1000 * 1000,
|
||||
"M" | "MiB" => 1024 * 1024,
|
||||
"GB" => 1000 * 1000 * 1000,
|
||||
"G" | "GiB" => 1024 * 1024 * 1024,
|
||||
"TB" => 1000 * 1000 * 1000 * 1000,
|
||||
"T" | "TiB" => 1024 * 1024 * 1024 * 1024,
|
||||
"PB" => 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
"P" | "PiB" => 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
"EB" => 1000 * 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
"E" | "EiB" => 1024 * 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
"ZB" => 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
"Z" | "ZiB" => 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
"YB" => 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
"Y" | "YiB" => 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
_ => return Err(ParseError::NoMatchingMultiplier(s.to_string())),
|
||||
};
|
||||
|
||||
mult.try_into()
|
||||
.map_err(|_e| {
|
||||
ParseError::MultiplierStringWouldOverflow(s.to_string())
|
||||
})
|
||||
}
|
||||
|
||||
fn parse_bytes_only(s: &str) -> Result<usize, ParseError> {
|
||||
|
||||
Reference in New Issue
Block a user