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