From efd7b6116cdf255330d5f5d3699476b18b65e055 Mon Sep 17 00:00:00 2001 From: maxer137 Date: Wed, 3 Apr 2024 16:07:04 +0200 Subject: [PATCH 1/4] seq: remove is_minus_zero_float check on parse_exponent_no_decimal --- src/uu/seq/src/numberparse.rs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/uu/seq/src/numberparse.rs b/src/uu/seq/src/numberparse.rs index df7c1f7d1dd..20b42638a1a 100644 --- a/src/uu/seq/src/numberparse.rs +++ b/src/uu/seq/src/numberparse.rs @@ -103,20 +103,17 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result Date: Wed, 3 Apr 2024 16:07:31 +0200 Subject: [PATCH 2/4] seq: remove exponent exponent less than 0 check. When exponent is greater than 0 we previously created a new string causing us to create a new string with a much larger size. This would the get passed to the BigDecimal crate which would get stuck. --- src/uu/seq/src/numberparse.rs | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/uu/seq/src/numberparse.rs b/src/uu/seq/src/numberparse.rs index 20b42638a1a..1a3ffd6b32e 100644 --- a/src/uu/seq/src/numberparse.rs +++ b/src/uu/seq/src/numberparse.rs @@ -117,24 +117,18 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result Date: Wed, 3 Apr 2024 19:20:27 +0200 Subject: [PATCH 3/4] seq: Reverted change in is_minus_zero check I had made the mistake of not running all the tests. This is indeed needed. However, you still need to add the exponent if it's positive for 0 numbers. This way, 0 numbers (such as 0e+5) will be counted as having a width of 5. This change also removes the memory allocation needed for the previous implementation. Where the string itself would be padded with zeros on the right side. Creating large numbers this method would cause large allocations in memory. This does not seem to fix issue #6182. --- src/uu/seq/src/numberparse.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/uu/seq/src/numberparse.rs b/src/uu/seq/src/numberparse.rs index 1a3ffd6b32e..0ac1f93c906 100644 --- a/src/uu/seq/src/numberparse.rs +++ b/src/uu/seq/src/numberparse.rs @@ -104,16 +104,24 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result 0 { + 2usize + exponent as usize + } else { + 2usize + } } else { - result + let total = j as i64 + exponent; + let result = if total < 1 { + 1 + } else { + total.try_into().unwrap() + }; + if x.sign() == Sign::Minus { + result + 1 + } else { + result + } }; let num_fractional_digits = if exponent < 0 { -exponent as usize } else { 0 }; From 0fdefc3767a00a7047948d27e5f17ff334c0d489 Mon Sep 17 00:00:00 2001 From: maxer137 Date: Fri, 5 Apr 2024 15:01:18 +0200 Subject: [PATCH 4/4] seq: remove zero padding from `parse_decimal_and_exponent` This adds the same fix applied to `parse_exponent_no_decimal`. This way we don't need to create large strings --- src/uu/seq/src/numberparse.rs | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/src/uu/seq/src/numberparse.rs b/src/uu/seq/src/numberparse.rs index 0ac1f93c906..5a5c64bb991 100644 --- a/src/uu/seq/src/numberparse.rs +++ b/src/uu/seq/src/numberparse.rs @@ -206,7 +206,11 @@ fn parse_decimal_and_exponent( let minimum: usize = { let integral_part: f64 = s[..j].parse().map_err(|_| ParseNumberError::Float)?; if integral_part.is_sign_negative() { - 2 + if exponent > 0 { + 2usize + exponent as usize + } else { + 2usize + } } else { 1 } @@ -233,30 +237,7 @@ fn parse_decimal_and_exponent( .unwrap() }; - if num_digits_between_decimal_point_and_e <= exponent { - if is_minus_zero_float(s, &val) { - Ok(PreciseNumber::new( - ExtendedBigDecimal::MinusZero, - num_integral_digits, - num_fractional_digits, - )) - } else { - let zeros: String = "0".repeat( - (exponent - num_digits_between_decimal_point_and_e) - .try_into() - .unwrap(), - ); - let expanded = [&s[0..i], &s[i + 1..j], &zeros].concat(); - let n = expanded - .parse::() - .map_err(|_| ParseNumberError::Float)?; - Ok(PreciseNumber::new( - ExtendedBigDecimal::BigDecimal(n), - num_integral_digits, - num_fractional_digits, - )) - } - } else if is_minus_zero_float(s, &val) { + if is_minus_zero_float(s, &val) { Ok(PreciseNumber::new( ExtendedBigDecimal::MinusZero, num_integral_digits,