--- ray/src/common/header.c 2003/06/20 00:25:49 2.15 +++ ray/src/common/header.c 2019/05/25 04:00:54 2.33 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: header.c,v 2.15 2003/06/20 00:25:49 greg Exp $"; +static const char RCSid[] = "$Id: header.c,v 2.33 2019/05/25 04:00:54 greg Exp $"; #endif /* * header.c - routines for reading and writing information headers. @@ -7,14 +7,12 @@ static const char RCSid[] = "$Id: header.c,v 2.15 2003 * Externals declared in resolu.h * * newheader(t,fp) start new information header identified by string t - * isheadid(s) returns true if s is a header id line * headidval(r,s) copy header identifier value in s to r - * dateval(t,s) get capture date value - * isdate(s) returns true if s is a date line - * fputdate(t,fp) put out the given capture date and time + * dateval(t,s) get capture date value as UTC + * gmtval(t,s) get GMT as UTC + * fputdate(t,fp) put out the given UTC * fputnow(fp) put out the current date and time * printargs(ac,av,fp) print an argument list to fp, followed by '\n' - * isformat(s) returns true if s is of the form "FORMAT=*" * formatval(r,s) copy the format value in s to r * fputformat(s,fp) write "FORMAT=%s" to fp * getheader(fp,f,p) read header from fp, calling f(s,p) on each line @@ -26,26 +24,30 @@ static const char RCSid[] = "$Id: header.c,v 2.15 2003 #include "copyright.h" -#include -#include -#include #include -#define MAXLINE 512 +#include "rtio.h" +#include "resolu.h" -char HDRSTR[] = "#?"; /* information header magic number */ +#define MAXLINE 2048 -char FMTSTR[] = "FORMAT="; /* format identifier */ +extern time_t timegm(struct tm *tm); -char TMSTR[] = "CAPDATE="; /* capture date identifier */ +const char HDRSTR[] = "#?"; /* information header magic number */ -static int mycheck(); +const char FMTSTR[] = "FORMAT="; /* format identifier */ +const char TMSTR[] = "CAPDATE="; /* capture date identifier */ +const char GMTSTR[] = "GMT="; /* GMT identifier */ +static gethfunc mycheck; + + void -newheader(s, fp) /* identifying line of information header */ -char *s; -register FILE *fp; +newheader( /* identifying line of information header */ + const char *s, + FILE *fp +) { fputs(HDRSTR, fp); fputs(s, fp); @@ -54,10 +56,12 @@ register FILE *fp; int -headidval(r,s) /* get header id (return true if is id) */ -register char *r, *s; +headidval( /* get header id (return true if is id) */ + char *r, + const char *s +) { - register char *cp = HDRSTR; + const char *cp = HDRSTR; while (*cp) if (*cp++ != *s++) return(0); if (r == NULL) return(1); @@ -68,20 +72,13 @@ register char *r, *s; int -isheadid(s) /* check to see if line is header id */ -char *s; +dateval( /* convert capture date line to UTC */ + time_t *tloc, + const char *s +) { - return(headidval(NULL, s)); -} - - -int -dateval(tloc, s) /* get capture date value */ -time_t *tloc; -char *s; -{ struct tm tms; - register char *cp = TMSTR; + const char *cp = TMSTR; while (*cp) if (*cp++ != *s++) return(0); while (isspace(*s)) s++; @@ -101,30 +98,55 @@ char *s; int -isdate(s) /* is the given line a capture date? */ -char *s; +gmtval( /* convert GMT date line to UTC */ + time_t *tloc, + const char *s +) { - return(dateval(NULL, s)); + struct tm tms; + const char *cp = GMTSTR; + + while (*cp) if (*cp++ != *s++) return(0); + while (isspace(*s)) s++; + if (!*s) return(0); + if (sscanf(s, "%d:%d:%d %d:%d:%d", + &tms.tm_year, &tms.tm_mon, &tms.tm_mday, + &tms.tm_hour, &tms.tm_min, &tms.tm_sec) != 6) + return(0); + if (tloc == NULL) + return(1); + tms.tm_mon--; + tms.tm_year -= 1900; + *tloc = timegm(&tms); + return(1); } void -fputdate(tv, fp) /* write out the given time value */ -time_t tv; -FILE *fp; +fputdate( /* write out the given time value (local & GMT) */ + time_t tv, + FILE *fp +) { - struct tm *tm = localtime(&tv); - if (tm == NULL) - return; - fprintf(fp, "%s %04d:%02d:%02d %02d:%02d:%02d\n", TMSTR, - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); + struct tm *tms; + + tms = localtime(&tv); + if (tms != NULL) + fprintf(fp, "%s %04d:%02d:%02d %02d:%02d:%02d\n", TMSTR, + tms->tm_year+1900, tms->tm_mon+1, tms->tm_mday, + tms->tm_hour, tms->tm_min, tms->tm_sec); + tms = gmtime(&tv); + if (tms != NULL) + fprintf(fp, "%s %04d:%02d:%02d %02d:%02d:%02d\n", GMTSTR, + tms->tm_year+1900, tms->tm_mon+1, tms->tm_mday, + tms->tm_hour, tms->tm_min, tms->tm_sec); } void -fputnow(fp) /* write out the current time */ -FILE *fp; +fputnow( /* write out the current time */ + FILE *fp +) { time_t tv; time(&tv); @@ -133,10 +155,11 @@ FILE *fp; void -printargs(ac, av, fp) /* print arguments to a file */ -int ac; -char **av; -FILE *fp; +printargs( /* print arguments to a file */ + int ac, + char **av, + FILE *fp +) { while (ac-- > 0) { fputword(*av++, fp); @@ -146,11 +169,13 @@ FILE *fp; int -formatval(r, s) /* get format value (return true if format) */ -register char *r; -register char *s; +formatval( /* get format value (return true if format) */ + char fmt[MAXFMTLEN], + const char *s +) { - register char *cp = FMTSTR; + const char *cp = FMTSTR; + char *r = fmt; while (*cp) if (*cp++ != *s++) return(0); while (isspace(*s)) s++; @@ -158,24 +183,17 @@ register char *s; if (r == NULL) return(1); do *r++ = *s++; - while(*s && !isspace(*s)); + while (*s && !isspace(*s) && r-fmt < MAXFMTLEN-1); *r = '\0'; return(1); } -int -isformat(s) /* is line a format line? */ -char *s; -{ - return(formatval(NULL, s)); -} - - void -fputformat(s, fp) /* put out a format value */ -char *s; -FILE *fp; +fputformat( /* put out a format value */ + const char *s, + FILE *fp +) { fputs(FMTSTR, fp); fputs(s, fp); @@ -184,53 +202,59 @@ FILE *fp; int -getheader(fp, f, p) /* get header from file */ -FILE *fp; -int (*f)(); -char *p; +getheader( /* get header from file */ + FILE *fp, + gethfunc *f, + void *p +) { + int rtotal = 0; char buf[MAXLINE]; for ( ; ; ) { + int rval = 0; buf[MAXLINE-2] = '\n'; if (fgets(buf, MAXLINE, fp) == NULL) return(-1); - if (buf[0] == '\n') - return(0); -#ifdef MSDOS - if (buf[0] == '\r' && buf[1] == '\n') - return(0); -#endif + if (buf[buf[0]=='\r'] == '\n') + return(rtotal); if (buf[MAXLINE-2] != '\n') { ungetc(buf[MAXLINE-2], fp); /* prevent false end */ buf[MAXLINE-2] = '\0'; } - if (f != NULL && (*f)(buf, p) < 0) + if (f != NULL && (rval = (*f)(buf, p)) < 0) return(-1); + rtotal += rval; } } struct check { FILE *fp; - char fs[64]; + char fs[MAXFMTLEN]; }; static int -mycheck(s, cp) /* check a header line for format info. */ -char *s; -register struct check *cp; +mycheck( /* check a header line for format info. */ + char *s, + void *cp +) { - if (!formatval(cp->fs, s) && cp->fp != NULL) - fputs(s, cp->fp); + struct check *scp = (struct check *)cp; + + if (!formatval(scp->fs, s) && scp->fp != NULL) + fputs(s, scp->fp); + return(0); } int -globmatch(p, s) /* check for match of s against pattern p */ -register char *p, *s; +globmatch( /* check for match of s against pattern p */ + const char *p, + const char *s +) { int setmatch; @@ -243,7 +267,7 @@ register char *p, *s; case '*': /* match any string */ while (p[1] == '*') p++; do - if ( (p[1]=='?' || p[1]==*s) && + if ( (p[1]=='?') | (p[1]==*s) && globmatch(p+1,s) ) return(1); while (*s++); @@ -256,11 +280,11 @@ register char *p, *s; if (!*p) return(0); if (*p == '-') { - setmatch += p[-1] <= *s && *s <= p[1]; + setmatch += (p[-1] <= *s && *s <= p[1]); if (!*++p) break; } else - setmatch += *p == *s; + setmatch += (*p == *s); } if (!setmatch) return(0); @@ -295,13 +319,14 @@ register char *p, *s; */ int -checkheader(fin, fmt, fout) -FILE *fin; -char *fmt; -FILE *fout; +checkheader( + FILE *fin, + char fmt[MAXFMTLEN], + FILE *fout +) { struct check cdat; - register char *cp; + char *cp; cdat.fp = fout; cdat.fs[0] = '\0'; @@ -310,11 +335,12 @@ FILE *fout; if (!cdat.fs[0]) return(0); for (cp = fmt; *cp; cp++) /* check for globbing */ - if (*cp == '?' | *cp == '*') + if ((*cp == '?') | (*cp == '*')) { if (globmatch(fmt, cdat.fs)) { strcpy(fmt, cdat.fs); return(1); } else return(-1); + } return(strcmp(fmt, cdat.fs) ? -1 : 1); /* literal match */ }