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