1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-02-17 12:52:16 +02:00

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.
This commit is contained in:
Pádraig Brady
2012-12-19 19:27:10 +00:00
parent 0568f72d2a
commit 76f606a954
4 changed files with 23 additions and 7 deletions

4
NEWS
View File

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

View File

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

View File

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

View File

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