--- ray/src/util/rad.c 1995/11/07 18:22:24 2.46 +++ ray/src/util/rad.c 1998/06/10 17:51:06 2.57 @@ -1,7 +1,7 @@ -/* Copyright (c) 1995 Regents of the University of California */ +/* Copyright (c) 1998 Silicon Graphics, Inc. */ #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static char SCCSid[] = "$SunId$ SGI"; #endif /* @@ -9,96 +9,71 @@ static char SCCSid[] = "$SunId$ LBL"; */ #include "standard.h" +#include "view.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 */ -#define MATERIAL 2 /* material files */ -#define ILLUM 3 /* mkillum input files */ -#define MKILLUM 4 /* mkillum options */ -#define RENDER 5 /* rendering options */ -#define OCONV 6 /* oconv options */ -#define PFILT 7 /* pfilt options */ -#define VIEW 8 /* view(s) for picture(s) */ -#define ZONE 9 /* simulation zone */ -#define QUALITY 10 /* desired rendering quality */ -#define OCTREE 11 /* octree file name */ -#define PICTURE 12 /* picture file root name */ -#define AMBFILE 13 /* ambient file name */ -#define OPTFILE 14 /* rendering options file */ -#define EXPOSURE 15 /* picture exposure setting */ -#define RESOLUTION 16 /* maximum picture resolution */ -#define UP 17 /* view up (X, Y or Z) */ -#define INDIRECT 18 /* indirection in lighting */ -#define DETAIL 19 /* level of scene detail */ -#define PENUMBRAS 20 /* shadow penumbras are desired */ -#define VARIABILITY 21 /* level of light variability */ -#define REPORT 22 /* report frequency and errfile */ -#define RAWFILE 23 /* raw picture file root name */ + /* variables (alphabetical by name) */ +#define AMBFILE 0 /* ambient file name */ +#define DETAIL 1 /* level of scene detail */ +#define EXPOSURE 2 /* picture exposure setting */ +#define EYESEP 3 /* interocular distance */ +#define ILLUM 4 /* mkillum input files */ +#define INDIRECT 5 /* indirection in lighting */ +#define MATERIAL 6 /* material files */ +#define MKILLUM 7 /* mkillum options */ +#define OBJECT 8 /* object files */ +#define OCONV 9 /* oconv options */ +#define OCTREE 10 /* octree file name */ +#define OPTFILE 11 /* rendering options file */ +#define PENUMBRAS 12 /* shadow penumbras are desired */ +#define PFILT 13 /* pfilt options */ +#define PICTURE 14 /* picture file root name */ +#define QUALITY 15 /* desired rendering quality */ +#define RAWFILE 16 /* raw picture file root name */ +#define RENDER 17 /* rendering options */ +#define REPORT 18 /* report frequency and errfile */ +#define RESOLUTION 19 /* maximum picture resolution */ +#define SCENE 20 /* scene files */ +#define UP 21 /* view up (X, Y or Z) */ +#define VARIABILITY 22 /* level of light variability */ +#define VIEWS 23 /* view(s) for picture(s) */ #define ZFILE 24 /* distance file root name */ +#define ZONE 25 /* simulation zone */ /* total number of variables */ -#define NVARS 25 +int NVARS = 26; -VARIABLE vv[NVARS] = { /* variable-value pairs */ - {"objects", 3, 0, NULL, catvalues}, - {"scene", 3, 0, NULL, catvalues}, - {"materials", 3, 0, NULL, catvalues}, +VARIABLE vv[] = { /* variable-value pairs */ + {"AMBFILE", 3, 0, NULL, onevalue}, + {"DETAIL", 3, 0, NULL, qualvalue}, + {"EXPOSURE", 3, 0, NULL, fltvalue}, + {"EYESEP", 3, 0, NULL, fltvalue}, {"illum", 3, 0, NULL, catvalues}, + {"INDIRECT", 3, 0, NULL, intvalue}, + {"materials", 3, 0, NULL, catvalues}, {"mkillum", 3, 0, NULL, catvalues}, - {"render", 3, 0, NULL, catvalues}, + {"objects", 3, 0, NULL, catvalues}, {"oconv", 3, 0, NULL, catvalues}, - {"pfilt", 2, 0, NULL, catvalues}, - {"view", 2, 0, NULL, NULL}, - {"ZONE", 2, 0, NULL, onevalue}, - {"QUALITY", 3, 0, NULL, qualvalue}, {"OCTREE", 3, 0, NULL, onevalue}, - {"PICTURE", 3, 0, NULL, onevalue}, - {"AMBFILE", 3, 0, NULL, onevalue}, {"OPTFILE", 3, 0, NULL, onevalue}, - {"EXPOSURE", 3, 0, NULL, fltvalue}, + {"PENUMBRAS", 3, 0, NULL, boolvalue}, + {"pfilt", 2, 0, NULL, catvalues}, + {"PICTURE", 3, 0, NULL, onevalue}, + {"QUALITY", 3, 0, NULL, qualvalue}, + {"RAWFILE", 3, 0, NULL, onevalue}, + {"render", 3, 0, NULL, catvalues}, + {"REPORT", 3, 0, NULL, onevalue}, {"RESOLUTION", 3, 0, NULL, onevalue}, + {"scene", 3, 0, NULL, catvalues}, {"UP", 2, 0, NULL, onevalue}, - {"INDIRECT", 3, 0, NULL, intvalue}, - {"DETAIL", 3, 0, NULL, qualvalue}, - {"PENUMBRAS", 3, 0, NULL, boolvalue}, {"VARIABILITY", 3, 0, NULL, qualvalue}, - {"REPORT", 3, 0, NULL, onevalue}, - {"RAWFILE", 3, 0, NULL, onevalue}, + {"view", 2, 0, NULL, NULL}, {"ZFILE", 2, 0, NULL, onevalue}, + {"ZONE", 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,10 +155,14 @@ 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]); + if (setvariable(argv[i], matchvar) < 0) { + fprintf(stderr, "%s: unknown variable: %s\n", + progname, argv[i]); + quit(1); + } /* check assignments */ checkvalues(); /* check files and dates */ @@ -192,7 +171,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 */ @@ -204,12 +183,12 @@ char *argv[]; rview(ropts, popts); else rpict(ropts, popts); - exit(0); + quit(0); userr: fprintf(stderr, -"Usage: %s [-s][-n][-t][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", +"Usage: %s [-w][-s][-n][-t][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", progname); - exit(1); + quit(1); } @@ -228,253 +207,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; @@ -551,7 +283,7 @@ checkfiles() /* check for existence and modified tim if (!octreedate & !scenedate & !illumdate) { fprintf(stderr, "%s: need '%s' or '%s' or '%s'\n", progname, vnam(OCTREE), vnam(SCENE), vnam(ILLUM)); - exit(1); + quit(1); } matdate = checklast(vval(MATERIAL)); } @@ -581,7 +313,7 @@ double org[3], *sizp; fprintf(stderr, "%s: error reading bounding box from getbbox\n", progname); - exit(1); + quit(1); } for (i = 0; i < 3; i++) if (max[i] - min[i] > osiz) @@ -599,7 +331,7 @@ double org[3], *sizp; fprintf(stderr, "%s: error reading bounding cube from getinfo\n", progname); - exit(1); + quit(1); } pclose(fp); } @@ -635,9 +367,9 @@ setdefaults() /* set default values for unassigned v vval(PICTURE) = radname; vdef(PICTURE)++; } - if (!vdef(VIEW)) { - vval(VIEW) = "X"; - vdef(VIEW)++; + if (!vdef(VIEWS)) { + vval(VIEWS) = "X"; + vdef(VIEWS)++; } if (!vdef(DETAIL)) { vval(DETAIL) = "M"; @@ -654,38 +386,6 @@ setdefaults() /* set default values for unassigned v } -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); -} - - oconv() /* run oconv and mkillum if necessary */ { static char illumtmp[] = "ilXXXXXX"; @@ -709,7 +409,7 @@ oconv() /* run oconv and mkillum if necessary */ "%s: error generating octree\n\t%s removed\n", progname, vval(OCTREE)); unlink(vval(OCTREE)); - exit(1); + quit(1); } } octreedate = time((time_t *)NULL); @@ -740,7 +440,7 @@ oconv() /* run oconv and mkillum if necessary */ "%s: error generating octree\n\t%s removed\n", progname, oct0name); unlink(oct0name); - exit(1); + quit(1); } } oct0date = time((time_t *)NULL); @@ -760,7 +460,7 @@ oconv() /* run oconv and mkillum if necessary */ fprintf(stderr, "%s: error running mkillum\n", progname); unlink(illumtmp); - exit(1); + quit(1); } /* make octree1 (frozen) */ if (octreedate) @@ -778,7 +478,7 @@ oconv() /* run oconv and mkillum if necessary */ progname, oct1name); unlink(oct1name); unlink(illumtmp); - exit(1); + quit(1); } rmfile(illumtmp); } @@ -842,8 +542,8 @@ ambval() /* compute ambient value */ { if (vdef(EXPOSURE)) { if (vval(EXPOSURE)[0] == '+' || vval(EXPOSURE)[0] == '-') - return(.5/pow(2.,atof(vval(EXPOSURE)))); - return(.5/atof(vval(EXPOSURE))); + return(.5/pow(2.,vflt(EXPOSURE))); + return(.5/vflt(EXPOSURE)); } if (vlet(ZONE) == 'E') return(10.); @@ -942,7 +642,7 @@ medqopts(op, po) /* medium quality rendering options register char *op; char *po; { - double d, org[3], siz[3]; + double d, org[3], siz[3], asz; *op = '\0'; *po = '\0'; @@ -953,25 +653,32 @@ char *po; if (siz[0] <= FTINY | siz[1] <= FTINY | siz[2] <= FTINY) badvalue(ZONE); getoctcube(org, &d); - d *= 3./(siz[0]+siz[1]+siz[2]); + asz = (siz[0]+siz[1]+siz[2])/3.; + d /= asz; switch (vscale(DETAIL)) { case LOW: po = addarg(po, vbool(PENUMBRAS) ? "-ps 4" : "-ps 8"); op = addarg(op, "-dp 256"); sprintf(op, " -ar %d", (int)(8*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/20.); + op += strlen(op); break; case MEDIUM: po = addarg(po, vbool(PENUMBRAS) ? "-ps 3" : "-ps 6"); op = addarg(op, "-dp 512"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/40.); + op += strlen(op); break; case HIGH: po = addarg(po, vbool(PENUMBRAS) ? "-ps 2" : "-ps 4"); op = addarg(op, "-dp 1024"); sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/80.); + op += strlen(op); break; } po = addarg(po, "-pt .08"); @@ -1013,7 +720,7 @@ hiqopts(op, po) /* high quality rendering options * register char *op; char *po; { - double d, org[3], siz[3]; + double d, org[3], siz[3], asz; *op = '\0'; *po = '\0'; @@ -1024,25 +731,32 @@ char *po; if (siz[0] <= FTINY | siz[1] <= FTINY | siz[2] <= FTINY) badvalue(ZONE); getoctcube(org, &d); - d *= 3./(siz[0]+siz[1]+siz[2]); + asz = (siz[0]+siz[1]+siz[2])/3.; + d /= asz; switch (vscale(DETAIL)) { case LOW: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 8"); op = addarg(op, "-dp 1024"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/40.); + op += strlen(op); break; case MEDIUM: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 5"); op = addarg(op, "-dp 2048"); sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/80.); + op += strlen(op); break; case HIGH: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 3"); op = addarg(op, "-dp 4096"); sprintf(op, " -ar %d", (int)(64*d)); op += strlen(op); + sprintf(op, " -ms %.2g", asz/160.); + op += strlen(op); break; } po = addarg(po, "-pt .04"); @@ -1089,7 +803,8 @@ char *ro; return; if (vdef(OPTFILE)) { for (cp = ro; cp[1]; cp++) - if (isspace(cp[1]) && cp[2] == '-' && isalpha(cp[3])) + if (isspace(cp[1]) && (cp[2] == '@' || + (cp[2] == '-' && isalpha(cp[3])))) *cp = '\n'; else *cp = cp[1]; @@ -1287,14 +1002,14 @@ char *vn; /* returned view name */ } /* view number? */ if (isint(viewselect)) - return(specview(nvalue(vv+VIEW, atoi(viewselect)-1))); + return(specview(nvalue(VIEWS, atoi(viewselect)-1))); /* check list */ - while ((mv = nvalue(vv+VIEW, n++)) != NULL) + while ((mv = nvalue(VIEWS, n++)) != NULL) if (matchword(viewselect, mv)) return(specview(mv)); return(specview(viewselect)); /* standard view? */ } - mv = nvalue(vv+VIEW, n); /* use view n */ + mv = nvalue(VIEWS, n); /* use view n */ if (vn != NULL & mv != NULL) { register char *mv2 = mv; if (*mv2 != '-') @@ -1309,56 +1024,28 @@ char *vn; /* returned view name */ printview(vopts) /* print out selected view */ register char *vopts; { - extern char *atos(), *getenv(); - char buf[256]; - FILE *fp; + extern char *strstr(), *atos(), *getenv(); + VIEW vwr; + char buf[128]; register char *cp; - +again: if (vopts == NULL) return(-1); - fputs("VIEW=", stdout); - do { - if (matchword(vopts, "-vf")) { /* expand view file */ - vopts = sskip(vopts); - if (!*atos(buf, sizeof(buf), vopts)) - return(-1); - if ((fp = fopen(buf, "r")) == NULL) - return(-1); - for (buf[sizeof(buf)-2] = '\n'; - fgets(buf, sizeof(buf), fp) != NULL && - buf[0] != '\n'; - buf[sizeof(buf)-2] = '\n') { - if (buf[sizeof(buf)-2] != '\n') { - ungetc(buf[sizeof(buf)-2], fp); - buf[sizeof(buf)-2] = '\0'; - } - if (matchword(buf, "VIEW=") || - matchword(buf, "rview")) { - for (cp = sskip(buf); *cp && *cp != '\n'; cp++) - putchar(*cp); - } - } - fclose(fp); - vopts = sskip(vopts); - } else { - while (isspace(*vopts)) - vopts++; - putchar(' '); #ifdef MSDOS - if (*vopts == '$') { /* expand env. var. */ - if (!*atos(buf, sizeof(buf), vopts+1)) - return(-1); - if ((cp = getenv(buf)) == NULL) - return(-1); - fputs(cp, stdout); - vopts = sskip(vopts); - } else + if (vopts[0] == '$') { + vopts = getenv(vopts+1); + goto again; + } #endif - while (*vopts && !isspace(*vopts)) - putchar(*vopts++); - } - } while (*vopts++); - putchar('\n'); + copystruct(&vwr, &stdview); + cp = vopts; /* get -vf files first */ + while ((cp = strstr(cp, "-vf ")) != NULL && + *atos(buf, sizeof(buf), cp += 4)) + viewfile(buf, &vwr, NULL); + sscanview(&vwr, vopts); /* get the rest */ + fputs(VIEWSTR, stdout); + fprintview(&vwr, stdout); /* print full spec. */ + fputc('\n', stdout); return(0); } @@ -1381,7 +1068,7 @@ char *opts, *po; strcat(combuf, oct1name); if (runcom(combuf)) { /* run it */ fprintf(stderr, "%s: error running rview\n", progname); - exit(1); + quit(1); } } @@ -1478,7 +1165,7 @@ char *opts, *po; fprintf(stderr, "%s: error in overture for view %s\n", progname, vs); - exit(1); + quit(1); } #ifdef NIX rmfile(overfile); @@ -1491,7 +1178,7 @@ char *opts, *po; if (runcom(combuf)) { /* run rpict */ fprintf(stderr, "%s: error rendering view %s\n", progname, vs); - exit(1); + quit(1); } if (!vdef(RAWFILE) || strcmp(vval(RAWFILE),vval(PICTURE))) { /* build pfilt command */ @@ -1506,7 +1193,7 @@ char *opts, *po; "%s: error filtering view %s\n\t%s removed\n", progname, vs, picfile); unlink(picfile); - exit(1); + quit(1); } } /* remove/rename raw file */ @@ -1589,7 +1276,7 @@ char *vname, *value; sprintf(evp, "%s=%s", vname, value); if (putenv(evp) != 0) { fprintf(stderr, "%s: out of environment space\n", progname); - exit(1); + quit(1); } if (!silent) printf("set %s\n", evp); @@ -1602,7 +1289,7 @@ int vc; { fprintf(stderr, "%s: bad value for variable '%s'\n", progname, vnam(vc)); - exit(1); + quit(1); } @@ -1610,5 +1297,12 @@ syserr(s) /* report a system error and exit */ char *s; { perror(s); - exit(1); + quit(1); +} + + +quit(ec) /* exit program */ +int ec; +{ + exit(ec); }