summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-07-27 15:14:37 +0200
committerJim Meyering <meyering@redhat.com>2008-07-27 15:25:27 +0200
commitbee58d8a0400b0303c6dce3873fdf3482de0c110 (patch)
treedbef2d9ac7afe3398a2d2ca070bc891c368a82a4
parente535754fdbe701e70f3ac9834b643a9272dc1d98 (diff)
downloadcoreutils-bee58d8a0400b0303c6dce3873fdf3482de0c110.tar.xz
shuf: honor --zero-terminated option even with --input-range=LO-HI
* src/shuf.c (write_permuted_output): Add EOLBYTE parameter and use it rather than hard-coding "\n". (main): Adjust sole caller. * tests/misc/shuf: Add a test to exercise this bug fix. * NEWS: Mention it.
-rw-r--r--NEWS2
-rw-r--r--src/shuf.c7
-rwxr-xr-xtests/misc/shuf5
3 files changed, 11 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 8753fcfc6..3be1ad467 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,8 @@ GNU coreutils NEWS -*- outline -*-
md5sum now accepts the new option, --quiet, to suppress the printing of
'OK' messages. sha1sum, sha224sum, sha384sum, and sha512sum accept it, too.
+ shuf honors the --zero-terminated (-z) option, even with --input-range=LO-HI
+
sort accepts a new option, --files0-from=F, that specifies a file
containing a null-separated list of files to sort. This list is used
instead of filenames passed on the command-line to avoid problems with
diff --git a/src/shuf.c b/src/shuf.c
index ca5345b4b..5e07d6e49 100644
--- a/src/shuf.c
+++ b/src/shuf.c
@@ -214,7 +214,7 @@ read_input (FILE *in, char eolbyte, char ***pline)
static int
write_permuted_output (size_t n_lines, char * const *line, size_t lo_input,
- size_t const *permutation)
+ size_t const *permutation, char eolbyte)
{
size_t i;
@@ -230,7 +230,7 @@ write_permuted_output (size_t n_lines, char * const *line, size_t lo_input,
for (i = 0; i < n_lines; i++)
{
unsigned long int n = lo_input + permutation[i];
- if (printf ("%lu\n", n) < 0)
+ if (printf ("%lu%c", n, eolbyte) < 0)
return -1;
}
@@ -400,7 +400,8 @@ main (int argc, char **argv)
if (outfile && ! freopen (outfile, "w", stdout))
error (EXIT_FAILURE, errno, "%s", quotearg_colon (outfile));
- if (write_permuted_output (head_lines, line, lo_input, permutation) != 0)
+ if (write_permuted_output (head_lines, line, lo_input, permutation, eolbyte)
+ != 0)
error (EXIT_FAILURE, errno, _("write error"));
#ifdef lint
diff --git a/tests/misc/shuf b/tests/misc/shuf
index 97109498f..83530c207 100755
--- a/tests/misc/shuf
+++ b/tests/misc/shuf
@@ -51,4 +51,9 @@ test "$t" = 'a b c d e' || { fail=1; echo "not a permutation" 1>&2; }
# "seq 1860" produces 8193 (8K + 1) bytes of output.
seq 1860 | shuf > /dev/null || fail=1
+# coreutils-6.12 and earlier would output a newline terminator, not \0.
+shuf --zero-terminated -i 1-1 > out || fail=1
+printf '1\0' > exp || framework_failure
+cmp out exp || { fail=1; echo "missing NUL terminator?" 1>&2; }
+
(exit $fail); exit $fail