| 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}
|