tcomm.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tcomm.c (2125B)
---
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4
5 #define LB 2048
6 int one;
7 int two;
8 int three;
9
10 char ldr[3][4] = { "", "\t", "\t\t" };
11
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*);
19
20 void
21 main(int argc, char *argv[])
22 {
23 int l;
24 char lb1[LB],lb2[LB];
25
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;
35
36 case '2':
37 if(!two) {
38 two = 1;
39 ldr[2][l--] = '\0';
40 }
41 break;
42
43 case '3':
44 three = 1;
45 break;
46
47 default:
48 goto Usage;
49
50 }ARGEND
51
52 if(argc < 2) {
53 Usage:
54 fprint(2, "usage: comm [-123] file1 file2\n");
55 exits("usage");
56 }
57
58 ib1 = openfil(argv[0]);
59 ib2 = openfil(argv[1]);
60
61
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);
69
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;
82
83 case 1:
84 wr(lb1,1);
85 if(rd(ib1,lb1) < 0)
86 copy(ib2,lb2,2);
87 continue;
88
89 case 2:
90 wr(lb2,2);
91 if(rd(ib2,lb2) < 0)
92 copy(ib1,lb1,1);
93 continue;
94 }
95 }
96 }
97
98 int
99 rd(Biobuf *file, char *buf)
100 {
101 int i, c;
102
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;
109 }
110 i++;
111 buf++;
112 }
113 return -1;
114 }
115
116 void
117 wr(char *str, int n)
118 {
119
120 switch(n){
121 case 1:
122 if(one)
123 return;
124 break;
125
126 case 2:
127 if(two)
128 return;
129 break;
130
131 case 3:
132 if(three)
133 return;
134 }
135 print("%s%s\n", ldr[n-1],str);
136 }
137
138 void
139 copy(Biobuf *ibuf, char *lbuf, int n)
140 {
141 do
142 wr(lbuf,n);
143 while(rd(ibuf,lbuf) >= 0);
144 exits(0);
145 }
146
147 int
148 compare(char *a, char *b)
149 {
150 while(*a == *b){
151 if(*a == '\0')
152 return 0;
153 a++;
154 b++;
155 }
156 if(*a < *b)
157 return 1;
158 return 2;
159 }
160
161 Biobuf*
162 openfil(char *s)
163 {
164 Biobuf *b;
165
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 */
174 }