xref: /plan9/sys/src/cmd/comm.c (revision 9c74240406852a66155a96c0daa6f8bf6e19c93e)
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