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