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