]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
numfmt: handle leading zeros correctly
authorPádraig Brady <P@draigBrady.com>
Mon, 22 Jun 2015 01:12:32 +0000 (02:12 +0100)
committerPádraig Brady <P@draigBrady.com>
Mon, 22 Jun 2015 01:21:02 +0000 (02:21 +0100)
* src/numfmt.c (simple_strtod_int): Don't count leading zeros
as significant digits.  Also have leading zeros as optional
for floating point numbers.
* tests/misc/numfmt.pl: Add test cases.
* NEWS: Mention the fix.

NEWS
src/numfmt.c
tests/misc/numfmt.pl

diff --git a/NEWS b/NEWS
index 3b3000034f3816e7caec666b4061d2b671ebef83..99a930133ff276a811437c1855508e1a4b221a49 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   large numbers, or with numbers with increased precision.
   [bug introduced when numfmt was added in coreutils-8.21]
 
+  numfmt now handles leading zeros correctly, not counting them when
+  settings processing limits, and making them optional with floating point.
+  [bug introduced when numfmt was added in coreutils-8.21]
+
   paste no longer truncates output for large input files.  This would happen
   for example with files larger than 4GiB on 32 bit systems with a '\n'
   character at the 4GiB position.
index 82a958549f2411f9b55815e4b7e9c4148f361dcf..1a7185f2b5e0a59b563117029769361ac902a63f 100644 (file)
@@ -462,6 +462,7 @@ simple_strtod_int (const char *input_str,
 
   long double val = 0;
   unsigned int digits = 0;
+  bool found_digit = false;
 
   if (*input_str == '-')
     {
@@ -476,7 +477,10 @@ simple_strtod_int (const char *input_str,
     {
       int digit = (**endptr) - '0';
 
-      digits++;
+      found_digit = true;
+
+      if (val || digit)
+        digits++;
 
       if (digits > MAX_UNSCALED_DIGITS)
         e = SSE_OK_PRECISION_LOSS;
@@ -489,7 +493,8 @@ simple_strtod_int (const char *input_str,
 
       ++(*endptr);
     }
-  if (digits == 0)
+  if (! found_digit
+      && ! STREQ_LEN (*endptr, decimal_point, decimal_point_length))
     return SSE_INVALID_NUMBER;
   if (*negative)
     val = -val;
index 25bba61b2c7908c90f8eb055c9a2799399e17e4d..a6432a76c59623bf8611fba26cb2de69dcbb6139 100755 (executable)
@@ -659,6 +659,19 @@ my @Tests =
      ['large-15',$limits->{INTMAX_OFLOW}, {OUT=>$limits->{INTMAX_OFLOW}}],
      ['large-16','9.300000000000000000', {OUT=>'9.300000000000000000'}],
 
+     # Leading zeros weren't handled appropriately before 8.24
+     ['leading-1','0000000000000000000000000001', {OUT=>"1"}],
+     ['leading-2','.1', {OUT=>"0.1"}],
+     ['leading-3','bad.1',
+             {ERR => "$prog: invalid number: 'bad.1'\n"},
+             {EXIT => 2}],
+     ['leading-4','..1',
+             {ERR => "$prog: invalid suffix in input: '..1'\n"},
+             {EXIT => 2}],
+     ['leading-5','1.',
+             {ERR => "$prog: invalid number: '1.'\n"},
+             {EXIT => 2}],
+
      # precision override
      ['precision-1','--format=%.4f 9991239123 --to=si', {OUT=>"9.9913G"}],
      ['precision-2','--format=%.1f 9991239123 --to=si', {OUT=>"10.0G"}],