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