Blame


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"
7 5cedca1b 2004-05-15 devnull
8 5cedca1b 2004-05-15 devnull YYSTYPE getvar(char *s) /* return value of variable s (usually pointer) */
9 5cedca1b 2004-05-15 devnull {
10 5cedca1b 2004-05-15 devnull struct symtab *p;
11 5cedca1b 2004-05-15 devnull static YYSTYPE bug;
12 5cedca1b 2004-05-15 devnull
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;
17 5cedca1b 2004-05-15 devnull else
18 5cedca1b 2004-05-15 devnull ERROR "no such place as %s", s WARNING;
19 5cedca1b 2004-05-15 devnull return(bug);
20 5cedca1b 2004-05-15 devnull }
21 5cedca1b 2004-05-15 devnull return(p->s_val);
22 5cedca1b 2004-05-15 devnull }
23 5cedca1b 2004-05-15 devnull
24 5cedca1b 2004-05-15 devnull double getfval(char *s) /* return float value of variable s */
25 5cedca1b 2004-05-15 devnull {
26 5cedca1b 2004-05-15 devnull YYSTYPE y;
27 5cedca1b 2004-05-15 devnull
28 5cedca1b 2004-05-15 devnull y = getvar(s);
29 5cedca1b 2004-05-15 devnull return y.f;
30 5cedca1b 2004-05-15 devnull }
31 5cedca1b 2004-05-15 devnull
32 5cedca1b 2004-05-15 devnull void setfval(char *s, double f) /* set variable s to f */
33 5cedca1b 2004-05-15 devnull {
34 5cedca1b 2004-05-15 devnull struct symtab *p;
35 5cedca1b 2004-05-15 devnull
36 5cedca1b 2004-05-15 devnull if ((p = lookup(s)) != NULL)
37 5cedca1b 2004-05-15 devnull p->s_val.f = f;
38 5cedca1b 2004-05-15 devnull }
39 5cedca1b 2004-05-15 devnull
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 */
42 5cedca1b 2004-05-15 devnull {
43 5cedca1b 2004-05-15 devnull struct symtab *p;
44 5cedca1b 2004-05-15 devnull
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)
47 5cedca1b 2004-05-15 devnull break;
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 */
54 5cedca1b 2004-05-15 devnull }
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);
59 5cedca1b 2004-05-15 devnull }
60 5cedca1b 2004-05-15 devnull
61 5cedca1b 2004-05-15 devnull struct symtab *lookup(char *s) /* find s in symtab */
62 5cedca1b 2004-05-15 devnull {
63 5cedca1b 2004-05-15 devnull int i;
64 5cedca1b 2004-05-15 devnull struct symtab *p;
65 5cedca1b 2004-05-15 devnull
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);
71 5cedca1b 2004-05-15 devnull }
72 5cedca1b 2004-05-15 devnull
73 5cedca1b 2004-05-15 devnull void freesymtab(struct symtab *p) /* free space used by symtab at p */
74 5cedca1b 2004-05-15 devnull {
75 5cedca1b 2004-05-15 devnull struct symtab *q;
76 5cedca1b 2004-05-15 devnull
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);
81 5cedca1b 2004-05-15 devnull }
82 5cedca1b 2004-05-15 devnull }
83 5cedca1b 2004-05-15 devnull
84 5cedca1b 2004-05-15 devnull void freedef(char *s) /* free definition for string s */
85 5cedca1b 2004-05-15 devnull {
86 5cedca1b 2004-05-15 devnull struct symtab *p, *q, *op;
87 5cedca1b 2004-05-15 devnull
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)
91 5cedca1b 2004-05-15 devnull break;
92 5cedca1b 2004-05-15 devnull if (p == op) /* 1st elem */
93 5cedca1b 2004-05-15 devnull stack[nstack].p_symtab = p->s_next;
94 5cedca1b 2004-05-15 devnull else
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);
99 5cedca1b 2004-05-15 devnull return;
100 5cedca1b 2004-05-15 devnull }
101 5cedca1b 2004-05-15 devnull q = p;
102 5cedca1b 2004-05-15 devnull }
103 5cedca1b 2004-05-15 devnull /* ERROR "%s is not defined at this point", s WARNING; */
104 5cedca1b 2004-05-15 devnull }