diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/hoc/symbol.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/hoc/symbol.c')
-rwxr-xr-x | sys/src/cmd/hoc/symbol.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/src/cmd/hoc/symbol.c b/sys/src/cmd/hoc/symbol.c new file mode 100755 index 000000000..0a777b0d5 --- /dev/null +++ b/sys/src/cmd/hoc/symbol.c @@ -0,0 +1,55 @@ +#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; +} |