112284Stut #ifndef lint 2*32269Sbostic static char *sccsid = "@(#)hunt2.c 4.5 (Berkeley) 09/28/87"; 312284Stut #endif 412284Stut 512284Stut #include "refer..c" 612284Stut 712284Stut static int *coord = 0; 812284Stut int hh[50]; 912284Stut extern int *hfreq, hfrflg, hcomp(), hexch(); 1012284Stut extern int prfreqs; 1112284Stut 1212284Stut doquery(hpt, nhash, fb, nitem, qitem, master) 1312284Stut long *hpt; 1412284Stut FILE *fb; 1512284Stut char *qitem[]; 16*32269Sbostic unsigned *master; 1712284Stut { 18*32269Sbostic union ptr { 19*32269Sbostic unsigned *a; 20*32269Sbostic long *b; 21*32269Sbostic } umaster; 2212284Stut long k; 2312284Stut union ptr prevdrop; 2412284Stut int nf = 0, best = 0, nterm = 0, i, g, j; 2512284Stut int *prevcoord; 2612284Stut long lp; 2712284Stut extern int lmaster, colevel, reached; 2812284Stut long getl(); 2912284Stut extern int iflong; 3012284Stut 3112284Stut # if D1 3212284Stut fprintf(stderr, "entering doquery nitem %d\n",nitem); 3312284Stut fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]); 3412284Stut fprintf(stderr, "and frequencies are %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]); 3512284Stut # endif 36*32269Sbostic if (iflong) 37*32269Sbostic umaster.b = (long *) master; 38*32269Sbostic else 39*32269Sbostic umaster.a = master; 4012284Stut _assert (lmaster>0); 4112284Stut if (coord==0) 4217679Sralph coord = (int *) zalloc(lmaster, sizeof(lmaster)); 4312284Stut if (colevel>0) 4412284Stut { 4517679Sralph if (iflong) 4617679Sralph prevdrop.b = (long *) zalloc(lmaster, sizeof(long)); 4717679Sralph else 4817679Sralph prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int)); 4917679Sralph prevcoord = (int *) zalloc(lmaster, sizeof(lmaster)); 5012284Stut } 5112284Stut else 5212284Stut { 53*32269Sbostic prevdrop.a=umaster.a; 5412284Stut prevcoord=coord; 5512284Stut } 5612284Stut # if D1 5712284Stut fprintf(stderr, "nitem %d\n",nitem); 5812284Stut # endif 5912284Stut for(i=0; i<nitem; i++) 6012284Stut { 6112284Stut hh[i] = hash(qitem[i])%nhash; 6212284Stut # if D1 6312284Stut fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]); 6412284Stut # endif 6512284Stut } 6612284Stut # if D1 6712284Stut fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt); 6812284Stut # endif 6912284Stut if (prfreqs) 7012284Stut for(i=0; i<nitem; i++) 7112284Stut fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]); 7212284Stut /* if possible, sort query into decreasing frequency of hashes */ 7312284Stut if (hfrflg) 7412284Stut shell (nitem, hcomp, hexch); 7512284Stut # if D1 7612284Stut for(i=0; i<nitem; i++) 7712284Stut fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]); 7812284Stut # endif 7912284Stut lp = hpt [hh[0]]; 8012284Stut # if D1 8112284Stut fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp); 8212284Stut # endif 8312284Stut _assert (fb!=NULL); 8424070Sbloom _assert (fseek(fb, lp, 0) != -1); 8512284Stut for(i=0; i<lmaster; i++) 8612284Stut { 8712284Stut if (iflong) 88*32269Sbostic umaster.b[i] = getl(fb); 8912284Stut else 90*32269Sbostic umaster.a[i] = getw(fb); 9112284Stut coord[i]=1; 9212284Stut # if D2 9312284Stut if (iflong) 94*32269Sbostic fprintf(stderr,"umaster has %ld\n",(umaster.b[i])); 9512284Stut else 96*32269Sbostic fprintf(stderr,"umaster has %d\n",(umaster.a[i])); 9712284Stut # endif 9812284Stut _assert (i<lmaster); 9912284Stut if (iflong) 10012284Stut { 101*32269Sbostic if (umaster.b[i] == -1L) break; 10212284Stut } 10312284Stut else 10412284Stut { 105*32269Sbostic if (umaster.a[i] == -1) break; 10612284Stut } 10712284Stut } 10812284Stut nf= i; 10912284Stut for(nterm=1; nterm<nitem; nterm++) 11012284Stut { 11112284Stut # ifdef D1 11212284Stut fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]); 11312284Stut # endif 11412284Stut if (colevel>0) 11512284Stut { 11612284Stut for(j=0; j<nf; j++) 11712284Stut { 11812284Stut if (iflong) 119*32269Sbostic prevdrop.b[j] = umaster.b[j]; 12012284Stut else 121*32269Sbostic prevdrop.a[j] = umaster.a[j]; 12212284Stut prevcoord[j] = coord[j]; 12312284Stut } 12412284Stut } 12512284Stut lp = hpt[hh[nterm]]; 12624070Sbloom _assert (fseek(fb, lp, 0) != -1); 12712284Stut # if D1 12812284Stut fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp); 12912284Stut # endif 13012284Stut g=j=0; 13112284Stut while (1) 13212284Stut { 13312284Stut if (iflong) 13412284Stut k = getl(fb); 13512284Stut else 13612284Stut k = getw(fb); 13712284Stut if (k== -1) break; 13812284Stut # if D2 13912284Stut fprintf(stderr,"next term finds %ld\n",k); 14012284Stut # endif 14112284Stut # if D3 14212284Stut if (iflong) 14312284Stut fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k)); 14412284Stut else 14512284Stut fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k)); 14612284Stut # endif 14712284Stut while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k) 14812284Stut { 14912284Stut # if D3 15012284Stut if (iflong) 15112284Stut fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n", 15212284Stut j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k)); 15312284Stut else 15412284Stut fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n", 15512284Stut j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k)); 15612284Stut # endif 15712284Stut if (prevcoord[j] + colevel <= nterm) 15812284Stut j++; 15912284Stut else 16012284Stut { 16112284Stut _assert (g<lmaster); 16212284Stut if (iflong) 163*32269Sbostic umaster.b[g] = prevdrop.b[j]; 16412284Stut else 165*32269Sbostic umaster.a[g] = prevdrop.a[j]; 16612284Stut coord[g++] = prevcoord[j++]; 16712284Stut # if D1 16812284Stut if (iflong) 169*32269Sbostic 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]); 17012284Stut else 171*32269Sbostic fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,umaster.a[g-1], coord[g-1],nterm); 17212284Stut # endif 17312284Stut continue; 17412284Stut } 17512284Stut } 17612284Stut if (colevel==0 && j>=nf) break; 17712284Stut if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k) 17812284Stut { 17912284Stut if (iflong) 180*32269Sbostic umaster.b[g]=k; 18112284Stut else 182*32269Sbostic umaster.a[g]=k; 18312284Stut coord[g++] = prevcoord[j++]+1; 18412284Stut # if D1 18512284Stut if (iflong) 186*32269Sbostic fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,umaster.b[g-1],coord[g-1],umaster.b[j-1]); 18712284Stut else 188*32269Sbostic fprintf(stderr, " at g %d item %d coord %d note %d\n",g,umaster.a[g-1],coord[g-1],umaster.a[j-1]); 18912284Stut # endif 19012284Stut } 19112284Stut else 19212284Stut if (colevel >= nterm) 19312284Stut { 19412284Stut if (iflong) 195*32269Sbostic umaster.b[g]=k; 19612284Stut else 197*32269Sbostic umaster.a[g]=k; 19812284Stut coord[g++] = 1; 19912284Stut } 20012284Stut } 20112284Stut # if D1 20212284Stut fprintf(stderr,"now have %d items\n",g); 20312284Stut # endif 20412284Stut if (colevel>0) 20512284Stut for ( ; j<nf; j++) 20617679Sralph if (prevcoord[j]+colevel > nterm) 20712284Stut { 20812284Stut _assert(g<lmaster); 20912284Stut if (iflong) 210*32269Sbostic umaster.b[g] = prevdrop.b[j]; 21112284Stut else 212*32269Sbostic umaster.a[g] = prevdrop.a[j]; 21312284Stut coord[g++] = prevcoord[j]; 21412284Stut # if D3 21512284Stut if(iflong) 216*32269Sbostic fprintf(stderr, "copied over %ld coord %d\n",umaster.b[g-1], coord[g-1]); 21712284Stut else 218*32269Sbostic fprintf(stderr, "copied over %d coord %d\n",umaster.a[g-1], coord[g-1]); 21912284Stut # endif 22012284Stut } 22112284Stut nf = g; 22212284Stut } 22312284Stut if (colevel>0) 22412284Stut { 22512284Stut best=0; 22612284Stut for(j=0; j<nf; j++) 22712284Stut if (coord[j]>best) best = coord[j]; 22812284Stut # if D1 22912284Stut fprintf(stderr, "colevel %d best %d\n", colevel, best); 23012284Stut # endif 23112284Stut reached = best; 23212284Stut for(g=j=0; j<nf; j++) 23312284Stut if (coord[j]==best) 23412284Stut { 23512284Stut if (iflong) 236*32269Sbostic umaster.b[g++] = umaster.b[j]; 23712284Stut else 238*32269Sbostic umaster.a[g++] = umaster.a[j]; 23912284Stut } 24012284Stut nf=g; 24112284Stut # if D1 24212284Stut fprintf(stderr, "yet got %d\n",nf); 24312284Stut # endif 24412284Stut } 24512284Stut # ifdef D1 24612284Stut fprintf(stderr, " returning with %d\n",nf); 24712284Stut # endif 24812284Stut if (colevel) 24912284Stut { 25012284Stut free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int)); 25112284Stut free(prevcoord, lmaster, sizeof (lmaster)); 25212284Stut } 25312284Stut # if D3 25412284Stut for(g=0;g<nf;g++) 25512284Stut if(iflong) 256*32269Sbostic fprintf(stderr,":%ld\n",umaster.b[g]); 25712284Stut else 258*32269Sbostic fprintf(stderr,":%d\n",umaster.a[g]); 25912284Stut # endif 26012284Stut return(nf); 26112284Stut } 26212284Stut 26312284Stut long 26412284Stut getl(fb) 26512284Stut FILE *fb; 26612284Stut { 26712284Stut return(getw(fb)); 26812284Stut } 26912284Stut 27012284Stut putl(ll, f) 27112284Stut long ll; 27212284Stut FILE *f; 27312284Stut { 27412284Stut putw(ll, f); 27512284Stut } 27612284Stut 27712284Stut hcomp( n1, n2) 27812284Stut { 27912284Stut return (hfreq[hh[n1]]<=hfreq[hh[n2]]); 28012284Stut } 28112284Stut 28212284Stut hexch( n1, n2 ) 28312284Stut { 28412284Stut int t; 28512284Stut t = hh[n1]; 28612284Stut hh[n1] = hh[n2]; 28712284Stut hh[n2] = t; 28812284Stut } 289