145 lines
2.4 KiB
C
145 lines
2.4 KiB
C
/*
|
|
* Deal with duplicated lines in a file
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.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);
|
|
}
|