88 |
|
|
89 |
|
extern char *savestr(), *emalloc(); |
90 |
|
|
91 |
– |
extern LIBR *liblookup(); |
92 |
– |
|
91 |
|
extern VARDEF *argf(); |
92 |
|
|
93 |
|
#ifdef VARIABLE |
155 |
|
{ |
156 |
|
register LIBR *lp; |
157 |
|
|
158 |
< |
if ((lp = liblookup(fname)) == NULL) { |
158 |
> |
if ((lp = liblookup(fname)) == NULL) { /* insert */ |
159 |
|
if (libsize >= MAXLIB) { |
160 |
|
eputs("Too many library functons!\n"); |
161 |
|
quit(1); |
170 |
|
break; |
171 |
|
libsize++; |
172 |
|
} |
173 |
< |
lp[0].fname = fname; /* must be static! */ |
174 |
< |
lp[0].nargs = nargs; |
175 |
< |
lp[0].atyp = assign; |
176 |
< |
lp[0].f = fptr; |
173 |
> |
if (fptr == NULL) { /* delete */ |
174 |
> |
while (lp < &library[libsize-1]) { |
175 |
> |
lp[0].fname = lp[1].fname; |
176 |
> |
lp[0].nargs = lp[1].nargs; |
177 |
> |
lp[0].atyp = lp[1].atyp; |
178 |
> |
lp[0].f = lp[1].f; |
179 |
> |
lp++; |
180 |
> |
} |
181 |
> |
libsize--; |
182 |
> |
} else { /* or assign */ |
183 |
> |
lp[0].fname = fname; /* string must be static! */ |
184 |
> |
lp[0].nargs = nargs; |
185 |
> |
lp[0].atyp = assign; |
186 |
> |
lp[0].f = fptr; |
187 |
> |
} |
188 |
> |
libupdate(fname); /* relink library */ |
189 |
|
} |
190 |
|
|
191 |
|
|
371 |
|
static double |
372 |
|
libfunc(fname, vp) /* execute library function */ |
373 |
|
char *fname; |
374 |
< |
register VARDEF *vp; |
374 |
> |
VARDEF *vp; |
375 |
|
{ |
376 |
< |
VARDEF dumdef; |
376 |
> |
register LIBR *lp; |
377 |
|
double d; |
378 |
|
int lasterrno; |
379 |
|
|
380 |
< |
if (vp == NULL) { |
381 |
< |
vp = &dumdef; |
382 |
< |
vp->lib = NULL; |
383 |
< |
} |
384 |
< |
if (((vp->lib == NULL || strcmp(fname, vp->lib->fname)) && |
375 |
< |
(vp->lib = liblookup(fname)) == NULL) || |
376 |
< |
vp->lib->f == NULL) { |
380 |
> |
if (vp != NULL) |
381 |
> |
lp = vp->lib; |
382 |
> |
else |
383 |
> |
lp = liblookup(fname); |
384 |
> |
if (lp == NULL) { |
385 |
|
eputs(fname); |
386 |
|
eputs(": undefined function\n"); |
387 |
|
quit(1); |
388 |
|
} |
389 |
|
lasterrno = errno; |
390 |
|
errno = 0; |
391 |
< |
d = (*vp->lib->f)(vp->lib->fname); |
391 |
> |
d = (*lp->f)(lp->fname); |
392 |
|
#ifdef IEEE |
393 |
< |
if (!finite(d)) |
394 |
< |
errno = EDOM; |
393 |
> |
if (errno == 0) |
394 |
> |
if (isnan(d)) |
395 |
> |
errno = EDOM; |
396 |
> |
else if (isinf(d)) |
397 |
> |
errno = ERANGE; |
398 |
|
#endif |
399 |
|
if (errno) { |
400 |
|
wputs(fname); |