summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--doc/coreutils.texi2
-rw-r--r--src/comm.c19
-rwxr-xr-xtests/misc/comm.pl3
4 files changed, 22 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 408872b7e..27789f761 100644
--- a/NEWS
+++ b/NEWS
@@ -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"} ],