1 /*
2 * Copyright 2017 Gary Mills
3 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
4 * Use is subject to license terms.
5 */
6
7 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
8 /* All Rights Reserved */
9
10 /*
11 * Copyright (c) 1980 Regents of the University of California.
12 * All rights reserved. The Berkeley software License Agreement
13 * specifies the terms and conditions for redistribution.
14 */
15
16 #include <stdio.h>
17 #include <locale.h>
18 #include <assert.h>
19 #define SAME 0
20 #define FGCT 10
21 #define FGSIZE 150
22
23 int keepold = 1; /* keep old things for fgrep search */
24 char fgspace[FGSIZE];
25 char *fgp = fgspace;
26 char *fgnames[FGCT];
27 char **fgnamp = fgnames;
28
29 extern char *mindex();
30
31 long
32 findline(char *in, char **out, int outlen, long indexdate)
33 {
34 static char name[100] = "";
35 char *p, **ftp;
36 extern long gdate();
37 static FILE *fa = NULL;
38 long lp, llen;
39 int k, nofil;
40
41 #if D1
42 fprintf(stderr, "findline: %s\n", in);
43 #endif
44 if (mindex(in, '!'))
45 return (0);
46
47 nofil = in[0] == 0;
48 for (p = in; *p && *p != ':' && *p != ';'; p++)
49 ;
50 if (*p) *p++ = 0;
51 else p = in;
52 k = sscanf(p, "%ld,%ld", &lp, &llen);
53 #ifdef D1
54 fprintf(stderr, "p %s k %d lp %ld llen %ld\n", p, k, lp, llen);
55 #endif
56 if (k < 2) {
57 lp = 0;
58 llen = outlen;
59 }
60 #ifdef D1
61 fprintf(stderr, "lp %ld llen %ld\n", lp, llen);
62 #endif
63 #ifdef D1
64 fprintf(stderr, "fa now %o, p %o in %o %s\n", fa, p, in, in);
65 #endif
66 if (nofil) {
67 #if D1
68 fprintf(stderr, "set fa to stdin\n");
69 #endif
70 fa = stdin;
71 } else
72 if (strcmp(name, in) != 0 || 1) {
73 #if D1
74 fprintf(stderr, "old: %s new %s not equal\n", name, in);
75 #endif
76 if (fa != NULL)
77 fa = freopen(in, "r", fa);
78 else
79 fa = fopen(in, "r");
80 #if D1
81 if (fa == NULL)
82 fprintf(stderr, "failed to (re)open *%s*\n",
83 in);
84 #endif
85 if (fa == NULL)
86 return (0);
87 /* err("Can't open %s", in); */
88 strcpy(name, in);
89 if (gdate(fa) > indexdate && indexdate != 0) {
90 if (keepold) {
91 for (ftp = fgnames; ftp < fgnamp; ftp++)
92 if (strcmp(*ftp, name) == SAME)
93 return (0);
94 strcpy(*fgnamp++ = fgp, name);
95 assert(fgnamp < fgnames+FGCT);
96 while (*fgp && *fgp != ':')
97 fgp++;
98 *fgp++ = 0;
99 assert(fgp < fgspace+FGSIZE);
100 return (0);
101 }
102 fprintf(stderr, gettext(
103 "Warning: index predates file '%s'\n"),
104 name);
105 }
106 }
107 #if D1
108 else
109 fprintf(stderr, "old %s new %s same fa %o\n",
110 name, in, fa);
111 #endif
112 if (fa != NULL) {
113 fseek(fa, lp, 0);
114 *out = (char *)malloc(llen + 1);
115 if (*out == NULL) {
116 return (0);
117 }
118 (void) fread(*out, 1, llen, fa);
119 *(*out + llen) = 0;
120 #ifdef D1
121 fprintf(stderr, "length as read is %d\n", len);
122 #endif
123 }
124 return (llen);
125 }