123955Sjaap #ifndef lint
2*24092Sjaap static char sccsid[] = "@(#)symtab.c 3.1 (CWI) 85/07/30";
323955Sjaap #endif lint
4*24092Sjaap
523955Sjaap #include <stdio.h>
623955Sjaap #include <ctype.h>
723955Sjaap #include "pic.h"
823955Sjaap #include "y.tab.h"
923955Sjaap
getvar(s)1023955Sjaap YYSTYPE getvar(s) /* return value of variable s (usually pointer) */
1123955Sjaap char *s;
1223955Sjaap {
1323955Sjaap struct symtab *p;
1423955Sjaap static YYSTYPE bug;
1523955Sjaap
1623955Sjaap p = lookup(s);
1723955Sjaap if (p == NULL) {
1823955Sjaap if (islower(s[0]))
1923955Sjaap yyerror("no such variable as %s", s);
2023955Sjaap else
2123955Sjaap yyerror("no such place as %s", s);
2223955Sjaap return(bug);
2323955Sjaap }
2423955Sjaap return(p->s_val);
2523955Sjaap }
2623955Sjaap
getfval(s)2723955Sjaap float getfval(s) /* return float value of variable s */
2823955Sjaap char *s;
2923955Sjaap {
3023955Sjaap YYSTYPE y;
3123955Sjaap
3223955Sjaap y = getvar(s);
3323955Sjaap return y.f;
3423955Sjaap }
3523955Sjaap
setfval(s,f)3623955Sjaap setfval(s, f) /* set variable s to f */
3723955Sjaap char *s;
3823955Sjaap float f;
3923955Sjaap {
4023955Sjaap struct symtab *p;
4123955Sjaap
4223955Sjaap if ((p = lookup(s)) != NULL)
4323955Sjaap p->s_val.f = f;
4423955Sjaap }
4523955Sjaap
makevar(s,t,v)4623955Sjaap struct symtab *makevar(s, t, v) /* make variable named s in table */
4723955Sjaap char *s; /* assumes s is static or from tostring */
4823955Sjaap int t;
4923955Sjaap YYSTYPE v;
5023955Sjaap {
5123955Sjaap int i;
5223955Sjaap struct symtab *p;
5323955Sjaap
5423955Sjaap for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
5523955Sjaap if (strcmp(s, p->s_name) == 0)
5623955Sjaap break;
5723955Sjaap if (p == NULL) { /* it's a new one */
5823955Sjaap p = (struct symtab *) malloc(sizeof(struct symtab));
5923955Sjaap if (p == NULL) {
6023955Sjaap yyerror("out of symtab space with %s", s);
6123955Sjaap exit(1);
6223955Sjaap }
6323955Sjaap p->s_next = stack[nstack].p_symtab;
6423955Sjaap stack[nstack].p_symtab = p; /* stick it at front */
6523955Sjaap }
6623955Sjaap p->s_name = s;
6723955Sjaap p->s_type = t;
6823955Sjaap p->s_val = v;
6923955Sjaap return(p);
7023955Sjaap }
7123955Sjaap
lookup(s)7223955Sjaap struct symtab *lookup(s) /* find s in symtab */
7323955Sjaap char *s;
7423955Sjaap {
7523955Sjaap int i;
7623955Sjaap struct symtab *p;
7723955Sjaap
7823955Sjaap for (i = nstack; i >= 0; i--) /* look in each active symtab */
7923955Sjaap for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
8023955Sjaap if (strcmp(s, p->s_name) == 0)
8123955Sjaap return(p);
8223955Sjaap return(NULL);
8323955Sjaap }
8423955Sjaap
8523955Sjaap freesymtab(p) /* free space used by symtab at p */
8623955Sjaap struct symtab *p;
8723955Sjaap {
8824020Sjaap struct symtab *q;
8924020Sjaap
9024020Sjaap for ( ; p != NULL; p = q) {
9124020Sjaap q = p->s_next;
9223955Sjaap free(p->s_name); /* assumes done with tostring */
9323955Sjaap free(p);
9423955Sjaap }
9523955Sjaap }
9624020Sjaap
freedef(s)9724020Sjaap freedef(s) /* free definition for string s */
9824020Sjaap char *s;
9924020Sjaap {
10024020Sjaap struct symtab *p, *q, *op;
10124020Sjaap
10224020Sjaap for (p = op = q = stack[nstack].p_symtab; p != NULL; p = p->s_next) {
10324020Sjaap if (strcmp(s, p->s_name) == 0) { /* got it */
10424020Sjaap if (p->s_type != DEFNAME)
10524020Sjaap break;
10624020Sjaap if (p == op) /* 1st elem */
10724020Sjaap stack[nstack].p_symtab = p->s_next;
10824020Sjaap else
10924020Sjaap q->s_next = p->s_next;
11024020Sjaap free(p->s_name);
11124020Sjaap free(p->s_val.p);
11224020Sjaap free(p);
11324020Sjaap return;
11424020Sjaap }
11524020Sjaap q = p;
11624020Sjaap }
11724020Sjaap yyerror("%s is not defined at this point", s);
11824020Sjaap }
119