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