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>
Reviewed by:	cem, emaste
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D10694
This commit is contained in:
Ed Maste 2017-05-15 20:18:14 +00:00
parent 33cbbff80f
commit a520574d76
2 changed files with 9 additions and 20 deletions

View File

@ -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

View File

@ -129,13 +129,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();
@ -182,9 +175,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)
@ -200,8 +190,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;
@ -209,8 +198,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;
@ -220,8 +207,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);
}
@ -286,9 +272,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);
}
@ -351,6 +339,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);
}