Rewrite mapsize in Rust and remove the Go implementation #1
@@ -375,8 +375,7 @@ fn split_num(s: &str) -> (&str, &str) {
|
||||
pub fn parse_size(s: &str) -> Result<i64, String> {
|
||||
let (num, unit_raw) = split_num(s);
|
||||
let Ok(v) = num.parse::<f64>() else { return Err(format!("bad size {s:?}")) };
|
||||
// ponytail: textutil exposes no SI getter; its formatting reveals the setting.
|
||||
let bare: f64 = if crate::textutil::size(1000).ends_with("kB") { 1000.0 } else { 1024.0 };
|
||||
let bare: f64 = if crate::textutil::si() { 1000.0 } else { 1024.0 };
|
||||
let m = match unit_raw.trim().to_lowercase().as_str() {
|
||||
"" | "b" => 1.0,
|
||||
"k" => bare,
|
||||
|
||||
@@ -162,11 +162,16 @@ pub fn set_si(v: bool) {
|
||||
SI.store(v, Ordering::Relaxed);
|
||||
}
|
||||
|
||||
/// Whether decimal units are selected.
|
||||
pub fn si() -> bool {
|
||||
SI.load(Ordering::Relaxed)
|
||||
}
|
||||
|
||||
const IEC_UNITS: [&str; 7] = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"];
|
||||
const SI_UNITS: [&str; 7] = ["B", "kB", "MB", "GB", "TB", "PB", "EB"];
|
||||
|
||||
fn scaled(n: i64) -> (f64, &'static str) {
|
||||
let (base, units) = if SI.load(Ordering::Relaxed) { (1000.0, &SI_UNITS) } else { (1024.0, &IEC_UNITS) };
|
||||
let (base, units) = if si() { (1000.0, &SI_UNITS) } else { (1024.0, &IEC_UNITS) };
|
||||
let neg = n < 0;
|
||||
let mut v = (n as f64).abs();
|
||||
let mut i = 0;
|
||||
|
||||
Reference in New Issue
Block a user