diff options
author | Pádraig Brady <P@draigBrady.com> | 2012-12-19 19:27:10 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2012-12-21 15:55:19 +0000 |
commit | 76f606a9544bd67629bd4766ff6efe8bf42b20d9 (patch) | |
tree | be7a7617d93624af2e88a9c8aca32ea3dfea17bd | |
parent | 0568f72d2a09b247176b9ad162e41e3a475a1d53 (diff) | |
download | coreutils-76f606a9544bd67629bd4766ff6efe8bf42b20d9.tar.xz |
seq: fix newline output when -s specified
This regression was introduced in commit v8.19-132-g3786fb6.
* src/seq.c (seq_fast): Don't use puts() to output the first number,
and instead insert it into the buffer as for other numbers.
Also output the terminator unconditionally.
* tests/misc/seq.pl: Add some basic tests for the -s option.
* NEWS: Mention the fix.
* THANKS.in: Reported by Philipp Gortan.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | THANKS.in | 1 | ||||
-rw-r--r-- | src/seq.c | 20 | ||||
-rwxr-xr-x | tests/misc/seq.pl | 5 |
4 files changed, 23 insertions, 7 deletions
@@ -43,6 +43,10 @@ GNU coreutils NEWS -*- outline -*- the output numbers are properly aligned and of the correct width. [This bug was present in "the beginning".] + seq -s now doesn't output 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] + ** Changes in behavior df --total now prints '-' into the target column (mount point) of the @@ -505,6 +505,7 @@ Phil Richards phil.richards@vf.vodafone.co.uk Philippe De Muyter phdm@macqel.be Philippe Schnoebelen Philippe.Schnoebelen@imag.fr Phillip Jones mouse@datastacks.com +Philipp Gortan gortan@gmail.com Philipp Thomas pth@suse.de Piergiorgio Sartor sartor@sony.de Pieter Bowman bowman@math.utah.edu @@ -419,30 +419,36 @@ seq_fast (char const *a, char const *b) bool ok = cmp (p, p_len, q, q_len) <= 0; if (ok) { - /* Buffer at least this many output lines per fwrite call. + /* Buffer at least this many numbers per fwrite call. This gives a speed-up of more than 2x over the unbuffered code when printing the first 10^9 integers. */ enum {N = 40}; char *buf = xmalloc (N * (n + 1)); char const *buf_end = buf + N * (n + 1); - puts (p); char *z = buf; + + /* Write first number to buffer. */ + z = mempcpy (z, p, p_len); + + /* Append separator then number. */ while (cmp (p, p_len, q, q_len) < 0) { + *z++ = *separator; incr (&p, &p_len); z = mempcpy (z, p, p_len); - *z++ = *separator; - if (buf_end - n - 1 < z) + /* If no place for another separator + number then + output buffer so far, and reset to start of buffer. */ + if (buf_end - (n + 1) < z) { fwrite (buf, z - buf, 1, stdout); z = buf; } } - /* Write any remaining, buffered output. */ - if (buf < z) - fwrite (buf, z - buf, 1, stdout); + /* Write any remaining buffered output, and the terminator. */ + *z++ = *terminator; + fwrite (buf, z - buf, 1, stdout); IF_LINT (free (buf)); } diff --git a/tests/misc/seq.pl b/tests/misc/seq.pl index 447baa4b3..416b839b6 100755 --- a/tests/misc/seq.pl +++ b/tests/misc/seq.pl @@ -128,6 +128,11 @@ my @Tests = ['long-leading-zeros2', qw(000 02), {OUT => [qw(0 1 2)]}], ['long-leading-zeros3', qw(00 02), {OUT => [qw(0 1 2)]}], ['long-leading-zeros4', qw(0 02), {OUT => [qw(0 1 2)]}], + + # Exercise the -s option, which was broken in 8.20 + ['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)]}], ); # Append a newline to each entry in the OUT array. |