diff options
author | Pádraig Brady <P@draigBrady.com> | 2015-06-23 22:48:25 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2015-06-24 17:03:59 +0100 |
commit | 60c8e31d9201f10295cfdcfd2d15893f9682083b (patch) | |
tree | e3120ba36f30b691cfab27af0790b38c3882d9be | |
parent | fc6825b231b43c12738fb65a9309cdecb67f6833 (diff) | |
download | coreutils-60c8e31d9201f10295cfdcfd2d15893f9682083b.tar.xz |
seq: use consistent output format with hex integers
* src/seq.c (scan_arg): Set precision to 0 for hex constants
(while avoiding hex floats). This will use then use the
fast path for these arguments. Note we also set the precision
of inf to 0 here, which ensures we use consistent precision
on output where possible.
* tests/misc/seq-precision.sh: Add corresponding test cases.
-rw-r--r-- | src/seq.c | 17 | ||||
-rwxr-xr-x | tests/misc/seq-precision.sh | 26 |
2 files changed, 35 insertions, 8 deletions
@@ -147,15 +147,18 @@ scan_arg (const char *arg) while (isspace (to_uchar (*arg)) || *arg == '+') arg++; - ret.width = strlen (arg); + ret.width = 0; ret.precision = INT_MAX; + char const *decimal_point = strchr (arg, '.'); + if (! decimal_point && ! strchr (arg, 'p') /* not a hex float */) + ret.precision = 0; + if (! arg[strcspn (arg, "xX")] && isfinite (ret.value)) { - char const *decimal_point = strchr (arg, '.'); - if (! decimal_point) - ret.precision = 0; - else + ret.width = strlen (arg); + + if (decimal_point) { size_t fraction_len = strcspn (decimal_point + 1, "eE"); if (fraction_len <= INT_MAX) @@ -625,8 +628,8 @@ main (int argc, char **argv) } } - if (first.precision == 0 && step.precision == 0 - && (! isfinite (last.value) || last.precision == 0) + if ((isfinite (first.value) && first.precision == 0) + && step.precision == 0 && last.precision == 0 && 0 <= first.value && step.value == 1 && 0 <= last.value && !equal_width && !format_str && strlen (separator) == 1) { diff --git a/tests/misc/seq-precision.sh b/tests/misc/seq-precision.sh index 9ba601446..e6a2bd7b8 100755 --- a/tests/misc/seq-precision.sh +++ b/tests/misc/seq-precision.sh @@ -19,7 +19,8 @@ . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src print_ver_ seq -# Integer only. Before v8.24 this would switch output format +# Integer only. Before v8.24 these would switch output format + seq 999999 inf | head -n2 > out || fail=1 printf "%s\n" 999999 1000000 > exp || framework_failure_ compare exp out || fail=1 @@ -34,4 +35,27 @@ for i in $(seq 100); do compare exp out || fail=1 done +seq 0xF423F 0xF4240 > out || fail=1 +printf "%s\n" 999999 1000000 > exp || framework_failure_ +compare exp out || fail=1 + +# Ensure consistent precision for inf +seq 1 .1 inf | head -n2 > out || fail=1 +printf "%s\n" 1.0 1.1 > exp || framework_failure_ +compare exp out || fail=1 + +# Ensure standard output methods with inf start +seq inf inf | head -n2 | uniq > out || fail=1 +test "$(wc -l < out)" = 1 || fail=1 + +# Ensure auto precision for hex float +seq 1 0x1p-1 2 > out || fail=1 +printf "%s\n" 1 1.5 2 > exp || framework_failure_ +compare exp out || fail=1 + +# Ensure consistent precision for hex +seq 1 .1 0x2 | head -n2 > out || fail=1 +printf "%s\n" 1.0 1.1 > exp || framework_failure_ +compare exp out || fail=1 + Exit $fail |