diff options
Diffstat (limited to 'src/cmd/hoc/init.c')
| -rw-r--r-- | src/cmd/hoc/init.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/cmd/hoc/init.c b/src/cmd/hoc/init.c new file mode 100644 index 00000000..e0745325 --- /dev/null +++ b/src/cmd/hoc/init.c @@ -0,0 +1,69 @@ +#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; + } +} |
