112283Stut #ifndef lint 2*17679Sralph static char *sccsid = "@(#)hunt1.c 4.3 (Berkeley) 01/09/85"; 312283Stut #endif 412283Stut 513225Sgarrison # include <stdio.h> 613225Sgarrison # include <assert.h> 712283Stut extern char refdir[]; 812283Stut extern int keepold; 912283Stut extern char *fgnames[]; 1012283Stut extern char **fgnamp; 1113225Sgarrison FILE *fd =NULL; 1213225Sgarrison int lmaster =500; 1312283Stut int *hfreq, hfrflg; 1413225Sgarrison int colevel =0; 1513225Sgarrison int measure=0; 1613225Sgarrison int soutlen =1000; 1713225Sgarrison int reached =0; 1813225Sgarrison int iflong =0; 1913225Sgarrison int prfreqs =0; 2012283Stut char usedir[100]; 2113225Sgarrison char * calloc(); 2213225Sgarrison char * todir(); 2312283Stut char gfile[50]; 2413225Sgarrison static int full =1000; 2513225Sgarrison static int tags =0; 2612283Stut char *sinput, *soutput, *tagout; 2713225Sgarrison long indexdate =0, gdate(); 2812283Stut 2912283Stut main(argc,argv) 3012283Stut char *argv[]; 3112283Stut { 3212283Stut /* read query from stdin, expect name of indexes in argv[1] */ 3312283Stut static FILE *fa, *fb, *fc; 3413225Sgarrison char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = NULL; 3512283Stut char nmd[100], grepquery[256]; 3612283Stut static char oldname[30] ; 3713225Sgarrison static int was =0; 3812283Stut /* these pointers are unions of pointer to int and pointer to long */ 3912283Stut long *hpt; 4013225Sgarrison unsigned *master =0; 4112283Stut int falseflg, nhash, nitem, nfound, frtbl, kk; 4212283Stut 4312283Stut /* special wart for refpart: default is tags only */ 4412283Stut 4512283Stut while (argv[1][0] == '-') 4612283Stut { 4712283Stut switch(argv[1][1]) 4812283Stut { 4912283Stut case 'a': /* all output, incl. false drops */ 5012283Stut falseflg = 1; 5112283Stut break; 5212283Stut case 'r': 5312283Stut argc--; 5412283Stut argv++; 5512283Stut rprog = argv[1]; 5612283Stut break; 5712283Stut case 'F': /* put out full text */ 5812283Stut full = setfrom(argv[1][2]); 5912283Stut break; 6012283Stut case 'T': /* put out tags */ 6112283Stut tags = setfrom(argv[1][2]); 6212283Stut break; 6312283Stut case 'i': /* input in argument string */ 6412283Stut argc--; 6512283Stut argv++; 6612283Stut sinput = argv[1]; 6712283Stut break; 6812283Stut case 's': /*text output to string */ 6912283Stut case 'o': 7012283Stut argc--; 7112283Stut argv++; 7212283Stut soutput = argv[1]; 73*17679Sralph if ((int) argv[2]<16000) 7412283Stut { 7513225Sgarrison soutlen = (int)argv[2]; 7612283Stut argc--; 7712283Stut argv++; 7812283Stut } 7912283Stut break; 8012283Stut case 't': /*tag output to string */ 8112283Stut argc--; 8212283Stut argv++; 8312283Stut tagout = argv[1]; 8412283Stut break; 8512283Stut case 'l': /* length of internal lists */ 8612283Stut argc--; 8712283Stut argv++; 8812283Stut lmaster = atoi(argv[1]); 8912283Stut break; 9012283Stut case 'g': /* suppress fgrep search on old files */ 9112283Stut keepold = 0; 9212283Stut break; 9312283Stut case 'C': /* coordination level */ 9412283Stut colevel = atoi(argv[1]+2); 9512283Stut # if D1 9612283Stut fprintf(stderr, "colevel set to %d\n",colevel); 9712283Stut # endif 9812283Stut break; 9912283Stut case 'P': /* print term freqs */ 10012283Stut prfreqs=1; 10112283Stut break; 10213225Sgarrison case 'm': 10313225Sgarrison measure=1; 10413225Sgarrison break; 10512283Stut } 10612283Stut argc--; 10712283Stut argv++; 10812283Stut } 10912283Stut strcpy (nma, todir(argv[1])); 11012283Stut if (was == 0 || strcmp (oldname, nma) !=0) 11112283Stut { 11212283Stut strcpy (oldname,nma); 11312283Stut strcpy (nmb, nma); 11412283Stut strcpy (nmc, nmb); 11512283Stut strcpy(nmd,nma); 11612283Stut strcat (nma, ".ia"); 11712283Stut strcat (nmb, ".ib"); 11812283Stut strcat (nmc, ".ic"); 11912283Stut strcat (nmd, ".id"); 12012283Stut if (was) 12112283Stut { 12212283Stut fclose(fa); 12312283Stut fclose(fb); 12412283Stut fclose(fc); 12512283Stut } 12612283Stut 12712283Stut fa = fopen(nma, "r"); 12812283Stut if (fa==NULL) 12912283Stut { 13013225Sgarrison strcpy(*fgnamp++ = calloc(strlen(oldname)+2,1), oldname); 13113225Sgarrison fb=NULL; 13213225Sgarrison goto search; 13312283Stut } 13412283Stut fb = fopen(nmb, "r"); 13512283Stut fc = fopen(nmc, "r"); 13612283Stut was =1; 13712283Stut if (fb== NULL || fc ==NULL) 13812283Stut { 13912283Stut err("Index incomplete %s", nmb); 14012283Stut exit(1); 14112283Stut } 14212283Stut indexdate = gdate(fb); 14312283Stut fd = fopen(nmd, "r"); 14412283Stut } 14512283Stut fseek (fa, 0L, 0); 14612283Stut fread (&nhash, sizeof(nhash), 1, fa); 14712283Stut fread (&iflong, sizeof(iflong), 1, fa); 14812283Stut if(master==0) 149*17679Sralph master = (unsigned *) calloc (lmaster, iflong? sizeof(long): sizeof(unsigned)); 150*17679Sralph hpt = (long *) calloc(nhash, sizeof(*hpt)); 15112283Stut kk=fread( hpt, sizeof(*hpt), nhash, fa); 15212283Stut # if D1 15312283Stut fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash); 15412283Stut # endif 15512283Stut _assert (kk==nhash); 156*17679Sralph hfreq = (int *) calloc(nhash, sizeof(*hfreq)); 15712283Stut _assert (hfreq != NULL); 15812283Stut frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa); 15912283Stut hfrflg = (frtbl == nhash); 16012283Stut # if D1 16112283Stut fprintf(stderr, "read freqs %d\n", frtbl); 16212283Stut # endif 16312283Stut 16413225Sgarrison search: 16512283Stut while (1) 16612283Stut { 16712283Stut nitem = getq(qitem); 16813225Sgarrison if (measure) tick(); 16912283Stut if (nitem==0) continue; 17012283Stut if (nitem < 0) break; 17113225Sgarrison if (tagout) tagout[0]=0; 17213225Sgarrison if (fb!=NULL) 17313225Sgarrison { 17413225Sgarrison nfound = doquery(hpt, nhash, fb, nitem, qitem, master); 17512283Stut # if D1 17613225Sgarrison fprintf(stderr,"after doquery nfound %d\n", nfound); 17712283Stut # endif 17813225Sgarrison fgnamp=fgnames; 17913225Sgarrison if (falseflg == 0) 18013225Sgarrison nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full); 18112283Stut # if D1 18213225Sgarrison fprintf(stderr,"after baddrop nfound %d\n", nfound); 18312283Stut # endif 18413225Sgarrison } 18512283Stut if (fgnamp>fgnames) 18612283Stut { 18712283Stut char **fgp, tgbuff[100]; 18812283Stut int k; 18912283Stut # if D1 19012283Stut fprintf(stderr, "were %d bad files\n", fgnamp-fgnames); 19112283Stut # endif 19212283Stut grepquery[0]=0; 19312283Stut for(k=0; k<nitem; k++) 19412283Stut { 19512283Stut strcat(grepquery, " "); 19612283Stut strcat(grepquery, qitem[k]); 19712283Stut } 19812283Stut # if D1 19912283Stut fprintf(stderr, "grepquery %s\n",grepquery); 20012283Stut # endif 20112283Stut for(fgp=fgnames; fgp<fgnamp; fgp++) 20212283Stut { 20312283Stut # if D1 20412283Stut fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery); 20512283Stut # endif 20612283Stut makefgrep(*fgp); 20712283Stut # if D1 20812283Stut fprintf(stderr, "grepmade\n"); 20912283Stut # endif 21012283Stut if (tagout==0) 21112283Stut tagout=tgbuff; 21212283Stut grepcall(grepquery, tagout, *fgp); 21312283Stut # if D1 21412283Stut fprintf(stderr, "tagout now /%s/\n", tagout); 21512283Stut # endif 21612283Stut if (full) 21712283Stut { 21812283Stut char bout[1000]; 21913225Sgarrison char *tagp; 22013225Sgarrison char *oldtagp; 22113225Sgarrison tagp = tagout; 22213225Sgarrison while (*tagp) { 22313225Sgarrison oldtagp = tagp; 22413225Sgarrison while (*tagp && (*tagp != '\n')) 22513225Sgarrison tagp++; 22613225Sgarrison if (*tagp) 22713225Sgarrison tagp++; 22813225Sgarrison findline(oldtagp, bout, 1000); 22913225Sgarrison fputs(bout,stdout); 23013225Sgarrison } 23112283Stut } 23212283Stut } 23312283Stut } 23412283Stut if (tags) 23512283Stut result (master, nfound >tags ? tags: nfound, fc); 23613225Sgarrison if (measure) tock(); 23712283Stut } 23812283Stut } 23912283Stut 24012283Stut char * 24112283Stut todir(t) 24212283Stut char *t; 24312283Stut { 24412283Stut char *s; 24512283Stut s=t; 24612283Stut while (*s) s++; 24712283Stut while (s>=t && *s != '/') s--; 24812283Stut if (s<t) return(t); 24912283Stut *s++ = 0; 25012283Stut t = (*t ? t : "/"); 25112283Stut chdir (t); 25212283Stut strcpy (usedir,t); 25312283Stut return(s); 25412283Stut } 25512283Stut setfrom(c) 25612283Stut { 25712283Stut switch(c) 25812283Stut { 25912283Stut case 'y': 26012283Stut case '\0': 26112283Stut default: 26212283Stut return(1000); 26312283Stut case '1': 26412283Stut case '2': 26512283Stut case '3': 26612283Stut case '4': 26712283Stut case '5': 26812283Stut case '6': 26912283Stut case '7': 27012283Stut case '8': 27112283Stut case '9': 27212283Stut return(c-'0'); 27312283Stut case 'n': 27412283Stut case '0': 27512283Stut return(0); 27612283Stut } 27712283Stut } 278