#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#define LB 2048 | |
int one; | |
int two; | |
int three; | |
char ldr[3][4] = { "", "\t", "\t\t" }; | |
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]; | |
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 = unsharp("#d/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 */ | |
} |