--- ray/src/util/rad.c 1994/12/23 09:20:06 2.42 +++ ray/src/util/rad.c 1997/03/20 12:50:07 2.53 @@ -1,4 +1,4 @@ -/* Copyright (c) 1994 Regents of the University of California */ +/* Copyright (c) 1995 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -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 */ @@ -38,7 +27,7 @@ int onevalue(), catvalues(), boolvalue(), #define ZONE 9 /* simulation zone */ #define QUALITY 10 /* desired rendering quality */ #define OCTREE 11 /* octree file name */ -#define PICTURE 12 /* picture 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 */ @@ -49,10 +38,12 @@ int onevalue(), catvalues(), boolvalue(), #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 */ +#define ZFILE 24 /* distance file root name */ /* total number of variables */ -#define NVARS 23 +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}, @@ -76,28 +67,13 @@ VARIABLE vv[NVARS] = { /* variable-value pairs */ {"PENUMBRAS", 3, 0, NULL, boolvalue}, {"VARIABILITY", 3, 0, NULL, qualvalue}, {"REPORT", 3, 0, NULL, onevalue}, + {"RAWFILE", 3, 0, NULL, onevalue}, + {"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.raw"; +char overfile[] = "overture.unf"; #else char overfile[] = "/dev/null"; #endif @@ -176,10 +152,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 */ @@ -188,7 +168,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 */ @@ -200,12 +180,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", progname); - exit(1); + quit(1); } @@ -224,253 +204,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; @@ -547,7 +280,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)); } @@ -559,7 +292,7 @@ double org[3], *sizp; extern FILE *popen(); static double oorg[3], osiz = 0.; double min[3], max[3]; - char buf[512]; + char buf[1024]; FILE *fp; register int i; @@ -577,7 +310,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) @@ -595,7 +328,7 @@ double org[3], *sizp; fprintf(stderr, "%s: error reading bounding cube from getinfo\n", progname); - exit(1); + quit(1); } pclose(fp); } @@ -650,42 +383,10 @@ 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"; - char combuf[512], ocopts[64], mkopts[64]; + char combuf[1024], ocopts[64], mkopts[64]; oconvopts(ocopts); /* get options */ if (octreedate < scenedate) { /* check date on original octree */ @@ -705,7 +406,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); @@ -736,7 +437,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); @@ -756,7 +457,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) @@ -773,7 +474,8 @@ oconv() /* run oconv and mkillum if necessary */ "%s: error generating octree\n\t%s removed\n", progname, oct1name); unlink(oct1name); - exit(1); + unlink(illumtmp); + quit(1); } rmfile(illumtmp); } @@ -837,8 +539,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.); @@ -914,10 +616,10 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .4 -ad 64"); + op = addarg(op, "-aw 128 -aa .4 -ad 64"); break; case MEDIUM: - op = addarg(op, "-aa .3 -ad 128"); + op = addarg(op, "-aw 1024 -aa .3 -ad 128"); break; case HIGH: op = addarg(op, "-aa .25 -ad 256"); @@ -937,7 +639,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'; @@ -948,25 +650,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"); @@ -986,10 +695,10 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .25 -ad 196 -as 0"); + op = addarg(op, "-aw 128 -aa .25 -ad 196 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .2 -ad 400 -as 64"); + op = addarg(op, "-aw 1024 -aa .2 -ad 400 -as 64"); break; case HIGH: op = addarg(op, "-aa .15 -ad 768 -as 196"); @@ -1008,7 +717,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'; @@ -1019,25 +728,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"); @@ -1055,10 +771,10 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .15 -ad 256 -as 0"); + op = addarg(op, "-aw 128 -aa .15 -ad 256 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .125 -ad 512 -as 256"); + op = addarg(op, "-aw 1024 -aa .125 -ad 512 -as 256"); break; case HIGH: op = addarg(op, "-aa .08 -ad 1024 -as 512"); @@ -1084,7 +800,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]; @@ -1179,7 +896,7 @@ register char *vs; zpos = -1; vs++; } viewtype = 'v'; - if (*vs == 'v' | *vs == 'l' | *vs == 'a' | *vs == 'h') + if (*vs == 'v' | *vs == 'l' | *vs == 'a' | *vs == 'h' | *vs == 'c') viewtype = *vs++; cp = viewopts; if ((!*vs || isspace(*vs)) && (xpos|ypos|zpos)) { /* got one! */ @@ -1234,6 +951,9 @@ register char *vs; case 'h': cp = addarg(cp, "-vh 180 -vv 180"); break; + case 'c': + cp = addarg(cp, "-vh 180 -vv 90"); + break; } } else { while (!isspace(*vs)) /* else skip id */ @@ -1279,14 +999,14 @@ char *vn; /* returned view name */ } /* view number? */ if (isint(viewselect)) - return(specview(nvalue(vv+VIEW, atoi(viewselect)-1))); + return(specview(nvalue(VIEW, atoi(viewselect)-1))); /* check list */ - while ((mv = nvalue(vv+VIEW, n++)) != NULL) + while ((mv = nvalue(VIEW, n++)) != NULL) if (matchword(viewselect, mv)) return(specview(mv)); return(specview(viewselect)); /* standard view? */ } - mv = nvalue(vv+VIEW, n); /* use view n */ + mv = nvalue(VIEW, n); /* use view n */ if (vn != NULL & mv != NULL) { register char *mv2 = mv; if (*mv2 != '-') @@ -1373,7 +1093,7 @@ char *opts, *po; strcat(combuf, oct1name); if (runcom(combuf)) { /* run it */ fprintf(stderr, "%s: error running rview\n", progname); - exit(1); + quit(1); } } @@ -1382,7 +1102,8 @@ rpict(opts, po) /* run rpict and pfilt for each vie char *opts, *po; { char combuf[1024]; - char rawfile[MAXPATH], picfile[MAXPATH], rep[MAXPATH+16], res[32]; + char rawfile[MAXPATH], picfile[MAXPATH]; + char zopt[MAXPATH+4], rep[MAXPATH+16], res[32]; char pfopts[128]; char vs[32], *vw; int vn, mult; @@ -1435,12 +1156,17 @@ char *opts, *po; if (!vs[0]) sprintf(vs, "%d", vn); sprintf(picfile, "%s_%s.pic", vval(PICTURE), vs); + if (vdef(ZFILE)) + sprintf(zopt, " -z %s_%s.zbf", vval(ZFILE), vs); + else + zopt[0] = '\0'; /* check date on picture */ pfdt = fdate(picfile); if (pfdt >= oct1date) continue; /* get raw file name */ - sprintf(rawfile, "%s_%s.raw", vval(PICTURE), vs); + sprintf(rawfile, "%s_%s.unf", + vdef(RAWFILE) ? vval(RAWFILE) : vval(PICTURE), vs); rfdt = fdate(rawfile); if (touchonly) { /* update times only */ if (rfdt) { @@ -1452,8 +1178,8 @@ char *opts, *po; } /* build rpict command */ if (rfdt >= oct1date) /* recover */ - sprintf(combuf, "rpict%s%s%s -ro %s %s", - rep, po, opts, rawfile, oct1name); + sprintf(combuf, "rpict%s%s%s%s -ro %s %s", + rep, po, opts, zopt, rawfile, oct1name); else { if (overture) { /* run overture calculation */ sprintf(combuf, @@ -1464,37 +1190,43 @@ char *opts, *po; fprintf(stderr, "%s: error in overture for view %s\n", progname, vs); - exit(1); + quit(1); } #ifdef NIX rmfile(overfile); #endif } - sprintf(combuf, "rpict%s %s %s%s%s %s > %s", - rep, vw, res, po, opts, - oct1name, rawfile); + sprintf(combuf, "rpict%s %s %s%s%s%s %s > %s", + rep, vw, res, po, opts, zopt, + oct1name, rawfile); } 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 */ - if (mult > 1) - sprintf(combuf, "pfilt%s -x /%d -y /%d %s > %s", + if (mult > 1) + sprintf(combuf, "pfilt%s -x /%d -y /%d %s > %s", pfopts, mult, mult, rawfile, picfile); - else - sprintf(combuf, "pfilt%s %s > %s", pfopts, - rawfile, picfile); - if (runcom(combuf)) { /* run pfilt */ - fprintf(stderr, - "%s: error filtering view %s\n\t%s removed\n", - progname, vs, picfile); - unlink(picfile); - exit(1); + else + sprintf(combuf, "pfilt%s %s > %s", pfopts, + rawfile, picfile); + if (runcom(combuf)) { /* run pfilt */ + fprintf(stderr, + "%s: error filtering view %s\n\t%s removed\n", + progname, vs, picfile); + unlink(picfile); + quit(1); + } } - /* remove raw file */ - rmfile(rawfile); + /* remove/rename raw file */ + if (vdef(RAWFILE)) { + sprintf(combuf, "%s_%s.pic", vval(RAWFILE), vs); + mvfile(rawfile, combuf); + } else + rmfile(rawfile); } } @@ -1542,7 +1274,22 @@ char *fn; } +mvfile(fold, fnew) /* move a file */ +char *fold, *fnew; +{ + if (!silent) #ifdef MSDOS + printf("\trename %s %s\n", fold, fnew); +#else + printf("\tmv %s %s\n", fold, fnew); +#endif + if (noaction) + return(0); + return(rename(fold, fnew)); +} + + +#ifdef MSDOS setenv(vname, value) /* set an environment variable */ char *vname, *value; { @@ -1554,7 +1301,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); @@ -1567,7 +1314,7 @@ int vc; { fprintf(stderr, "%s: bad value for variable '%s'\n", progname, vnam(vc)); - exit(1); + quit(1); } @@ -1575,5 +1322,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); }