Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
5 #define LB 2048
6 int one;
7 int two;
8 int three;
10 char ldr[3][4] = { "", "\t", "\t\t" };
12 Biobuf *ib1;
13 Biobuf *ib2;
14 Biobuf *openfil(char*);
15 int rd(Biobuf*, char*);
16 void wr(char*, int);
17 void copy(Biobuf*, char*, int);
18 int compare(char*, char*);
20 void
21 main(int argc, char *argv[])
22 {
23 int l;
24 char lb1[LB],lb2[LB];
26 l = 1;
27 ARGBEGIN{
28 case '1':
29 if(!one) {
30 one = 1;
31 ldr[1][0] =
32 ldr[2][l--] = '\0';
33 }
34 break;
36 case '2':
37 if(!two) {
38 two = 1;
39 ldr[2][l--] = '\0';
40 }
41 break;
43 case '3':
44 three = 1;
45 break;
47 default:
48 goto Usage;
50 }ARGEND
52 if(argc < 2) {
53 Usage:
54 fprint(2, "usage: comm [-123] file1 file2\n");
55 exits("usage");
56 }
58 ib1 = openfil(argv[0]);
59 ib2 = openfil(argv[1]);
62 if(rd(ib1,lb1) < 0){
63 if(rd(ib2,lb2) < 0)
64 exits(0);
65 copy(ib2,lb2,2);
66 }
67 if(rd(ib2,lb2) < 0)
68 copy(ib1,lb1,1);
70 for(;;){
71 switch(compare(lb1,lb2)) {
72 case 0:
73 wr(lb1,3);
74 if(rd(ib1,lb1) < 0) {
75 if(rd(ib2,lb2) < 0)
76 exits(0);
77 copy(ib2,lb2,2);
78 }
79 if(rd(ib2,lb2) < 0)
80 copy(ib1,lb1,1);
81 continue;
83 case 1:
84 wr(lb1,1);
85 if(rd(ib1,lb1) < 0)
86 copy(ib2,lb2,2);
87 continue;
89 case 2:
90 wr(lb2,2);
91 if(rd(ib2,lb2) < 0)
92 copy(ib1,lb1,1);
93 continue;
94 }
95 }
96 }
98 int
99 rd(Biobuf *file, char *buf)
101 int i, c;
103 i = 0;
104 while((c = Bgetc(file)) != Beof) {
105 *buf = c;
106 if(c == '\n' || i > LB-2) {
107 *buf = '\0';
108 return 0;
110 i++;
111 buf++;
113 return -1;
116 void
117 wr(char *str, int n)
120 switch(n){
121 case 1:
122 if(one)
123 return;
124 break;
126 case 2:
127 if(two)
128 return;
129 break;
131 case 3:
132 if(three)
133 return;
135 print("%s%s\n", ldr[n-1],str);
138 void
139 copy(Biobuf *ibuf, char *lbuf, int n)
141 do
142 wr(lbuf,n);
143 while(rd(ibuf,lbuf) >= 0);
144 exits(0);
147 int
148 compare(char *a, char *b)
150 while(*a == *b){
151 if(*a == '\0')
152 return 0;
153 a++;
154 b++;
156 if(*a < *b)
157 return 1;
158 return 2;
161 Biobuf*
162 openfil(char *s)
164 Biobuf *b;
166 if(s[0]=='-' && s[1]==0)
167 s = unsharp("#d/0");
168 b = Bopen(s, OREAD);
169 if(b)
170 return b;
171 fprint(2,"comm: cannot open %s: %r\n",s);
172 exits("open");
173 return 0; /* shut up ken */