mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-09 21:53:55 +02:00
seq: output decimal points consistently with invalid locales
* src/seq.c (print_numbers): Only reset the locale if it was successfully set originally. * tests/misc/seq-locale.sh: Add a new test. * tests/local.mk: Reference the new test. * NEWS: Mention the fix.
This commit is contained in:
4
NEWS
4
NEWS
@@ -14,6 +14,10 @@ GNU coreutils NEWS -*- outline -*-
|
||||
df no longer corrupts displayed multibyte characters on macOS.
|
||||
[bug introduced with coreutils-8.18]
|
||||
|
||||
seq no longer outputs inconsistent decimal point characters
|
||||
for the last number, when locales are misconfigured.
|
||||
[bug introduced in coreutils-7.0]
|
||||
|
||||
shred, sort, and split no longer falsely report ftruncate errors
|
||||
when outputting to less-common file types. For example, the shell
|
||||
command 'sort /dev/null -o /dev/stdout | cat' no longer fails with
|
||||
|
||||
11
src/seq.c
11
src/seq.c
@@ -42,6 +42,9 @@
|
||||
|
||||
#define AUTHORS proper_name ("Ulrich Drepper")
|
||||
|
||||
/* True if the locale settings were honored. */
|
||||
static bool locale_ok;
|
||||
|
||||
/* If true print all number with equal width. */
|
||||
static bool equal_width;
|
||||
|
||||
@@ -324,9 +327,11 @@ print_numbers (char const *fmt, struct layout layout,
|
||||
long double x_val;
|
||||
char *x_str;
|
||||
int x_strlen;
|
||||
setlocale (LC_NUMERIC, "C");
|
||||
if (locale_ok)
|
||||
setlocale (LC_NUMERIC, "C");
|
||||
x_strlen = asprintf (&x_str, fmt, x);
|
||||
setlocale (LC_NUMERIC, "");
|
||||
if (locale_ok)
|
||||
setlocale (LC_NUMERIC, "");
|
||||
if (x_strlen < 0)
|
||||
xalloc_die ();
|
||||
x_str[x_strlen - layout.suffix_len] = '\0';
|
||||
@@ -559,7 +564,7 @@ main (int argc, char **argv)
|
||||
|
||||
initialize_main (&argc, &argv);
|
||||
set_program_name (argv[0]);
|
||||
setlocale (LC_ALL, "");
|
||||
locale_ok = !!setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
|
||||
@@ -244,6 +244,7 @@ all_tests = \
|
||||
tests/misc/seq.pl \
|
||||
tests/misc/seq-epipe.sh \
|
||||
tests/misc/seq-io-errors.sh \
|
||||
tests/misc/seq-locale.sh \
|
||||
tests/misc/seq-long-double.sh \
|
||||
tests/misc/seq-precision.sh \
|
||||
tests/misc/head.pl \
|
||||
|
||||
28
tests/misc/seq-locale.sh
Executable file
28
tests/misc/seq-locale.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
# Test for output with appropriate precision
|
||||
|
||||
# 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
||||
print_ver_ seq
|
||||
|
||||
# With coreutils-8.30 and earlier, the last decimal point would be ','
|
||||
# when setlocale(LC_ALL, "") failed, but setlocale(LC_NUMERIC, "") succeeded.
|
||||
LC_ALL= LANG=invalid LC_NUMERIC=$LOCALE_FR_UTF8 seq 0.1 0.2 0.7 > out || fail=1
|
||||
uniq -w2 out > out-merge || framework_failure_
|
||||
test "$(wc -l < out-merge)" = 1 || { fail=1; cat out; }
|
||||
|
||||
Exit $fail
|
||||
Reference in New Issue
Block a user