| 107 |
|
static CMATRIX * |
| 108 |
|
cm_load(const char *fname, int nrows, int ncols, int dtype) |
| 109 |
|
{ |
| 110 |
– |
CMATRIX *cm; |
| 110 |
|
FILE *fp = stdin; |
| 111 |
+ |
CMATRIX *cm; |
| 112 |
|
|
| 113 |
|
if (ncols <= 0) |
| 114 |
|
error(USER, "Non-positive number of columns"); |
| 118 |
|
sprintf(errmsg, "cannot open file '%s'", fname); |
| 119 |
|
error(SYSTEM, errmsg); |
| 120 |
|
} |
| 121 |
+ |
#ifdef getc_unlocked |
| 122 |
+ |
flockfile(fp); |
| 123 |
+ |
#endif |
| 124 |
|
if (dtype != DTascii) |
| 125 |
|
SET_FILE_BINARY(fp); |
| 126 |
|
if (dtype == DTfromHeader) |
| 161 |
|
cm = cm_alloc(guessrows, ncols); |
| 162 |
|
} else |
| 163 |
|
cm = cm_alloc(nrows, ncols); |
| 164 |
< |
if (cm == NULL) |
| 164 |
> |
if (cm == NULL) /* XXX never happens */ |
| 165 |
|
return(NULL); |
| 166 |
|
if (dtype == DTascii) { /* read text file */ |
| 167 |
|
int maxrow = (nrows > 0 ? nrows : 32000); |
| 236 |
|
cvp += 3; |
| 237 |
|
} |
| 238 |
|
} |
| 239 |
< |
if (getc(fp) != EOF) { |
| 239 |
> |
if (fgetc(fp) != EOF) { |
| 240 |
|
sprintf(errmsg, |
| 241 |
|
"unexpected data at end of binary file %s", |
| 242 |
|
fname); |
| 245 |
|
} |
| 246 |
|
if (fp != stdin) |
| 247 |
|
fclose(fp); |
| 248 |
+ |
#ifdef getc_unlocked |
| 249 |
+ |
else |
| 250 |
+ |
funlockfile(fp); |
| 251 |
+ |
#endif |
| 252 |
|
return(cm); |
| 253 |
|
EOFerror: |
| 254 |
< |
sprintf(errmsg, "unexpected EOF reading %s", |
| 248 |
< |
fname); |
| 254 |
> |
sprintf(errmsg, "unexpected EOF reading %s", fname); |
| 255 |
|
error(USER, errmsg); |
| 256 |
|
not_handled: |
| 257 |
|
error(INTERNAL, "unhandled data size or length in cm_load()"); |
| 593 |
|
int |
| 594 |
|
main(int argc, char *argv[]) |
| 595 |
|
{ |
| 596 |
+ |
int skyfmt = DTascii; |
| 597 |
|
int nsteps = 1; |
| 598 |
|
char *ofspec = NULL; |
| 599 |
|
FILE *ofp = stdout; |
| 603 |
|
|
| 604 |
|
progname = argv[0]; |
| 605 |
|
/* get options */ |
| 606 |
< |
for (a = 1; a < argc-1 && argv[a][0] == '-'; a++) |
| 607 |
< |
switch (argv[0][1]) { |
| 606 |
> |
for (a = 1; a < argc && argv[a][0] == '-'; a++) |
| 607 |
> |
switch (argv[a][1]) { |
| 608 |
|
case 'n': |
| 609 |
|
nsteps = atoi(argv[++a]); |
| 610 |
|
if (nsteps <= 0) |
| 613 |
|
case 'o': |
| 614 |
|
ofspec = argv[++a]; |
| 615 |
|
break; |
| 616 |
+ |
case 'i': |
| 617 |
+ |
switch (argv[a][2]) { |
| 618 |
+ |
case 'f': |
| 619 |
+ |
skyfmt = DTfloat; |
| 620 |
+ |
break; |
| 621 |
+ |
case 'd': |
| 622 |
+ |
skyfmt = DTdouble; |
| 623 |
+ |
break; |
| 624 |
+ |
case 'a': |
| 625 |
+ |
skyfmt = DTascii; |
| 626 |
+ |
break; |
| 627 |
+ |
default: |
| 628 |
+ |
goto userr; |
| 629 |
+ |
} |
| 630 |
+ |
break; |
| 631 |
|
default: |
| 632 |
|
goto userr; |
| 633 |
|
} |
| 638 |
|
CMATRIX *smtx, *Dmat, *Tmat, *imtx; |
| 639 |
|
COLOR tLamb; |
| 640 |
|
/* get sky vector/matrix */ |
| 641 |
< |
smtx = cm_load(argv[a+3], 0, nsteps, DTascii); |
| 641 |
> |
smtx = cm_load(argv[a+3], 0, nsteps, skyfmt); |
| 642 |
|
/* load BSDF */ |
| 643 |
|
Tmat = cm_loadBSDF(argv[a+1], tLamb); |
| 644 |
|
/* load Daylight matrix */ |
| 655 |
|
} |
| 656 |
|
cm_free(imtx); |
| 657 |
|
} else { /* sky vector/matrix only */ |
| 658 |
< |
cmtx = cm_load(argv[a+1], 0, nsteps, DTascii); |
| 658 |
> |
cmtx = cm_load(argv[a+1], 0, nsteps, skyfmt); |
| 659 |
|
} |
| 660 |
|
/* prepare output stream */ |
| 661 |
|
if ((ofspec != NULL) & (nsteps == 1) && hasNumberFormat(ofspec)) { |
| 743 |
|
cm_free(cmtx); |
| 744 |
|
return(0); |
| 745 |
|
userr: |
| 746 |
< |
fprintf(stderr, "Usage: %s [-n nsteps][-o ospec] DCspec [skyf]\n", |
| 746 |
> |
fprintf(stderr, "Usage: %s [-n nsteps][-o ospec][-i{f|d}] DCspec [skyf]\n", |
| 747 |
|
progname); |
| 748 |
< |
fprintf(stderr, " or: %s [-n nsteps][-o ospec] Vspec Tbsdf.xml Dmat.dat [skyf]\n", |
| 748 |
> |
fprintf(stderr, " or: %s [-n nsteps][-o ospec][-i{f|d}] Vspec Tbsdf.xml Dmat.dat [skyf]\n", |
| 749 |
|
progname); |
| 750 |
|
return(1); |
| 751 |
|
} |