|
|
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.