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