1 5cedca1b 2004-05-15 devnull #include <stdio.h>
2 5cedca1b 2004-05-15 devnull #include <stdlib.h>
3 5cedca1b 2004-05-15 devnull #include <ctype.h>
4 5cedca1b 2004-05-15 devnull #include <string.h>
5 5cedca1b 2004-05-15 devnull #include "pic.h"
6 5cedca1b 2004-05-15 devnull #include "y.tab.h"
8 5cedca1b 2004-05-15 devnull YYSTYPE getvar(char *s) /* return value of variable s (usually pointer) */
10 5cedca1b 2004-05-15 devnull struct symtab *p;
11 5cedca1b 2004-05-15 devnull static YYSTYPE bug;
13 5cedca1b 2004-05-15 devnull p = lookup(s);
14 5cedca1b 2004-05-15 devnull if (p == NULL) {
15 5f1cf8e6 2004-05-16 devnull if (islower((int) s[0]))
16 5cedca1b 2004-05-15 devnull ERROR "no such variable as %s", s WARNING;
18 5cedca1b 2004-05-15 devnull ERROR "no such place as %s", s WARNING;
19 5cedca1b 2004-05-15 devnull return(bug);
21 5cedca1b 2004-05-15 devnull return(p->s_val);
24 5cedca1b 2004-05-15 devnull double getfval(char *s) /* return float value of variable s */
26 5cedca1b 2004-05-15 devnull YYSTYPE y;
28 5cedca1b 2004-05-15 devnull y = getvar(s);
29 5cedca1b 2004-05-15 devnull return y.f;
32 5cedca1b 2004-05-15 devnull void setfval(char *s, double f) /* set variable s to f */
34 5cedca1b 2004-05-15 devnull struct symtab *p;
36 5cedca1b 2004-05-15 devnull if ((p = lookup(s)) != NULL)
37 5cedca1b 2004-05-15 devnull p->s_val.f = f;
40 5cedca1b 2004-05-15 devnull struct symtab *makevar(char *s, int t, YYSTYPE v) /* make variable named s in table */
41 5cedca1b 2004-05-15 devnull /* assumes s is static or from tostring */
43 5cedca1b 2004-05-15 devnull struct symtab *p;
45 5cedca1b 2004-05-15 devnull for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
46 5cedca1b 2004-05-15 devnull if (strcmp(s, p->s_name) == 0)
48 5cedca1b 2004-05-15 devnull if (p == NULL) { /* it's a new one */
49 5cedca1b 2004-05-15 devnull p = (struct symtab *) malloc(sizeof(struct symtab));
50 5cedca1b 2004-05-15 devnull if (p == NULL)
51 5cedca1b 2004-05-15 devnull ERROR "out of symtab space with %s", s FATAL;
52 5cedca1b 2004-05-15 devnull p->s_next = stack[nstack].p_symtab;
53 5cedca1b 2004-05-15 devnull stack[nstack].p_symtab = p; /* stick it at front */
55 5cedca1b 2004-05-15 devnull p->s_name = s;
56 5cedca1b 2004-05-15 devnull p->s_type = t;
57 5cedca1b 2004-05-15 devnull p->s_val = v;
58 5cedca1b 2004-05-15 devnull return(p);
61 5cedca1b 2004-05-15 devnull struct symtab *lookup(char *s) /* find s in symtab */
64 5cedca1b 2004-05-15 devnull struct symtab *p;
66 5cedca1b 2004-05-15 devnull for (i = nstack; i >= 0; i--) /* look in each active symtab */
67 5cedca1b 2004-05-15 devnull for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
68 5cedca1b 2004-05-15 devnull if (strcmp(s, p->s_name) == 0)
69 5cedca1b 2004-05-15 devnull return(p);
70 5cedca1b 2004-05-15 devnull return(NULL);
73 5cedca1b 2004-05-15 devnull void freesymtab(struct symtab *p) /* free space used by symtab at p */
75 5cedca1b 2004-05-15 devnull struct symtab *q;
77 5cedca1b 2004-05-15 devnull for ( ; p != NULL; p = q) {
78 5cedca1b 2004-05-15 devnull q = p->s_next;
79 5cedca1b 2004-05-15 devnull free(p->s_name); /* assumes done with tostring */
80 5cedca1b 2004-05-15 devnull free((char *)p);
84 5cedca1b 2004-05-15 devnull void freedef(char *s) /* free definition for string s */
86 5cedca1b 2004-05-15 devnull struct symtab *p, *q, *op;
88 5cedca1b 2004-05-15 devnull for (p = op = q = stack[nstack].p_symtab; p != NULL; p = p->s_next) {
89 5cedca1b 2004-05-15 devnull if (strcmp(s, p->s_name) == 0) { /* got it */
90 5cedca1b 2004-05-15 devnull if (p->s_type != DEFNAME)
92 5cedca1b 2004-05-15 devnull if (p == op) /* 1st elem */
93 5cedca1b 2004-05-15 devnull stack[nstack].p_symtab = p->s_next;
95 5cedca1b 2004-05-15 devnull q->s_next = p->s_next;
96 5cedca1b 2004-05-15 devnull free(p->s_name);
97 5cedca1b 2004-05-15 devnull free(p->s_val.p);
98 5cedca1b 2004-05-15 devnull free((char *)p);
103 5cedca1b 2004-05-15 devnull /* ERROR "%s is not defined at this point", s WARNING; */