1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)glue1.c 4.5 (Berkeley) 04/18/91"; 7 #endif /* not lint */ 8 9 #include <stdio.h> 10 #define unopen(fil) {if (fil!=NULL) {fclose(fil); fil=NULL;}} 11 12 extern char refdir[]; 13 int lmaster = 1000; 14 int reached = 0; 15 FILE *fd = 0; 16 int *hfreq, hfrflg; 17 int colevel = 0; 18 unsigned *master = 0; 19 int iflong; 20 extern char *fgnames[], **fgnamp; 21 extern FILE *iopen(); 22 char *todir(); 23 int prfreqs = 0; 24 int typeindex = 0; 25 char usedir[100]; 26 static int full = 1000; 27 static int tags = 0; 28 char *sinput, *soutput, *tagout; 29 long indexdate = 0, gdate(); 30 int soutlen = 1000; 31 int taglen = 1000; 32 33 huntmain(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 indexname[100], *qitem[100], *rprog = 0; 39 char grepquery[200]; 40 static char oldname[30] ; 41 static int nhash = 0; 42 static int maxhash = 0; 43 int falseflg = 0, nitem, nfound, frtbl; 44 static long *hpt = 0; 45 # if D1 46 fprintf(stderr, "in glue1 argc %d argv %o %o\n", argc, argv[0],argv[1]); 47 # endif 48 savedir(); 49 while (argv[1][0] == '-') 50 { 51 # if D1 52 fprintf(stderr, "argv.1 is %s\n",argv[1]); 53 # endif 54 switch(argv[1][1]) 55 { 56 case 'a': /* all output, incl. false drops */ 57 falseflg = 1; 58 break; 59 case 'r': 60 argc--; 61 argv++; 62 rprog = argv[1]; 63 break; 64 case 'F': /* put out full text */ 65 full = setfrom(argv[1][2]); 66 break; 67 case 'T': /* put out tags */ 68 tags = setfrom(argv[1][2]); 69 break; 70 case 'i': /* input in argument string */ 71 argc--; 72 argv++; 73 sinput = argv[1]; 74 break; 75 case 's': /*text output to string */ 76 case 'o': 77 argc--; 78 argv++; 79 soutput = argv[1]; 80 if ((int) argv[2]<16000) 81 { 82 soutlen = (int) argv[2]; 83 argc--; 84 argv++; 85 } 86 break; 87 case 't': /*tag output to string */ 88 argc--; 89 argv++; 90 tagout = argv[1]; 91 if ((int)argv[2]<16000) 92 { 93 taglen = (int)argv[2]; 94 argc--; 95 argv++; 96 } 97 break; 98 case 'l': /* specify length of lists */ 99 argc--; 100 argv++; 101 lmaster = atoi(argv[1]); 102 # if D1 103 fprintf(stderr, "lmaster now %d\n",lmaster); 104 # endif 105 break; 106 case 'C': 107 argc--; 108 argv++; 109 colevel = atoi(argv[1]); 110 break; 111 } 112 argc--; 113 argv++; 114 } 115 strcpy (indexname, todir(argv[1])); 116 # if D1 117 fprintf(stderr, "in huntmain indexname %s typeindex %d\n", indexname, typeindex); 118 # endif 119 if (typeindex == 0 || strcmp (oldname, indexname) !=0) 120 { 121 strcpy (oldname, indexname); 122 unopen(fa); 123 unopen(fb); 124 unopen(fc); 125 126 if (ckexist(indexname, ".ib")) 127 { 128 # if D1 129 fprintf(stderr, "found old index\n"); 130 # endif 131 fa = iopen(indexname, ".ia"); 132 fb = iopen(indexname, ".ib"); 133 fc = iopen(indexname, ".ic"); 134 typeindex =1; 135 # if D1 136 fprintf(stderr, "opened f's as %o %o %o\n",fa,fb,fc); 137 # endif 138 indexdate = gdate(fb); 139 fread (&nhash, sizeof(nhash), 1, fa); 140 fread (&iflong, sizeof(iflong), 1, fa); 141 if (nhash > maxhash) 142 { 143 if (hpt) 144 free (hpt, maxhash, sizeof(*hpt)); 145 hpt=0; 146 if (hfreq) 147 free(hfreq, maxhash, sizeof(*hfreq)); 148 hfreq=0; 149 maxhash=nhash; 150 # if D1 151 fprintf(stderr, "Freed if needed maxhash %d\n",maxhash); 152 # endif 153 } 154 if (hpt==0) 155 hpt = (long *) zalloc(nhash, sizeof(*hpt)); 156 # if D1 157 fprintf(stderr, "hpt now %o\n",hpt); 158 # endif 159 if (hpt == NULL) 160 err ("No space for hash list (%d)", nhash); 161 fread( hpt, sizeof(*hpt), nhash, fa); 162 if (hfreq==0) 163 hfreq=(int *)zalloc(nhash, sizeof(*hfreq)); 164 if (hfreq==NULL) 165 err ("No space for hash frequencies (%d)", nhash); 166 frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa); 167 hfrflg = (frtbl == nhash); 168 # if D1 169 fprintf(stderr,"Read pointer files\n"); 170 # endif 171 if(master==0) 172 master = (unsigned *) zalloc (lmaster, iflong? sizeof(long): sizeof(unsigned)); 173 if (master == NULL) 174 err ("no space for answer list",0); 175 } 176 else 177 if (makefgrep(indexname)) 178 typeindex=2; 179 else 180 { 181 err ("No files %s\n",indexname); 182 exit(1); 183 } 184 } 185 186 # if D1 187 fprintf(stderr, "typeindex now %d\n",typeindex); 188 # endif 189 tagout[0]=0; 190 if (typeindex==2) 191 { 192 grepcall(sinput, tagout, indexname); 193 # if D1 194 fprintf(stderr, " back from grepcall\n"); 195 # endif 196 restodir(); 197 return; 198 } 199 nitem = getq(qitem); 200 # if D1 201 fprintf(stderr, "approaching doquery fb %o\n", fb); 202 # endif 203 nfound = doquery(hpt, nhash, fb, nitem, qitem, master); 204 # ifdef D1 205 fprintf(stderr, "return from doquery with nfound %d\n", nfound); 206 # endif 207 if (falseflg == 0) 208 nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full); 209 # ifdef D1 210 fprintf(stderr, "after baddrop with nfound %d\n",nfound); 211 fprintf(stderr, "tagout is /%s/, sout /%s/\n",tagout, soutput); 212 # endif 213 if (tags) 214 result (master, nfound >tags ? tags : nfound, fc); 215 # if D1 216 fprintf(stderr, "done with huntmain\n"); 217 fprintf(stderr, "tagout is /%s/\n", tagout); 218 fprintf(stderr, "string out is /%s/\n", soutput); 219 # endif 220 if (fgnamp>fgnames) 221 { 222 char **fgp; 223 int k; 224 # if D1 225 fprintf(stderr, "were %d bad files\n", fgnamp-fgnames); 226 # endif 227 grepquery[0]=0; 228 for(k=0; k<nitem; k++) 229 { 230 strcat(grepquery, " "); 231 strcat(grepquery, qitem[k]); 232 } 233 for(fgp=fgnames; fgp<fgnamp; fgp++) 234 { 235 # if D1 236 fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery); 237 # endif 238 makefgrep(*fgp); 239 grepcall(grepquery, tagout, *fgp); 240 # if D1 241 fprintf(stderr, "tagout now /%s/\n", tagout); 242 # endif 243 } 244 } 245 restodir(); 246 } 247 248 char * 249 todir(t) 250 char *t; 251 { 252 char *s; 253 254 usedir[0] = 0; 255 s=t; 256 while (*s) s++; 257 while (s>=t && *s != '/') s--; 258 if (s<t) return(t); 259 *s++ = 0; 260 t = (*t ? t : "/"); 261 chdir (t); 262 strcpy (usedir,t); 263 return(s); 264 } 265 266 setfrom(c) 267 { 268 switch(c) 269 { 270 case 'y': 271 case '\0': 272 default: 273 return(1000); 274 case '1': 275 case '2': 276 case '3': 277 case '4': 278 case '5': 279 case '6': 280 case '7': 281 case '8': 282 case '9': 283 return(c-'0'); 284 case 'n': 285 case '0': 286 return(0); 287 } 288 } 289