]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/pic/symtab.c
upas/fs: remove useless loop in rf822()
[plan9front.git] / sys / src / cmd / pic / symtab.c
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
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(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
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
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
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
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
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
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 }