| 44 |  | static void | 
| 45 |  | new_kids(TNODE *pn) | 
| 46 |  | { | 
| 47 | < | pn->kid = (TNODE *)calloc(1<<ttrank, sizeof(TNODE)); | 
| 47 | > | pn->kid = (TNODE *)calloc((size_t)1<<ttrank, sizeof(TNODE)); | 
| 48 |  | if (pn->kid == NULL) | 
| 49 |  | error(SYSTEM, "out of memory in new_kids"); | 
| 50 |  | } | 
| 110 |  |  | 
| 111 |  | /* Set our trimming threshold */ | 
| 112 |  | static void | 
| 113 | < | set_threshold() | 
| 113 | > | set_threshold(void) | 
| 114 |  | { | 
| 115 |  | int     hsum = 0; | 
| 116 |  | int     i; | 
| 155 |  | bkmin[j] = bmin[j] + (i>>(ttrank-1-j) & 1); | 
| 156 |  | val = (ttrank == 3) ? dval3(bkmin[0],bkmin[1],bkmin[2]) | 
| 157 |  | : dval4(bkmin[0],bkmin[1],bkmin[2],bkmin[3]); | 
| 158 | < | printf(" %.4e", val); | 
| 158 | > | printf((0.001<=val)&(val<10.) ? " %.7f" : " %.3e", val); | 
| 159 |  | } | 
| 160 |  | fputs(" }\n", stdout); | 
| 161 |  | return; | 
| 235 |  | return(nread); | 
| 236 |  | } | 
| 237 |  |  | 
| 238 | + | /* Truncate any negative values to zero */ | 
| 239 | + | static void | 
| 240 | + | noneg(float *varr, int n) | 
| 241 | + | { | 
| 242 | + | int     nnan = 0; | 
| 243 | + |  | 
| 244 | + | while (n-- > 0) { | 
| 245 | + | #ifdef isnan | 
| 246 | + | if (isnan(*varr)) { | 
| 247 | + | *varr = 0; | 
| 248 | + | ++nnan; | 
| 249 | + | } else | 
| 250 | + | #endif | 
| 251 | + | if (*varr < 0) *varr = 0; | 
| 252 | + | ++varr; | 
| 253 | + | } | 
| 254 | + | if (nnan) | 
| 255 | + | fprintf(stderr, "Warning: BSDF data contains %d NaN values\n", | 
| 256 | + | nnan); | 
| 257 | + | } | 
| 258 | + |  | 
| 259 |  | /* Load data array, filling zeroes for rank 3 demi-tensor */ | 
| 260 |  | static void | 
| 261 | < | load_data() | 
| 261 | > | load_data(void) | 
| 262 |  | { | 
| 263 |  | int     (*readf)(float *, int) = NULL; | 
| 264 |  |  | 
| 276 |  | error(COMMAND, "unsupported input format"); | 
| 277 |  | break; | 
| 278 |  | } | 
| 279 | + | /* XXX VC warns about 32 bit shift coerced to 64 bit */ | 
| 280 |  | datarr = (float *)calloc(1<<(log2g*ttrank), sizeof(float)); | 
| 281 |  | if (datarr == NULL) | 
| 282 |  | error(SYSTEM, "out of memory in load_data"); | 
| 311 |  | } | 
| 312 |  | } else if (getc(stdin) != EOF) | 
| 313 |  | error(WARNING, "binary data past end of expected input"); | 
| 314 | + |  | 
| 315 | + | noneg(datarr, 1<<(log2g*ttrank));       /* take precautions */ | 
| 316 |  | } | 
| 317 |  |  | 
| 318 |  | /* Enforce reciprocity by averaging data values */ | 
| 319 |  | static void | 
| 320 | < | do_reciprocity() | 
| 320 | > | do_reciprocity(void) | 
| 321 |  | { | 
| 322 |  | const int       siz = 1<<log2g; | 
| 323 |  | float           *v1p, *v2p; | 
| 388 |  | if (i < argc-1) | 
| 389 |  | goto userr; | 
| 390 |  | /* load input data */ | 
| 391 | < | if (i == argc-1 && freopen(argv[i], "rb", stdin) == NULL) { | 
| 391 | > | if (i == argc-1 && freopen(argv[i], "r", stdin) == NULL) { | 
| 392 |  | sprintf(errmsg, "cannot open input file '%s'", argv[i]); | 
| 393 |  | error(SYSTEM, errmsg); | 
| 394 |  | } | 
| 395 |  | if (infmt != 'a') | 
| 396 |  | SET_FILE_BINARY(stdin); | 
| 397 | + | #ifdef getc_unlocked                    /* avoid lock/unlock overhead */ | 
| 398 | + | flockfile(stdin); | 
| 399 | + | #endif | 
| 400 |  | load_data(); | 
| 401 |  | if (recipavg) | 
| 402 |  | do_reciprocity(); |