--- ray/src/common/header.c 1994/02/27 10:16:45 2.4 +++ ray/src/common/header.c 1998/10/27 08:44:28 2.10 @@ -1,4 +1,4 @@ -/* Copyright (c) 1994 Regents of the University of California */ +/* Copyright (c) 1996 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -17,6 +17,7 @@ static char SCCSid[] = "$SunId$ LBL"; * 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 + * globmatch(pat, str) check for glob match of str against pat * checkheader(i,p,o) check header format from i against p and copy to o * * To copy header from input to output, use getheader(fin, fputs, fout) @@ -48,6 +49,7 @@ register FILE *fp; } +int headidval(r,s) /* get header id (return true if is id) */ register char *r, *s; { @@ -55,12 +57,13 @@ 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); } +int isheadid(s) /* check to see if line is header id */ char *s; { @@ -86,12 +89,12 @@ register FILE *fp; putc(quote, fp); } else fputs(*av++, fp); - putc(' ', fp); + putc(ac ? ' ' : '\n', fp); } - putc('\n', fp); } +int formatval(r, s) /* get format value (return true if format) */ register char *r; register char *s; @@ -102,13 +105,15 @@ register char *s; while (isspace(*s)) s++; if (!*s) return(0); if (r == NULL) return(1); - while(*s) *r++ = *s++; - while (isspace(r[-1])) r--; + do + *r++ = *s++; + while(*s && !isspace(*s)); *r = '\0'; return(1); } +int isformat(s) /* is line a format line? */ char *s; { @@ -126,6 +131,7 @@ FILE *fp; } +int getheader(fp, f, p) /* get header from file */ FILE *fp; int (*f)(); @@ -147,8 +153,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); } } @@ -169,16 +175,10 @@ register struct check *cp; } -/* - * Copymatch(pat,str) checks pat for wildcards, and - * copies str into pat if there is a match (returning true). - */ - -#ifdef COPYMATCH -copymatch(pat, str) +int +globmatch(pat, str) /* check for glob match of str against pat */ char *pat, *str; { - int docopy = 0; register char *p = pat, *s = str; do { @@ -186,16 +186,13 @@ char *pat, *str; case '?': /* match any character */ if (!*s++) return(0); - docopy++; break; case '*': /* match any string */ while (p[1] == '*') p++; do - if ( (p[1]=='?' || p[1]==*s) - && copymatch(p+1,s) ) { - strcpy(pat, str); + if ( (p[1]=='?' || p[1]==*s) && + globmatch(p+1,s) ) return(1); - } while (*s++); return(0); case '\\': /* literal next */ @@ -208,13 +205,8 @@ char *pat, *str; break; } } while (*p++); - if (docopy) - strcpy(pat, str); return(1); } -#else -#define copymatch(pat, s) (!strcmp(pat, s)) -#endif /* @@ -225,23 +217,33 @@ char *pat, *str; * if any input format is found (or there is an error), and 0 otherwise. * If fmt contains any '*' or '?' characters, then checkheader * does wildcard expansion and copies a matching result into fmt. - * Be sure that fmt is big enough to hold the match in such cases! + * Be sure that fmt is big enough to hold the match in such cases, + * and that it is not a static, read-only string! * The input header (minus any format lines) is copied to fout * if fout is not NULL. */ +int checkheader(fin, fmt, fout) FILE *fin; char *fmt; FILE *fout; { struct check cdat; + register char *cp; cdat.fp = fout; cdat.fs[0] = '\0'; if (getheader(fin, mycheck, &cdat) < 0) return(-1); - if (cdat.fs[0] != '\0') - return(copymatch(fmt, cdat.fs) ? 1 : -1); - return(0); + if (!cdat.fs[0]) + return(0); + for (cp = fmt; *cp; cp++) /* check for globbing */ + 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 */ }