plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

comm.c (2125B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 
      5 #define LB 2048
      6 int	one;
      7 int	two;
      8 int	three;
      9 
     10 char	ldr[3][4] = { "", "\t", "\t\t" };
     11 
     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*);
     19 
     20 void
     21 main(int argc, char *argv[])
     22 {
     23 	int l;
     24 	char	lb1[LB],lb2[LB];
     25 
     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;
     35 
     36 	case '2':
     37 		if(!two) {
     38 			two = 1;
     39 			ldr[2][l--] = '\0';
     40 		}
     41 		break;
     42 
     43 	case '3':
     44 		three = 1;
     45 		break;
     46 
     47 	default:
     48 		goto Usage;
     49 
     50 	}ARGEND
     51 
     52 	if(argc < 2) {
     53     Usage:
     54 		fprint(2, "usage: comm [-123] file1 file2\n");
     55 		exits("usage");
     56 	}
     57 
     58 	ib1 = openfil(argv[0]);
     59 	ib2 = openfil(argv[1]);
     60 
     61 
     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);
     69 
     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;
     82 
     83 		case 1:
     84 			wr(lb1,1);
     85 			if(rd(ib1,lb1) < 0)
     86 				copy(ib2,lb2,2);
     87 			continue;
     88 
     89 		case 2:
     90 			wr(lb2,2);
     91 			if(rd(ib2,lb2) < 0)
     92 				copy(ib1,lb1,1);
     93 			continue;
     94 		}
     95 	}
     96 }
     97 
     98 int
     99 rd(Biobuf *file, char *buf)
    100 {
    101 	int i, c;
    102 
    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 }
    115 
    116 void
    117 wr(char *str, int n)
    118 {
    119 
    120 	switch(n){
    121 		case 1:
    122 			if(one)
    123 				return;
    124 			break;
    125 
    126 		case 2:
    127 			if(two)
    128 				return;
    129 			break;
    130 
    131 		case 3:
    132 			if(three)
    133 				return;
    134 	}
    135 	print("%s%s\n", ldr[n-1],str);
    136 }
    137 
    138 void
    139 copy(Biobuf *ibuf, char *lbuf, int n)
    140 {
    141 	do
    142 		wr(lbuf,n);
    143 	while(rd(ibuf,lbuf) >= 0);
    144 	exits(0);
    145 }
    146 
    147 int
    148 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 }
    160 
    161 Biobuf*
    162 openfil(char *s)
    163 {
    164 	Biobuf *b;
    165 
    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 }