#include <u.h>
#include <libc.h>
#include "hoc.h"
#include "y.tab.h"

static Symbol *symlist = 0;  /* symbol table: linked list */

Symbol*
lookup(char* s) /* find s in symbol table */
{
       Symbol *sp;

       for (sp = symlist; sp != (Symbol *) 0; sp = sp->next)
               if (strcmp(sp->name, s) == 0)
                       return sp;
       return 0;       /* 0 ==> not found */
}

Symbol*
install(char* s, int t, double d)  /* install s in symbol table */
{
       Symbol *sp;

       sp = emalloc(sizeof(Symbol));
       sp->name = emalloc(strlen(s)+1); /* +1 for '\0' */
       strcpy(sp->name, s);
       sp->type = t;
       sp->u.val = d;
       sp->next = symlist; /* put at front of list */
       symlist = sp;
       return sp;
}

void*
emalloc(unsigned n)     /* check return from malloc */
{
       char *p;

       p = malloc(n);
       if (p == 0)
               execerror("out of memory", (char *) 0);
       return p;
}

Formal*
formallist(Symbol *formal, Formal *list)        /* add formal to list */
{
       Formal *f;

       f = emalloc(sizeof(Formal));
       f->sym = formal;
       f->save = 0;
       f->next = list;
       return f;
}