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