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