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