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][4] = { "", "\t", "\t\t" };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 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;36 case '2':37 if(!two) {38 two = 1;39 ldr[2][l--] = '\0';40 }41 break;43 case '3':44 three = 1;45 break;47 default:48 goto Usage;50 }ARGEND52 if(argc < 2) {53 Usage:54 fprint(2, "usage: comm [-123] file1 file2\n");55 exits("usage");56 }58 ib1 = openfil(argv[0]);59 ib2 = openfil(argv[1]);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);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;83 case 1:84 wr(lb1,1);85 if(rd(ib1,lb1) < 0)86 copy(ib2,lb2,2);87 continue;89 case 2:90 wr(lb2,2);91 if(rd(ib2,lb2) < 0)92 copy(ib1,lb1,1);93 continue;94 }95 }96 }98 int99 rd(Biobuf *file, char *buf)100 {101 int i, c;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 }116 void117 wr(char *str, int n)118 {120 switch(n){121 case 1:122 if(one)123 return;124 break;126 case 2:127 if(two)128 return;129 break;131 case 3:132 if(three)133 return;134 }135 print("%s%s\n", ldr[n-1],str);136 }138 void139 copy(Biobuf *ibuf, char *lbuf, int n)140 {141 do142 wr(lbuf,n);143 while(rd(ibuf,lbuf) >= 0);144 exits(0);145 }147 int148 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 }161 Biobuf*162 openfil(char *s)163 {164 Biobuf *b;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 }