--- ray/src/common/calfunc.c 2022/04/08 23:32:25 2.28 +++ ray/src/common/calfunc.c 2024/02/26 20:55:00 2.31 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: calfunc.c,v 2.28 2022/04/08 23:32:25 greg Exp $"; +static const char RCSid[] = "$Id: calfunc.c,v 2.31 2024/02/26 20:55:00 greg Exp $"; #endif /* * calfunc.c - routines for calcomp using functions. @@ -15,6 +15,7 @@ static const char RCSid[] = "$Id: calfunc.c,v 2.28 202 #include #include #include +#include #include #include "rterror.h" @@ -22,7 +23,7 @@ static const char RCSid[] = "$Id: calfunc.c,v 2.28 202 /* bits in argument flag (better be right!) */ #define AFLAGSIZ (8*sizeof(unsigned long)) -#define ALISTSIZ 8 /* maximum saved argument list */ +#define ALISTSIZ 10 /* maximum saved argument list */ typedef struct activation { char *name; /* function name */ @@ -200,12 +201,9 @@ double argument(int n) /* return nth argument for active function */ { ACTIVATION *actp = curact; - EPNODE *ep = NULL; + EPNODE *ep; double aval; - if (!n) /* asking for # arguments? */ - return((double)nargum()); - if (!actp | (--n < 0)) { eputs("Bad call to argument!\n"); quit(1); @@ -297,6 +295,18 @@ efunc(EPNODE *ep) /* evaluate a function */ curact = act.prev; /* pop environment */ return(rval); +} + + +double +eargument( /* evaluate an argument */ + EPNODE *ep +) +{ + if ((ep->v.chan <= AFLAGSIZ) & curact->an >> (ep->v.chan-1)) + return(curact->ap[ep->v.chan-1]); + + return(argument(ep->v.chan)); }