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];
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 ldr[0] = "";
27 ldr[1] = "\t";
28 ldr[2] = "\t\t";
29 l = 2;
30 ARGBEGIN{
31 case '1':
32 if(!one) {
33 one = 1;
34 ldr[1][0] =
35 ldr[2][l--] = '\0';
36 }
37 break;
39 case '2':
40 if(!two) {
41 two = 1;
42 ldr[2][l--] = '\0';
43 }
44 break;
46 case '3':
47 three = 1;
48 break;
50 default:
51 goto Usage;
53 }ARGEND
55 if(argc < 2) {
56 Usage:
57 fprint(2, "usage: comm [-123] file1 file2\n");
58 exits("usage");
59 }
61 ib1 = openfil(argv[0]);
62 ib2 = openfil(argv[1]);
65 if(rd(ib1,lb1) < 0){
66 if(rd(ib2,lb2) < 0)
67 exits(0);
68 copy(ib2,lb2,2);
69 }
70 if(rd(ib2,lb2) < 0)
71 copy(ib1,lb1,1);
73 for(;;){
74 switch(compare(lb1,lb2)) {
75 case 0:
76 wr(lb1,3);
77 if(rd(ib1,lb1) < 0) {
78 if(rd(ib2,lb2) < 0)
79 exits(0);
80 copy(ib2,lb2,2);
81 }
82 if(rd(ib2,lb2) < 0)
83 copy(ib1,lb1,1);
84 continue;
86 case 1:
87 wr(lb1,1);
88 if(rd(ib1,lb1) < 0)
89 copy(ib2,lb2,2);
90 continue;
92 case 2:
93 wr(lb2,2);
94 if(rd(ib2,lb2) < 0)
95 copy(ib1,lb1,1);
96 continue;
97 }
98 }
99 exits(0);
102 int
103 rd(Biobuf *file, char *buf)
105 int i, c;
107 i = 0;
108 while((c = Bgetc(file)) != Beof) {
109 *buf = c;
110 if(c == '\n' || i > LB-2) {
111 *buf = '\0';
112 return 0;
114 i++;
115 buf++;
117 return -1;
120 void
121 wr(char *str, int n)
124 switch(n){
125 case 1:
126 if(one)
127 return;
128 break;
130 case 2:
131 if(two)
132 return;
133 break;
135 case 3:
136 if(three)
137 return;
139 print("%s%s\n", ldr[n-1],str);
142 void
143 copy(Biobuf *ibuf, char *lbuf, int n)
145 do
146 wr(lbuf,n);
147 while(rd(ibuf,lbuf) >= 0);
148 exits(0);
151 int
152 compare(char *a, char *b)
154 while(*a == *b){
155 if(*a == '\0')
156 return 0;
157 a++;
158 b++;
160 if(*a < *b)
161 return 1;
162 return 2;
165 Biobuf*
166 openfil(char *s)
168 Biobuf *b;
170 if(s[0]=='-' && s[1]==0)
171 s = "/fd/0";
172 b = Bopen(s, OREAD);
173 if(b)
174 return b;
175 fprint(2,"comm: cannot open %s: %r\n",s);
176 exits("open");
177 return 0; /* shut up ken */