1: # include "stdio.h" 2: # define SAME 0 3: # include "assert.h" 4: # define FGCT 10 5: # define FGSIZE 150 6: int keepold 1; /* keep old things for fgrep search */ 7: char fgspace[FGSIZE]; 8: char *fgp fgspace; 9: char *fgnames[FGCT]; 10: char **fgnamp fgnames; 11: findline(in, out, outlen, indexdate) 12: long indexdate; 13: char *in, *out; 14: { 15: static char name[100] ""; 16: char *p, **ftp; 17: extern long gdate(); 18: static FILE *fa NULL; 19: long lp, llen; 20: int len, k, nofil; 21: 22: # if D1 23: fprintf(stderr, "findline: %s\n", in); 24: # endif 25: if (mindex(in, '!')) 26: return(remote(in, out)); 27: nofil = in[0]==0; 28: for(p=in; *p && *p != ':' && *p != ';'; p++) 29: ; 30: if (*p) *p++=0; 31: else p=in; 32: k = sscanf(p, "%ld,%ld", &lp, &llen); 33: # ifdef D1 34: fprintf(stderr, "p %s k %d lp %ld llen %ld\n",p,k,lp,llen); 35: # endif 36: if (k<2) 37: { 38: lp = 0; 39: llen=outlen; 40: } 41: # ifdef D1 42: fprintf(stderr, "lp %ld llen %ld\n",lp, llen); 43: # endif 44: # ifdef D1 45: fprintf(stderr, "fa now %o, p %o in %o %s\n",fa, p,in,in); 46: # endif 47: if (nofil) 48: { 49: # if D1 50: fprintf(stderr, "set fa to stdin\n"); 51: # endif 52: fa = stdin; 53: } 54: else 55: if (strcmp (name, in) != 0 || 1) 56: { 57: # if D1 58: fprintf(stderr, "old: %s new %s not equal\n",name,in); 59: # endif 60: if (fa != NULL) 61: fa = freopen(in, "r", fa); 62: else 63: fa = fopen(in, "r"); 64: # if D1 65: if (fa==NULL) fprintf(stderr, "failed to (re)open *%s*\n",in); 66: # endif 67: if (fa == NULL) 68: return(0); 69: /* err("Can't open %s", in); */ 70: strcpy(name, in); 71: if (gdate(fa) > indexdate && indexdate != 0) 72: { 73: if (keepold) 74: { 75: for(ftp=fgnames; ftp<fgnamp; ftp++) 76: if (strcmp(*ftp, name)==SAME) 77: return(0); 78: strcpy (*fgnamp++ = fgp, name); 79: assert(fgnamp<fgnames+FGCT); 80: while (*fgp && *fgp!=':') 81: fgp++; 82: *fgp++ = 0; 83: assert (fgp<fgspace+FGSIZE); 84: return(0); 85: } 86: fprintf(stderr, "Warning: index predates file '%s'\n", name); 87: } 88: } 89: # if D1 90: else 91: fprintf(stderr, "old %s new %s same fa %o\n", name,in,fa); 92: # endif 93: if (fa != NULL) 94: { 95: fseek (fa, lp, 0); 96: len = (llen >= outlen) ? outlen-1 : llen; 97: len = fread (out, 1, len, fa); 98: out[len] = 0; 99: # ifdef D1 100: fprintf(stderr, "length as read is %d\n",len); 101: # endif 102: } 103: return(len); 104: }