Blame


1 bc7cb1a1 2003-11-23 devnull /*
2 bc7cb1a1 2003-11-23 devnull * Deal with duplicated lines in a file
3 bc7cb1a1 2003-11-23 devnull */
4 bc7cb1a1 2003-11-23 devnull #include <u.h>
5 bc7cb1a1 2003-11-23 devnull #include <libc.h>
6 bc7cb1a1 2003-11-23 devnull #include <bio.h>
7 bc7cb1a1 2003-11-23 devnull #include <ctype.h>
8 bc7cb1a1 2003-11-23 devnull
9 bc7cb1a1 2003-11-23 devnull #define SIZE 8000
10 bc7cb1a1 2003-11-23 devnull
11 bc7cb1a1 2003-11-23 devnull int fields = 0;
12 bc7cb1a1 2003-11-23 devnull int letters = 0;
13 bc7cb1a1 2003-11-23 devnull int linec = 0;
14 bc7cb1a1 2003-11-23 devnull char mode;
15 bc7cb1a1 2003-11-23 devnull int uniq;
16 bc7cb1a1 2003-11-23 devnull char *b1, *b2;
17 bc7cb1a1 2003-11-23 devnull long bsize;
18 bc7cb1a1 2003-11-23 devnull Biobuf fin;
19 bc7cb1a1 2003-11-23 devnull Biobuf fout;
20 bc7cb1a1 2003-11-23 devnull
21 bc7cb1a1 2003-11-23 devnull int gline(char *buf);
22 bc7cb1a1 2003-11-23 devnull void pline(char *buf);
23 bc7cb1a1 2003-11-23 devnull int equal(char *b1, char *b2);
24 bc7cb1a1 2003-11-23 devnull char* skip(char *s);
25 bc7cb1a1 2003-11-23 devnull
26 bc7cb1a1 2003-11-23 devnull void
27 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
28 bc7cb1a1 2003-11-23 devnull {
29 bc7cb1a1 2003-11-23 devnull int f;
30 bc7cb1a1 2003-11-23 devnull
31 bc7cb1a1 2003-11-23 devnull bsize = SIZE;
32 bc7cb1a1 2003-11-23 devnull b1 = malloc(bsize);
33 bc7cb1a1 2003-11-23 devnull b2 = malloc(bsize);
34 bc7cb1a1 2003-11-23 devnull f = 0;
35 bc7cb1a1 2003-11-23 devnull while(argc > 1) {
36 bc7cb1a1 2003-11-23 devnull if(*argv[1] == '-') {
37 1c171e3a 2005-07-19 devnull if(isdigit((uchar)argv[1][1]))
38 bc7cb1a1 2003-11-23 devnull fields = atoi(&argv[1][1]);
39 bc7cb1a1 2003-11-23 devnull else
40 bc7cb1a1 2003-11-23 devnull mode = argv[1][1];
41 bc7cb1a1 2003-11-23 devnull argc--;
42 bc7cb1a1 2003-11-23 devnull argv++;
43 bc7cb1a1 2003-11-23 devnull continue;
44 bc7cb1a1 2003-11-23 devnull }
45 bc7cb1a1 2003-11-23 devnull if(*argv[1] == '+') {
46 bc7cb1a1 2003-11-23 devnull letters = atoi(&argv[1][1]);
47 bc7cb1a1 2003-11-23 devnull argc--;
48 bc7cb1a1 2003-11-23 devnull argv++;
49 bc7cb1a1 2003-11-23 devnull continue;
50 bc7cb1a1 2003-11-23 devnull }
51 bc7cb1a1 2003-11-23 devnull f = open(argv[1], 0);
52 bc7cb1a1 2003-11-23 devnull if(f < 0) {
53 bc7cb1a1 2003-11-23 devnull fprint(2, "cannot open %s\n", argv[1]);
54 bc7cb1a1 2003-11-23 devnull exits("open");
55 bc7cb1a1 2003-11-23 devnull }
56 bc7cb1a1 2003-11-23 devnull break;
57 bc7cb1a1 2003-11-23 devnull }
58 bc7cb1a1 2003-11-23 devnull if(argc > 2) {
59 bc7cb1a1 2003-11-23 devnull fprint(2, "unexpected argument %s\n", argv[2]);
60 bc7cb1a1 2003-11-23 devnull exits("arg");
61 bc7cb1a1 2003-11-23 devnull }
62 bc7cb1a1 2003-11-23 devnull Binit(&fin, f, OREAD);
63 bc7cb1a1 2003-11-23 devnull Binit(&fout, 1, OWRITE);
64 bc7cb1a1 2003-11-23 devnull
65 bc7cb1a1 2003-11-23 devnull if(gline(b1))
66 bc7cb1a1 2003-11-23 devnull exits(0);
67 bc7cb1a1 2003-11-23 devnull for(;;) {
68 bc7cb1a1 2003-11-23 devnull linec++;
69 bc7cb1a1 2003-11-23 devnull if(gline(b2)) {
70 bc7cb1a1 2003-11-23 devnull pline(b1);
71 bc7cb1a1 2003-11-23 devnull exits(0);
72 bc7cb1a1 2003-11-23 devnull }
73 bc7cb1a1 2003-11-23 devnull if(!equal(b1, b2)) {
74 bc7cb1a1 2003-11-23 devnull pline(b1);
75 bc7cb1a1 2003-11-23 devnull linec = 0;
76 bc7cb1a1 2003-11-23 devnull do {
77 bc7cb1a1 2003-11-23 devnull linec++;
78 bc7cb1a1 2003-11-23 devnull if(gline(b1)) {
79 bc7cb1a1 2003-11-23 devnull pline(b2);
80 bc7cb1a1 2003-11-23 devnull exits(0);
81 bc7cb1a1 2003-11-23 devnull }
82 bc7cb1a1 2003-11-23 devnull } while(equal(b2, b1));
83 bc7cb1a1 2003-11-23 devnull pline(b2);
84 bc7cb1a1 2003-11-23 devnull linec = 0;
85 bc7cb1a1 2003-11-23 devnull }
86 bc7cb1a1 2003-11-23 devnull }
87 bc7cb1a1 2003-11-23 devnull }
88 bc7cb1a1 2003-11-23 devnull
89 bc7cb1a1 2003-11-23 devnull int
90 bc7cb1a1 2003-11-23 devnull gline(char *buf)
91 bc7cb1a1 2003-11-23 devnull {
92 bc7cb1a1 2003-11-23 devnull char *p;
93 bc7cb1a1 2003-11-23 devnull
94 bc7cb1a1 2003-11-23 devnull p = Brdline(&fin, '\n');
95 bc7cb1a1 2003-11-23 devnull if(p == 0)
96 bc7cb1a1 2003-11-23 devnull return 1;
97 bc7cb1a1 2003-11-23 devnull if(fin.rdline >= bsize-1) {
98 bc7cb1a1 2003-11-23 devnull fprint(2, "line too long\n");
99 bc7cb1a1 2003-11-23 devnull exits("too long");
100 bc7cb1a1 2003-11-23 devnull }
101 bc7cb1a1 2003-11-23 devnull memmove(buf, p, fin.rdline);
102 bc7cb1a1 2003-11-23 devnull buf[fin.rdline-1] = 0;
103 bc7cb1a1 2003-11-23 devnull return 0;
104 bc7cb1a1 2003-11-23 devnull }
105 bc7cb1a1 2003-11-23 devnull
106 bc7cb1a1 2003-11-23 devnull void
107 bc7cb1a1 2003-11-23 devnull pline(char *buf)
108 bc7cb1a1 2003-11-23 devnull {
109 bc7cb1a1 2003-11-23 devnull
110 bc7cb1a1 2003-11-23 devnull switch(mode) {
111 bc7cb1a1 2003-11-23 devnull
112 bc7cb1a1 2003-11-23 devnull case 'u':
113 bc7cb1a1 2003-11-23 devnull if(uniq) {
114 bc7cb1a1 2003-11-23 devnull uniq = 0;
115 bc7cb1a1 2003-11-23 devnull return;
116 bc7cb1a1 2003-11-23 devnull }
117 bc7cb1a1 2003-11-23 devnull break;
118 bc7cb1a1 2003-11-23 devnull
119 bc7cb1a1 2003-11-23 devnull case 'd':
120 bc7cb1a1 2003-11-23 devnull if(uniq)
121 bc7cb1a1 2003-11-23 devnull break;
122 bc7cb1a1 2003-11-23 devnull return;
123 bc7cb1a1 2003-11-23 devnull
124 bc7cb1a1 2003-11-23 devnull case 'c':
125 bc7cb1a1 2003-11-23 devnull Bprint(&fout, "%4d ", linec);
126 bc7cb1a1 2003-11-23 devnull }
127 bc7cb1a1 2003-11-23 devnull uniq = 0;
128 bc7cb1a1 2003-11-23 devnull Bprint(&fout, "%s\n", buf);
129 bc7cb1a1 2003-11-23 devnull }
130 bc7cb1a1 2003-11-23 devnull
131 bc7cb1a1 2003-11-23 devnull int
132 bc7cb1a1 2003-11-23 devnull equal(char *b1, char *b2)
133 bc7cb1a1 2003-11-23 devnull {
134 bc7cb1a1 2003-11-23 devnull char c;
135 bc7cb1a1 2003-11-23 devnull
136 bc7cb1a1 2003-11-23 devnull if(fields || letters) {
137 bc7cb1a1 2003-11-23 devnull b1 = skip(b1);
138 bc7cb1a1 2003-11-23 devnull b2 = skip(b2);
139 bc7cb1a1 2003-11-23 devnull }
140 bc7cb1a1 2003-11-23 devnull for(;;) {
141 bc7cb1a1 2003-11-23 devnull c = *b1++;
142 bc7cb1a1 2003-11-23 devnull if(c != *b2++) {
143 bc7cb1a1 2003-11-23 devnull if(c == 0 && mode == 's')
144 bc7cb1a1 2003-11-23 devnull return 1;
145 bc7cb1a1 2003-11-23 devnull return 0;
146 bc7cb1a1 2003-11-23 devnull }
147 bc7cb1a1 2003-11-23 devnull if(c == 0) {
148 bc7cb1a1 2003-11-23 devnull uniq++;
149 bc7cb1a1 2003-11-23 devnull return 1;
150 bc7cb1a1 2003-11-23 devnull }
151 bc7cb1a1 2003-11-23 devnull }
152 bc7cb1a1 2003-11-23 devnull }
153 bc7cb1a1 2003-11-23 devnull
154 bc7cb1a1 2003-11-23 devnull char*
155 bc7cb1a1 2003-11-23 devnull skip(char *s)
156 bc7cb1a1 2003-11-23 devnull {
157 bc7cb1a1 2003-11-23 devnull int nf, nl;
158 bc7cb1a1 2003-11-23 devnull
159 bc7cb1a1 2003-11-23 devnull nf = nl = 0;
160 bc7cb1a1 2003-11-23 devnull while(nf++ < fields) {
161 bc7cb1a1 2003-11-23 devnull while(*s == ' ' || *s == '\t')
162 bc7cb1a1 2003-11-23 devnull s++;
163 fa325e9b 2020-01-10 cross while(!(*s == ' ' || *s == '\t' || *s == 0) )
164 bc7cb1a1 2003-11-23 devnull s++;
165 bc7cb1a1 2003-11-23 devnull }
166 fa325e9b 2020-01-10 cross while(nl++ < letters && *s != 0)
167 bc7cb1a1 2003-11-23 devnull s++;
168 bc7cb1a1 2003-11-23 devnull return s;
169 bc7cb1a1 2003-11-23 devnull }