13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier #define LB 2048
63e12c5d1SDavid du Colombier int one;
73e12c5d1SDavid du Colombier int two;
83e12c5d1SDavid du Colombier int three;
93e12c5d1SDavid du Colombier
103e12c5d1SDavid du Colombier char *ldr[3];
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier Biobuf *ib1;
133e12c5d1SDavid du Colombier Biobuf *ib2;
143e12c5d1SDavid du Colombier Biobuf *openfil(char*);
153e12c5d1SDavid du Colombier int rd(Biobuf*, char*);
163e12c5d1SDavid du Colombier void wr(char*, int);
173e12c5d1SDavid du Colombier void copy(Biobuf*, char*, int);
183e12c5d1SDavid du Colombier int compare(char*, char*);
193e12c5d1SDavid du Colombier
203e12c5d1SDavid du Colombier void
main(int argc,char * argv[])213e12c5d1SDavid du Colombier main(int argc, char *argv[])
223e12c5d1SDavid du Colombier {
233e12c5d1SDavid du Colombier int l;
243e12c5d1SDavid du Colombier char lb1[LB],lb2[LB];
253e12c5d1SDavid du Colombier
263e12c5d1SDavid du Colombier ldr[0] = "";
273e12c5d1SDavid du Colombier ldr[1] = "\t";
283e12c5d1SDavid du Colombier ldr[2] = "\t\t";
29*9c742404SDavid du Colombier l = 1;
303e12c5d1SDavid du Colombier ARGBEGIN{
313e12c5d1SDavid du Colombier case '1':
323e12c5d1SDavid du Colombier if(!one) {
333e12c5d1SDavid du Colombier one = 1;
343e12c5d1SDavid du Colombier ldr[1][0] =
353e12c5d1SDavid du Colombier ldr[2][l--] = '\0';
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier break;
383e12c5d1SDavid du Colombier
393e12c5d1SDavid du Colombier case '2':
403e12c5d1SDavid du Colombier if(!two) {
413e12c5d1SDavid du Colombier two = 1;
423e12c5d1SDavid du Colombier ldr[2][l--] = '\0';
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier break;
453e12c5d1SDavid du Colombier
463e12c5d1SDavid du Colombier case '3':
473e12c5d1SDavid du Colombier three = 1;
483e12c5d1SDavid du Colombier break;
493e12c5d1SDavid du Colombier
503e12c5d1SDavid du Colombier default:
513e12c5d1SDavid du Colombier goto Usage;
523e12c5d1SDavid du Colombier
533e12c5d1SDavid du Colombier }ARGEND
543e12c5d1SDavid du Colombier
553e12c5d1SDavid du Colombier if(argc < 2) {
563e12c5d1SDavid du Colombier Usage:
573e12c5d1SDavid du Colombier fprint(2, "usage: comm [-123] file1 file2\n");
583e12c5d1SDavid du Colombier exits("usage");
593e12c5d1SDavid du Colombier }
603e12c5d1SDavid du Colombier
613e12c5d1SDavid du Colombier ib1 = openfil(argv[0]);
623e12c5d1SDavid du Colombier ib2 = openfil(argv[1]);
633e12c5d1SDavid du Colombier
643e12c5d1SDavid du Colombier
653e12c5d1SDavid du Colombier if(rd(ib1,lb1) < 0){
663e12c5d1SDavid du Colombier if(rd(ib2,lb2) < 0)
673e12c5d1SDavid du Colombier exits(0);
683e12c5d1SDavid du Colombier copy(ib2,lb2,2);
693e12c5d1SDavid du Colombier }
703e12c5d1SDavid du Colombier if(rd(ib2,lb2) < 0)
713e12c5d1SDavid du Colombier copy(ib1,lb1,1);
723e12c5d1SDavid du Colombier
733e12c5d1SDavid du Colombier for(;;){
743e12c5d1SDavid du Colombier switch(compare(lb1,lb2)) {
753e12c5d1SDavid du Colombier case 0:
763e12c5d1SDavid du Colombier wr(lb1,3);
773e12c5d1SDavid du Colombier if(rd(ib1,lb1) < 0) {
783e12c5d1SDavid du Colombier if(rd(ib2,lb2) < 0)
793e12c5d1SDavid du Colombier exits(0);
803e12c5d1SDavid du Colombier copy(ib2,lb2,2);
813e12c5d1SDavid du Colombier }
823e12c5d1SDavid du Colombier if(rd(ib2,lb2) < 0)
833e12c5d1SDavid du Colombier copy(ib1,lb1,1);
843e12c5d1SDavid du Colombier continue;
853e12c5d1SDavid du Colombier
863e12c5d1SDavid du Colombier case 1:
873e12c5d1SDavid du Colombier wr(lb1,1);
883e12c5d1SDavid du Colombier if(rd(ib1,lb1) < 0)
893e12c5d1SDavid du Colombier copy(ib2,lb2,2);
903e12c5d1SDavid du Colombier continue;
913e12c5d1SDavid du Colombier
923e12c5d1SDavid du Colombier case 2:
933e12c5d1SDavid du Colombier wr(lb2,2);
943e12c5d1SDavid du Colombier if(rd(ib2,lb2) < 0)
953e12c5d1SDavid du Colombier copy(ib1,lb1,1);
963e12c5d1SDavid du Colombier continue;
973e12c5d1SDavid du Colombier }
983e12c5d1SDavid du Colombier }
993e12c5d1SDavid du Colombier }
1003e12c5d1SDavid du Colombier
1013e12c5d1SDavid du Colombier int
rd(Biobuf * file,char * buf)1023e12c5d1SDavid du Colombier rd(Biobuf *file, char *buf)
1033e12c5d1SDavid du Colombier {
1043e12c5d1SDavid du Colombier int i, c;
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombier i = 0;
1073e12c5d1SDavid du Colombier while((c = Bgetc(file)) != Beof) {
1083e12c5d1SDavid du Colombier *buf = c;
1093e12c5d1SDavid du Colombier if(c == '\n' || i > LB-2) {
1103e12c5d1SDavid du Colombier *buf = '\0';
1113e12c5d1SDavid du Colombier return 0;
1123e12c5d1SDavid du Colombier }
1133e12c5d1SDavid du Colombier i++;
1143e12c5d1SDavid du Colombier buf++;
1153e12c5d1SDavid du Colombier }
1163e12c5d1SDavid du Colombier return -1;
1173e12c5d1SDavid du Colombier }
1183e12c5d1SDavid du Colombier
1193e12c5d1SDavid du Colombier void
wr(char * str,int n)1203e12c5d1SDavid du Colombier wr(char *str, int n)
1213e12c5d1SDavid du Colombier {
1223e12c5d1SDavid du Colombier
1233e12c5d1SDavid du Colombier switch(n){
1243e12c5d1SDavid du Colombier case 1:
1253e12c5d1SDavid du Colombier if(one)
1263e12c5d1SDavid du Colombier return;
1273e12c5d1SDavid du Colombier break;
1283e12c5d1SDavid du Colombier
1293e12c5d1SDavid du Colombier case 2:
1303e12c5d1SDavid du Colombier if(two)
1313e12c5d1SDavid du Colombier return;
1323e12c5d1SDavid du Colombier break;
1333e12c5d1SDavid du Colombier
1343e12c5d1SDavid du Colombier case 3:
1353e12c5d1SDavid du Colombier if(three)
1363e12c5d1SDavid du Colombier return;
1373e12c5d1SDavid du Colombier }
1383e12c5d1SDavid du Colombier print("%s%s\n", ldr[n-1],str);
1393e12c5d1SDavid du Colombier }
1403e12c5d1SDavid du Colombier
1413e12c5d1SDavid du Colombier void
copy(Biobuf * ibuf,char * lbuf,int n)1423e12c5d1SDavid du Colombier copy(Biobuf *ibuf, char *lbuf, int n)
1433e12c5d1SDavid du Colombier {
1443e12c5d1SDavid du Colombier do
1453e12c5d1SDavid du Colombier wr(lbuf,n);
1463e12c5d1SDavid du Colombier while(rd(ibuf,lbuf) >= 0);
1473e12c5d1SDavid du Colombier exits(0);
1483e12c5d1SDavid du Colombier }
1493e12c5d1SDavid du Colombier
1503e12c5d1SDavid du Colombier int
compare(char * a,char * b)1513e12c5d1SDavid du Colombier compare(char *a, char *b)
1523e12c5d1SDavid du Colombier {
1533e12c5d1SDavid du Colombier while(*a == *b){
1543e12c5d1SDavid du Colombier if(*a == '\0')
1553e12c5d1SDavid du Colombier return 0;
1563e12c5d1SDavid du Colombier a++;
1573e12c5d1SDavid du Colombier b++;
1583e12c5d1SDavid du Colombier }
1593e12c5d1SDavid du Colombier if(*a < *b)
1603e12c5d1SDavid du Colombier return 1;
1613e12c5d1SDavid du Colombier return 2;
1623e12c5d1SDavid du Colombier }
1633e12c5d1SDavid du Colombier
1643e12c5d1SDavid du Colombier Biobuf*
openfil(char * s)1653e12c5d1SDavid du Colombier openfil(char *s)
1663e12c5d1SDavid du Colombier {
1673e12c5d1SDavid du Colombier Biobuf *b;
1683e12c5d1SDavid du Colombier
1693e12c5d1SDavid du Colombier if(s[0]=='-' && s[1]==0)
1703e12c5d1SDavid du Colombier s = "/fd/0";
1713e12c5d1SDavid du Colombier b = Bopen(s, OREAD);
1723e12c5d1SDavid du Colombier if(b)
1733e12c5d1SDavid du Colombier return b;
1743e12c5d1SDavid du Colombier fprint(2,"comm: cannot open %s: %r\n",s);
1753e12c5d1SDavid du Colombier exits("open");
1763e12c5d1SDavid du Colombier return 0; /* shut up ken */
1773e12c5d1SDavid du Colombier }
178