#include #include #include #include "apl9.h" Symtab *globalsymtab; Symtab *currentsymtab; Symbol * getsym(Symtab *tab, Rune *name) { for(int i = 0; i < tab->nsyms; i++) if(runestrcmp(tab->syms[i]->name, name) == 0) return tab->syms[i]; tab->nsyms++; tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms); tab->syms[tab->nsyms-1] = emalloc(sizeof(Symbol)); tab->syms[tab->nsyms-1]->name = runestrdup(name); tab->syms[tab->nsyms-1]->undefined = 1; tab->syms[tab->nsyms-1]->getfn = nil; tab->syms[tab->nsyms-1]->setfn = nil; return tab->syms[tab->nsyms-1]; } Symtab * newsymtab(void) { Symtab *tab = emalloc(sizeof(Symtab)); tab->nsyms = 0; tab->syms = nil; tab->io = currentsymtab ? currentsymtab->io : 1; tab->div = currentsymtab ? currentsymtab->div : 0; return tab; } void freesymtab(Symtab *tab) { int i; for(i = 0; i < tab->nsyms; i++){ Symbol *s = tab->syms[i]; if(s->undefined == 0 && s->value.tag == ArrayTag) freearray(s->value.array); } free(tab->syms); free(tab); }