#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 */}
#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 */
}