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