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