xref: /titanic_52/usr/src/cmd/refer/hunt1.c (revision 84ab085a13f931bc78e7415e7ce921dbaa14fcb3)
1 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
2 /*	  All Rights Reserved  	*/
3 
4 
5 /*
6  * Copyright (c) 1980 Regents of the University of California.
7  * All rights reserved. The Berkeley software License Agreement
8  * specifies the terms and conditions for redistribution.
9  */
10 
11 /*
12  * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
13  * All Rights Reserved.
14  */
15 
16 #pragma ident	"%Z%%M%	%I%	%E% SMI"
17 
18 # include <locale.h>
19 # include <stdio.h>
20 # include <assert.h>
21 extern char refdir[];
22 extern int keepold;
23 extern char *fgnames[];
24 extern char **fgnamp;
25 FILE *fd =NULL;
26 int lmaster =500;
27 int *hfreq, hfrflg;
28 int colevel =0;
29 int measure=0;
30 int soutlen =1000;
31 int reached =0;
32 int iflong =0;
33 int prfreqs =0;
34 char usedir[100];
35 char * calloc();
36 char * todir();
37 char gfile[50];
38 static int full =1000;
39 static int tags =0;
40 char *sinput, *soutput, *tagout;
41 long indexdate =0, gdate();
42 
43 main(argc,argv)
44 char *argv[];
45 {
46 	/* read query from stdin, expect name of indexes in argv[1] */
47 	static FILE *fa, *fb, *fc;
48 	char nma[100], nmb[100], nmc[100], *qitem[100], *rprog = NULL;
49 	char nmd[100], grepquery[256];
50 	static char oldname[30] ;
51 	static int was =0;
52 	/* these pointers are unions of pointer to int and pointer to long */
53 	long *hpt;
54 	unsigned *master =0;
55 	int falseflg, nhash, nitem, nfound, frtbl, kk;
56 
57 	/* special wart for refpart: default is tags only */
58 
59 	(void) setlocale(LC_ALL, "");
60 
61 #if !defined(TEXT_DOMAIN)
62 #define TEXT_DOMAIN "SYS_TEST"
63 #endif
64 	(void) textdomain(TEXT_DOMAIN);
65 
66 	falseflg = 0;
67 
68 	while (argc > 1 && argv[1][0] == '-')
69 	{
70 		switch(argv[1][1])
71 		{
72 		case 'a': /* all output, incl. false drops */
73 			falseflg = 1;
74 			break;
75 		case 'r':
76 			argc--;
77 			argv++;
78 			rprog = argv[1];
79 			break;
80 		case 'F': /* put out full text */
81 			full = setfrom(argv[1][2]);
82 			break;
83 		case 'T': /* put out tags */
84 			tags = setfrom(argv[1][2]);
85 			break;
86 		case 'i': /* input in argument string */
87 			argc--;
88 			argv++;
89 			sinput = argv[1];
90 			break;
91 		case 's': /*text output to string */
92 		case 'o':
93 			argc--;
94 			argv++;
95 			soutput = argv[1];
96 			if ((int) argv[2]<16000)
97 			{
98 				soutlen = (int)argv[2];
99 				argc--;
100 				argv++;
101 			}
102 			break;
103 		case 't': /*tag output to string */
104 			argc--;
105 			argv++;
106 			tagout = argv[1];
107 			break;
108 		case 'l': /* length of internal lists */
109 			argc--;
110 			argv++;
111 			lmaster = atoi(argv[1]);
112 			break;
113 		case 'g': /* suppress fgrep search on old files */
114 			keepold = 0;
115 			break;
116 		case 'C': /* coordination level */
117 			colevel = atoi(argv[1]+2);
118 # if D1
119 			fprintf(stderr, "colevel set to %d\n",colevel);
120 # endif
121 			break;
122 		case 'P': /* print term freqs */
123 			prfreqs=1;
124 			break;
125 		case 'm':
126 			measure=1;
127 			break;
128 		}
129 		argc--;
130 		argv++;
131 	}
132 	if(argc < 2)
133 		exit(1);
134 	strcpy (nma, todir(argv[1]));
135 	if (was == 0 || strcmp (oldname, nma) !=0)
136 	{
137 		strcpy (oldname,nma);
138 		strcpy (nmb, nma);
139 		strcpy (nmc, nmb);
140 		strcpy(nmd,nma);
141 		strcat (nma, ".ia");
142 		strcat (nmb, ".ib");
143 		strcat (nmc, ".ic");
144 		strcat (nmd, ".id");
145 		if (was)
146 		{
147 			fclose(fa);
148 			fclose(fb);
149 			fclose(fc);
150 		}
151 
152 		fa = fopen(nma, "r");
153 		if (fa==NULL)
154 		{
155 			strcpy(*fgnamp++ = calloc(strlen(oldname)+2,1), oldname);
156 			fb=NULL;
157 			goto search;
158 		}
159 		fb = fopen(nmb, "r");
160 		fc = fopen(nmc, "r");
161 		was =1;
162 		if (fb== NULL || fc ==NULL)
163 		{
164 			err(gettext("Index incomplete %s"), nmb);
165 			exit(1);
166 		}
167 		indexdate = gdate(fb);
168 		fd = fopen(nmd, "r");
169 	}
170 	fseek (fa, 0L, 0);
171 	fread (&nhash, sizeof(nhash), 1, fa);
172 	fread (&iflong, sizeof(iflong), 1, fa);
173 	if(master==0)
174 		master = (unsigned *) calloc (lmaster, iflong? sizeof(long): sizeof(unsigned));
175 	hpt = (long *) calloc(nhash, sizeof(*hpt));
176 	kk=fread( hpt, sizeof(*hpt), nhash, fa);
177 # if D1
178 	fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash);
179 # endif
180 	assert (kk==nhash);
181 	hfreq = (int *) calloc(nhash, sizeof(*hfreq));
182 	assert (hfreq != NULL);
183 	frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
184 	hfrflg = (frtbl == nhash);
185 # if D1
186 	fprintf(stderr, "read freqs %d\n", frtbl);
187 # endif
188 
189 search:
190 	while (1)
191 	{
192 		nitem = getq(qitem);
193 		if (measure) tick();
194 		if (nitem==0) continue;
195 		if (nitem < 0) break;
196 		if (tagout) tagout[0]=0;
197 		if (fb!=NULL)
198 		{
199 			nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
200 # if D1
201 			fprintf(stderr,"after doquery nfound %d\n", nfound);
202 # endif
203 			fgnamp=fgnames;
204 			if (falseflg == 0)
205 				nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full);
206 # if D1
207 			fprintf(stderr,"after baddrop nfound %d\n", nfound);
208 # endif
209 		}
210 		if (fgnamp>fgnames)
211 		{
212 			char **fgp, tgbuff[100];
213 			int k;
214 # if D1
215 			fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
216 # endif
217 			(void) memset(tgbuff, 0, sizeof (tgbuff));
218 			grepquery[0]=0;
219 			for(k=0; k<nitem; k++)
220 			{
221 				strcat(grepquery, " ");
222 				strcat(grepquery, qitem[k]);
223 			}
224 # if D1
225 			fprintf(stderr, "grepquery %s\n",grepquery);
226 # endif
227 			for(fgp=fgnames; fgp<fgnamp; fgp++)
228 			{
229 # if D1
230 				fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery);
231 # endif
232 				makefgrep(*fgp);
233 # if D1
234 				fprintf(stderr, "grepmade\n");
235 # endif
236 				if (tagout==0)
237 					tagout=tgbuff;
238 				grepcall(grepquery, tagout, *fgp);
239 # if D1
240 				fprintf(stderr, "tagout now /%s/\n", tagout);
241 # endif
242 				if (full)
243 				{
244 					int nout;
245 					char *bout;
246 					char *tagp;
247 					char *oldtagp;
248 					tagp = tagout;
249 					while (*tagp) {
250 						oldtagp = tagp;
251 						while (*tagp && (*tagp != '\n'))
252 							tagp++;
253 						if (*tagp)
254 							tagp++;
255 				                nout = findline(oldtagp, &bout, 1000, 0L);
256 						if (nout > 0)
257 						{
258 							fputs(bout, stdout);
259 							free(bout);
260 						}
261 					}
262 				}
263 			}
264 		}
265 		if (tags)
266 			result (master, nfound >tags ? tags: nfound, fc);
267 		if (measure) tock();
268 	}
269 	/* NOTREACHED */
270 }
271 
272 char *
273 todir(t)
274 char *t;
275 {
276 	char *s;
277 	s=t;
278 	while (*s) s++;
279 	while (s>=t && *s != '/') s--;
280 	if (s<t) return(t);
281 	*s++ = 0;
282 	t = (*t ? t : "/");
283 	chdir (t);
284 	strcpy (usedir,t);
285 	return(s);
286 }
287 setfrom(c)
288 {
289 	switch(c)
290 	{
291 	case 'y':
292 	case '\0':
293 	default:
294 		return(1000);
295 	case '1':
296 	case '2':
297 	case '3':
298 	case '4':
299 	case '5':
300 	case '6':
301 	case '7':
302 	case '8':
303 	case '9':
304 		return(c-'0');
305 	case 'n':
306 	case '0':
307 		return(0);
308 	}
309 }
310