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