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