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