16 |
|
* 1/15/88 Added clock for caching of variable values. |
17 |
|
* |
18 |
|
* 11/16/88 Added VARDEF structure for hard linking. |
19 |
+ |
* |
20 |
+ |
* 5/31/90 Added conditional compile (REDEFW) for redefinition warning. |
21 |
|
*/ |
22 |
|
|
23 |
|
#include <stdio.h> |
34 |
|
|
35 |
|
extern char *ecalloc(), *savestr(); |
36 |
|
|
37 |
< |
extern double dvalue(); |
37 |
> |
static double dvalue(); |
38 |
|
|
39 |
|
long eclock = -1; /* value storage timer */ |
40 |
|
|
68 |
|
eputs(": cannot open\n"); |
69 |
|
quit(1); |
70 |
|
} |
71 |
< |
initfile(fname, fp); |
71 |
> |
initfile(fp, fname, 0); |
72 |
|
while (nextc != EOF) |
73 |
|
loaddefn(); |
74 |
|
if (fname != NULL) |
76 |
|
} |
77 |
|
|
78 |
|
|
79 |
< |
scompile(file, str) /* get definitions from a string */ |
78 |
< |
char *file; |
79 |
> |
scompile(str, fn, ln) /* get definitions from a string */ |
80 |
|
char *str; |
81 |
+ |
char *fn; |
82 |
+ |
int ln; |
83 |
|
{ |
84 |
< |
initstr(file, str); |
84 |
> |
initstr(str, fn, ln); |
85 |
|
while (nextc != EOF) |
86 |
|
loaddefn(); |
87 |
|
} |
115 |
|
ep2 = ep1->v.kid->sibling; |
116 |
|
if (ep2->type == NUM) { |
117 |
|
ep2->v.num = val; |
115 |
– |
ep2->sibling->v.tick = -1; |
118 |
|
return; |
119 |
|
} |
120 |
|
} |
129 |
|
ep2->type = NUM; |
130 |
|
ep2->v.num = val; |
131 |
|
addekid(ep1, ep2); |
130 |
– |
ep2 = newnode(); |
131 |
– |
ep2->type = TICK; |
132 |
– |
ep2->v.tick = -1; |
133 |
– |
addekid(ep1, ep2); |
134 |
– |
ep2 = newnode(); |
135 |
– |
ep2->type = NUM; |
136 |
– |
addekid(ep1, ep2); |
132 |
|
dclear(vname); |
133 |
|
dpush(ep1); |
134 |
|
} |
154 |
|
|
155 |
|
|
156 |
|
#ifdef OUTCHAN |
157 |
< |
chanout() /* set output channels */ |
157 |
> |
chanout(cs) /* set output channels */ |
158 |
> |
int (*cs)(); |
159 |
|
{ |
160 |
|
register EPNODE *ep; |
161 |
|
|
162 |
|
for (ep = outchan; ep != NULL; ep = ep->sibling) |
163 |
< |
chanset(ep->v.kid->v.chan, evalue(ep->v.kid->sibling)); |
163 |
> |
(*cs)(ep->v.kid->v.chan, evalue(ep->v.kid->sibling)); |
164 |
|
|
165 |
|
} |
166 |
|
#endif |
366 |
|
#endif |
367 |
|
{ /* ordinary definition */ |
368 |
|
ep = getdefn(); |
369 |
+ |
#ifdef REDEFW |
370 |
+ |
if (dlookup(dname(ep)) != NULL) { |
371 |
+ |
dclear(dname(ep)); |
372 |
+ |
wputs(dname(ep)); |
373 |
+ |
wputs(": redefined\n"); |
374 |
+ |
} |
375 |
+ |
#else |
376 |
|
dclear(dname(ep)); |
377 |
+ |
#endif |
378 |
|
dpush(ep); |
379 |
|
} |
380 |
|
if (nextc != EOF) { |
430 |
|
addekid(ep2, ep1); |
431 |
|
addekid(ep2, getE1()); |
432 |
|
|
433 |
+ |
if ( |
434 |
|
#ifdef FUNCTION |
435 |
< |
if (ep1->type == SYM) |
435 |
> |
ep1->type == SYM && |
436 |
|
#endif |
437 |
< |
{ |
437 |
> |
ep1->sibling->type != NUM) { |
438 |
|
ep1 = newnode(); |
439 |
|
ep1->type = TICK; |
440 |
|
ep1->v.tick = -1; |
495 |
|
quit(1); |
496 |
|
} |
497 |
|
ep1 = d->v.kid->sibling; /* get expression */ |
498 |
+ |
if (ep1->type == NUM) |
499 |
+ |
return(ep1->v.num); /* return if number */ |
500 |
|
ep2 = ep1->sibling; /* check time */ |
501 |
|
if (ep2->v.tick < 0 || ep2->v.tick < eclock) { |
502 |
|
ep2->v.tick = eclock; |
503 |
|
ep2 = ep2->sibling; |
504 |
< |
ep2->v.num = evalue(ep1); /* compute new value */ |
504 |
> |
ep2->v.num = evalue(ep1); /* needs new value */ |
505 |
|
} else |
506 |
< |
ep2 = ep2->sibling; /* reuse old value */ |
506 |
> |
ep2 = ep2->sibling; /* else reuse old value */ |
507 |
|
|
508 |
|
return(ep2->v.num); |
509 |
|
} |