|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: ! 6: #define C 3 ! 7: #define RANGE 30 ! 8: #define LEN 255 ! 9: #define INF 16384 ! 10: ! 11: char *text[2][RANGE]; ! 12: long lineno[2] = {1, 1}; /*no. of 1st stored line in each file*/ ! 13: int ntext[2]; /*number of stored lines in each*/ ! 14: long n0,n1; /*scan pointer in each*/ ! 15: int bflag; ! 16: int debug = 0; ! 17: FILE *file[2]; ! 18: ! 19: /* return pointer to line n of file f*/ ! 20: char *getl(f,n) ! 21: long n; ! 22: { ! 23: register char *t; ! 24: char *malloc(); ! 25: register delta, nt; ! 26: again: ! 27: delta = n - lineno[f]; ! 28: nt = ntext[f]; ! 29: if(delta<0) ! 30: progerr("1"); ! 31: if(delta<nt) ! 32: return(text[f][delta]); ! 33: if(delta>nt) ! 34: progerr("2"); ! 35: if(nt>=RANGE) ! 36: progerr("3"); ! 37: if(feof(file[f])) ! 38: return(NULL); ! 39: t = text[f][nt]; ! 40: if(t==0) { ! 41: t = text[f][nt] = malloc(LEN+1); ! 42: if(t==NULL) ! 43: if(hardsynch()) ! 44: goto again; ! 45: else ! 46: progerr("5"); ! 47: } ! 48: t = fgets(t,LEN,file[f]); ! 49: if(t!=NULL) ! 50: ntext[f]++; ! 51: return(t); ! 52: } ! 53: ! 54: /*remove thru line n of file f from storage*/ ! 55: clrl(f,n) ! 56: long n; ! 57: { ! 58: register i,j; ! 59: j = n-lineno[f]+1; ! 60: for(i=0;i+j<ntext[f];i++) ! 61: movstr(text[f][i+j],text[f][i]); ! 62: lineno[f] = n+1; ! 63: ntext[f] -= j; ! 64: } ! 65: ! 66: movstr(s,t) ! 67: register char *s, *t; ! 68: { ! 69: while(*t++= *s++) ! 70: continue; ! 71: } ! 72: ! 73: main(argc,argv) ! 74: char **argv; ! 75: { ! 76: char *s0,*s1; ! 77: FILE *dopen(); ! 78: int anydiff = 0; ! 79: while(*argv[1]=='-' && argv[1][1]!=0) { ! 80: argc--; ! 81: argv++; ! 82: while(*++argv[0]) ! 83: if(*argv[0]=='b') ! 84: bflag++; ! 85: } ! 86: if(argc!=3) ! 87: error("must have 2 file arguments",""); ! 88: file[0] = dopen(argv[1],argv[2]); ! 89: file[1] = dopen(argv[2],argv[1]); ! 90: for(;;) { ! 91: s0 = getl(0,++n0); ! 92: s1 = getl(1,++n1); ! 93: if(s0==NULL||s1==NULL) ! 94: break; ! 95: if(cmp(s0,s1)!=0) { ! 96: anydiff = 1; ! 97: if(!easysynch()&&!hardsynch()) ! 98: progerr("5"); ! 99: } else { ! 100: clrl(0,n0); ! 101: clrl(1,n1); ! 102: } ! 103: } ! 104: if(s0==NULL&&s1==NULL) ! 105: return anydiff; ! 106: if(s0==NULL) ! 107: output(-1,INF); ! 108: if(s1==NULL) ! 109: output(INF,-1); ! 110: return 1; ! 111: } ! 112: ! 113: /* synch on C successive matches*/ ! 114: easysynch() ! 115: { ! 116: int i,j; ! 117: register k,m; ! 118: char *s0,*s1; ! 119: for(i=j=1;i<RANGE&&j<RANGE;i++,j++) { ! 120: s0 = getl(0,n0+i); ! 121: if(s0==NULL) ! 122: return(output(INF,INF)); ! 123: for(k=C-1;k<j;k++) { ! 124: for(m=0;m<C;m++) ! 125: if(cmp(getl(0,n0+i-m), ! 126: getl(1,n1+k-m))!=0) ! 127: goto cont1; ! 128: return(output(i-C,k-C)); ! 129: cont1: ; ! 130: } ! 131: s1 = getl(1,n1+j); ! 132: if(s1==NULL) ! 133: return(output(INF,INF)); ! 134: for(k=C-1;k<=i;k++) { ! 135: for(m=0;m<C;m++) ! 136: if(cmp(getl(0,n0+k-m), ! 137: getl(1,n1+j-m))!=0) ! 138: goto cont2; ! 139: return(output(k-C,j-C)); ! 140: cont2: ; ! 141: } ! 142: } ! 143: return(0); ! 144: } ! 145: ! 146: output(a,b) ! 147: { ! 148: register i; ! 149: char *s; ! 150: if(a<0) ! 151: change(n0-1,0,n1,b,"a"); ! 152: else if(b<0) ! 153: change(n0,a,n1-1,0,"d"); ! 154: else ! 155: change(n0,a,n1,b,"c"); ! 156: for(i=0;i<=a;i++) { ! 157: s = getl(0,n0+i); ! 158: if(s==NULL) ! 159: break; ! 160: printf("< %s",s); ! 161: clrl(0,n0+i); ! 162: } ! 163: n0 += i-1; ! 164: if(a>=0&&b>=0) ! 165: printf("---\n"); ! 166: for(i=0;i<=b;i++) { ! 167: s = getl(1,n1+i); ! 168: if(s==NULL) ! 169: break; ! 170: printf("> %s",s); ! 171: clrl(1,n1+i); ! 172: } ! 173: n1 += i-1; ! 174: return(1); ! 175: } ! 176: ! 177: change(a,b,c,d,s) ! 178: long a,c; ! 179: char *s; ! 180: { ! 181: range(a,b); ! 182: printf("%s",s); ! 183: range(c,d); ! 184: printf("\n"); ! 185: } ! 186: ! 187: range(a,b) ! 188: long a; ! 189: { ! 190: if(b==INF) ! 191: printf("%ld,$",a); ! 192: else if(b==0) ! 193: printf("%ld",a); ! 194: else ! 195: printf("%ld,%ld",a,a+b); ! 196: } ! 197: ! 198: cmp(s,t) ! 199: char *s,*t; ! 200: { ! 201: if(debug) ! 202: printf("%s:%s\n",s,t); ! 203: for(;;){ ! 204: if(bflag&&isspace(*s)&&isspace(*t)) { ! 205: while(isspace(*++s)) ; ! 206: while(isspace(*++t)) ; ! 207: } ! 208: if(*s!=*t||*s==0) ! 209: break; ! 210: s++; ! 211: t++; ! 212: } ! 213: return(*s-*t); ! 214: } ! 215: ! 216: FILE *dopen(f1,f2) ! 217: char *f1,*f2; ! 218: { ! 219: FILE *f; ! 220: char b[100],*bptr,*eptr; ! 221: struct stat statbuf; ! 222: if(cmp(f1,"-")==0) ! 223: if(cmp(f2,"-")==0) ! 224: error("can't do - -",""); ! 225: else ! 226: return(stdin); ! 227: if(stat(f1,&statbuf)==-1) ! 228: error("can't access ",f1); ! 229: if((statbuf.st_mode&S_IFMT)==S_IFDIR) { ! 230: for(bptr=b;*bptr= *f1++;bptr++) ; ! 231: *bptr++ = '/'; ! 232: for(eptr=f2;*eptr;eptr++) ! 233: if(*eptr=='/'&&eptr[1]!=0&&eptr[1]!='/') ! 234: f2 = eptr+1; ! 235: while(*bptr++= *f2++) ; ! 236: f1 = b; ! 237: } ! 238: f = fopen(f1,"r"); ! 239: if(f==NULL) ! 240: error("can't open",f1); ! 241: return(f); ! 242: } ! 243: ! 244: ! 245: progerr(s) ! 246: char *s; ! 247: { ! 248: error("program error ",s); ! 249: } ! 250: ! 251: error(s,t) ! 252: char *s,*t; ! 253: { ! 254: fprintf(stderr,"diffh: %s%s\n",s,t); ! 255: exit(2); ! 256: } ! 257: ! 258: /*stub for resychronization beyond limits of text buf*/ ! 259: hardsynch() ! 260: { ! 261: change(n0,INF,n1,INF,"c"); ! 262: printf("---change record omitted\n"); ! 263: error("can't resynchronize",""); ! 264: return(0); ! 265: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.