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