--- ray/src/common/calfunc.c 1991/06/28 09:31:59 1.7 +++ ray/src/common/calfunc.c 1992/05/18 14:15:49 2.3 @@ -88,8 +88,6 @@ static int libsize = 5; extern char *savestr(), *emalloc(); -extern LIBR *liblookup(); - extern VARDEF *argf(); #ifdef VARIABLE @@ -157,7 +155,7 @@ double (*fptr)(); { register LIBR *lp; - if ((lp = liblookup(fname)) == NULL) { + if ((lp = liblookup(fname)) == NULL) { /* insert */ if (libsize >= MAXLIB) { eputs("Too many library functons!\n"); quit(1); @@ -172,10 +170,22 @@ double (*fptr)(); break; libsize++; } - lp[0].fname = fname; /* must be static! */ - lp[0].nargs = nargs; - lp[0].atyp = assign; - lp[0].f = fptr; + if (fptr == NULL) { /* delete */ + while (lp < &library[libsize-1]) { + lp[0].fname = lp[1].fname; + lp[0].nargs = lp[1].nargs; + lp[0].atyp = lp[1].atyp; + lp[0].f = lp[1].f; + lp++; + } + libsize--; + } else { /* or assign */ + lp[0].fname = fname; /* string must be static! */ + lp[0].nargs = nargs; + lp[0].atyp = assign; + lp[0].f = fptr; + } + libupdate(fname); /* relink library */ } @@ -361,33 +371,39 @@ register VARDEF *vp; static double libfunc(fname, vp) /* execute library function */ char *fname; -register VARDEF *vp; +VARDEF *vp; { - VARDEF dumdef; + register LIBR *lp; double d; int lasterrno; - if (vp == NULL) { - vp = &dumdef; - vp->lib = NULL; - } - if (((vp->lib == NULL || strcmp(fname, vp->lib->fname)) && - (vp->lib = liblookup(fname)) == NULL) || - vp->lib->f == NULL) { + if (vp != NULL) + lp = vp->lib; + else + lp = liblookup(fname); + if (lp == NULL) { eputs(fname); eputs(": undefined function\n"); quit(1); } lasterrno = errno; errno = 0; - d = (*vp->lib->f)(vp->lib->fname); + d = (*lp->f)(lp->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;