summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2017-05-30 16:55:15 +0000
committeremaste <emaste@FreeBSD.org>2017-05-30 16:55:15 +0000
commit10ed84a470ca0a5f1388a5e944d614fd57c1ea25 (patch)
tree4baf5d7b069e7f34ce838cfe3d23d86618f410c5
parenta91af134655cb94d293a8d398490ac309734b4e8 (diff)
downloadFreeBSD-src-10ed84a470ca0a5f1388a5e944d614fd57c1ea25.zip
FreeBSD-src-10ed84a470ca0a5f1388a5e944d614fd57c1ea25.tar.gz
MFC r318316: uniq: allow -c to be used with -d or -u
Bring in some bits from NetBSD and lift the restriction in uniq(1) that -c cannot be used with the -d and -u options. This restriction seems unnecessary and is supported at least by GNU, OpenBSD, and NetBSD. Lift the restriction and simplify the show() logic a little bit to maintain functionality when -c is provided with -d/-u. Also with this change, -d and -u are now actually a mutually exclusive, albeit valid, combination. Given that they both indicate opposite behavior, uniq(1) will no longer output anything if both -d and -u are supplied. This is in line with NetBSD as well as GNU. Adjust the man page and usage() to reflect that -c is its own standalone option. PR: 200553 Submitted by: Kyle Evans <kevans91@ksu.edu>
-rw-r--r--usr.bin/uniq/uniq.15
-rw-r--r--usr.bin/uniq/uniq.c24
2 files changed, 9 insertions, 20 deletions
diff --git a/usr.bin/uniq/uniq.1 b/usr.bin/uniq/uniq.1
index 63b9105..0036b71 100644
--- a/usr.bin/uniq/uniq.1
+++ b/usr.bin/uniq/uniq.1
@@ -31,7 +31,7 @@
.\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
-.Dd December 17, 2009
+.Dd May 15, 2017
.Dt UNIQ 1
.Os
.Sh NAME
@@ -39,7 +39,8 @@
.Nd report or filter out repeated lines in a file
.Sh SYNOPSIS
.Nm
-.Op Fl c | Fl d | Fl u
+.Op Fl c
+.Op Fl d | Fl u
.Op Fl i
.Op Fl f Ar num
.Op Fl s Ar chars
diff --git a/usr.bin/uniq/uniq.c b/usr.bin/uniq/uniq.c
index 7c1b0e3..be0ff08 100644
--- a/usr.bin/uniq/uniq.c
+++ b/usr.bin/uniq/uniq.c
@@ -130,13 +130,6 @@ main (int argc, char *argv[])
argc -= optind;
argv += optind;
- /* If no flags are set, default is -d -u. */
- if (cflag) {
- if (dflag || uflag)
- usage();
- } else if (!dflag && !uflag)
- dflag = uflag = 1;
-
if (argc > 2)
usage();
@@ -183,9 +176,6 @@ main (int argc, char *argv[])
}
tprev = convert(prevline);
- if (!cflag && uflag && dflag)
- show(ofp, prevline);
-
tthis = NULL;
while (getline(&thisline, &thisbuflen, ifp) >= 0) {
if (tthis != NULL)
@@ -201,8 +191,7 @@ main (int argc, char *argv[])
if (comp) {
/* If different, print; set previous to new value. */
- if (cflag || !dflag || !uflag)
- show(ofp, prevline);
+ show(ofp, prevline);
p = prevline;
b1 = prevbuflen;
prevline = thisline;
@@ -210,8 +199,6 @@ main (int argc, char *argv[])
if (tprev != NULL)
free(tprev);
tprev = tthis;
- if (!cflag && uflag && dflag)
- show(ofp, prevline);
thisline = p;
thisbuflen = b1;
tthis = NULL;
@@ -221,8 +208,7 @@ main (int argc, char *argv[])
}
if (ferror(ifp))
err(1, "%s", ifn);
- if (cflag || !dflag || !uflag)
- show(ofp, prevline);
+ show(ofp, prevline);
exit(0);
}
@@ -287,9 +273,11 @@ static void
show(FILE *ofp, const char *str)
{
+ if ((dflag && repeats == 0) || (uflag && repeats > 0))
+ return;
if (cflag)
(void)fprintf(ofp, "%4d %s", repeats + 1, str);
- if ((dflag && repeats) || (uflag && !repeats))
+ else
(void)fprintf(ofp, "%s", str);
}
@@ -352,6 +340,6 @@ static void
usage(void)
{
(void)fprintf(stderr,
-"usage: uniq [-c | -d | -u] [-i] [-f fields] [-s chars] [input [output]]\n");
+"usage: uniq [-c] [-d | -u] [-i] [-f fields] [-s chars] [input [output]]\n");
exit(1);
}
OpenPOWER on IntegriCloud