Research V7 development
[unix-history] / usr / src / cmd / refer / hunt1.c
CommitLineData
52960f2f
ML
1# include "stdio.h"
2# include "assert.h"
3extern char refdir[];
4extern int keepold;
5extern char *fgnames[];
6extern char **fgnamp;
7FILE *fd 0;
8int lmaster 500;
9int *hfreq, hfrflg;
10int colevel 0;
11int soutlen 1000;
12int reached 0;
13int iflong 0;
14int prfreqs 0;
15char usedir[100];
16char gfile[50];
17static int full 1000;
18static int tags 0;
19char *sinput, *soutput, *tagout;
20long indexdate 0, gdate();
21
22main(argc,argv)
23 char *argv[];
24{
25/* read query from stdin, expect name of indexes in argv[1] */
26static FILE *fa, *fb, *fc;
27char nma[100], nmb[100], nmc[100], *qitem[100], *rprog 0;
28char nmd[100], grepquery[256];
29static char oldname[30] ;
30static int was 0;
31/* these pointers are unions of pointer to int and pointer to long */
32long *hpt;
33unsigned *master 0;
34int falseflg, nhash, nitem, nfound, frtbl, kk;
35
36 /* special wart for refpart: default is tags only */
37
38while (argv[1][0] == '-')
39 {
40 switch(argv[1][1])
41 {
42 case 'a': /* all output, incl. false drops */
43 falseflg = 1; break;
44 case 'r':
45 argc--; argv++;
46 rprog = argv[1];
47 break;
48 case 'F': /* put out full text */
49 full = setfrom(argv[1][2]);
50 break;
51 case 'T': /* put out tags */
52 tags = setfrom(argv[1][2]);
53 break;
54 case 'i': /* input in argument string */
55 argc--; argv++;
56 sinput = argv[1];
57 break;
58 case 's': /*text output to string */
59 case 'o':
60 argc--; argv++;
61 soutput = argv[1];
62 if (argv[2]<16000)
63 {
64 soutlen = argv[2];
65 argc--; argv++;
66 }
67 break;
68 case 't': /*tag output to string */
69 argc--; argv++;
70 tagout = argv[1];
71 break;
72 case 'l': /* length of internal lists */
73 argc--; argv++;
74 lmaster = atoi(argv[1]);
75 break;
76 case 'g': /* suppress fgrep search on old files */
77 keepold = 0;
78 break;
79 case 'C': /* coordination level */
80 colevel = atoi(argv[1]+2);
81# if D1
82fprintf(stderr, "colevel set to %d\n",colevel);
83# endif
84 break;
85 case 'P': /* print term freqs */
86 prfreqs=1; break;
87 }
88 argc--; argv++;
89 }
90strcpy (nma, todir(argv[1]));
91if (was == 0 || strcmp (oldname, nma) !=0)
92 {
93 strcpy (oldname,nma);
94 strcpy (nmb, nma); strcpy (nmc, nmb); strcpy(nmd,nma);
95 strcat (nma, ".ia");
96 strcat (nmb, ".ib");
97 strcat (nmc, ".ic");
98 strcat (nmd, ".id");
99 if (was)
100 {fclose(fa); fclose(fb); fclose(fc);}
101
102 fa = fopen(nma, "r");
103 if (fa==NULL)
104 {
105 err("No files %s",nma);
106 exit(1);
107 }
108 fb = fopen(nmb, "r");
109 fc = fopen(nmc, "r");
110 was =1;
111 if (fb== NULL || fc ==NULL)
112 {
113 err("Index incomplete %s", nmb);
114 exit(1);
115 }
116 indexdate = gdate(fb);
117 fd = fopen(nmd, "r");
118 }
119fseek (fa, 0L, 0);
120fread (&nhash, sizeof(nhash), 1, fa);
121fread (&iflong, sizeof(iflong), 1, fa);
122if(master==0)
123master = calloc (lmaster, iflong? 4: 2);
124hpt = calloc(nhash, sizeof(*hpt));
125kk=fread( hpt, sizeof(*hpt), nhash, fa);
126# if D1
127fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash);
128# endif
129_assert (kk==nhash);
130hfreq = calloc(nhash, sizeof(*hfreq));
131_assert (hfreq != NULL);
132frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
133hfrflg = (frtbl == nhash);
134# if D1
135fprintf(stderr, "read freqs %d\n", frtbl);
136# endif
137
138while (1)
139 {
140 nitem = getq(qitem);
141 if (nitem==0) continue;
142 if (nitem < 0) break;
143 nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
144# if D1
145 fprintf(stderr,"after doquery nfound %d\n", nfound);
146# endif
147 fgnamp=fgnames;
148 if (falseflg == 0)
149 nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full);
150# if D1
151 fprintf(stderr,"after baddrop nfound %d\n", nfound);
152# endif
153 if (fgnamp>fgnames)
154 {
155 char **fgp, tgbuff[100];
156 int k;
157# if D1
158 fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
159# endif
160 grepquery[0]=0;
161 for(k=0; k<nitem; k++)
162 {
163 strcat(grepquery, " ");
164 strcat(grepquery, qitem[k]);
165 }
166# if D1
167 fprintf(stderr, "grepquery %s\n",grepquery);
168# endif
169 for(fgp=fgnames; fgp<fgnamp; fgp++)
170 {
171# if D1
172 fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery);
173# endif
174 makefgrep(*fgp);
175# if D1
176 fprintf(stderr, "grepmade\n");
177# endif
178 if (tagout==0)
179 tagout=tgbuff;
180 grepcall(grepquery, tagout, *fgp);
181# if D1
182 fprintf(stderr, "tagout now /%s/\n", tagout);
183# endif
184 if (full)
185 {
186 char bout[1000];
187 findline(tagout, bout, 1000);
188 fputs(bout,stdout);
189 }
190 }
191 }
192 if (tags)
193 result (master, nfound >tags ? tags: nfound, fc);
194 }
195}
196
197todir(t)
198 char *t;
199{
200 char *s;
201 s=t;
202 while (*s) s++;
203 while (s>=t && *s != '/') s--;
204 if (s<t) return(t);
205*s++ = 0;
206t = (*t ? t : "/");
207chdir (t);
208strcpy (usedir,t);
209return(s);
210}
211setfrom(c)
212{
213switch(c)
214 {
215 case 'y': case '\0':
216 default:
217 return(1000);
218 case '1':
219 case '2': case '3': case '4': case '5':
220 case '6': case '7': case '8': case '9':
221 return(c-'0');
222 case 'n': case '0':
223 return(0);
224 }
225}