--- ray/src/common/calfunc.c 1991/04/23 15:44:39 1.4 +++ ray/src/common/calfunc.c 1991/08/02 14:11:17 1.9 @@ -1,4 +1,4 @@ -/* Copyright (c) 1986 Regents of the University of California */ +/* Copyright (c) 1991 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -22,7 +22,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include "calcomp.h" - + /* bits in argument flag (better be right!) */ +#define AFLAGSIZ (8*sizeof(unsigned long)) #define ALISTSIZ 6 /* maximum saved argument list */ typedef struct activation { @@ -130,7 +131,10 @@ double *a; act.name = fname; act.prev = curact; act.ap = a; - act.an = (1L<= AFLAGSIZ) + act.an = ~0; + else + act.an = (1L<an) + if (n < AFLAGSIZ && 1L<an) return(actp->ap[n]); if (actp->fun == NULL || (ep = ekid(actp->fun, n+1)) == NULL) { @@ -376,14 +380,22 @@ register VARDEF *vp; } lasterrno = errno; errno = 0; - d = (*vp->lib->f)(); + d = (*vp->lib->f)(vp->lib->fname); #ifdef IEEE - if (!finite(d)) - errno = EDOM; + if (errno == 0) + if (isnan(d)) + errno = EDOM; + else if (isinf(d)) + errno = ERANGE; #endif if (errno) { wputs(fname); - wputs(": bad call\n"); + if (errno == EDOM) + wputs(": domain error\n"); + else if (errno == ERANGE) + wputs(": range error\n"); + else + wputs(": error in call\n"); return(0.0); } errno = lasterrno;