|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)hunt2.c 4.3 (Berkeley) 7/29/85";
3: #endif
4:
5: #include "refer..c"
6:
7: static int *coord = 0;
8: int hh[50];
9: extern int *hfreq, hfrflg, hcomp(), hexch();
10: extern int prfreqs;
11:
12: doquery(hpt, nhash, fb, nitem, qitem, master)
13: long *hpt;
14: FILE *fb;
15: char *qitem[];
16: union ptr {
17: unsigned *a;
18: long *b;
19: } master;
20: {
21: long k;
22: union ptr prevdrop;
23: int nf = 0, best = 0, nterm = 0, i, g, j;
24: int *prevcoord;
25: long lp;
26: extern int lmaster, colevel, reached;
27: long getl();
28: unsigned getw();
29: extern int iflong;
30:
31: # if D1
32: fprintf(stderr, "entering doquery nitem %d\n",nitem);
33: fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);
34: fprintf(stderr, "and frequencies are %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);
35: # endif
36: _assert (lmaster>0);
37: if (coord==0)
38: coord = (int *) zalloc(lmaster, sizeof(lmaster));
39: if (colevel>0)
40: {
41: if (iflong)
42: prevdrop.b = (long *) zalloc(lmaster, sizeof(long));
43: else
44: prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int));
45: prevcoord = (int *) zalloc(lmaster, sizeof(lmaster));
46: }
47: else
48: {
49: prevdrop.a=master.a;
50: prevcoord=coord;
51: }
52: # if D1
53: fprintf(stderr, "nitem %d\n",nitem);
54: # endif
55: for(i=0; i<nitem; i++)
56: {
57: hh[i] = hash(qitem[i])%nhash;
58: # if D1
59: fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
60: # endif
61: }
62: # if D1
63: fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
64: # endif
65: if (prfreqs)
66: for(i=0; i<nitem; i++)
67: fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
68: /* if possible, sort query into decreasing frequency of hashes */
69: if (hfrflg)
70: shell (nitem, hcomp, hexch);
71: # if D1
72: for(i=0; i<nitem; i++)
73: fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
74: # endif
75: lp = hpt [hh[0]];
76: # if D1
77: fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
78: # endif
79: _assert (fb!=NULL);
80: _assert (fseek(fb, lp, 0) != -1);
81: for(i=0; i<lmaster; i++)
82: {
83: if (iflong)
84: master.b[i] = getl(fb);
85: else
86: master.a[i] = getw(fb);
87: coord[i]=1;
88: # if D2
89: if (iflong)
90: fprintf(stderr,"master has %ld\n",(master.b[i]));
91: else
92: fprintf(stderr,"master has %d\n",(master.a[i]));
93: # endif
94: _assert (i<lmaster);
95: if (iflong)
96: {
97: if (master.b[i] == -1L) break;
98: }
99: else
100: {
101: if (master.a[i] == -1) break;
102: }
103: }
104: nf= i;
105: for(nterm=1; nterm<nitem; nterm++)
106: {
107: # ifdef D1
108: fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
109: # endif
110: if (colevel>0)
111: {
112: for(j=0; j<nf; j++)
113: {
114: if (iflong)
115: prevdrop.b[j] = master.b[j];
116: else
117: prevdrop.a[j] = master.a[j];
118: prevcoord[j] = coord[j];
119: }
120: }
121: lp = hpt[hh[nterm]];
122: _assert (fseek(fb, lp, 0) != -1);
123: # if D1
124: fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
125: # endif
126: g=j=0;
127: while (1)
128: {
129: if (iflong)
130: k = getl(fb);
131: else
132: k = getw(fb);
133: if (k== -1) break;
134: # if D2
135: fprintf(stderr,"next term finds %ld\n",k);
136: # endif
137: # if D3
138: if (iflong)
139: fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
140: else
141: fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
142: # endif
143: while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
144: {
145: # if D3
146: if (iflong)
147: fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
148: j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
149: else
150: fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
151: j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
152: # endif
153: if (prevcoord[j] + colevel <= nterm)
154: j++;
155: else
156: {
157: _assert (g<lmaster);
158: if (iflong)
159: master.b[g] = prevdrop.b[j];
160: else
161: master.a[g] = prevdrop.a[j];
162: coord[g++] = prevcoord[j++];
163: # if D1
164: if (iflong)
165: fprintf(stderr, " not skip g %d doc %d coord %d note %d\n",g,master.b[g-1], coord[g-1],master.b[j-1]);
166: else
167: fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,master.a[g-1], coord[g-1],nterm);
168: # endif
169: continue;
170: }
171: }
172: if (colevel==0 && j>=nf) break;
173: if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
174: {
175: if (iflong)
176: master.b[g]=k;
177: else
178: master.a[g]=k;
179: coord[g++] = prevcoord[j++]+1;
180: # if D1
181: if (iflong)
182: fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,master.b[g-1],coord[g-1],master.b[j-1]);
183: else
184: fprintf(stderr, " at g %d item %d coord %d note %d\n",g,master.a[g-1],coord[g-1],master.a[j-1]);
185: # endif
186: }
187: else
188: if (colevel >= nterm)
189: {
190: if (iflong)
191: master.b[g]=k;
192: else
193: master.a[g]=k;
194: coord[g++] = 1;
195: }
196: }
197: # if D1
198: fprintf(stderr,"now have %d items\n",g);
199: # endif
200: if (colevel>0)
201: for ( ; j<nf; j++)
202: if (prevcoord[j]+colevel > nterm)
203: {
204: _assert(g<lmaster);
205: if (iflong)
206: master.b[g] = prevdrop.b[j];
207: else
208: master.a[g] = prevdrop.a[j];
209: coord[g++] = prevcoord[j];
210: # if D3
211: if(iflong)
212: fprintf(stderr, "copied over %ld coord %d\n",master.b[g-1], coord[g-1]);
213: else
214: fprintf(stderr, "copied over %d coord %d\n",master.a[g-1], coord[g-1]);
215: # endif
216: }
217: nf = g;
218: }
219: if (colevel>0)
220: {
221: best=0;
222: for(j=0; j<nf; j++)
223: if (coord[j]>best) best = coord[j];
224: # if D1
225: fprintf(stderr, "colevel %d best %d\n", colevel, best);
226: # endif
227: reached = best;
228: for(g=j=0; j<nf; j++)
229: if (coord[j]==best)
230: {
231: if (iflong)
232: master.b[g++] = master.b[j];
233: else
234: master.a[g++] = master.a[j];
235: }
236: nf=g;
237: # if D1
238: fprintf(stderr, "yet got %d\n",nf);
239: # endif
240: }
241: # ifdef D1
242: fprintf(stderr, " returning with %d\n",nf);
243: # endif
244: if (colevel)
245: {
246: free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
247: free(prevcoord, lmaster, sizeof (lmaster));
248: }
249: # if D3
250: for(g=0;g<nf;g++)
251: if(iflong)
252: fprintf(stderr,":%ld\n",master.b[g]);
253: else
254: fprintf(stderr,":%d\n",master.a[g]);
255: # endif
256: return(nf);
257: }
258:
259: long
260: getl(fb)
261: FILE *fb;
262: {
263: return(getw(fb));
264: }
265:
266: putl(ll, f)
267: long ll;
268: FILE *f;
269: {
270: putw(ll, f);
271: }
272:
273: hcomp( n1, n2)
274: {
275: return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
276: }
277:
278: hexch( n1, n2 )
279: {
280: int t;
281: t = hh[n1];
282: hh[n1] = hh[n2];
283: hh[n2] = t;
284: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.