|
|
1.1 root 1: # include "stdio.h"
2: # define unopen(fil) {if (fil!=NULL) {fclose(fil); fil=NULL;}}
3: extern char refdir[];
4: int lmaster = 1000;
5: int reached = 0;
6: FILE *fd = 0;
7: int *hfreq, hfrflg;
8: int colevel = 0;
9: static union firetruck {unsigned *a; long *b;} master;
10: int iflong;
11: extern char *fgnames[], **fgnamp;
12: extern FILE *iopen();
13: char *todir();
14: int prfreqs = 0;
15: int typeindex = 0;
16: char usedir[100];
17: static int full = 1000;
18: static int tags = 0;
19: char *sinput, *soutput, *tagout;
20: long indexdate = 0, gdate();
21: int soutlen = 1000;
22: int taglen = 1000;
23:
24: huntmain(argc,argv)
25: char *argv[];
26: {
27: /* read query from stdin, expect name of indexes in argv[1] */
28: static FILE *fa, *fb, *fc;
29: char indexname[100], *qitem[100], *rprog = 0;
30: char grepquery[200];
31: static char oldname[30] ;
32: static int nhash = 0;
33: static int maxhash = 0;
34: int falseflg = 0, nitem, nfound, frtbl;
35: static long *hpt = 0;
36: # if D1
37: fprintf(stderr, "in glue1 argc %d argv %o %o\n", argc, argv[0],argv[1]);
38: # endif
39: savedir();
40: while (argv[1][0] == '-')
41: {
42: # if D1
43: fprintf(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: }
96: strcpy (indexname, todir(argv[1]));
97: # if D1
98: fprintf(stderr, "in huntmain indexname %s typeindex %d\n", indexname, typeindex);
99: # endif
100: if (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
169: fprintf(stderr, "typeindex now %d\n",typeindex);
170: # endif
171: tagout[0]=0;
172: if (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: }
181: nitem = getq(qitem);
182: # if D1
183: fprintf(stderr, "approaching doquery fb %o\n", fb);
184: # endif
185: nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
186: # ifdef D1
187: fprintf(stderr, "return from doquery with nfound %d\n", nfound);
188: # endif
189: if (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
195: if (tags)
196: result (master, nfound >tags ? tags : nfound, fc);
197: # if D1
198: fprintf(stderr, "done with huntmain\n");
199: fprintf(stderr, "tagout is /%s/\n", tagout);
200: fprintf(stderr, "string out is /%s/\n", soutput);
201: # endif
202: if (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: }
227: restodir();
228: }
229:
230: char *
231: todir(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;
240: t = (*t ? t : "/");
241: chdir (t);
242: strcpy (usedir,t);
243: return(s);
244: }
245: setfrom(c)
246: {
247: switch(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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.