]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Fix the automatic number width formatting in seq.
authorP@draigBrady.com <P@draigBrady.com>
Mon, 9 Jul 2007 15:07:38 +0000 (16:07 +0100)
committerJim Meyering <jim@meyering.net>
Mon, 9 Jul 2007 15:55:57 +0000 (17:55 +0200)
* src/seq.c: Fix the -w logic. Ignore spaces and '+'
characters of input numbers when determining width.
Set format correctly for input numbers in scientific notation.
* tests/seq/basic: Add various number width tests.
Details: <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/10903>

Signed-off-by: Pádraig Brady <Pádraig Brady P@draigBrady.com>
ChangeLog
src/seq.c
tests/seq/basic

index 170e76dfd8e1878e4ef05ba94ce5760f92553790..e62602020d1451bd1d6557b9c01148c12dd95949 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-07-09  Pádraig Brady <P@draigBrady.com>
+
+       Fix the automatic number width formatting in seq.
+       * src/seq.c: Fix the -w logic. Ignore spaces and '+'
+       characters of input numbers when determining width.
+       Set format correctly for input numbers in scientific notation.
+       * tests/seq/basic: Add various number width tests.
+       Details: <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/10903>
+
 2007-07-08  Jim Meyering  <jim@meyering.net>
 
        Run the coreutils-specific code only if tests/Makefile.am.in exists.
index d5d5c53a84b8db57310033acaab1939ae9ddebce..329f3a483e8606107a9fed0c28d0705a14db352e 100644 (file)
--- a/src/seq.c
+++ b/src/seq.c
@@ -135,23 +135,35 @@ scan_arg (const char *arg)
       usage (EXIT_FAILURE);
     }
 
+  /* We don't output spaces or '+' so don't include in width */
+  while (isspace (*arg) || *arg == '+')
+    arg++;
+
   ret.width = strlen (arg);
   ret.precision = INT_MAX;
 
-  if (! arg[strcspn (arg, "eExX")] && isfinite (ret.value))
+  if (! arg[strcspn (arg, "xX")] && isfinite (ret.value))
     {
       char const *decimal_point = strchr (arg, '.');
       if (! decimal_point)
        ret.precision = 0;
       else
        {
-         size_t fraction_len = strlen (decimal_point + 1);
+         size_t fraction_len = strcspn (decimal_point + 1, "eE");
          if (fraction_len <= INT_MAX)
            ret.precision = fraction_len;
-         ret.width += (fraction_len == 0
+         ret.width += (fraction_len == 0                      /* #.  -> #   */
                        ? -1
-                       : (decimal_point == arg
-                          || ! ISDIGIT (decimal_point[-1])));
+                       : (decimal_point == arg                /* .#  -> 0.# */
+                          || ! ISDIGIT (decimal_point[-1]))); /* -.# -> 0.# */
+       }
+      char const *e = strchr (arg, 'e');
+      if (! e)
+       e = strchr (arg, 'E');
+      if (e)
+       {
+         long exponent = strtol (e + 1, NULL, 10);
+         ret.precision += exponent < 0 ? -exponent : 0;
        }
     }
 
@@ -275,18 +287,18 @@ get_default_format (operand first, operand step, operand last)
     {
       if (equal_width)
        {
+         /* increase first_width by any increased precision in step */
          size_t first_width = first.width + (prec - first.precision);
+         /* adjust last_width to use precision from first/step */
          size_t last_width = last.width + (prec - last.precision);
-         if (first.width <= first_width
-             && (last.width < last_width) == (prec < last.precision))
+         if (last.precision && prec == 0)
+           last_width--;  /* don't include space for '.' */
+         size_t width = MAX (first_width, last_width);
+         if (width <= INT_MAX)
            {
-             size_t width = MAX (first_width, last_width);
-             if (width <= INT_MAX)
-               {
-                 int w = width;
-                 sprintf (format_buf, "%%0%d.%dLf", w, prec);
-                 return format_buf;
-               }
+             int w = width;
+             sprintf (format_buf, "%%0%d.%dLf", w, prec);
+             return format_buf;
            }
        }
       else
index a710e19d34c50f8e57b5cd2ab2ab29a223925174..6a277ba75e34f92afd033baa5763247f03880224 100755 (executable)
@@ -56,12 +56,18 @@ my @Tests =
    ['float-5', qw(0.8 1e-1 0.9),       {OUT => [qw(0.8 0.9)]}],
    ['float-6', qw(0.8 0.1 0.90000000000000000000),     {OUT => [qw(0.8 0.9)]}],
 
-   ['eq-wid-1',        qw(-w 1 -1 -1), {OUT => [qw(01 00 -1)]}],
+   ['wid-1',   qw(.8 1e-2 .81),  {OUT => [qw(0.80 0.81)]}],
+   ['wid-2',   qw(.89999 1e-7 .8999901),  {OUT => [qw(0.8999900 0.8999901)]}],
 
+   ['eq-wid-1',        qw(-w 1 -1 -1), {OUT => [qw(01 00 -1)]}],
    # Prior to 2.0g, this test would fail on e.g., HPUX systems
    # because it'd end up using %3.1f as the format instead of %4.1f.
-   # ['eq-wid-2',      qw(-w -.1 .1 .11),{OUT => [qw(-0.1 00.0 00.1)]}],
-   # ['eq-wid-3',      qw(-w 1 3.0),  {OUT => [qw(1 2 3)]}],
+   ['eq-wid-2',        qw(-w -.1 .1 .11),{OUT => [qw(-0.1 00.0 00.1)]}],
+   ['eq-wid-3',        qw(-w 1 3.0),  {OUT => [qw(1 2 3)]}],
+   ['eq-wid-4',        qw(-w .8 1e-2 .81),  {OUT => [qw(0.80 0.81)]}],
+   ['eq-wid-5',        qw(-w 1 .5 2),  {OUT => [qw(1.0 1.5 2.0)]}],
+   ['eq-wid-6',        qw(-w +1 2),  {OUT => [qw(1 2)]}],
+   ['eq-wid-7',        qw(-w "    .1"  "    .1"),  {OUT => [qw(0.1)]}],
 
    # Prior to coreutils-4.5.11, some of these were not accepted.
    ['fmt-1',   qw(-f %2.1f 1.5 .5 2),{OUT => [qw(1.5 2.0)]}],