--- ray/src/rt/rcontrib.c 2014/07/19 18:39:35 2.21 +++ ray/src/rt/rcontrib.c 2014/07/19 20:03:03 2.22 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rcontrib.c,v 2.21 2014/07/19 18:39:35 greg Exp $"; +static const char RCSid[] = "$Id: rcontrib.c,v 2.22 2014/07/19 20:03:03 greg Exp $"; #endif /* * Accumulate ray contributions for a set of materials @@ -216,48 +216,55 @@ rcinit() /************************** MAIN CALCULATION PROCESS ***********************/ /* Set parameters for current bin evaluation */ -static void +void set_eparams(char *prms) { - char vname[64]; - double value; - char *cps, *cpd; - /* assign each variable */ - for (cps = prms; *cps; cps++) { - if (isspace(*cps)) - continue; - if (!isalpha(*cps)) + static char *last_params = NULL; + char vname[RMAXWORD]; + double value; + char *cpd; + /* check if already set */ + if ((prms == NULL) | (prms == last_params)) + return; + if (last_params != NULL && !strcmp(prms, last_params)) + return; + last_params = prms; /* assign each variable */ + while (*prms) { + if (isspace(*prms)) { + ++prms; continue; + } + if (!isalpha(*prms)) goto bad_params; cpd = vname; - while (*cps && (*cps != '=') & !isspace(*cps)) { - if (!isid(*cps)) + while (*prms && (*prms != '=') & !isspace(*prms)) { + if (!isid(*prms)) goto bad_params; - *cpd++ = *cps++; + *cpd++ = *prms++; } if (cpd == vname) goto bad_params; *cpd = '\0'; - while (isspace(*cps)) cps++; - if (*cps++ != '=') + while (isspace(*prms)) prms++; + if (*prms++ != '=') goto bad_params; - value = atof(cps); - if ((cps = fskip(cps)) == NULL) + value = atof(prms); + if ((prms = fskip(prms)) == NULL) goto bad_params; - while (isspace(*cps)) cps++; - cps += (*cps == ',') | (*cps == ';'); + while (isspace(*prms)) prms++; + prms += (*prms == ',') | (*prms == ';'); varset(vname, '=', value); } return; bad_params: - sprintf(errmsg, "bad parameter list '%s'", prms); + sprintf(errmsg, "bad parameter list '%s'", last_params); error(USER, errmsg); } + /* Our trace call to sum contributions */ static void trace_contrib(RAY *r) { - static char *last_params = NULL; MODCONT *mp; double bval; int bn; @@ -275,9 +282,7 @@ trace_contrib(RAY *r) return; worldfunc(RCCONTEXT, r); /* else set context */ - if ((mp->params != NULL) & (mp->params != last_params) && - (last_params == NULL || strcmp(mp->params, last_params))) - set_eparams(last_params = (char *)mp->params); + set_eparams((char *)mp->params); if ((bval = evalue(mp->binv)) <= -.5) /* and get bin number */ return; /* silently ignore negatives */ if ((bn = (int)(bval + .5)) >= mp->nbins) {