#include #define LB 256 int one; int two; int three; char *ldr[3]; FILE *ib1; FILE *ib2; FILE *openfil(); main(argc,argv) char *argv[]; { int l; char lb1[LB],lb2[LB]; ldr[0] = ""; ldr[1] = "\t"; ldr[2] = "\t\t"; if(argc > 1) { if(*argv[1] == '-' && argv[1][1] != 0) { l = 1; while(*++argv[1]) { switch(*argv[1]) { 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: fprintf(stderr,"comm: illegal flag\n"); exit(1); } } argv++; argc--; } } if(argc < 3) { fprintf(stderr,"comm: arg count\n"); exit(1); } ib1 = openfil(argv[1]); ib2 = openfil(argv[2]); if(rd(ib1,lb1) < 0) { if(rd(ib2,lb2) < 0) exit(0); copy(ib2,lb2,2); } if(rd(ib2,lb2) < 0) copy(ib1,lb1,1); while(1) { switch(compare(lb1,lb2)) { case 0: wr(lb1,3); if(rd(ib1,lb1) < 0) { if(rd(ib2,lb2) < 0) exit(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; } } } rd(file,buf) FILE *file; char *buf; { register int i, c; i = 0; while((c = getc(file)) != EOF) { *buf = c; if(c == '\n' || i > LB-2) { *buf = '\0'; return(0); } i++; buf++; } return(-1); } wr(str,n) char *str; { switch(n) { case 1: if(one) return; break; case 2: if(two) return; break; case 3: if(three) return; } printf("%s%s\n",ldr[n-1],str); } copy(ibuf,lbuf,n) FILE *ibuf; char *lbuf; { do { wr(lbuf,n); } while(rd(ibuf,lbuf) >= 0); exit(0); } compare(a,b) char *a,*b; { register char *ra,*rb; ra = --a; rb = --b; while(*++ra == *++rb) if(*ra == '\0') return(0); if(*ra < *rb) return(1); return(2); } FILE *openfil(s) char *s; { FILE *b; if(s[0]=='-' && s[1]==0) b = stdin; else if((b=fopen(s,"r")) == NULL) { fprintf(stderr,"comm: cannot open %s\n",s); exit(1); } return(b); }