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