plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

symtab.c (2189B)


      1 #include	<stdio.h>
      2 #include	<ctype.h>
      3 #include	"pic.h"
      4 #include	"y.tab.h"
      5 
      6 YYSTYPE
      7 getvar(char *s)	/* return value of variable s (usually pointer) */
      8 {
      9 	struct symtab *p;
     10 	static YYSTYPE bug;
     11 
     12 	p = lookup(s);
     13 	if (p == NULL) {
     14 		if (islower(s[0]))
     15 			ERROR "no such variable as %s", s WARNING;
     16 		else
     17 			ERROR "no such place as %s", s WARNING;
     18 		return(bug);
     19 	}
     20 	return(p->s_val);
     21 }
     22 
     23 double
     24 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
     33 setfval(char *s, double f)	/* set variable s to f */
     34 {
     35 	struct symtab *p;
     36 
     37 	if ((p = lookup(s)) != NULL)
     38 		p->s_val.f = f;
     39 }
     40 
     41 struct symtab*
     42 makevar(char *s, int t, YYSTYPE v)	/* make variable named s in table */
     43 		/* assumes s is static or from tostring */
     44 {
     45 	struct symtab *p;
     46 
     47 	for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
     48 		if (strcmp(s, p->s_name) == 0)
     49 			break;
     50 	if (p == NULL) {	/* it's a new one */
     51 		p = (struct symtab *) malloc(sizeof(struct symtab));
     52 		if (p == NULL)
     53 			ERROR "out of symtab space with %s", s FATAL;
     54 		p->s_next = stack[nstack].p_symtab;
     55 		stack[nstack].p_symtab = p;	/* stick it at front */
     56 	}
     57 	p->s_name = s;
     58 	p->s_type = t;
     59 	p->s_val = v;
     60 	return(p);
     61 }
     62 
     63 struct symtab*
     64 lookup(char *s)	/* find s in symtab */
     65 {
     66 	int i;
     67 	struct symtab *p;
     68 
     69 	for (i = nstack; i >= 0; i--)	/* look in each active symtab */
     70 		for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
     71 			if (strcmp(s, p->s_name) == 0)
     72 				return(p);
     73 	return(NULL);
     74 }
     75 
     76 void
     77 freesymtab(struct symtab *p)	/* free space used by symtab at p */
     78 {
     79 	struct symtab *q;
     80 
     81 	for ( ; p != NULL; p = q) {
     82 		q = p->s_next;
     83 		free(p->s_name);	/* assumes done with tostring */
     84 		free((char *)p);
     85 	}
     86 }
     87 
     88 void
     89 freedef(char *s)	/* free definition for string s */
     90 {
     91 	struct symtab *p, *q, *op;
     92 
     93 	for (p = op = q = stack[nstack].p_symtab; p != NULL; p = p->s_next) {
     94 		if (strcmp(s, p->s_name) == 0) { 	/* got it */
     95 			if (p->s_type != DEFNAME)
     96 				break;
     97 			if (p == op)	/* 1st elem */
     98 				stack[nstack].p_symtab = p->s_next;
     99 			else
    100 				q->s_next = p->s_next;
    101 			free(p->s_name);
    102 			free(p->s_val.p);
    103 			free((char *)p);
    104 			return;
    105 		}
    106 		q = p;
    107 	}
    108 	/* ERROR "%s is not defined at this point", s WARNING; */
    109 }