Blame


1 b6d98463 2006-04-14 devnull #include <stdio.h>
2 b6d98463 2006-04-14 devnull #include <ctype.h>
3 b6d98463 2006-04-14 devnull #include "pic.h"
4 b6d98463 2006-04-14 devnull #include "y.tab.h"
5 b6d98463 2006-04-14 devnull
6 b6d98463 2006-04-14 devnull YYSTYPE
7 b6d98463 2006-04-14 devnull getvar(char *s) /* return value of variable s (usually pointer) */
8 b6d98463 2006-04-14 devnull {
9 b6d98463 2006-04-14 devnull struct symtab *p;
10 b6d98463 2006-04-14 devnull static YYSTYPE bug;
11 b6d98463 2006-04-14 devnull
12 b6d98463 2006-04-14 devnull p = lookup(s);
13 b6d98463 2006-04-14 devnull if (p == NULL) {
14 b6d98463 2006-04-14 devnull if (islower(s[0]))
15 b6d98463 2006-04-14 devnull ERROR "no such variable as %s", s WARNING;
16 b6d98463 2006-04-14 devnull else
17 b6d98463 2006-04-14 devnull ERROR "no such place as %s", s WARNING;
18 b6d98463 2006-04-14 devnull return(bug);
19 b6d98463 2006-04-14 devnull }
20 b6d98463 2006-04-14 devnull return(p->s_val);
21 b6d98463 2006-04-14 devnull }
22 b6d98463 2006-04-14 devnull
23 b6d98463 2006-04-14 devnull double
24 b6d98463 2006-04-14 devnull getfval(char *s) /* return float value of variable s */
25 b6d98463 2006-04-14 devnull {
26 b6d98463 2006-04-14 devnull YYSTYPE y;
27 b6d98463 2006-04-14 devnull
28 b6d98463 2006-04-14 devnull y = getvar(s);
29 b6d98463 2006-04-14 devnull return y.f;
30 b6d98463 2006-04-14 devnull }
31 b6d98463 2006-04-14 devnull
32 b6d98463 2006-04-14 devnull void
33 b6d98463 2006-04-14 devnull setfval(char *s, double f) /* set variable s to f */
34 b6d98463 2006-04-14 devnull {
35 b6d98463 2006-04-14 devnull struct symtab *p;
36 b6d98463 2006-04-14 devnull
37 b6d98463 2006-04-14 devnull if ((p = lookup(s)) != NULL)
38 b6d98463 2006-04-14 devnull p->s_val.f = f;
39 b6d98463 2006-04-14 devnull }
40 b6d98463 2006-04-14 devnull
41 b6d98463 2006-04-14 devnull struct symtab*
42 b6d98463 2006-04-14 devnull makevar(char *s, int t, YYSTYPE v) /* make variable named s in table */
43 b6d98463 2006-04-14 devnull /* assumes s is static or from tostring */
44 b6d98463 2006-04-14 devnull {
45 b6d98463 2006-04-14 devnull struct symtab *p;
46 b6d98463 2006-04-14 devnull
47 b6d98463 2006-04-14 devnull for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
48 b6d98463 2006-04-14 devnull if (strcmp(s, p->s_name) == 0)
49 b6d98463 2006-04-14 devnull break;
50 b6d98463 2006-04-14 devnull if (p == NULL) { /* it's a new one */
51 b6d98463 2006-04-14 devnull p = (struct symtab *) malloc(sizeof(struct symtab));
52 b6d98463 2006-04-14 devnull if (p == NULL)
53 b6d98463 2006-04-14 devnull ERROR "out of symtab space with %s", s FATAL;
54 b6d98463 2006-04-14 devnull p->s_next = stack[nstack].p_symtab;
55 b6d98463 2006-04-14 devnull stack[nstack].p_symtab = p; /* stick it at front */
56 b6d98463 2006-04-14 devnull }
57 b6d98463 2006-04-14 devnull p->s_name = s;
58 b6d98463 2006-04-14 devnull p->s_type = t;
59 b6d98463 2006-04-14 devnull p->s_val = v;
60 b6d98463 2006-04-14 devnull return(p);
61 b6d98463 2006-04-14 devnull }
62 b6d98463 2006-04-14 devnull
63 b6d98463 2006-04-14 devnull struct symtab*
64 b6d98463 2006-04-14 devnull lookup(char *s) /* find s in symtab */
65 b6d98463 2006-04-14 devnull {
66 b6d98463 2006-04-14 devnull int i;
67 b6d98463 2006-04-14 devnull struct symtab *p;
68 b6d98463 2006-04-14 devnull
69 b6d98463 2006-04-14 devnull for (i = nstack; i >= 0; i--) /* look in each active symtab */
70 b6d98463 2006-04-14 devnull for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
71 b6d98463 2006-04-14 devnull if (strcmp(s, p->s_name) == 0)
72 b6d98463 2006-04-14 devnull return(p);
73 b6d98463 2006-04-14 devnull return(NULL);
74 b6d98463 2006-04-14 devnull }
75 b6d98463 2006-04-14 devnull
76 b6d98463 2006-04-14 devnull void
77 b6d98463 2006-04-14 devnull freesymtab(struct symtab *p) /* free space used by symtab at p */
78 b6d98463 2006-04-14 devnull {
79 b6d98463 2006-04-14 devnull struct symtab *q;
80 b6d98463 2006-04-14 devnull
81 b6d98463 2006-04-14 devnull for ( ; p != NULL; p = q) {
82 b6d98463 2006-04-14 devnull q = p->s_next;
83 b6d98463 2006-04-14 devnull free(p->s_name); /* assumes done with tostring */
84 b6d98463 2006-04-14 devnull free((char *)p);
85 b6d98463 2006-04-14 devnull }
86 b6d98463 2006-04-14 devnull }
87 b6d98463 2006-04-14 devnull
88 b6d98463 2006-04-14 devnull void
89 b6d98463 2006-04-14 devnull freedef(char *s) /* free definition for string s */
90 b6d98463 2006-04-14 devnull {
91 b6d98463 2006-04-14 devnull struct symtab *p, *q, *op;
92 b6d98463 2006-04-14 devnull
93 b6d98463 2006-04-14 devnull for (p = op = q = stack[nstack].p_symtab; p != NULL; p = p->s_next) {
94 b6d98463 2006-04-14 devnull if (strcmp(s, p->s_name) == 0) { /* got it */
95 b6d98463 2006-04-14 devnull if (p->s_type != DEFNAME)
96 b6d98463 2006-04-14 devnull break;
97 b6d98463 2006-04-14 devnull if (p == op) /* 1st elem */
98 b6d98463 2006-04-14 devnull stack[nstack].p_symtab = p->s_next;
99 b6d98463 2006-04-14 devnull else
100 b6d98463 2006-04-14 devnull q->s_next = p->s_next;
101 b6d98463 2006-04-14 devnull free(p->s_name);
102 b6d98463 2006-04-14 devnull free(p->s_val.p);
103 b6d98463 2006-04-14 devnull free((char *)p);
104 b6d98463 2006-04-14 devnull return;
105 b6d98463 2006-04-14 devnull }
106 b6d98463 2006-04-14 devnull q = p;
107 b6d98463 2006-04-14 devnull }
108 b6d98463 2006-04-14 devnull /* ERROR "%s is not defined at this point", s WARNING; */
109 b6d98463 2006-04-14 devnull }