2003-11-23 18:04:47 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
#include <bio.h>
|
|
|
|
|
|
|
|
#define LB 2048
|
|
|
|
int one;
|
|
|
|
int two;
|
|
|
|
int three;
|
|
|
|
|
2004-04-19 19:35:17 +00:00
|
|
|
char ldr[3][4] = { "", "\t", "\t\t" };
|
2003-11-23 18:04:47 +00:00
|
|
|
|
|
|
|
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];
|
|
|
|
|
2004-12-25 01:54:02 +00:00
|
|
|
l = 1;
|
2003-11-23 18:04:47 +00:00
|
|
|
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)
|
2005-01-14 20:08:31 +00:00
|
|
|
s = unsharp("#d/0");
|
2003-11-23 18:04:47 +00:00
|
|
|
b = Bopen(s, OREAD);
|
|
|
|
if(b)
|
|
|
|
return b;
|
|
|
|
fprint(2,"comm: cannot open %s: %r\n",s);
|
|
|
|
exits("open");
|
|
|
|
return 0; /* shut up ken */
|
|
|
|
}
|