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

static struct {         /* Keywords */
       char    *name;
       int     kval;
} keywords[] = {
       "proc",         PROC,
       "func",         FUNC,
       "return",       RETURN,
       "if",           IF,
       "else",         ELSE,
       "while",        WHILE,
       "for",          FOR,
       "print",        PRINT,
       "read",         READ,
       0,              0,
};

static struct {         /* Constants */
       char *name;
       double cval;
} consts[] = {
       "PI",    3.14159265358979323846,
       "E",     2.71828182845904523536,
       "GAMMA", 0.57721566490153286060,  /* Euler */
       "DEG",  57.29577951308232087680,  /* deg/radian */
       "PHI",   1.61803398874989484820,  /* golden ratio */
       0,       0
};

static struct {         /* Built-ins */
       char *name;
       double  (*func)(double);
} builtins[] = {
       "sin",  sin,
       "cos",  cos,
       "tan",  tan,
       "atan", atan,
       "asin", Asin,   /* checks range */
       "acos", Acos,   /* checks range */
       "sinh", Sinh,   /* checks range */
       "cosh", Cosh,   /* checks range */
       "tanh", tanh,
       "log",  Log,    /* checks range */
       "log10", Log10, /* checks range */
       "exp",  Exp,    /* checks range */
       "sqrt", Sqrt,   /* checks range */
       "int",  integer,
       "abs",  fabs,
       0,      0
};

void
init(void)      /* install constants and built-ins in table */
{
       int i;
       Symbol *s;
       for (i = 0; keywords[i].name; i++)
               install(keywords[i].name, keywords[i].kval, 0.0);
       for (i = 0; consts[i].name; i++)
               install(consts[i].name, VAR, consts[i].cval);
       for (i = 0; builtins[i].name; i++) {
               s = install(builtins[i].name, BLTIN, 0.0);
               s->u.ptr = builtins[i].func;
       }
}