Blame


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