--- ray/src/common/calfunc.c 2019/06/10 16:52:27 2.22 +++ ray/src/common/calfunc.c 2022/04/08 23:32:25 2.28 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: calfunc.c,v 2.22 2019/06/10 16:52:27 greg Exp $"; +static const char RCSid[] = "$Id: calfunc.c,v 2.28 2022/04/08 23:32:25 greg Exp $"; #endif /* * calfunc.c - routines for calcomp using functions. @@ -150,6 +150,8 @@ funset( /* set a library function */ if (cp == fname) return; } if ((lp = liblookup(fname)) == NULL) { /* insert */ + if (fptr == NULL) + return; /* nothing! */ if (libsize >= MAXLIB) { eputs("Too many library functons!\n"); quit(1); @@ -356,7 +358,7 @@ libfunc( /* execute library function */ errno = ERANGE; } #endif - if (errno == EDOM || errno == ERANGE) { + if ((errno == EDOM) | (errno == ERANGE)) { wputs(fname); if (errno == EDOM) wputs(": domain error\n"); @@ -390,15 +392,16 @@ l_if(char *nm) /* if(cond, then, else) conditional ex static double l_select(char *nm) /* return argument #(A1+1) */ { - int n; + int narg = nargum(); + double a1 = argument(1); + int n = (int)(a1 + .5); - n = (int)(argument(1) + .5); - if (n == 0) - return(nargum()-1); - if (n < 1 || n > nargum()-1) { + if ((a1 < -.5) | (n >= narg)) { errno = EDOM; return(0.0); } + if (!n) /* asking max index? */ + return(narg-1); return(argument(n+1)); } @@ -407,11 +410,10 @@ static double l_max(char *nm) /* general maximum function */ { int n = nargum(); - int i = 1; - int vmax = argument(1); + double vmax = argument(1); - while (i++ < n) { - double v = argument(i); + while (n > 1) { + double v = argument(n--); if (vmax < v) vmax = v; } @@ -423,11 +425,10 @@ static double l_min(char *nm) /* general minimum function */ { int n = nargum(); - int i = 1; - int vmin = argument(1); + double vmin = argument(1); - while (i++ < n) { - double v = argument(i); + while (n > 1) { + double v = argument(n--); if (vmin > v) vmin = v; }