1: static char *sccsid = "@(#)uniq.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * Deal with duplicated lines in a file
4: */
5: #include <stdio.h>
6: #include <ctype.h>
7: int fields;
8: int letters;
9: int linec;
10: char mode;
11: int uniq;
12: char *skip();
13:
14: main(argc, argv)
15: int argc;
16: char *argv[];
17: {
18: static char b1[1000], b2[1000];
19:
20: while(argc > 1) {
21: if(*argv[1] == '-') {
22: if (isdigit(argv[1][1]))
23: fields = atoi(&argv[1][1]);
24: else mode = argv[1][1];
25: argc--;
26: argv++;
27: continue;
28: }
29: if(*argv[1] == '+') {
30: letters = atoi(&argv[1][1]);
31: argc--;
32: argv++;
33: continue;
34: }
35: if (freopen(argv[1], "r", stdin) == NULL)
36: printe("cannot open %s\n", argv[1]);
37: break;
38: }
39: if(argc > 2 && freopen(argv[2], "w", stdout) == NULL)
40: printe("cannot create %s\n", argv[2]);
41:
42: if(gline(b1))
43: exit(0);
44: for(;;) {
45: linec++;
46: if(gline(b2)) {
47: pline(b1);
48: exit(0);
49: }
50: if(!equal(b1, b2)) {
51: pline(b1);
52: linec = 0;
53: do {
54: linec++;
55: if(gline(b1)) {
56: pline(b2);
57: exit(0);
58: }
59: } while(equal(b1, b2));
60: pline(b2);
61: linec = 0;
62: }
63: }
64: }
65:
66: gline(buf)
67: register char buf[];
68: {
69: register c;
70:
71: while((c = getchar()) != '\n') {
72: if(c == EOF)
73: return(1);
74: *buf++ = c;
75: }
76: *buf = 0;
77: return(0);
78: }
79:
80: pline(buf)
81: register char buf[];
82: {
83:
84: switch(mode) {
85:
86: case 'u':
87: if(uniq) {
88: uniq = 0;
89: return;
90: }
91: break;
92:
93: case 'd':
94: if(uniq) break;
95: return;
96:
97: case 'c':
98: printf("%4d ", linec);
99: }
100: uniq = 0;
101: fputs(buf, stdout);
102: putchar('\n');
103: }
104:
105: equal(b1, b2)
106: register char b1[], b2[];
107: {
108: register char c;
109:
110: b1 = skip(b1);
111: b2 = skip(b2);
112: while((c = *b1++) != 0)
113: if(c != *b2++) return(0);
114: if(*b2 != 0)
115: return(0);
116: uniq++;
117: return(1);
118: }
119:
120: char *
121: skip(s)
122: register char *s;
123: {
124: register nf, nl;
125:
126: nf = nl = 0;
127: while(nf++ < fields) {
128: while(*s == ' ' || *s == '\t')
129: s++;
130: while( !(*s == ' ' || *s == '\t' || *s == 0) )
131: s++;
132: }
133: while(nl++ < letters && *s != 0)
134: s++;
135: return(s);
136: }
137:
138: printe(p,s)
139: char *p,*s;
140: {
141: fprintf(stderr, p, s);
142: exit(1);
143: }
Defined functions
gline
defined in line
66; used 3 times
main
defined in line
14;
never used
pline
defined in line
80; used 4 times
skip
defined in line
120; used 3 times
Defined variables
fields
defined in line
7; used 2 times
linec
defined in line
9; used 5 times
mode
defined in line
10; used 2 times
sccsid
defined in line
1;
never used
uniq
defined in line
11; used 5 times