diff options
-rw-r--r-- | src/seq.c | 15 | ||||
-rwxr-xr-x | tests/misc/seq-precision.sh | 18 |
2 files changed, 31 insertions, 2 deletions
@@ -147,20 +147,24 @@ scan_arg (const char *arg) while (isspace (to_uchar (*arg)) || *arg == '+') arg++; + /* Default to auto width and precision. */ ret.width = 0; ret.precision = INT_MAX; + /* Use no precision (and possibly fast generation) for integers. */ char const *decimal_point = strchr (arg, '.'); if (! decimal_point && ! strchr (arg, 'p') /* not a hex float */) ret.precision = 0; + /* auto set width and precision for decimal inputs. */ if (! arg[strcspn (arg, "xX")] && isfinite (ret.value)) { + size_t fraction_len = 0; ret.width = strlen (arg); if (decimal_point) { - size_t fraction_len = strcspn (decimal_point + 1, "eE"); + fraction_len = strcspn (decimal_point + 1, "eE"); if (fraction_len <= INT_MAX) ret.precision = fraction_len; ret.width += (fraction_len == 0 /* #. -> # */ @@ -174,7 +178,8 @@ scan_arg (const char *arg) if (e) { long exponent = strtol (e + 1, NULL, 10); - ret.precision += exponent < 0 ? -exponent : 0; + ret.precision += exponent < 0 ? -exponent + : - MIN (ret.precision, exponent); /* Don't account for e.... in the width since this is not output. */ ret.width -= strlen (arg) - (e - arg); /* Adjust the width as per the exponent. */ @@ -189,6 +194,12 @@ scan_arg (const char *arg) ret.width++; exponent = -exponent; } + else + { + if (decimal_point && ret.precision == 0 && fraction_len) + ret.width--; /* discount space for '.' */ + exponent -= MIN (fraction_len, exponent); + } ret.width += exponent; } } diff --git a/tests/misc/seq-precision.sh b/tests/misc/seq-precision.sh index e6a2bd7b8..b8382ca19 100755 --- a/tests/misc/seq-precision.sh +++ b/tests/misc/seq-precision.sh @@ -58,4 +58,22 @@ seq 1 .1 0x2 | head -n2 > out || fail=1 printf "%s\n" 1.0 1.1 > exp || framework_failure_ compare exp out || fail=1 +# Ensure consistent handling of precision/width for exponents + +seq 1.1e1 12 > out || fail=1 +printf "%s\n" 11 12 > exp || framework_failure_ +compare exp out || fail=1 + +seq 11 1.2e1 > out || fail=1 +printf "%s\n" 11 12 > exp || framework_failure_ +compare exp out || fail=1 + +seq -w 1.1e4 | head -n1 > out || fail=1 +printf "%s\n" 00001 > exp || framework_failure_ +compare exp out || fail=1 + +seq -w 1.10000e5 1.10000e5 > out || fail=1 +printf "%s\n" 110000 > exp || framework_failure_ +compare exp out || fail=1 + Exit $fail |