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>
5 bc7cb1a1 2003-11-23 devnull #define LB 2048
8 bc7cb1a1 2003-11-23 devnull int three;
10 bc7cb1a1 2003-11-23 devnull char *ldr[3];
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*);
21 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
24 bc7cb1a1 2003-11-23 devnull char lb1[LB],lb2[LB];
26 bc7cb1a1 2003-11-23 devnull ldr[0] = "";
27 bc7cb1a1 2003-11-23 devnull ldr[1] = "\t";
28 bc7cb1a1 2003-11-23 devnull ldr[2] = "\t\t";
30 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
31 bc7cb1a1 2003-11-23 devnull case '1':
32 bc7cb1a1 2003-11-23 devnull if(!one) {
34 bc7cb1a1 2003-11-23 devnull ldr[1][0] =
35 bc7cb1a1 2003-11-23 devnull ldr[2][l--] = '\0';
39 bc7cb1a1 2003-11-23 devnull case '2':
40 bc7cb1a1 2003-11-23 devnull if(!two) {
42 bc7cb1a1 2003-11-23 devnull ldr[2][l--] = '\0';
46 bc7cb1a1 2003-11-23 devnull case '3':
47 bc7cb1a1 2003-11-23 devnull three = 1;
51 bc7cb1a1 2003-11-23 devnull goto Usage;
55 bc7cb1a1 2003-11-23 devnull if(argc < 2) {
57 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: comm [-123] file1 file2\n");
58 bc7cb1a1 2003-11-23 devnull exits("usage");
61 bc7cb1a1 2003-11-23 devnull ib1 = openfil(argv[0]);
62 bc7cb1a1 2003-11-23 devnull ib2 = openfil(argv[1]);
65 bc7cb1a1 2003-11-23 devnull if(rd(ib1,lb1) < 0){
66 bc7cb1a1 2003-11-23 devnull if(rd(ib2,lb2) < 0)
67 bc7cb1a1 2003-11-23 devnull exits(0);
68 bc7cb1a1 2003-11-23 devnull copy(ib2,lb2,2);
70 bc7cb1a1 2003-11-23 devnull if(rd(ib2,lb2) < 0)
71 bc7cb1a1 2003-11-23 devnull copy(ib1,lb1,1);
74 bc7cb1a1 2003-11-23 devnull switch(compare(lb1,lb2)) {
76 bc7cb1a1 2003-11-23 devnull wr(lb1,3);
77 bc7cb1a1 2003-11-23 devnull if(rd(ib1,lb1) < 0) {
78 bc7cb1a1 2003-11-23 devnull if(rd(ib2,lb2) < 0)
79 bc7cb1a1 2003-11-23 devnull exits(0);
80 bc7cb1a1 2003-11-23 devnull copy(ib2,lb2,2);
82 bc7cb1a1 2003-11-23 devnull if(rd(ib2,lb2) < 0)
83 bc7cb1a1 2003-11-23 devnull copy(ib1,lb1,1);
84 bc7cb1a1 2003-11-23 devnull continue;
87 bc7cb1a1 2003-11-23 devnull wr(lb1,1);
88 bc7cb1a1 2003-11-23 devnull if(rd(ib1,lb1) < 0)
89 bc7cb1a1 2003-11-23 devnull copy(ib2,lb2,2);
90 bc7cb1a1 2003-11-23 devnull continue;
93 bc7cb1a1 2003-11-23 devnull wr(lb2,2);
94 bc7cb1a1 2003-11-23 devnull if(rd(ib2,lb2) < 0)
95 bc7cb1a1 2003-11-23 devnull copy(ib1,lb1,1);
96 bc7cb1a1 2003-11-23 devnull continue;
99 bc7cb1a1 2003-11-23 devnull exits(0);
103 bc7cb1a1 2003-11-23 devnull rd(Biobuf *file, char *buf)
105 bc7cb1a1 2003-11-23 devnull int i, c;
108 bc7cb1a1 2003-11-23 devnull while((c = Bgetc(file)) != Beof) {
109 bc7cb1a1 2003-11-23 devnull *buf = c;
110 bc7cb1a1 2003-11-23 devnull if(c == '\n' || i > LB-2) {
111 bc7cb1a1 2003-11-23 devnull *buf = '\0';
112 bc7cb1a1 2003-11-23 devnull return 0;
117 bc7cb1a1 2003-11-23 devnull return -1;
121 bc7cb1a1 2003-11-23 devnull wr(char *str, int n)
124 bc7cb1a1 2003-11-23 devnull switch(n){
136 bc7cb1a1 2003-11-23 devnull if(three)
139 bc7cb1a1 2003-11-23 devnull print("%s%s\n", ldr[n-1],str);
143 bc7cb1a1 2003-11-23 devnull copy(Biobuf *ibuf, char *lbuf, int n)
146 bc7cb1a1 2003-11-23 devnull wr(lbuf,n);
147 bc7cb1a1 2003-11-23 devnull while(rd(ibuf,lbuf) >= 0);
148 bc7cb1a1 2003-11-23 devnull exits(0);
152 bc7cb1a1 2003-11-23 devnull compare(char *a, char *b)
154 bc7cb1a1 2003-11-23 devnull while(*a == *b){
155 bc7cb1a1 2003-11-23 devnull if(*a == '\0')
156 bc7cb1a1 2003-11-23 devnull return 0;
160 bc7cb1a1 2003-11-23 devnull if(*a < *b)
161 bc7cb1a1 2003-11-23 devnull return 1;
162 bc7cb1a1 2003-11-23 devnull return 2;
166 bc7cb1a1 2003-11-23 devnull openfil(char *s)
168 bc7cb1a1 2003-11-23 devnull Biobuf *b;
170 bc7cb1a1 2003-11-23 devnull if(s[0]=='-' && s[1]==0)
171 bc7cb1a1 2003-11-23 devnull s = "/fd/0";
172 bc7cb1a1 2003-11-23 devnull b = Bopen(s, OREAD);
174 bc7cb1a1 2003-11-23 devnull return b;
175 bc7cb1a1 2003-11-23 devnull fprint(2,"comm: cannot open %s: %r\n",s);
176 bc7cb1a1 2003-11-23 devnull exits("open");
177 bc7cb1a1 2003-11-23 devnull return 0; /* shut up ken */