177 lines · 2.1 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h> #define LB 2048int	one;int	two;int	three; char	*ldr[3]; Biobuf *ib1;Biobuf *ib2;Biobuf *openfil(char*);int	rd(Biobuf*, char*);void	wr(char*, int);void	copy(Biobuf*, char*, int);int	compare(char*, char*); voidmain(int argc, char *argv[]){	int l;	char	lb1[LB],lb2[LB]; 	ldr[0] = "";	ldr[1] = "\t";	ldr[2] = "\t\t";	l = 1;	ARGBEGIN{	case '1':		if(!one) {			one = 1;			ldr[1][0] =			ldr[2][l--] = '\0';		}		break; 	case '2':		if(!two) {			two = 1;			ldr[2][l--] = '\0';		}		break; 	case '3':		three = 1;		break; 	default:		goto Usage; 	}ARGEND 	if(argc < 2) {    Usage:		fprint(2, "usage: comm [-123] file1 file2\n");		exits("usage");	} 	ib1 = openfil(argv[0]);	ib2 = openfil(argv[1]);  	if(rd(ib1,lb1) < 0){		if(rd(ib2,lb2) < 0)			exits(0);		copy(ib2,lb2,2);	}	if(rd(ib2,lb2) < 0)		copy(ib1,lb1,1); 	for(;;){		switch(compare(lb1,lb2)) {		case 0:			wr(lb1,3);			if(rd(ib1,lb1) < 0) {				if(rd(ib2,lb2) < 0)					exits(0);				copy(ib2,lb2,2);			}			if(rd(ib2,lb2) < 0)				copy(ib1,lb1,1);			continue; 		case 1:			wr(lb1,1);			if(rd(ib1,lb1) < 0)				copy(ib2,lb2,2);			continue; 		case 2:			wr(lb2,2);			if(rd(ib2,lb2) < 0)				copy(ib1,lb1,1);			continue;		}	}} intrd(Biobuf *file, char *buf){	int i, c; 	i = 0;	while((c = Bgetc(file)) != Beof) {		*buf = c;		if(c == '\n' || i > LB-2) {			*buf = '\0';			return 0;		}		i++;		buf++;	}	return -1;} voidwr(char *str, int n){ 	switch(n){		case 1:			if(one)				return;			break; 		case 2:			if(two)				return;			break; 		case 3:			if(three)				return;	}	print("%s%s\n", ldr[n-1],str);} voidcopy(Biobuf *ibuf, char *lbuf, int n){	do		wr(lbuf,n);	while(rd(ibuf,lbuf) >= 0);	exits(0);} intcompare(char *a, char *b){	while(*a == *b){		if(*a == '\0')			return 0;		a++;		b++;	}	if(*a < *b)		return 1;	return 2;} Biobuf*openfil(char *s){	Biobuf *b; 	if(s[0]=='-' && s[1]==0)		s = "/fd/0";	b = Bopen(s, OREAD);	if(b)		return b;	fprint(2,"comm: cannot open %s: %r\n",s);	exits("open");	return 0;	/* shut up ken */}