xref: /original-bsd/old/refer/refer/glue1.c (revision e59fb703)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)glue1.c	4.5 (Berkeley) 04/18/91";
7 #endif /* not lint */
8 
9 #include <stdio.h>
10 #define unopen(fil) {if (fil!=NULL) {fclose(fil); fil=NULL;}}
11 
12 extern char refdir[];
13 int lmaster = 1000;
14 int reached = 0;
15 FILE *fd = 0;
16 int *hfreq, hfrflg;
17 int colevel = 0;
18 unsigned *master = 0;
19 int iflong;
20 extern char *fgnames[], **fgnamp;
21 extern FILE *iopen();
22 char *todir();
23 int prfreqs = 0;
24 int typeindex = 0;
25 char usedir[100];
26 static int full = 1000;
27 static int tags = 0;
28 char *sinput, *soutput, *tagout;
29 long indexdate = 0, gdate();
30 int soutlen = 1000;
31 int taglen = 1000;
32 
33 huntmain(argc,argv)
34 char *argv[];
35 {
36 	/* read query from stdin, expect name of indexes in argv[1] */
37 	static FILE *fa, *fb, *fc;
38 	char indexname[100], *qitem[100], *rprog = 0;
39 	char grepquery[200];
40 	static char oldname[30] ;
41 	static int nhash = 0;
42 	static int maxhash = 0;
43 	int falseflg = 0, nitem, nfound, frtbl;
44 	static long *hpt = 0;
45 # if D1
46 	fprintf(stderr, "in glue1 argc %d argv %o %o\n", argc, argv[0],argv[1]);
47 # endif
48 	savedir();
49 	while (argv[1][0] == '-')
50 	{
51 # if D1
52 		fprintf(stderr, "argv.1 is %s\n",argv[1]);
53 # endif
54 		switch(argv[1][1])
55 		{
56 		case 'a': /* all output, incl. false drops */
57 			falseflg = 1;
58 			break;
59 		case 'r':
60 			argc--;
61 			argv++;
62 			rprog = argv[1];
63 			break;
64 		case 'F': /* put out full text */
65 			full = setfrom(argv[1][2]);
66 			break;
67 		case 'T': /* put out tags */
68 			tags = setfrom(argv[1][2]);
69 			break;
70 		case 'i': /* input in argument string */
71 			argc--;
72 			argv++;
73 			sinput = argv[1];
74 			break;
75 		case 's': /*text output to string */
76 		case 'o':
77 			argc--;
78 			argv++;
79 			soutput = argv[1];
80 			if ((int) argv[2]<16000)
81 			{
82 				soutlen = (int) argv[2];
83 				argc--;
84 				argv++;
85 			}
86 			break;
87 		case 't': /*tag output to string */
88 			argc--;
89 			argv++;
90 			tagout = argv[1];
91 			if ((int)argv[2]<16000)
92 			{
93 				taglen = (int)argv[2];
94 				argc--;
95 				argv++;
96 			}
97 			break;
98 		case 'l': /* specify length of lists */
99 			argc--;
100 			argv++;
101 			lmaster = atoi(argv[1]);
102 # if D1
103 			fprintf(stderr, "lmaster now %d\n",lmaster);
104 # endif
105 			break;
106 		case 'C':
107 			argc--;
108 			argv++;
109 			colevel = atoi(argv[1]);
110 			break;
111 		}
112 		argc--;
113 		argv++;
114 	}
115 	strcpy (indexname, todir(argv[1]));
116 # if D1
117 	fprintf(stderr, "in huntmain indexname %s typeindex %d\n", indexname, typeindex);
118 # endif
119 	if (typeindex == 0 || strcmp (oldname, indexname) !=0)
120 	{
121 		strcpy (oldname, indexname);
122 		unopen(fa);
123 		unopen(fb);
124 		unopen(fc);
125 
126 		if (ckexist(indexname, ".ib"))
127 		{
128 # if D1
129 			fprintf(stderr, "found old index\n");
130 # endif
131 			fa = iopen(indexname, ".ia");
132 			fb = iopen(indexname, ".ib");
133 			fc = iopen(indexname, ".ic");
134 			typeindex =1;
135 # if D1
136 			fprintf(stderr, "opened f's as %o %o %o\n",fa,fb,fc);
137 # endif
138 			indexdate = gdate(fb);
139 			fread (&nhash, sizeof(nhash), 1, fa);
140 			fread (&iflong, sizeof(iflong), 1, fa);
141 			if (nhash > maxhash)
142 			{
143 				if (hpt)
144 					free (hpt, maxhash, sizeof(*hpt));
145 				hpt=0;
146 				if (hfreq)
147 					free(hfreq, maxhash, sizeof(*hfreq));
148 				hfreq=0;
149 				maxhash=nhash;
150 # if D1
151 				fprintf(stderr, "Freed if needed maxhash %d\n",maxhash);
152 # endif
153 			}
154 			if (hpt==0)
155 				hpt = (long *) zalloc(nhash, sizeof(*hpt));
156 # if D1
157 			fprintf(stderr, "hpt now %o\n",hpt);
158 # endif
159 			if (hpt == NULL)
160 				err ("No space for hash list (%d)", nhash);
161 			fread( hpt, sizeof(*hpt), nhash, fa);
162 			if (hfreq==0)
163 				hfreq=(int *)zalloc(nhash, sizeof(*hfreq));
164 			if (hfreq==NULL)
165 				err ("No space for hash frequencies (%d)", nhash);
166 			frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
167 			hfrflg = (frtbl == nhash);
168 # if D1
169 			fprintf(stderr,"Read pointer files\n");
170 # endif
171 			if(master==0)
172 				master = (unsigned *) zalloc (lmaster, iflong? sizeof(long): sizeof(unsigned));
173 			if (master == NULL)
174 				err ("no space for answer list",0);
175 		}
176 		else
177 			if (makefgrep(indexname))
178 				typeindex=2;
179 			else
180 			{
181 				err ("No files %s\n",indexname);
182 				exit(1);
183 			}
184 	}
185 
186 # if D1
187 	fprintf(stderr, "typeindex now %d\n",typeindex);
188 # endif
189 	tagout[0]=0;
190 	if (typeindex==2)
191 	{
192 		grepcall(sinput, tagout, indexname);
193 # if D1
194 		fprintf(stderr, " back from grepcall\n");
195 # endif
196 		restodir();
197 		return;
198 	}
199 	nitem = getq(qitem);
200 # if D1
201 	fprintf(stderr, "approaching doquery fb %o\n", fb);
202 # endif
203 	nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
204 # ifdef D1
205 	fprintf(stderr, "return from doquery with nfound %d\n", nfound);
206 # endif
207 	if (falseflg == 0)
208 		nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full);
209 # ifdef D1
210 	fprintf(stderr, "after baddrop with nfound %d\n",nfound);
211 	fprintf(stderr, "tagout is /%s/, sout /%s/\n",tagout, soutput);
212 # endif
213 	if (tags)
214 		result (master, nfound >tags ? tags : nfound, fc);
215 # if D1
216 	fprintf(stderr, "done with huntmain\n");
217 	fprintf(stderr, "tagout is /%s/\n", tagout);
218 	fprintf(stderr, "string out is /%s/\n", soutput);
219 # endif
220 	if (fgnamp>fgnames)
221 	{
222 		char **fgp;
223 		int k;
224 # if D1
225 		fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
226 # endif
227 		grepquery[0]=0;
228 		for(k=0; k<nitem; k++)
229 		{
230 			strcat(grepquery, " ");
231 			strcat(grepquery, qitem[k]);
232 		}
233 		for(fgp=fgnames; fgp<fgnamp; fgp++)
234 		{
235 # if D1
236 			fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery);
237 # endif
238 			makefgrep(*fgp);
239 			grepcall(grepquery, tagout, *fgp);
240 # if D1
241 			fprintf(stderr, "tagout now /%s/\n", tagout);
242 # endif
243 		}
244 	}
245 	restodir();
246 }
247 
248 char *
249 todir(t)
250 char *t;
251 {
252 	char *s;
253 
254 	usedir[0] = 0;
255 	s=t;
256 	while (*s) s++;
257 	while (s>=t && *s != '/') s--;
258 	if (s<t) return(t);
259 	*s++ = 0;
260 	t = (*t ? t : "/");
261 	chdir (t);
262 	strcpy (usedir,t);
263 	return(s);
264 }
265 
266 setfrom(c)
267 {
268 	switch(c)
269 	{
270 	case 'y':
271 	case '\0':
272 	default:
273 		return(1000);
274 	case '1':
275 	case '2':
276 	case '3':
277 	case '4':
278 	case '5':
279 	case '6':
280 	case '7':
281 	case '8':
282 	case '9':
283 		return(c-'0');
284 	case 'n':
285 	case '0':
286 		return(0);
287 	}
288 }
289