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