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