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