1*12283Stut #ifndef lint 2*12283Stut static char *sccsid = "@(#)hunt1.c 4.1 (Berkeley) 05/06/83"; 3*12283Stut #endif 4*12283Stut 5*12283Stut #include <stdio.h> 6*12283Stut #include <assert.h> 7*12283Stut extern char refdir[]; 8*12283Stut extern int keepold; 9*12283Stut extern char *fgnames[]; 10*12283Stut extern char **fgnamp; 11*12283Stut FILE *fd = 0; 12*12283Stut int lmaster = 500; 13*12283Stut int *hfreq, hfrflg; 14*12283Stut int colevel = 0; 15*12283Stut int soutlen = 1000; 16*12283Stut int reached = 0; 17*12283Stut int iflong = 0; 18*12283Stut int prfreqs = 0; 19*12283Stut char usedir[100]; 20*12283Stut char gfile[50]; 21*12283Stut static int full = 1000; 22*12283Stut static int tags = 0; 23*12283Stut char *sinput, *soutput, *tagout; 24*12283Stut long indexdate = 0, gdate(); 25*12283Stut extern char *todir(); 26*12283Stut 27*12283Stut main(argc,argv) 28*12283Stut char *argv[]; 29*12283Stut { 30*12283Stut /* read query from stdin, expect name of indexes in argv[1] */ 31*12283Stut static FILE *fa, *fb, *fc; 32*12283Stut char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = 0; 33*12283Stut char nmd[100], grepquery[256]; 34*12283Stut static char oldname[30] ; 35*12283Stut static int was = 0; 36*12283Stut /* these pointers are unions of pointer to int and pointer to long */ 37*12283Stut long *hpt; 38*12283Stut unsigned *master = 0; 39*12283Stut int falseflg, nhash, nitem, nfound, frtbl, kk; 40*12283Stut 41*12283Stut /* special wart for refpart: default is tags only */ 42*12283Stut 43*12283Stut while (argv[1][0] == '-') 44*12283Stut { 45*12283Stut switch(argv[1][1]) 46*12283Stut { 47*12283Stut case 'a': /* all output, incl. false drops */ 48*12283Stut falseflg = 1; 49*12283Stut break; 50*12283Stut case 'r': 51*12283Stut argc--; 52*12283Stut argv++; 53*12283Stut rprog = argv[1]; 54*12283Stut break; 55*12283Stut case 'F': /* put out full text */ 56*12283Stut full = setfrom(argv[1][2]); 57*12283Stut break; 58*12283Stut case 'T': /* put out tags */ 59*12283Stut tags = setfrom(argv[1][2]); 60*12283Stut break; 61*12283Stut case 'i': /* input in argument string */ 62*12283Stut argc--; 63*12283Stut argv++; 64*12283Stut sinput = argv[1]; 65*12283Stut break; 66*12283Stut case 's': /*text output to string */ 67*12283Stut case 'o': 68*12283Stut argc--; 69*12283Stut argv++; 70*12283Stut soutput = argv[1]; 71*12283Stut if (argv[2]<16000) 72*12283Stut { 73*12283Stut soutlen = argv[2]; 74*12283Stut argc--; 75*12283Stut argv++; 76*12283Stut } 77*12283Stut break; 78*12283Stut case 't': /*tag output to string */ 79*12283Stut argc--; 80*12283Stut argv++; 81*12283Stut tagout = argv[1]; 82*12283Stut break; 83*12283Stut case 'l': /* length of internal lists */ 84*12283Stut argc--; 85*12283Stut argv++; 86*12283Stut lmaster = atoi(argv[1]); 87*12283Stut break; 88*12283Stut case 'g': /* suppress fgrep search on old files */ 89*12283Stut keepold = 0; 90*12283Stut break; 91*12283Stut case 'C': /* coordination level */ 92*12283Stut colevel = atoi(argv[1]+2); 93*12283Stut # if D1 94*12283Stut fprintf(stderr, "colevel set to %d\n",colevel); 95*12283Stut # endif 96*12283Stut break; 97*12283Stut case 'P': /* print term freqs */ 98*12283Stut prfreqs=1; 99*12283Stut break; 100*12283Stut } 101*12283Stut argc--; 102*12283Stut argv++; 103*12283Stut } 104*12283Stut strcpy (nma, todir(argv[1])); 105*12283Stut if (was == 0 || strcmp (oldname, nma) !=0) 106*12283Stut { 107*12283Stut strcpy (oldname,nma); 108*12283Stut strcpy (nmb, nma); 109*12283Stut strcpy (nmc, nmb); 110*12283Stut strcpy(nmd,nma); 111*12283Stut strcat (nma, ".ia"); 112*12283Stut strcat (nmb, ".ib"); 113*12283Stut strcat (nmc, ".ic"); 114*12283Stut strcat (nmd, ".id"); 115*12283Stut if (was) 116*12283Stut { 117*12283Stut fclose(fa); 118*12283Stut fclose(fb); 119*12283Stut fclose(fc); 120*12283Stut } 121*12283Stut 122*12283Stut fa = fopen(nma, "r"); 123*12283Stut if (fa==NULL) 124*12283Stut { 125*12283Stut err("No files %s",nma); 126*12283Stut exit(1); 127*12283Stut } 128*12283Stut fb = fopen(nmb, "r"); 129*12283Stut fc = fopen(nmc, "r"); 130*12283Stut was =1; 131*12283Stut if (fb== NULL || fc ==NULL) 132*12283Stut { 133*12283Stut err("Index incomplete %s", nmb); 134*12283Stut exit(1); 135*12283Stut } 136*12283Stut indexdate = gdate(fb); 137*12283Stut fd = fopen(nmd, "r"); 138*12283Stut } 139*12283Stut fseek (fa, 0L, 0); 140*12283Stut fread (&nhash, sizeof(nhash), 1, fa); 141*12283Stut fread (&iflong, sizeof(iflong), 1, fa); 142*12283Stut if(master==0) 143*12283Stut master = calloc (lmaster, iflong? sizeof(long): sizeof(int)); 144*12283Stut hpt = calloc(nhash, sizeof(*hpt)); 145*12283Stut kk=fread( hpt, sizeof(*hpt), nhash, fa); 146*12283Stut # if D1 147*12283Stut fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash); 148*12283Stut # endif 149*12283Stut _assert (kk==nhash); 150*12283Stut hfreq = calloc(nhash, sizeof(*hfreq)); 151*12283Stut _assert (hfreq != NULL); 152*12283Stut frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa); 153*12283Stut hfrflg = (frtbl == nhash); 154*12283Stut # if D1 155*12283Stut fprintf(stderr, "read freqs %d\n", frtbl); 156*12283Stut # endif 157*12283Stut 158*12283Stut while (1) 159*12283Stut { 160*12283Stut nitem = getq(qitem); 161*12283Stut if (nitem==0) continue; 162*12283Stut if (nitem < 0) break; 163*12283Stut nfound = doquery(hpt, nhash, fb, nitem, qitem, master); 164*12283Stut # if D1 165*12283Stut fprintf(stderr,"after doquery nfound %d\n", nfound); 166*12283Stut # endif 167*12283Stut fgnamp=fgnames; 168*12283Stut if (falseflg == 0) 169*12283Stut nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full); 170*12283Stut # if D1 171*12283Stut fprintf(stderr,"after baddrop nfound %d\n", nfound); 172*12283Stut # endif 173*12283Stut if (fgnamp>fgnames) 174*12283Stut { 175*12283Stut char **fgp, tgbuff[100]; 176*12283Stut int k; 177*12283Stut # if D1 178*12283Stut fprintf(stderr, "were %d bad files\n", fgnamp-fgnames); 179*12283Stut # endif 180*12283Stut grepquery[0]=0; 181*12283Stut for(k=0; k<nitem; k++) 182*12283Stut { 183*12283Stut strcat(grepquery, " "); 184*12283Stut strcat(grepquery, qitem[k]); 185*12283Stut } 186*12283Stut # if D1 187*12283Stut fprintf(stderr, "grepquery %s\n",grepquery); 188*12283Stut # endif 189*12283Stut for(fgp=fgnames; fgp<fgnamp; fgp++) 190*12283Stut { 191*12283Stut # if D1 192*12283Stut fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery); 193*12283Stut # endif 194*12283Stut makefgrep(*fgp); 195*12283Stut # if D1 196*12283Stut fprintf(stderr, "grepmade\n"); 197*12283Stut # endif 198*12283Stut if (tagout==0) 199*12283Stut tagout=tgbuff; 200*12283Stut grepcall(grepquery, tagout, *fgp); 201*12283Stut # if D1 202*12283Stut fprintf(stderr, "tagout now /%s/\n", tagout); 203*12283Stut # endif 204*12283Stut if (full) 205*12283Stut { 206*12283Stut char bout[1000]; 207*12283Stut findline(tagout, bout, 1000); 208*12283Stut fputs(bout,stdout); 209*12283Stut } 210*12283Stut } 211*12283Stut } 212*12283Stut if (tags) 213*12283Stut result (master, nfound >tags ? tags: nfound, fc); 214*12283Stut } 215*12283Stut } 216*12283Stut 217*12283Stut char * 218*12283Stut todir(t) 219*12283Stut char *t; 220*12283Stut { 221*12283Stut char *s; 222*12283Stut s=t; 223*12283Stut while (*s) s++; 224*12283Stut while (s>=t && *s != '/') s--; 225*12283Stut if (s<t) return(t); 226*12283Stut *s++ = 0; 227*12283Stut t = (*t ? t : "/"); 228*12283Stut chdir (t); 229*12283Stut strcpy (usedir,t); 230*12283Stut return(s); 231*12283Stut } 232*12283Stut 233*12283Stut setfrom(c) 234*12283Stut { 235*12283Stut switch(c) 236*12283Stut { 237*12283Stut case 'y': 238*12283Stut case '\0': 239*12283Stut default: 240*12283Stut return(1000); 241*12283Stut case '1': 242*12283Stut case '2': 243*12283Stut case '3': 244*12283Stut case '4': 245*12283Stut case '5': 246*12283Stut case '6': 247*12283Stut case '7': 248*12283Stut case '8': 249*12283Stut case '9': 250*12283Stut return(c-'0'); 251*12283Stut case 'n': 252*12283Stut case '0': 253*12283Stut return(0); 254*12283Stut } 255*12283Stut } 256