--- ray/src/common/header.c 1996/03/12 11:29:16 2.7 +++ ray/src/common/header.c 2003/02/22 02:07:22 2.11 @@ -1,17 +1,18 @@ -/* Copyright (c) 1994 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: header.c,v 2.11 2003/02/22 02:07:22 greg Exp $"; #endif - /* * header.c - routines for reading and writing information headers. * - * 8/19/88 + * 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 + * 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 @@ -23,7 +24,66 @@ static char SCCSid[] = "$SunId$ LBL"; * To copy header from input to output, use getheader(fin, fputs, fout) */ +/* ==================================================================== + * The Radiance Software License, Version 1.0 + * + * Copyright (c) 1990 - 2002 The Regents of the University of California, + * through Lawrence Berkeley National Laboratory. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes Radiance software + * (http://radsite.lbl.gov/) + * developed by the Lawrence Berkeley National Laboratory + * (http://www.lbl.gov/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" + * and "The Regents of the University of California" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact radiance@radsite.lbl.gov. + * + * 5. Products derived from this software may not be called "Radiance", + * nor may "Radiance" appear in their name, without prior written + * permission of Lawrence Berkeley National Laboratory. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of Lawrence Berkeley National Laboratory. For more + * information on Lawrence Berkeley National Laboratory, please see + * . + */ + #include +#include +#include #include #define MAXLINE 512 @@ -38,7 +98,12 @@ char HDRSTR[] = "#?"; /* information header magic nu char FMTSTR[] = "FORMAT="; /* format identifier */ +char TMSTR[] = "CAPDATE="; /* capture date identifier */ +static int mycheck(); + + +void newheader(s, fp) /* identifying line of information header */ char *s; register FILE *fp; @@ -57,7 +122,7 @@ register char *r, *s; while (*cp) if (*cp++ != *s++) return(0); if (r == NULL) return(1); - while (*s) *r++ = *s++; + while (*s && !isspace(*s)) *r++ = *s++; *r = '\0'; return(1); } @@ -71,27 +136,75 @@ char *s; } +int +dateval(tloc, s) /* get capture date value */ +time_t *tloc; +char *s; +{ + struct tm tms; + register char *cp = TMSTR; + + 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; + tms.tm_isdst = -1; /* ask mktime() to figure out DST */ + *tloc = mktime(&tms); + return(1); +} + + +int +isdate(s) /* is the given line a capture date? */ +char *s; +{ + return(dateval(NULL, s)); +} + + +void +fputdate(tv, fp) /* write out the given time value */ +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); +} + + +void +fputnow(fp) /* write out the current time */ +FILE *fp; +{ + time_t tv; + time(&tv); + fputdate(tv, fp); +} + + +void printargs(ac, av, fp) /* print arguments to a file */ int ac; char **av; -register FILE *fp; +FILE *fp; { int quote; while (ac-- > 0) { - if (index(*av, ' ') != NULL) { /* quote it */ - if (index(*av, '\'') != NULL) - quote = '"'; - else - quote = '\''; - putc(quote, fp); - fputs(*av++, fp); - putc(quote, fp); - } else - fputs(*av++, fp); - putc(' ', fp); + fputword(*av++, fp); + fputc(ac ? ' ' : '\n', fp); } - putc('\n', fp); } @@ -122,6 +235,7 @@ char *s; } +void fputformat(s, fp) /* put out a format value */ char *s; FILE *fp; @@ -154,8 +268,8 @@ char *p; ungetc(buf[MAXLINE-2], fp); /* prevent false end */ buf[MAXLINE-2] = '\0'; } - if (f != NULL) - (*f)(buf, p); + if (f != NULL && (*f)(buf, p) < 0) + return(-1); } } @@ -166,21 +280,22 @@ struct check { }; -static +static int mycheck(s, cp) /* check a header line for format info. */ char *s; register struct check *cp; { if (!formatval(cp->fs, s) && cp->fp != NULL) fputs(s, cp->fp); + return(0); } int -globmatch(pat, str) /* check for glob match of str against pat */ -char *pat, *str; +globmatch(p, s) /* check for match of s against pattern p */ +register char *p, *s; { - register char *p = pat, *s = str; + int setmatch; do { switch (*p) { @@ -196,6 +311,24 @@ char *pat, *str; return(1); while (*s++); return(0); + case '[': /* character set */ + setmatch = *s == *++p; + if (!*p) + return(0); + while (*++p != ']') { + if (!*p) + return(0); + if (*p == '-') { + setmatch += p[-1] <= *s && *s <= p[1]; + if (!*++p) + break; + } else + setmatch += *p == *s; + } + if (!setmatch) + return(0); + s++; + break; case '\\': /* literal next */ p++; /* fall through */