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