summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBo Borgerson <gigabo@gmail.com>2008-04-22 23:47:42 -0400
committerJim Meyering <meyering@redhat.com>2008-06-12 21:03:05 +0200
commit81d0c8f367c89a52e41bbd89e7c45d2b1ac495f2 (patch)
treeea8d5e7931701cce737d522cb0c662a6801eb033 /src
parent98a96822d9dac92de719fa340fe326e1fe0427fe (diff)
downloadcoreutils-81d0c8f367c89a52e41bbd89e7c45d2b1ac495f2.tar.gz
comm: accept new option: --output-delimiter=STR
* src/comm.c (delimiter): New global. (writeline): Use delimiter string instead of single TAB character. (main): Initialize delimiter. * tests/misc/comm: Add tests for comm output delimiter specification. * doc/coreutils.texi: Document new option. * NEWS: Advertise new option. * TODO: Remove associated item.
Diffstat (limited to 'src')
-rw-r--r--src/comm.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/comm.c b/src/comm.c
index 01c0b8c61..9742fb371 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -65,10 +65,18 @@ static enum
CHECK_ORDER_DISABLED
} check_input_order;
+/* Output columns will be delimited with this string, which may be set
+ on the command-line with --output-delimiter=STR. The default is a
+ single TAB character. */
+static char const *delimiter;
+
+/* For long options that have no equivalent short option, use a
+ non-character as a pseudo short option, starting with CHAR_MAX + 1. */
enum
{
CHECK_ORDER_OPTION = CHAR_MAX + 1,
- NOCHECK_ORDER_OPTION
+ NOCHECK_ORDER_OPTION,
+ OUTPUT_DELIMITER_OPTION
};
@@ -76,6 +84,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},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{NULL, 0, NULL, 0}
@@ -116,6 +125,9 @@ and column three contains lines common to both files.\n\
if all input lines are pairable\n\
--nocheck-order do not check that the input is correctly sorted\n\
"), stdout);
+ fputs (_("\
+ --output-delimiter=STR separate columns with STR\n\
+"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
emit_bug_reporting_address ();
@@ -141,20 +153,20 @@ writeline (const struct linebuffer *line, FILE *stream, int class)
case 2:
if (!only_file_2)
return;
- /* Print a TAB if we are printing lines from file 1. */
+ /* Print a delimiter if we are printing lines from file 1. */
if (only_file_1)
- putc ('\t', stream);
+ fputs (delimiter, stream);
break;
case 3:
if (!both)
return;
- /* Print a TAB if we are printing lines from file 1. */
+ /* Print a delimiter if we are printing lines from file 1. */
if (only_file_1)
- putc ('\t', stream);
- /* Print a TAB if we are printing lines from file 2. */
+ fputs (delimiter, stream);
+ /* Print a delimiter if we are printing lines from file 2. */
if (only_file_2)
- putc ('\t', stream);
+ fputs (delimiter, stream);
break;
}
@@ -379,6 +391,17 @@ main (int argc, char **argv)
check_input_order = CHECK_ORDER_ENABLED;
break;
+ case OUTPUT_DELIMITER_OPTION:
+ if (delimiter && !STREQ (delimiter, optarg))
+ error (EXIT_FAILURE, 0, _("multiple delimiters specified"));
+ delimiter = optarg;
+ if (!*delimiter)
+ {
+ error (EXIT_FAILURE, 0, _("empty %s not allowed"),
+ quote ("--output-delimiter"));
+ }
+ break;
+
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
@@ -402,6 +425,10 @@ main (int argc, char **argv)
usage (EXIT_FAILURE);
}
+ /* The default delimiter is a TAB. */
+ if (!delimiter)
+ delimiter = "\t";
+
compare_files (argv + optind);
if (issued_disorder_warning[0] || issued_disorder_warning[1])