summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/seq.c15
-rwxr-xr-xtests/misc/seq-precision.sh18
2 files changed, 31 insertions, 2 deletions
diff --git a/src/seq.c b/src/seq.c
index 95e6cd639..2426c4de3 100644
--- a/src/seq.c
+++ b/src/seq.c
@@ -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