symtab.c (2235B)
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((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 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 }