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