ref: c1cebeee3da60bac9fdde3d8b2caac29c27ef912
dir: /sym.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <geometry.h>
#include "dat.h"
#include "fns.h"
static Symbol *symtab;
Symbol *
declsym(char *s, int t, ...)
{
Symbol *sym;
va_list a;
va_start(a, t);
sym = emalloc(sizeof(Symbol));
sym->name = estrdup(s);
sym->type = t;
switch(t){
case SYMVAR:
sym->var = va_arg(a, Var);
break;
case SYMCONST:
sym->cval = va_arg(a, double);
break;
default:
va_end(a);
free(sym->name);
free(sym);
werrstr("unknown symbol type");
return nil;
}
sym->next = symtab;
symtab = sym;
va_end(a);
return sym;
}
Symbol *
getsym(char *s)
{
Symbol *sym;
for(sym = symtab; sym != nil; sym = sym->next)
if(strcmp(sym->name, s) == 0)
return sym;
return nil;
}
void
printsymtab(void)
{
Symbol *sym;
for(sym = symtab; sym != nil; sym = sym->next){
print("sym name '%s' type", sym->name);
switch(sym->type){
case SYMVAR:
print(" var %d [%g,%g,%g,%g]\n",
sym->var.type,
sym->var.val[0], sym->var.val[1],
sym->var.val[2], sym->var.val[3]);
break;
case SYMCONST:
print(" const [%g]\n", sym->cval);
break;
}
print("\n");
}
}