#include "refer.h" #include #ifndef D1 #define D1 0 #endif #if D1 #define D(x) x #else #define D(x) #endif int findline(char *argin, char *out, int outlen, long indexdate) { static char name[DIRLEN] = ""; char *p, *in; static FILE *fa = NULL; long lp, llen; int len = 0, k, nofil; D(fprintf(stderr, "findline: %s\n", argin)); in = (char *)zalloc(strlen(argin) + 1, 1); strcpy(in, argin); nofil = in[0] == 0; for (p = in; *p && *p != ':' && *p != ';'; p++) ; if (*p) *p++ = 0; else p = in; k = sscanf(p, "%ld,%ld", &lp, &llen); D(fprintf(stderr, "p %s k %d lp %ld llen %ld\n", p, k, lp, llen)); if (k < 2) { lp = 0; llen = outlen; } D(fprintf(stderr, "lp %ld llen %ld\n", lp, llen)); D(fprintf(stderr, "fa now %o, p %o in %o %s\n", fa, p, in, in)); if (nofil) { D(fprintf(stderr, "set fa to stdin\n")); fa = stdin; } else if (strcmp (name, in) != 0 || 1) { D(fprintf(stderr, "old: %s new %s not equal\n", name, in)); if (fa != NULL) fa = freopen(in, "r", fa); else fa = fopen(in, "r"); if (fa == NULL) { /* should this be a fatal error? */ warn(0, "failed to (re)open %s. %s\n", in, strerror(errno)); free(in); return 0; } strcpy(name, in); if (gdate(fa) > indexdate && indexdate != 0) err("index files %s.i[abc] out of date - rerun pubindex", name); } else { D(fprintf(stderr, "old %s new %s same fa %o\n", name, in, fa)); } if (fa != NULL) { fseek (fa, lp, 0); len = fread (out, 1, llen>=outlen? outlen-1: llen, fa); out[len] = 0; D(fprintf(stderr, "length as read is %d\n", len)); } free(in); return len; }