diff options
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | doc/coreutils.texi | 2 | ||||
-rw-r--r-- | src/comm.c | 19 | ||||
-rwxr-xr-x | tests/misc/comm.pl | 3 |
4 files changed, 22 insertions, 4 deletions
@@ -33,7 +33,7 @@ GNU coreutils NEWS -*- outline -*- ** New features - cut, head, tail now have the -z,--zero-terminated option, and + comm, cut, head, tail now have the -z,--zero-terminated option, and tac --separator accepts an empty argument, to work with NUL delimited items. dd now summarizes sizes in --human-readable format too, not just --si. diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 09020275c..157ce0e12 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -5130,6 +5130,8 @@ rather than the default of a single TAB character. The delimiter @var{str} may not be empty. +@optZeroTerminated + @end table @node ptx invocation diff --git a/src/comm.c b/src/comm.c index 89cee88fc..e66ac81ef 100644 --- a/src/comm.c +++ b/src/comm.c @@ -59,6 +59,9 @@ static bool seen_unpairable; /* If nonzero, we have warned about disorder in that file. */ static bool issued_disorder_warning[2]; +/* line delimiter. */ +static unsigned char delim = '\n'; + /* If nonzero, check that the input is correctly ordered. */ static enum { @@ -86,6 +89,7 @@ static struct option const long_options[] = {"check-order", no_argument, NULL, CHECK_ORDER_OPTION}, {"nocheck-order", no_argument, NULL, NOCHECK_ORDER_OPTION}, {"output-delimiter", required_argument, NULL, OUTPUT_DELIMITER_OPTION}, + {"zero-terminated", no_argument, NULL, 'z'}, {GETOPT_HELP_OPTION_DECL}, {GETOPT_VERSION_OPTION_DECL}, {NULL, 0, NULL, 0} @@ -131,6 +135,9 @@ and column three contains lines common to both files.\n\ fputs (_("\ --output-delimiter=STR separate columns with STR\n\ "), stdout); + fputs (_("\ + -z, --zero-terminated line delimiter is NUL, not newline\n\ +"), stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); fputs (_("\ @@ -277,7 +284,8 @@ compare_files (char **infiles) fadvise (streams[i], FADVISE_SEQUENTIAL); - thisline[i] = readlinebuffer (all_line[i][alt[i][0]], streams[i]); + thisline[i] = readlinebuffer_delim (all_line[i][alt[i][0]], streams[i], + delim); if (ferror (streams[i])) error (EXIT_FAILURE, errno, "%s", quotef (infiles[i])); } @@ -336,7 +344,8 @@ compare_files (char **infiles) alt[i][1] = alt[i][0]; alt[i][0] = (alt[i][0] + 1) & 0x03; - thisline[i] = readlinebuffer (all_line[i][alt[i][0]], streams[i]); + thisline[i] = readlinebuffer_delim (all_line[i][alt[i][0]], + streams[i], delim); if (thisline[i]) check_order (all_line[i][alt[i][1]], thisline[i], i + 1); @@ -382,7 +391,7 @@ main (int argc, char **argv) issued_disorder_warning[0] = issued_disorder_warning[1] = false; check_input_order = CHECK_ORDER_DEFAULT; - while ((c = getopt_long (argc, argv, "123", long_options, NULL)) != -1) + while ((c = getopt_long (argc, argv, "123z", long_options, NULL)) != -1) switch (c) { case '1': @@ -397,6 +406,10 @@ main (int argc, char **argv) both = false; break; + case 'z': + delim = '\0'; + break; + case NOCHECK_ORDER_OPTION: check_input_order = CHECK_ORDER_DISABLED; break; diff --git a/tests/misc/comm.pl b/tests/misc/comm.pl index 52d14ba5a..3232d6339 100755 --- a/tests/misc/comm.pl +++ b/tests/misc/comm.pl @@ -28,14 +28,17 @@ my $prog = 'comm'; @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; my @inputs = ({IN=>{a=>"1\n3"}}, {IN=>{b=>"2\n3"}}); +my @zinputs = ({IN=>{za=>"1\0003"}}, {IN=>{zb=>"2\0003"}}); my @Tests = ( # basic operation ['basic', @inputs, {OUT=>"1\n\t2\n\t\t3\n"} ], + ['zbasic', '-z', @zinputs, {OUT=>"1\0\t2\0\t\t3\0"} ], # suppress lines unique to file 1 ['opt-1', '-1', @inputs, {OUT=>"2\n\t3\n"} ], + ['zopt-1', '-z', '-1', @zinputs, {OUT=>"2\0\t3\0"} ], # suppress lines unique to file 2 ['opt-2', '-2', @inputs, {OUT=>"1\n\t3\n"} ], |