>From 52505fe73fb00a30435009895d03fa3bba1297a4 Mon Sep 17 00:00:00 2001 From: Assaf Gordon Date: Thu, 1 Aug 2019 17:01:21 -0600 Subject: [PATCH] seq: fix superfluous output line Under certain circumstances seq prints an extra line when the output format has custom format with characters following the printed numbers: $ seq -f "%g " 1000000 1000000 1e+06 1e+06 This is due to the "print_extra_number" logic using strings to determine whether a 'extra number' is needed, but only one string was trimmed when using a custom printf format. Prompted by https://lists.gnu.org/r/coreutils/2019-08/msg00001.html * NEWS: Mention fix. * src/seq.c (print_numbers): Trim the 'x0_str' string before comparing it to the previous 'x_str' string. * tests/misc/seq-extra-number.sh: Add this scenario. * tests/local.mk (all_tests): Add new test. --- NEWS | 4 +++ src/seq.c | 4 ++- tests/local.mk | 1 + tests/misc/seq-extra-number.sh | 47 ++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100755 tests/misc/seq-extra-number.sh 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..4295e1791 --- /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 -- 2.20.1