| 8 | 
  | 
 | 
| 9 | 
  | 
#include "copyright.h" | 
| 10 | 
  | 
 | 
| 11 | 
– | 
#include <ctype.h> | 
| 11 | 
  | 
#include "rcontrib.h" | 
| 12 | 
  | 
#include "otypes.h" | 
| 13 | 
  | 
#include "source.h" | 
| 214 | 
  | 
 | 
| 215 | 
  | 
/************************** MAIN CALCULATION PROCESS ***********************/ | 
| 216 | 
  | 
 | 
| 218 | 
– | 
/* Set parameters for current bin evaluation */ | 
| 219 | 
– | 
static void | 
| 220 | 
– | 
set_eparams(char *prms) | 
| 221 | 
– | 
{ | 
| 222 | 
– | 
        char    vname[64]; | 
| 223 | 
– | 
        double  value; | 
| 224 | 
– | 
        char    *cps, *cpd; | 
| 225 | 
– | 
                                        /* assign each variable */ | 
| 226 | 
– | 
        for (cps = prms; *cps; cps++) { | 
| 227 | 
– | 
                if (isspace(*cps)) | 
| 228 | 
– | 
                        continue; | 
| 229 | 
– | 
                if (!isalpha(*cps)) | 
| 230 | 
– | 
                        goto bad_params; | 
| 231 | 
– | 
                cpd = vname; | 
| 232 | 
– | 
                while (*cps && (*cps != '=') & !isspace(*cps)) { | 
| 233 | 
– | 
                        if (!isid(*cps)) | 
| 234 | 
– | 
                                goto bad_params; | 
| 235 | 
– | 
                        *cpd++ = *cps++; | 
| 236 | 
– | 
                } | 
| 237 | 
– | 
                if (cpd == vname) | 
| 238 | 
– | 
                        goto bad_params; | 
| 239 | 
– | 
                *cpd = '\0'; | 
| 240 | 
– | 
                while (isspace(*cps)) cps++; | 
| 241 | 
– | 
                if (*cps++ != '=') | 
| 242 | 
– | 
                        goto bad_params; | 
| 243 | 
– | 
                value = atof(cps); | 
| 244 | 
– | 
                if ((cps = fskip(cps)) == NULL) | 
| 245 | 
– | 
                        goto bad_params; | 
| 246 | 
– | 
                while (isspace(*cps)) cps++; | 
| 247 | 
– | 
                cps += (*cps == ',') | (*cps == ';'); | 
| 248 | 
– | 
                varset(vname, '=', value); | 
| 249 | 
– | 
        } | 
| 250 | 
– | 
        return; | 
| 251 | 
– | 
bad_params: | 
| 252 | 
– | 
        sprintf(errmsg, "bad parameter list '%s'", prms); | 
| 253 | 
– | 
        error(USER, errmsg); | 
| 254 | 
– | 
} | 
| 255 | 
– | 
 | 
| 217 | 
  | 
/* Our trace call to sum contributions */ | 
| 218 | 
  | 
static void | 
| 219 | 
  | 
trace_contrib(RAY *r) | 
| 220 | 
  | 
{ | 
| 260 | 
– | 
        static char     *last_params = NULL; | 
| 221 | 
  | 
        MODCONT *mp; | 
| 222 | 
  | 
        double  bval; | 
| 223 | 
  | 
        int     bn; | 
| 235 | 
  | 
                return; | 
| 236 | 
  | 
 | 
| 237 | 
  | 
        worldfunc(RCCONTEXT, r);                /* else set context */ | 
| 238 | 
< | 
        if ((mp->params != NULL) & (mp->params != last_params) && | 
| 279 | 
< | 
                        (last_params == NULL || strcmp(mp->params, last_params))) | 
| 280 | 
< | 
                set_eparams(last_params = (char *)mp->params); | 
| 238 | 
> | 
        set_eparams((char *)mp->params); | 
| 239 | 
  | 
        if ((bval = evalue(mp->binv)) <= -.5)   /* and get bin number */ | 
| 240 | 
  | 
                return;                         /* silently ignore negatives */ | 
| 241 | 
  | 
        if ((bn = (int)(bval + .5)) >= mp->nbins) { | 
| 242 | 
< | 
                error(WARNING, "bad bin number (ignored)"); | 
| 242 | 
> | 
                sprintf(errmsg, "bad bin number (%d ignored)", bn); | 
| 243 | 
> | 
                error(WARNING, errmsg); | 
| 244 | 
  | 
                return; | 
| 245 | 
  | 
        } | 
| 246 | 
  | 
        raycontrib(contr, r, PRIMARY);          /* compute coefficient */ |