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:
parent
33cbbff80f
commit
a520574d76
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user