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 (mindex(in, '!')) 42 return (0); 43 44 nofil = in[0] == 0; 45 for (p = in; *p && *p != ':' && *p != ';'; p++) 46 ; 47 if (*p) *p++ = 0; 48 else p = in; 49 k = sscanf(p, "%ld,%ld", &lp, &llen); 50 if (k < 2) { 51 lp = 0; 52 llen = outlen; 53 } 54 if (nofil) { 55 fa = stdin; 56 } else 57 if (strcmp(name, in) != 0 || 1) { 58 if (fa != NULL) 59 fa = freopen(in, "r", fa); 60 else 61 fa = fopen(in, "r"); 62 if (fa == NULL) 63 return (0); 64 /* err("Can't open %s", in); */ 65 strcpy(name, in); 66 if (gdate(fa) > indexdate && indexdate != 0) { 67 if (keepold) { 68 for (ftp = fgnames; ftp < fgnamp; ftp++) 69 if (strcmp(*ftp, name) == SAME) 70 return (0); 71 strcpy(*fgnamp++ = fgp, name); 72 assert(fgnamp < fgnames+FGCT); 73 while (*fgp && *fgp != ':') 74 fgp++; 75 *fgp++ = 0; 76 assert(fgp < fgspace+FGSIZE); 77 return (0); 78 } 79 fprintf(stderr, gettext( 80 "Warning: index predates file '%s'\n"), 81 name); 82 } 83 } 84 if (fa != NULL) { 85 fseek(fa, lp, 0); 86 *out = (char *)malloc(llen + 1); 87 if (*out == NULL) { 88 return (0); 89 } 90 (void) fread(*out, 1, llen, fa); 91 *(*out + llen) = 0; 92 } 93 return (llen); 94 }