ref: 0cb4115b8234946b5468f3f0fe29d4c6a94f1026
dir: /sys/src/cmd/hoc/symbol.c/
#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; }