diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/seq.c | 5 | ||||
-rwxr-xr-x | tests/misc/seq.pl | 11 |
3 files changed, 16 insertions, 3 deletions
@@ -57,7 +57,8 @@ GNU coreutils NEWS -*- outline -*- seq -s no longer prints an erroneous newline after the first number, and outputs a newline after the last number rather than a trailing separator. - [bug introduced in coreutils-8.20] + Also seq no longer ignores a specified step value when the end value is 1. + [bugs introduced in coreutils-8.20] ** Changes in behavior @@ -565,11 +565,12 @@ main (int argc, char **argv) then use the much more efficient integer-only code. */ if (all_digits_p (argv[optind]) && (n_args == 1 || all_digits_p (argv[optind + 1])) - && (n_args < 3 || STREQ ("1", argv[optind + 2])) + && (n_args < 3 || (STREQ ("1", argv[optind + 1]) + && all_digits_p (argv[optind + 2]))) && !equal_width && !format_str && strlen (separator) == 1) { char const *s1 = n_args == 1 ? "1" : argv[optind]; - char const *s2 = n_args == 1 ? argv[optind] : argv[optind + 1]; + char const *s2 = argv[optind + (n_args - 1)]; if (seq_fast (s1, s2)) exit (EXIT_SUCCESS); diff --git a/tests/misc/seq.pl b/tests/misc/seq.pl index 64c62b2bc..b3496d62c 100755 --- a/tests/misc/seq.pl +++ b/tests/misc/seq.pl @@ -137,6 +137,17 @@ my @Tests = ['sep-1', qw(-s, 1 3), {OUT => [qw(1,2,3)]}], ['sep-2', qw(-s, 1 1), {OUT => [qw(1)]}], ['sep-3', qw(-s,, 1 3), {OUT => [qw(1,,2,,3)]}], + + # Exercise fast path avoidance logic. + # In 8.20 a step value != 1, with positive integer start and end was broken + ['not-fast-1', qw(1 3 1), {OUT => [qw(1)]}], + ['not-fast-2', qw(1 1 4.2), {OUT => [qw(1 2 3 4)]}], + ['not-fast-3', qw(1 1 0)], + + # Ensure the correct parameters are passed to the fast path + ['fast-1', qw(4), {OUT => [qw(1 2 3 4)]}], + ['fast-2', qw(1 4), {OUT => [qw(1 2 3 4)]}], + ['fast-3', qw(1 1 4), {OUT => [qw(1 2 3 4)]}], ); # Append a newline to each entry in the OUT array. |