URI: 
       tsymtab.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tsymtab.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 }