BSD 4 release
[unix-history] / usr / src / cmd / uniq.c
static char *sccsid = "@(#)uniq.c 4.1 (Berkeley) 10/1/80";
/*
* Deal with duplicated lines in a file
*/
#include <stdio.h>
#include <ctype.h>
int fields;
int letters;
int linec;
char mode;
int uniq;
char *skip();
main(argc, argv)
int argc;
char *argv[];
{
static char b1[1000], b2[1000];
while(argc > 1) {
if(*argv[1] == '-') {
if (isdigit(argv[1][1]))
fields = atoi(&argv[1][1]);
else mode = argv[1][1];
argc--;
argv++;
continue;
}
if(*argv[1] == '+') {
letters = atoi(&argv[1][1]);
argc--;
argv++;
continue;
}
if (freopen(argv[1], "r", stdin) == NULL)
printe("cannot open %s\n", argv[1]);
break;
}
if(argc > 2 && freopen(argv[2], "w", stdout) == NULL)
printe("cannot create %s\n", argv[2]);
if(gline(b1))
exit(0);
for(;;) {
linec++;
if(gline(b2)) {
pline(b1);
exit(0);
}
if(!equal(b1, b2)) {
pline(b1);
linec = 0;
do {
linec++;
if(gline(b1)) {
pline(b2);
exit(0);
}
} while(equal(b1, b2));
pline(b2);
linec = 0;
}
}
}
gline(buf)
register char buf[];
{
register c;
while((c = getchar()) != '\n') {
if(c == EOF)
return(1);
*buf++ = c;
}
*buf = 0;
return(0);
}
pline(buf)
register char buf[];
{
switch(mode) {
case 'u':
if(uniq) {
uniq = 0;
return;
}
break;
case 'd':
if(uniq) break;
return;
case 'c':
printf("%4d ", linec);
}
uniq = 0;
fputs(buf, stdout);
putchar('\n');
}
equal(b1, b2)
register char b1[], b2[];
{
register char c;
b1 = skip(b1);
b2 = skip(b2);
while((c = *b1++) != 0)
if(c != *b2++) return(0);
if(*b2 != 0)
return(0);
uniq++;
return(1);
}
char *
skip(s)
register char *s;
{
register nf, nl;
nf = nl = 0;
while(nf++ < fields) {
while(*s == ' ' || *s == '\t')
s++;
while( !(*s == ' ' || *s == '\t' || *s == 0) )
s++;
}
while(nl++ < letters && *s != 0)
s++;
return(s);
}
printe(p,s)
char *p,*s;
{
fprintf(stderr, p, s);
exit(1);
}