shuf: honor --zero-terminated option even with --input-range=LO-HI
authorJim Meyering <meyering@redhat.com>
Sun, 27 Jul 2008 13:14:37 +0000 (15:14 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 27 Jul 2008 13:25:27 +0000 (15:25 +0200)
* 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.

NEWS
src/shuf.c
tests/misc/shuf

diff --git a/NEWS b/NEWS
index 8753fcf..3be1ad4 100644 (file)
--- 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
index ca5345b..5e07d6e 100644 (file)
@@ -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
index 9710949..83530c2 100755 (executable)
@@ -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