#include <u.h>
#include <libc.h>
#include <bio.h>
#define LB 2048
int 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*);
void
main(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;
}
}
}
int
rd(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;
}
void
wr(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);
}
void
copy(Biobuf *ibuf, char *lbuf, int n)
{
do
wr(lbuf,n);
while(rd(ibuf,lbuf) >= 0);
exits(0);
}
int
compare(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 */
}
|