1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-04-12 15:06:44 +02:00

seq: handle exponents more consistently

src/seq.c (scan_arg): Set precision and width _after_ exponentiation.
For example, this will make '1.1e1 12' and '11 1.2e1' equivalent.
One can still set the precision by specifying extra precision on
the start value, or more naturally with a precision on a step value.
* tests/misc/seq-precision.sh: Add new cases.
This commit is contained in:
Pádraig Brady
2015-06-23 22:51:24 +01:00
parent 60c8e31d92
commit 32c97093db
2 changed files with 31 additions and 2 deletions

View File

@@ -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;
}
}

View File

@@ -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