--- ray/src/util/rad.c 1995/12/08 19:55:50 2.47 +++ ray/src/util/rad.c 1995/12/12 13:30:14 2.48 @@ -10,21 +10,10 @@ static char SCCSid[] = "$SunId$ LBL"; #include "standard.h" #include "paths.h" +#include "vars.h" #include #include - -typedef struct { - char *name; /* variable name */ - short nick; /* # characters required for nickname */ - short nass; /* # assignments made */ - char *value; /* assigned value(s) */ - int (*fixval)(); /* assignment checking function */ -} VARIABLE; - -int onevalue(), catvalues(), boolvalue(), - qualvalue(), fltvalue(), intvalue(); - /* variables */ #define OBJECT 0 /* object files */ #define SCENE 1 /* scene files */ @@ -52,9 +41,9 @@ int onevalue(), catvalues(), boolvalue(), #define RAWFILE 23 /* raw picture file root name */ #define ZFILE 24 /* distance file root name */ /* total number of variables */ -#define NVARS 25 +int NVARS = 25; -VARIABLE vv[NVARS] = { /* variable-value pairs */ +VARIABLE vv[] = { /* variable-value pairs */ {"objects", 3, 0, NULL, catvalues}, {"scene", 3, 0, NULL, catvalues}, {"materials", 3, 0, NULL, catvalues}, @@ -82,23 +71,6 @@ VARIABLE vv[NVARS] = { /* variable-value pairs */ {"ZFILE", 2, 0, NULL, onevalue}, }; -VARIABLE *matchvar(); -char *nvalue(); - -#define UPPER(c) ((c)&~0x20) /* ASCII trick */ - -#define vnam(vc) (vv[vc].name) -#define vdef(vc) (vv[vc].nass) -#define vval(vc) (vv[vc].value) -#define vint(vc) atoi(vval(vc)) -#define vlet(vc) UPPER(vval(vc)[0]) -#define vscale vlet -#define vbool(vc) (vlet(vc)=='T') - -#define HIGH 'H' -#define MEDIUM 'M' -#define LOW 'L' - /* overture calculation file */ #ifdef NIX char overfile[] = "overture.unf"; @@ -180,7 +152,7 @@ char *argv[]; /* assign Radiance root file name */ rootname(radname, rifname); /* load variable values */ - load(rifname); + loadvars(rifname); /* get any additional assignments */ for (i++; i < argc; i++) setvariable(argv[i]); @@ -192,7 +164,7 @@ char *argv[]; setdefaults(); /* print all values if requested */ if (explicate) - printvals(); + printvars(stdout); /* build octree (and run mkillum) */ oconv(); /* check date on ambient file */ @@ -228,253 +200,6 @@ register char *rn, *fn; } -#define NOCHAR 127 /* constant for character to delete */ - - -load(rfname) /* load Radiance simulation file */ -char *rfname; -{ - FILE *fp; - char buf[512]; - register char *cp; - - if (rfname == NULL) - fp = stdin; - else if ((fp = fopen(rfname, "r")) == NULL) - syserr(rfname); - while (fgetline(buf, sizeof(buf), fp) != NULL) { - for (cp = buf; *cp; cp++) { - switch (*cp) { - case '\\': - *cp++ = NOCHAR; - continue; - case '#': - *cp = '\0'; - break; - default: - continue; - } - break; - } - setvariable(buf); - } - fclose(fp); -} - - -setvariable(ass) /* assign variable according to string */ -register char *ass; -{ - char varname[32]; - int n; - register char *cp; - register VARIABLE *vp; - register int i; - - while (isspace(*ass)) /* skip leading space */ - ass++; - cp = varname; /* extract name */ - while (cp < varname+sizeof(varname)-1 - && *ass && !isspace(*ass) && *ass != '=') - *cp++ = *ass++; - *cp = '\0'; - if (!varname[0]) - return; /* no variable name! */ - /* trim value */ - while (isspace(*ass) || *ass == '=') - ass++; - for (n = strlen(ass); n > 0; n--) - if (!isspace(ass[n-1])) - break; - if (!n && !nowarn) { - fprintf(stderr, "%s: warning - missing value for variable '%s'\n", - progname, varname); - return; - } - /* match variable from list */ - vp = matchvar(varname); - if (vp == NULL) { - fprintf(stderr, "%s: unknown variable '%s'\n", - progname, varname); - exit(1); - } - /* assign new value */ - if (i = vp->nass) { - cp = vp->value; - while (i--) - while (*cp++) - ; - i = cp - vp->value; - vp->value = realloc(vp->value, i+n+1); - } else - vp->value = malloc(n+1); - if (vp->value == NULL) - syserr(progname); - cp = vp->value+i; /* copy value, squeezing spaces */ - *cp = *ass; - for (i = 1; i <= n; i++) { - if (ass[i] == NOCHAR) - continue; - if (isspace(*cp)) - while (isspace(ass[i])) - i++; - *++cp = ass[i]; - } - if (isspace(*cp)) /* remove trailing space */ - *cp = '\0'; - vp->nass++; -} - - -VARIABLE * -matchvar(nam) /* match a variable by its name */ -char *nam; -{ - int n = strlen(nam); - register int i; - - for (i = 0; i < NVARS; i++) - if (n >= vv[i].nick && !strncmp(nam, vv[i].name, n)) - return(vv+i); - return(NULL); -} - - -char * -nvalue(vp, n) /* return nth variable value */ -VARIABLE *vp; -register int n; -{ - register char *cp; - - if (vp == NULL | n < 0 | n >= vp->nass) - return(NULL); - cp = vp->value; - while (n--) - while (*cp++) - ; - return(cp); -} - - -checkvalues() /* check assignments */ -{ - register int i; - - for (i = 0; i < NVARS; i++) - if (vv[i].fixval != NULL) - (*vv[i].fixval)(vv+i); -} - - -onevalue(vp) /* only one assignment for this variable */ -register VARIABLE *vp; -{ - if (vp->nass < 2) - return; - if (!nowarn) - fprintf(stderr, - "%s: warning - multiple assignment of variable '%s'\n", - progname, vp->name); - do - vp->value += strlen(vp->value)+1; - while (--vp->nass > 1); -} - - -catvalues(vp) /* concatenate variable values */ -register VARIABLE *vp; -{ - register char *cp; - - if (vp->nass < 2) - return; - for (cp = vp->value; vp->nass > 1; vp->nass--) { - while (*cp) - cp++; - *cp++ = ' '; - } -} - - -int -badmatch(tv, cv) /* case insensitive truncated comparison */ -register char *tv, *cv; -{ - if (!*tv) return(1); /* null string cannot match */ - do - if (UPPER(*tv) != *cv++) - return(1); - while (*++tv); - return(0); /* OK */ -} - - -boolvalue(vp) /* check boolean for legal values */ -register VARIABLE *vp; -{ - if (!vp->nass) return; - onevalue(vp); - switch (UPPER(vp->value[0])) { - case 'T': - if (badmatch(vp->value, "TRUE")) break; - return; - case 'F': - if (badmatch(vp->value, "FALSE")) break; - return; - } - fprintf(stderr, "%s: illegal value for boolean variable '%s'\n", - progname, vp->name); - exit(1); -} - - -qualvalue(vp) /* check qualitative var. for legal values */ -register VARIABLE *vp; -{ - if (!vp->nass) return; - onevalue(vp); - switch (UPPER(vp->value[0])) { - case 'L': - if (badmatch(vp->value, "LOW")) break; - return; - case 'M': - if (badmatch(vp->value, "MEDIUM")) break; - return; - case 'H': - if (badmatch(vp->value, "HIGH")) break; - return; - } - fprintf(stderr, "%s: illegal value for qualitative variable '%s'\n", - progname, vp->name); - exit(1); -} - - -intvalue(vp) /* check integer variable for legal values */ -register VARIABLE *vp; -{ - if (!vp->nass) return; - onevalue(vp); - if (isint(vp->value)) return; - fprintf(stderr, "%s: illegal value for integer variable '%s'\n", - progname, vp->name); - exit(1); -} - - -fltvalue(vp) /* check float variable for legal values */ -register VARIABLE *vp; -{ - if (!vp->nass) return; - onevalue(vp); - if (isflt(vp->value)) return; - fprintf(stderr, "%s: illegal value for real variable '%s'\n", - progname, vp->name); - exit(1); -} - - time_t checklast(fnames) /* check files and find most recent */ register char *fnames; @@ -651,38 +376,6 @@ setdefaults() /* set default values for unassigned v vval(VARIABILITY) = "L"; vdef(VARIABILITY)++; } -} - - -printvals() /* print variable values */ -{ - int i, j, clipline; - register char *cp; - register int k; - - for (i = 0; i < NVARS; i++) /* print each variable */ - for (j = 0; j < vdef(i); j++) { /* print each assignment */ - fputs(vnam(i), stdout); - fputs("= ", stdout); - k = clipline = ( vv[i].fixval == catvalues ? 64 : 320 ) - - strlen(vnam(i)) ; - cp = nvalue(vv+i, j); - while (*cp) { - putchar(*cp++); - if (--k <= 0) { /* line too long */ - while (*cp && !isspace(*cp)) - putchar(*cp++); /* finish this word */ - if (*cp) { /* start new line */ - putchar('\n'); - fputs(vnam(i), stdout); - putchar('='); - k = clipline; - } - } - } - putchar('\n'); - } - fflush(stdout); }