--- ray/src/util/rmtxop.c 2014/08/02 17:10:43 2.3 +++ ray/src/util/rmtxop.c 2017/08/28 15:59:46 2.11 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmtxop.c,v 2.3 2014/08/02 17:10:43 greg Exp $"; +static const char RCSid[] = "$Id: rmtxop.c,v 2.11 2017/08/28 15:59:46 greg Exp $"; #endif /* * General component matrix operations. @@ -7,9 +7,11 @@ static const char RCSid[] = "$Id: rmtxop.c,v 2.3 2014/ #include #include +#include #include "rtio.h" #include "resolu.h" #include "rmatrix.h" +#include "platform.h" #define MAXCOMP 50 /* #components we support */ @@ -22,14 +24,13 @@ typedef struct { int op; /* '*' or '+' */ } ROPERAT; /* matrix operation */ -int outfmt = DTfromHeader; /* output format */ int verbose = 0; /* verbose reporting? */ static void op_default(ROPERAT *op) { memset(op, 0, sizeof(ROPERAT)); - op->op = '*'; + op->op = '.'; } static RMATRIX * @@ -112,7 +113,7 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname } if (mleft == NULL) /* just one matrix */ return(mright); - if (op->op == '*') { /* concatenate */ + if (op->op == '.') { /* concatenate */ RMATRIX *mres = rmx_multiply(mleft, mright); if (mres == NULL) { fputs(fname, stderr); @@ -143,6 +144,23 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname fputs(": added in matrix\n", stderr); } rmx_free(mright); + } else if ((op->op == '*') | (op->op == '/')) { + const char * tnam = (op->op == '/') ? + "division" : "multiplication"; + errno = 0; + if (!rmx_elemult(mleft, mright, (op->op == '/'))) { + fprintf(stderr, "%s: element-wise %s failed\n", + fname, tnam); + rmx_free(mright); + return(NULL); + } + if (errno) + fprintf(stderr, + "%s: warning - error during element-wise %s\n", + fname, tnam); + else if (verbose) + fprintf(stderr, "%s: element-wise %s\n", fname, tnam); + rmx_free(mright); } else { fprintf(stderr, "%s: unknown operation '%c'\n", fname, op->op); rmx_free(mright); @@ -165,16 +183,17 @@ get_factors(double da[], int n, char *av[]) int main(int argc, char *argv[]) { + int outfmt = DTfromHeader; RMATRIX *mres = NULL; ROPERAT op; - long nbw; int i; /* initialize */ op_default(&op); /* get options and arguments */ for (i = 1; i < argc; i++) - if (argv[i][0] == '+' && !argv[i][1]) { - op.op = '+'; + if (argv[i][0] && !argv[i][1] && + strchr("+*/", argv[i][0]) != NULL) { + op.op = argv[i][0]; } else if (argv[i][0] != '-' || !argv[i][1]) { char *fname = NULL; /* load matrix */ if (argv[i][0] != '-') @@ -232,20 +251,21 @@ main(int argc, char *argv[]) if (mres == NULL) /* check that we got something */ goto userr; /* write result to stdout */ + if (outfmt == DTfromHeader) + outfmt = mres->dtype; + if (outfmt != DTascii) + SET_FILE_BINARY(stdout); newheader("RADIANCE", stdout); printargs(argc, argv, stdout); - nbw = rmx_write(mres, outfmt, stdout); - /* rmx_free(mres); mres = NULL; */ - if (nbw <= 0) { + if (!rmx_write(mres, outfmt, stdout)) { fprintf(stderr, "%s: error writing result matrix\n", argv[0]); return(1); } - if (verbose) - fprintf(stderr, "%s: %ld bytes written\n", argv[0], nbw); + /* rmx_free(mres); mres = NULL; */ return(0); userr: fprintf(stderr, - "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+] .. > mres\n", + "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+*/] .. > mres\n", argv[0]); return(1); }