diff --git a/NEWS b/NEWS index fd0543351..97c9d18bd 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,10 @@ GNU coreutils NEWS -*- outline -*- for --numeric, --hex, or default alphabetic suffixes respectively. [bug introduced in coreutils-8.24] + seq no longer prints an extra line under certain circumstances (such as + 'seq -f "%g " 1000000 1000000'). + [bug introduced in coreutils-6.10] + ** New Features od --skip-bytes now can use lseek even if the input is not a regular diff --git a/src/seq.c b/src/seq.c index b5913368a..8efe929e1 100644 --- a/src/seq.c +++ b/src/seq.c @@ -340,8 +340,10 @@ print_numbers (char const *fmt, struct layout layout, && x_val == last) { char *x0_str = NULL; - if (asprintf (&x0_str, fmt, x0) < 0) + int x0_strlen = asprintf (&x0_str, fmt, x0); + if (x0_strlen < 0) xalloc_die (); + x0_str[x0_strlen - layout.suffix_len] = '\0'; print_extra_number = !STREQ (x0_str, x_str); free (x0_str); } diff --git a/tests/local.mk b/tests/local.mk index e88d99f24..3e347cd96 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -245,6 +245,7 @@ all_tests = \ tests/misc/test.pl \ tests/misc/seq.pl \ tests/misc/seq-epipe.sh \ + tests/misc/seq-extra-number.sh \ tests/misc/seq-io-errors.sh \ tests/misc/seq-locale.sh \ tests/misc/seq-long-double.sh \ diff --git a/tests/misc/seq-extra-number.sh b/tests/misc/seq-extra-number.sh new file mode 100755 index 000000000..cb59a1ab2 --- /dev/null +++ b/tests/misc/seq-extra-number.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# Test the "print_extra_number" logic seq.c:print_numbers() + +# Copyright (C) 2019 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ seq + +## +## Test 1: the documented reason for the logic +## +cat<<'EOF'>exp1 || framework_failure_ +0.000000 +0.000001 +0.000002 +0.000003 +EOF + +seq 0 0.000001 0.000003 > out1 || fail=1 +compare exp1 out1 || fail=1 + + +## +## Test 2: before 8.32, this resulted in TWO lines +## (print_extra_number was erroneously set to true) +## The '=' is there instead of a space to ease visual inspection. +cat<<'EOF'>exp2 || framework_failure_ +1e+06= +EOF + +seq -f "%g=" 1000000 1000000 > out2 || fail=1 +compare exp2 out2 || fail=1 + +Exit $fail