2 bc7cb1a1 2003-11-23 devnull * Deal with duplicated lines in a file
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>
9 bc7cb1a1 2003-11-23 devnull #define SIZE 8000
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;
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);
27 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
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);
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]);
40 bc7cb1a1 2003-11-23 devnull mode = argv[1][1];
43 bc7cb1a1 2003-11-23 devnull continue;
45 bc7cb1a1 2003-11-23 devnull if(*argv[1] == '+') {
46 bc7cb1a1 2003-11-23 devnull letters = atoi(&argv[1][1]);
49 bc7cb1a1 2003-11-23 devnull continue;
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");
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");
62 bc7cb1a1 2003-11-23 devnull Binit(&fin, f, OREAD);
63 bc7cb1a1 2003-11-23 devnull Binit(&fout, 1, OWRITE);
65 bc7cb1a1 2003-11-23 devnull if(gline(b1))
66 bc7cb1a1 2003-11-23 devnull exits(0);
67 bc7cb1a1 2003-11-23 devnull for(;;) {
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);
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;
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);
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;
90 bc7cb1a1 2003-11-23 devnull gline(char *buf)
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");
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;
107 bc7cb1a1 2003-11-23 devnull pline(char *buf)
110 bc7cb1a1 2003-11-23 devnull switch(mode) {
112 bc7cb1a1 2003-11-23 devnull case 'u':
113 bc7cb1a1 2003-11-23 devnull if(uniq) {
114 bc7cb1a1 2003-11-23 devnull uniq = 0;
119 bc7cb1a1 2003-11-23 devnull case 'd':
120 bc7cb1a1 2003-11-23 devnull if(uniq)
124 bc7cb1a1 2003-11-23 devnull case 'c':
125 bc7cb1a1 2003-11-23 devnull Bprint(&fout, "%4d ", linec);
127 bc7cb1a1 2003-11-23 devnull uniq = 0;
128 bc7cb1a1 2003-11-23 devnull Bprint(&fout, "%s\n", buf);
132 bc7cb1a1 2003-11-23 devnull equal(char *b1, char *b2)
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);
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;
147 bc7cb1a1 2003-11-23 devnull if(c == 0) {
149 bc7cb1a1 2003-11-23 devnull return 1;
155 bc7cb1a1 2003-11-23 devnull skip(char *s)
157 bc7cb1a1 2003-11-23 devnull int nf, nl;
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')
163 bc7cb1a1 2003-11-23 devnull while(!(*s == ' ' || *s == '\t' || *s == 0) )
166 bc7cb1a1 2003-11-23 devnull while(nl++ < letters && *s != 0)
168 bc7cb1a1 2003-11-23 devnull return s;