1*48296Sbostic /*-
2*48296Sbostic * %sccs.include.proprietary.c%
3*48296Sbostic */
4*48296Sbostic
512284Stut #ifndef lint
6*48296Sbostic static char sccsid[] = "@(#)hunt2.c 4.6 (Berkeley) 04/18/91";
7*48296Sbostic #endif /* not lint */
812284Stut
912284Stut #include "refer..c"
1012284Stut
1112284Stut static int *coord = 0;
1212284Stut int hh[50];
1312284Stut extern int *hfreq, hfrflg, hcomp(), hexch();
1412284Stut extern int prfreqs;
1512284Stut
doquery(hpt,nhash,fb,nitem,qitem,master)1612284Stut doquery(hpt, nhash, fb, nitem, qitem, master)
1712284Stut long *hpt;
1812284Stut FILE *fb;
1912284Stut char *qitem[];
2032269Sbostic unsigned *master;
2112284Stut {
2232269Sbostic union ptr {
2332269Sbostic unsigned *a;
2432269Sbostic long *b;
2532269Sbostic } umaster;
2612284Stut long k;
2712284Stut union ptr prevdrop;
2812284Stut int nf = 0, best = 0, nterm = 0, i, g, j;
2912284Stut int *prevcoord;
3012284Stut long lp;
3112284Stut extern int lmaster, colevel, reached;
3212284Stut long getl();
3312284Stut extern int iflong;
3412284Stut
3512284Stut # if D1
3612284Stut fprintf(stderr, "entering doquery nitem %d\n",nitem);
3712284Stut fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);
3812284Stut fprintf(stderr, "and frequencies are %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);
3912284Stut # endif
4032269Sbostic if (iflong)
4132269Sbostic umaster.b = (long *) master;
4232269Sbostic else
4332269Sbostic umaster.a = master;
4412284Stut _assert (lmaster>0);
4512284Stut if (coord==0)
4617679Sralph coord = (int *) zalloc(lmaster, sizeof(lmaster));
4712284Stut if (colevel>0)
4812284Stut {
4917679Sralph if (iflong)
5017679Sralph prevdrop.b = (long *) zalloc(lmaster, sizeof(long));
5117679Sralph else
5217679Sralph prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int));
5317679Sralph prevcoord = (int *) zalloc(lmaster, sizeof(lmaster));
5412284Stut }
5512284Stut else
5612284Stut {
5732269Sbostic prevdrop.a=umaster.a;
5812284Stut prevcoord=coord;
5912284Stut }
6012284Stut # if D1
6112284Stut fprintf(stderr, "nitem %d\n",nitem);
6212284Stut # endif
6312284Stut for(i=0; i<nitem; i++)
6412284Stut {
6512284Stut hh[i] = hash(qitem[i])%nhash;
6612284Stut # if D1
6712284Stut fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
6812284Stut # endif
6912284Stut }
7012284Stut # if D1
7112284Stut fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
7212284Stut # endif
7312284Stut if (prfreqs)
7412284Stut for(i=0; i<nitem; i++)
7512284Stut fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
7612284Stut /* if possible, sort query into decreasing frequency of hashes */
7712284Stut if (hfrflg)
7812284Stut shell (nitem, hcomp, hexch);
7912284Stut # if D1
8012284Stut for(i=0; i<nitem; i++)
8112284Stut fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
8212284Stut # endif
8312284Stut lp = hpt [hh[0]];
8412284Stut # if D1
8512284Stut fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
8612284Stut # endif
8712284Stut _assert (fb!=NULL);
8824070Sbloom _assert (fseek(fb, lp, 0) != -1);
8912284Stut for(i=0; i<lmaster; i++)
9012284Stut {
9112284Stut if (iflong)
9232269Sbostic umaster.b[i] = getl(fb);
9312284Stut else
9432269Sbostic umaster.a[i] = getw(fb);
9512284Stut coord[i]=1;
9612284Stut # if D2
9712284Stut if (iflong)
9832269Sbostic fprintf(stderr,"umaster has %ld\n",(umaster.b[i]));
9912284Stut else
10032269Sbostic fprintf(stderr,"umaster has %d\n",(umaster.a[i]));
10112284Stut # endif
10212284Stut _assert (i<lmaster);
10312284Stut if (iflong)
10412284Stut {
10532269Sbostic if (umaster.b[i] == -1L) break;
10612284Stut }
10712284Stut else
10812284Stut {
10932269Sbostic if (umaster.a[i] == -1) break;
11012284Stut }
11112284Stut }
11212284Stut nf= i;
11312284Stut for(nterm=1; nterm<nitem; nterm++)
11412284Stut {
11512284Stut # ifdef D1
11612284Stut fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
11712284Stut # endif
11812284Stut if (colevel>0)
11912284Stut {
12012284Stut for(j=0; j<nf; j++)
12112284Stut {
12212284Stut if (iflong)
12332269Sbostic prevdrop.b[j] = umaster.b[j];
12412284Stut else
12532269Sbostic prevdrop.a[j] = umaster.a[j];
12612284Stut prevcoord[j] = coord[j];
12712284Stut }
12812284Stut }
12912284Stut lp = hpt[hh[nterm]];
13024070Sbloom _assert (fseek(fb, lp, 0) != -1);
13112284Stut # if D1
13212284Stut fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
13312284Stut # endif
13412284Stut g=j=0;
13512284Stut while (1)
13612284Stut {
13712284Stut if (iflong)
13812284Stut k = getl(fb);
13912284Stut else
14012284Stut k = getw(fb);
14112284Stut if (k== -1) break;
14212284Stut # if D2
14312284Stut fprintf(stderr,"next term finds %ld\n",k);
14412284Stut # endif
14512284Stut # if D3
14612284Stut if (iflong)
14712284Stut fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
14812284Stut else
14912284Stut fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
15012284Stut # endif
15112284Stut while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
15212284Stut {
15312284Stut # if D3
15412284Stut if (iflong)
15512284Stut fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15612284Stut j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
15712284Stut else
15812284Stut fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15912284Stut j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
16012284Stut # endif
16112284Stut if (prevcoord[j] + colevel <= nterm)
16212284Stut j++;
16312284Stut else
16412284Stut {
16512284Stut _assert (g<lmaster);
16612284Stut if (iflong)
16732269Sbostic umaster.b[g] = prevdrop.b[j];
16812284Stut else
16932269Sbostic umaster.a[g] = prevdrop.a[j];
17012284Stut coord[g++] = prevcoord[j++];
17112284Stut # if D1
17212284Stut if (iflong)
17332269Sbostic fprintf(stderr, " not skip g %d doc %d coord %d note %d\n",g,umaster.b[g-1], coord[g-1],umaster.b[j-1]);
17412284Stut else
17532269Sbostic fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,umaster.a[g-1], coord[g-1],nterm);
17612284Stut # endif
17712284Stut continue;
17812284Stut }
17912284Stut }
18012284Stut if (colevel==0 && j>=nf) break;
18112284Stut if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
18212284Stut {
18312284Stut if (iflong)
18432269Sbostic umaster.b[g]=k;
18512284Stut else
18632269Sbostic umaster.a[g]=k;
18712284Stut coord[g++] = prevcoord[j++]+1;
18812284Stut # if D1
18912284Stut if (iflong)
19032269Sbostic fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,umaster.b[g-1],coord[g-1],umaster.b[j-1]);
19112284Stut else
19232269Sbostic fprintf(stderr, " at g %d item %d coord %d note %d\n",g,umaster.a[g-1],coord[g-1],umaster.a[j-1]);
19312284Stut # endif
19412284Stut }
19512284Stut else
19612284Stut if (colevel >= nterm)
19712284Stut {
19812284Stut if (iflong)
19932269Sbostic umaster.b[g]=k;
20012284Stut else
20132269Sbostic umaster.a[g]=k;
20212284Stut coord[g++] = 1;
20312284Stut }
20412284Stut }
20512284Stut # if D1
20612284Stut fprintf(stderr,"now have %d items\n",g);
20712284Stut # endif
20812284Stut if (colevel>0)
20912284Stut for ( ; j<nf; j++)
21017679Sralph if (prevcoord[j]+colevel > nterm)
21112284Stut {
21212284Stut _assert(g<lmaster);
21312284Stut if (iflong)
21432269Sbostic umaster.b[g] = prevdrop.b[j];
21512284Stut else
21632269Sbostic umaster.a[g] = prevdrop.a[j];
21712284Stut coord[g++] = prevcoord[j];
21812284Stut # if D3
21912284Stut if(iflong)
22032269Sbostic fprintf(stderr, "copied over %ld coord %d\n",umaster.b[g-1], coord[g-1]);
22112284Stut else
22232269Sbostic fprintf(stderr, "copied over %d coord %d\n",umaster.a[g-1], coord[g-1]);
22312284Stut # endif
22412284Stut }
22512284Stut nf = g;
22612284Stut }
22712284Stut if (colevel>0)
22812284Stut {
22912284Stut best=0;
23012284Stut for(j=0; j<nf; j++)
23112284Stut if (coord[j]>best) best = coord[j];
23212284Stut # if D1
23312284Stut fprintf(stderr, "colevel %d best %d\n", colevel, best);
23412284Stut # endif
23512284Stut reached = best;
23612284Stut for(g=j=0; j<nf; j++)
23712284Stut if (coord[j]==best)
23812284Stut {
23912284Stut if (iflong)
24032269Sbostic umaster.b[g++] = umaster.b[j];
24112284Stut else
24232269Sbostic umaster.a[g++] = umaster.a[j];
24312284Stut }
24412284Stut nf=g;
24512284Stut # if D1
24612284Stut fprintf(stderr, "yet got %d\n",nf);
24712284Stut # endif
24812284Stut }
24912284Stut # ifdef D1
25012284Stut fprintf(stderr, " returning with %d\n",nf);
25112284Stut # endif
25212284Stut if (colevel)
25312284Stut {
25412284Stut free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
25512284Stut free(prevcoord, lmaster, sizeof (lmaster));
25612284Stut }
25712284Stut # if D3
25812284Stut for(g=0;g<nf;g++)
25912284Stut if(iflong)
26032269Sbostic fprintf(stderr,":%ld\n",umaster.b[g]);
26112284Stut else
26232269Sbostic fprintf(stderr,":%d\n",umaster.a[g]);
26312284Stut # endif
26412284Stut return(nf);
26512284Stut }
26612284Stut
26712284Stut long
getl(fb)26812284Stut getl(fb)
26912284Stut FILE *fb;
27012284Stut {
27112284Stut return(getw(fb));
27212284Stut }
27312284Stut
putl(ll,f)27412284Stut putl(ll, f)
27512284Stut long ll;
27612284Stut FILE *f;
27712284Stut {
27812284Stut putw(ll, f);
27912284Stut }
28012284Stut
hcomp(n1,n2)28112284Stut hcomp( n1, n2)
28212284Stut {
28312284Stut return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
28412284Stut }
28512284Stut
hexch(n1,n2)28612284Stut hexch( n1, n2 )
28712284Stut {
28812284Stut int t;
28912284Stut t = hh[n1];
29012284Stut hh[n1] = hh[n2];
29112284Stut hh[n2] = t;
29212284Stut }
293