|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.