|
|
1.1 root 1: # include "runup.h"
2: long *histrt, *hnstrt, *hnew;
3: fixib()
4: {
5: /* straighten up ia, ib */
6: FILE *fbo, *fbn, *fno, *ft;
7: long getl(), mappos();
8: int it, lgind, lgnn, nocc;
9: int *hfreq, did1, did2;
10: long l1, l2, nowat;
11: struct bibfile *bp;
12: struct newfile *np;
13: if (chatty) printf("Alterations read\n");
14: fbo = fopen("Ind.ib", "r");
15: fbn = fopen("XInd.ib", "w");
16: fno = fopen("NN.ib", "r");
17: assert(fbo!=NULL); assert(fbn!=NULL); assert(fno!=NULL);
18: /* read in old hash pointers */
19: ft = fopen("Ind.ia", "r");
20: it = getw(ft);
21: assert(it==nhash);
22: lgind = getw(ft);
23: histrt= calloc(nhash, sizeof(long));
24: for(it=0; it<nhash; it++)
25: histrt[it] = getl(ft);
26: fclose(ft);
27: /* read in supplementary hash pointers */
28: ft = fopen("NN.ia", "r");
29: it = getw(ft);
30: assert(it==nhash);
31: lgnn = getw(ft);
32: hnstrt= calloc(nhash, sizeof(long));
33: for(it=0; it<nhash; it++)
34: hnstrt[it] = getl(ft);
35: fclose(ft);
36:
37: # if D3
38: /* temporarily, dump the NN hash file */
39: for(it=0; it<nhash; it++)
40: {
41: fseek (fno, hnstrt[it], 0);
42: while ((l2 = lgnn ? getl(fno) : (long)(getw(fno)))>=0)
43: printf("hash %d in %ld\n",it, l2);
44: }
45: # endif
46: # if D1
47: printf("in fixib, lgind %d lgnn %d lgout %d nhash %d\n",lgind,lgnn,lgout, nhash);
48: # endif
49: /* now read through the hash files */
50: hnew = calloc(nhash, sizeof(long));
51: hfreq = calloc(nhash, sizeof(int));
52: nowat=0;
53: for(it=0; it <nhash; it++)
54: {
55: if (verbose && (it%100)==0)
56: printf("at hash %d got %.1f of %d sec.\n", it, tuse(), tlapse());
57: fseek (fbo, histrt[it], 0);
58: fseek (fno, hnstrt[it], 0);
59: hnew[it]=nowat;
60: bp = bibs;
61: nocc = 0;
62: did1 = did2 = 0;
63: np = news;
64: l1 = lgind ? getl(fbo) : (long)(getw(fbo));
65: l2 = lgnn ? getl(fno) : (long)(getw(fno));
66: if (l1 == -1 && l2 == -1)
67: {
68: # if D1
69: printf(" none at hash %d\n",it);
70: # endif
71: if (nowat > 0)
72: hnew[it] = nowat - (lgout ? 4 : 2);
73: else
74: lgout ? putl(-1L,fbn) : putw(-1,fbn);
75: nowat =ftell(fbn);
76: hfreq[it] = 0;
77: continue;
78: }
79: # if D1
80: printf("Seeding at hash %d l1 %ld l2 %ld\n",it,l1,l2);
81: # endif
82: while (l1 != -1 || l2 != -1)
83: {
84: # if D2
85: if(vhash==it) printf("loop: l1 %ld l2 %ld bp %d np %d\n",l1,l2,bp-bibs,np-news);
86: # endif
87: if (l1>=0 && did1==0)
88: {
89: for (; bp->bibfno >=0 && bp->bibival<l1; bp++)
90: ;
91: # if D2
92: if(vhash==it) printf("bp now %d\n",bp-bibs);
93: # endif
94: if (bp->bibfno >=0 && l1 == bp->bibival)
95: {
96: # if D2
97: if(vhash==it) printf("Matched bibval, ignoring %ld\n",l1);
98: # endif
99: l1 = lgind ? getl(fbo) : (long)(getw(fbo));
100: did1=0;
101: # if D2
102: if(vhash==it) printf("New l1 read as %ld\n",l1);
103: # endif
104: continue;
105: }
106: l1 = mappos(l1);
107: # if D2
108: if(vhash==it) printf("after mappos offset l1 %ld\n",l1);
109: # endif
110: if (l1>=ins1) l1 += add;
111: # if D2
112: if(vhash==it) printf("l1 finally is %ld\n",l1);
113: # endif
114: did1=1;
115: }
116: if (l2>=0 && did2==0)
117: {
118: for(; np->nn_ic>=0 && np->nn_ic < l2; np++);
119: l2 = np->new_ic;
120: # if D2
121: if(vhash==it) printf("np at %d l2 now %ld\n",np-news,l2);
122: # endif
123: if (l2>=ins2) l2 += add;
124: # if D2
125: if(vhash==it) printf("l2 finally is %ld\n",l2);
126: # endif
127: did2=1;
128: }
129: if (l1 >=0 && (l2 == -1 || l1<l2))
130: {
131: # if D2
132: if(vhash==it) printf("Writing l1 %ld not l2 %ld lgout %d\n",l1,l2,lgout);
133: # endif
134: lgout ? putl(l1,fbn) : putw((int)l1,fbn);
135: l1 = lgind ? getl(fbo) : (long)(getw(fbo));
136: did1=0;
137: # if D2
138: if(vhash==it) printf("New l1 is %ld\n",l1);
139: # endif
140: nocc++;
141: continue;
142: }
143: if (l2 >= 0 && (l1 == -1 || l2<l1))
144: {
145: # if D2
146: if(vhash==it) printf("Writing l2 %ld not l1 %ld lgout %d \n",l2,l1,lgout);
147: # endif
148: lgout ? putl(l2,fbn) : putw((int)l2,fbn);
149: l2 = lgnn ? getl(fno) : (long)(getw(fno));
150: # if D2
151: if(vhash==it) printf("New l2 %ld\n",l2);
152: # endif
153: did2=0;
154: nocc++;
155: continue;
156: }
157: # if D1
158: printf("bad case l1 %ld l2 %ld\n",l1,l2);
159: # endif
160: assert(0);
161: }
162: lgout ? putl(-1L, fbn) : putw(-1, fbn);
163: nowat = ftell(fbn);
164: hfreq[it] = nocc;
165: }
166: fclose(fbn);
167: fbn = fopen("XInd.ia", "w");
168: assert(fbn!=NULL);
169: putw(nhash, fbn);
170: putw(lgout, fbn);
171: for(it=0; it<nhash; it++)
172: putl(hnew[it], fbn);
173: for(it=0; it<nhash; it++)
174: putw(hfreq[it], fbn);
175: fclose(fbn);
176: }
177: long
178: getl(f)
179: FILE *f;
180: {
181: long in;
182: int j;
183: j = fread(&in, sizeof(long), 1, f);
184: if (j<=0) return(-1L);
185: return(in);
186: }
187: putl(l, f)
188: long l;
189: FILE *f;
190: {
191: int i,j;
192: i = l>>16;
193: j = l;
194: putw(i,f);
195: putw(j,f);
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.