new utilities.
the .C files compile but are renamed to avoid building automatically.
This commit is contained in:
parent
f08fdedcee
commit
bc7cb1a15a
45 changed files with 16585 additions and 0 deletions
178
src/cmd/comm.c
Normal file
178
src/cmd/comm.c
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
#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 = 2;
|
||||
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;
|
||||
}
|
||||
}
|
||||
exits(0);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue