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