--- ray/src/common/header.c 1991/04/19 10:33:25 1.3 +++ ray/src/common/header.c 1994/02/27 10:16:45 2.4 @@ -1,4 +1,4 @@ -/* Copyright (c) 1988 Regents of the University of California */ +/* Copyright (c) 1994 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -9,7 +9,10 @@ static char SCCSid[] = "$SunId$ LBL"; * * 8/19/88 * - * printargs(ac,av,fp) print an argument list to fp, followed by '\n' + * 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 + * 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 @@ -22,45 +25,97 @@ static char SCCSid[] = "$SunId$ LBL"; #include #include -#define MAXLINE 512 +#define MAXLINE 512 -char FMTSTR[] = "FORMAT="; -int FMTSTRL = 7; +#ifndef BSD +#define index strchr +#endif +extern char *index(); +char HDRSTR[] = "#?"; /* information header magic number */ + +char FMTSTR[] = "FORMAT="; /* format identifier */ + + +newheader(s, fp) /* identifying line of information header */ +char *s; +register FILE *fp; +{ + fputs(HDRSTR, fp); + fputs(s, fp); + putc('\n', fp); +} + + +headidval(r,s) /* get header id (return true if is id) */ +register char *r, *s; +{ + register char *cp = HDRSTR; + + while (*cp) if (*cp++ != *s++) return(0); + if (r == NULL) return(1); + while (*s) *r++ = *s++; + *r = '\0'; + return(1); +} + + +isheadid(s) /* check to see if line is header id */ +char *s; +{ + return(headidval(NULL, s)); +} + + printargs(ac, av, fp) /* print arguments to a file */ int ac; char **av; -FILE *fp; +register FILE *fp; { + int quote; + while (ac-- > 0) { - fputs(*av++, fp); + 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); } putc('\n', fp); } -isformat(s) /* is line a format line? */ -char *s; -{ - return(!strncmp(s,FMTSTR,FMTSTRL)); -} - - -formatval(r, s) /* return format value */ +formatval(r, s) /* get format value (return true if format) */ register char *r; register char *s; { - s += FMTSTRL; + register char *cp = FMTSTR; + + while (*cp) if (*cp++ != *s++) return(0); while (isspace(*s)) s++; - if (!*s) { *r = '\0'; return; } + if (!*s) return(0); + if (r == NULL) return(1); while(*s) *r++ = *s++; while (isspace(r[-1])) r--; *r = '\0'; + return(1); } +isformat(s) /* is line a format line? */ +char *s; +{ + return(formatval(NULL, s)); +} + + fputformat(s, fp) /* put out a format value */ char *s; FILE *fp; @@ -80,10 +135,14 @@ char *p; for ( ; ; ) { buf[MAXLINE-2] = '\n'; - if (fgets(buf, sizeof(buf), fp) == NULL) + 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[MAXLINE-2] != '\n') { ungetc(buf[MAXLINE-2], fp); /* prevent false end */ buf[MAXLINE-2] = '\0'; @@ -105,9 +164,7 @@ mycheck(s, cp) /* check a header line for format inf char *s; register struct check *cp; { - if (!strncmp(s,FMTSTR,FMTSTRL)) - formatval(cp->fs, s); - else if (cp->fp != NULL) /* don't copy format info. */ + if (!formatval(cp->fs, s) && cp->fp != NULL) fputs(s, cp->fp); } @@ -134,7 +191,7 @@ char *pat, *str; case '*': /* match any string */ while (p[1] == '*') p++; do - if ( (p[1] == '?' || p[1] == *s) + if ( (p[1]=='?' || p[1]==*s) && copymatch(p+1,s) ) { strcpy(pat, str); return(1); @@ -164,7 +221,7 @@ char *pat, *str; * Checkheader(fin,fmt,fout) returns a value of 1 if the input format * matches the specification in fmt, 0 if no input format was found, * and -1 if the input format does not match or there is an - * error reading the header. If fmt is NULL, then -1 is returned + * error reading the header. If fmt is empty, then -1 is returned * 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. @@ -183,8 +240,6 @@ FILE *fout; cdat.fp = fout; cdat.fs[0] = '\0'; if (getheader(fin, mycheck, &cdat) < 0) - return(-1); - if (fmt == NULL && cdat.fs[0] != '\0') return(-1); if (cdat.fs[0] != '\0') return(copymatch(fmt, cdat.fs) ? 1 : -1);