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