From: Pádraig Brady Date: Fri, 8 Jan 2016 15:14:01 +0000 (+0000) Subject: comm: add the -z,--zero-terminated option X-Git-Tag: v8.25~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3b4def577c4eee22f83b72d1310aa1d9155908d;p=thirdparty%2Fcoreutils.git comm: add the -z,--zero-terminated option * doc/coreutils.texi (comm invocation): Reference option description. * src/comm.c (main): Use readlinebuffer_delim() to support a parameterized delimiter. * tests/misc/comm.pl: Add test cases. * NEWS: Mention the new feature. --- diff --git a/NEWS b/NEWS index 408872b7e7..27789f761c 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 09020275cb..157ce0e12e 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 89cee88fca..e66ac81ef2 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} @@ -130,6 +134,9 @@ and column three contains lines common to both files.\n\ "), stdout); 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); @@ -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 52d14ba5a0..3232d6339a 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"} ],