Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>5 #define LB 20486 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 void21 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 }ARGEND55 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);100 }102 int103 rd(Biobuf *file, char *buf)104 {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;113 }114 i++;115 buf++;116 }117 return -1;118 }120 void121 wr(char *str, int n)122 {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;138 }139 print("%s%s\n", ldr[n-1],str);140 }142 void143 copy(Biobuf *ibuf, char *lbuf, int n)144 {145 do146 wr(lbuf,n);147 while(rd(ibuf,lbuf) >= 0);148 exits(0);149 }151 int152 compare(char *a, char *b)153 {154 while(*a == *b){155 if(*a == '\0')156 return 0;157 a++;158 b++;159 }160 if(*a < *b)161 return 1;162 return 2;163 }165 Biobuf*166 openfil(char *s)167 {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 */178 }