xref: /original-bsd/old/refer/hunt/hunt1.c (revision a732a806)
1*a732a806Sbostic /*-
2*a732a806Sbostic  * %sccs.include.proprietary.c%
3*a732a806Sbostic  */
4*a732a806Sbostic 
595ce91a1Stut #ifndef lint
6*a732a806Sbostic static char sccsid[] = "@(#)hunt1.c	4.4 (Berkeley) 04/18/91";
7*a732a806Sbostic #endif /* not lint */
895ce91a1Stut 
995ce91a1Stut # include <stdio.h>
1095ce91a1Stut # include <assert.h>
1195ce91a1Stut extern char refdir[];
1295ce91a1Stut extern int keepold;
1395ce91a1Stut extern char *fgnames[];
1495ce91a1Stut extern char **fgnamp;
15b59b80ebSgarrison FILE *fd =NULL;
1695ce91a1Stut int lmaster =500;
1795ce91a1Stut int *hfreq, hfrflg;
1895ce91a1Stut int colevel =0;
19b59b80ebSgarrison int measure=0;
2095ce91a1Stut int soutlen =1000;
2195ce91a1Stut int reached =0;
2295ce91a1Stut int iflong =0;
2395ce91a1Stut int prfreqs =0;
2495ce91a1Stut char usedir[100];
25b59b80ebSgarrison char * calloc();
26b59b80ebSgarrison char * todir();
2795ce91a1Stut char gfile[50];
2895ce91a1Stut static int full =1000;
2995ce91a1Stut static int tags =0;
3095ce91a1Stut char *sinput, *soutput, *tagout;
3195ce91a1Stut long indexdate =0, gdate();
3295ce91a1Stut 
main(argc,argv)3395ce91a1Stut main(argc,argv)
3495ce91a1Stut char *argv[];
3595ce91a1Stut {
3695ce91a1Stut 	/* read query from stdin, expect name of indexes in argv[1] */
3795ce91a1Stut 	static FILE *fa, *fb, *fc;
38b59b80ebSgarrison 	char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = NULL;
3995ce91a1Stut 	char nmd[100], grepquery[256];
4095ce91a1Stut 	static char oldname[30] ;
4195ce91a1Stut 	static int was =0;
4295ce91a1Stut 	/* these pointers are unions of pointer to int and pointer to long */
4395ce91a1Stut 	long *hpt;
4495ce91a1Stut 	unsigned *master =0;
4595ce91a1Stut 	int falseflg, nhash, nitem, nfound, frtbl, kk;
4695ce91a1Stut 
4795ce91a1Stut 	/* special wart for refpart: default is tags only */
4895ce91a1Stut 
4995ce91a1Stut 	while (argv[1][0] == '-')
5095ce91a1Stut 	{
5195ce91a1Stut 		switch(argv[1][1])
5295ce91a1Stut 		{
5395ce91a1Stut 		case 'a': /* all output, incl. false drops */
5495ce91a1Stut 			falseflg = 1;
5595ce91a1Stut 			break;
5695ce91a1Stut 		case 'r':
5795ce91a1Stut 			argc--;
5895ce91a1Stut 			argv++;
5995ce91a1Stut 			rprog = argv[1];
6095ce91a1Stut 			break;
6195ce91a1Stut 		case 'F': /* put out full text */
6295ce91a1Stut 			full = setfrom(argv[1][2]);
6395ce91a1Stut 			break;
6495ce91a1Stut 		case 'T': /* put out tags */
6595ce91a1Stut 			tags = setfrom(argv[1][2]);
6695ce91a1Stut 			break;
6795ce91a1Stut 		case 'i': /* input in argument string */
6895ce91a1Stut 			argc--;
6995ce91a1Stut 			argv++;
7095ce91a1Stut 			sinput = argv[1];
7195ce91a1Stut 			break;
7295ce91a1Stut 		case 's': /*text output to string */
7395ce91a1Stut 		case 'o':
7495ce91a1Stut 			argc--;
7595ce91a1Stut 			argv++;
7695ce91a1Stut 			soutput = argv[1];
771a17a1d3Sralph 			if ((int) argv[2]<16000)
7895ce91a1Stut 			{
79b59b80ebSgarrison 				soutlen = (int)argv[2];
8095ce91a1Stut 				argc--;
8195ce91a1Stut 				argv++;
8295ce91a1Stut 			}
8395ce91a1Stut 			break;
8495ce91a1Stut 		case 't': /*tag output to string */
8595ce91a1Stut 			argc--;
8695ce91a1Stut 			argv++;
8795ce91a1Stut 			tagout = argv[1];
8895ce91a1Stut 			break;
8995ce91a1Stut 		case 'l': /* length of internal lists */
9095ce91a1Stut 			argc--;
9195ce91a1Stut 			argv++;
9295ce91a1Stut 			lmaster = atoi(argv[1]);
9395ce91a1Stut 			break;
9495ce91a1Stut 		case 'g': /* suppress fgrep search on old files */
9595ce91a1Stut 			keepold = 0;
9695ce91a1Stut 			break;
9795ce91a1Stut 		case 'C': /* coordination level */
9895ce91a1Stut 			colevel = atoi(argv[1]+2);
9995ce91a1Stut # if D1
10095ce91a1Stut 			fprintf(stderr, "colevel set to %d\n",colevel);
10195ce91a1Stut # endif
10295ce91a1Stut 			break;
10395ce91a1Stut 		case 'P': /* print term freqs */
10495ce91a1Stut 			prfreqs=1;
10595ce91a1Stut 			break;
106b59b80ebSgarrison 		case 'm':
107b59b80ebSgarrison 			measure=1;
108b59b80ebSgarrison 			break;
10995ce91a1Stut 		}
11095ce91a1Stut 		argc--;
11195ce91a1Stut 		argv++;
11295ce91a1Stut 	}
11395ce91a1Stut 	strcpy (nma, todir(argv[1]));
11495ce91a1Stut 	if (was == 0 || strcmp (oldname, nma) !=0)
11595ce91a1Stut 	{
11695ce91a1Stut 		strcpy (oldname,nma);
11795ce91a1Stut 		strcpy (nmb, nma);
11895ce91a1Stut 		strcpy (nmc, nmb);
11995ce91a1Stut 		strcpy(nmd,nma);
12095ce91a1Stut 		strcat (nma, ".ia");
12195ce91a1Stut 		strcat (nmb, ".ib");
12295ce91a1Stut 		strcat (nmc, ".ic");
12395ce91a1Stut 		strcat (nmd, ".id");
12495ce91a1Stut 		if (was)
12595ce91a1Stut 		{
12695ce91a1Stut 			fclose(fa);
12795ce91a1Stut 			fclose(fb);
12895ce91a1Stut 			fclose(fc);
12995ce91a1Stut 		}
13095ce91a1Stut 
13195ce91a1Stut 		fa = fopen(nma, "r");
13295ce91a1Stut 		if (fa==NULL)
13395ce91a1Stut 		{
134b59b80ebSgarrison 			strcpy(*fgnamp++ = calloc(strlen(oldname)+2,1), oldname);
135b59b80ebSgarrison 			fb=NULL;
136b59b80ebSgarrison 			goto search;
13795ce91a1Stut 		}
13895ce91a1Stut 		fb = fopen(nmb, "r");
13995ce91a1Stut 		fc = fopen(nmc, "r");
14095ce91a1Stut 		was =1;
14195ce91a1Stut 		if (fb== NULL || fc ==NULL)
14295ce91a1Stut 		{
14395ce91a1Stut 			err("Index incomplete %s", nmb);
14495ce91a1Stut 			exit(1);
14595ce91a1Stut 		}
14695ce91a1Stut 		indexdate = gdate(fb);
14795ce91a1Stut 		fd = fopen(nmd, "r");
14895ce91a1Stut 	}
14995ce91a1Stut 	fseek (fa, 0L, 0);
15095ce91a1Stut 	fread (&nhash, sizeof(nhash), 1, fa);
15195ce91a1Stut 	fread (&iflong, sizeof(iflong), 1, fa);
15295ce91a1Stut 	if(master==0)
1531a17a1d3Sralph 		master = (unsigned *) calloc (lmaster, iflong? sizeof(long): sizeof(unsigned));
1541a17a1d3Sralph 	hpt = (long *) calloc(nhash, sizeof(*hpt));
15595ce91a1Stut 	kk=fread( hpt, sizeof(*hpt), nhash, fa);
15695ce91a1Stut # if D1
15795ce91a1Stut 	fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash);
15895ce91a1Stut # endif
15995ce91a1Stut 	_assert (kk==nhash);
1601a17a1d3Sralph 	hfreq = (int *) calloc(nhash, sizeof(*hfreq));
16195ce91a1Stut 	_assert (hfreq != NULL);
16295ce91a1Stut 	frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
16395ce91a1Stut 	hfrflg = (frtbl == nhash);
16495ce91a1Stut # if D1
16595ce91a1Stut 	fprintf(stderr, "read freqs %d\n", frtbl);
16695ce91a1Stut # endif
16795ce91a1Stut 
168b59b80ebSgarrison search:
16995ce91a1Stut 	while (1)
17095ce91a1Stut 	{
17195ce91a1Stut 		nitem = getq(qitem);
172b59b80ebSgarrison 		if (measure) tick();
17395ce91a1Stut 		if (nitem==0) continue;
17495ce91a1Stut 		if (nitem < 0) break;
175b59b80ebSgarrison 		if (tagout) tagout[0]=0;
176b59b80ebSgarrison 		if (fb!=NULL)
177b59b80ebSgarrison 		{
17895ce91a1Stut 			nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
17995ce91a1Stut # if D1
18095ce91a1Stut 			fprintf(stderr,"after doquery nfound %d\n", nfound);
18195ce91a1Stut # endif
18295ce91a1Stut 			fgnamp=fgnames;
18395ce91a1Stut 			if (falseflg == 0)
18495ce91a1Stut 				nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full);
18595ce91a1Stut # if D1
18695ce91a1Stut 			fprintf(stderr,"after baddrop nfound %d\n", nfound);
18795ce91a1Stut # endif
188b59b80ebSgarrison 		}
18995ce91a1Stut 		if (fgnamp>fgnames)
19095ce91a1Stut 		{
19195ce91a1Stut 			char **fgp, tgbuff[100];
19295ce91a1Stut 			int k;
19395ce91a1Stut # if D1
19495ce91a1Stut 			fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
19595ce91a1Stut # endif
19695ce91a1Stut 			grepquery[0]=0;
19795ce91a1Stut 			for(k=0; k<nitem; k++)
19895ce91a1Stut 			{
19995ce91a1Stut 				strcat(grepquery, " ");
20095ce91a1Stut 				strcat(grepquery, qitem[k]);
20195ce91a1Stut 			}
20295ce91a1Stut # if D1
20395ce91a1Stut 			fprintf(stderr, "grepquery %s\n",grepquery);
20495ce91a1Stut # endif
20595ce91a1Stut 			for(fgp=fgnames; fgp<fgnamp; fgp++)
20695ce91a1Stut 			{
20795ce91a1Stut # if D1
20895ce91a1Stut 				fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery);
20995ce91a1Stut # endif
21095ce91a1Stut 				makefgrep(*fgp);
21195ce91a1Stut # if D1
21295ce91a1Stut 				fprintf(stderr, "grepmade\n");
21395ce91a1Stut # endif
21495ce91a1Stut 				if (tagout==0)
21595ce91a1Stut 					tagout=tgbuff;
21695ce91a1Stut 				grepcall(grepquery, tagout, *fgp);
21795ce91a1Stut # if D1
21895ce91a1Stut 				fprintf(stderr, "tagout now /%s/\n", tagout);
21995ce91a1Stut # endif
22095ce91a1Stut 				if (full)
22195ce91a1Stut 				{
22295ce91a1Stut 					char bout[1000];
223b59b80ebSgarrison 					char *tagp;
224b59b80ebSgarrison 					char *oldtagp;
225b59b80ebSgarrison 					tagp = tagout;
226b59b80ebSgarrison 					while (*tagp) {
227b59b80ebSgarrison 						oldtagp = tagp;
228b59b80ebSgarrison 						while (*tagp && (*tagp != '\n'))
229b59b80ebSgarrison 							tagp++;
230b59b80ebSgarrison 						if (*tagp)
231b59b80ebSgarrison 							tagp++;
232b59b80ebSgarrison 						findline(oldtagp, bout, 1000);
23395ce91a1Stut 						fputs(bout,stdout);
23495ce91a1Stut 					}
23595ce91a1Stut 				}
23695ce91a1Stut 			}
237b59b80ebSgarrison 		}
23895ce91a1Stut 		if (tags)
23995ce91a1Stut 			result (master, nfound >tags ? tags: nfound, fc);
240b59b80ebSgarrison 		if (measure) tock();
24195ce91a1Stut 	}
24295ce91a1Stut }
24395ce91a1Stut 
24495ce91a1Stut char *
todir(t)24595ce91a1Stut todir(t)
24695ce91a1Stut char *t;
24795ce91a1Stut {
24895ce91a1Stut 	char *s;
24995ce91a1Stut 	s=t;
25095ce91a1Stut 	while (*s) s++;
25195ce91a1Stut 	while (s>=t && *s != '/') s--;
25295ce91a1Stut 	if (s<t) return(t);
25395ce91a1Stut 	*s++ = 0;
25495ce91a1Stut 	t = (*t ? t : "/");
25595ce91a1Stut 	chdir (t);
25695ce91a1Stut 	strcpy (usedir,t);
25795ce91a1Stut 	return(s);
25895ce91a1Stut }
setfrom(c)25995ce91a1Stut setfrom(c)
26095ce91a1Stut {
26195ce91a1Stut 	switch(c)
26295ce91a1Stut 	{
26395ce91a1Stut 	case 'y':
26495ce91a1Stut 	case '\0':
26595ce91a1Stut 	default:
26695ce91a1Stut 		return(1000);
26795ce91a1Stut 	case '1':
26895ce91a1Stut 	case '2':
26995ce91a1Stut 	case '3':
27095ce91a1Stut 	case '4':
27195ce91a1Stut 	case '5':
27295ce91a1Stut 	case '6':
27395ce91a1Stut 	case '7':
27495ce91a1Stut 	case '8':
27595ce91a1Stut 	case '9':
27695ce91a1Stut 		return(c-'0');
27795ce91a1Stut 	case 'n':
27895ce91a1Stut 	case '0':
27995ce91a1Stut 		return(0);
28095ce91a1Stut 	}
28195ce91a1Stut }
282