1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier #include "hoc.h"
4*3e12c5d1SDavid du Colombier #include "y.tab.h"
5*3e12c5d1SDavid du Colombier
6*3e12c5d1SDavid du Colombier static struct { /* Keywords */
7*3e12c5d1SDavid du Colombier char *name;
8*3e12c5d1SDavid du Colombier int kval;
9*3e12c5d1SDavid du Colombier } keywords[] = {
10*3e12c5d1SDavid du Colombier "proc", PROC,
11*3e12c5d1SDavid du Colombier "func", FUNC,
12*3e12c5d1SDavid du Colombier "return", RETURN,
13*3e12c5d1SDavid du Colombier "if", IF,
14*3e12c5d1SDavid du Colombier "else", ELSE,
15*3e12c5d1SDavid du Colombier "while", WHILE,
16*3e12c5d1SDavid du Colombier "for", FOR,
17*3e12c5d1SDavid du Colombier "print", PRINT,
18*3e12c5d1SDavid du Colombier "read", READ,
19*3e12c5d1SDavid du Colombier 0, 0,
20*3e12c5d1SDavid du Colombier };
21*3e12c5d1SDavid du Colombier
22*3e12c5d1SDavid du Colombier static struct { /* Constants */
23*3e12c5d1SDavid du Colombier char *name;
24*3e12c5d1SDavid du Colombier double cval;
25*3e12c5d1SDavid du Colombier } consts[] = {
26*3e12c5d1SDavid du Colombier "PI", 3.14159265358979323846,
27*3e12c5d1SDavid du Colombier "E", 2.71828182845904523536,
28*3e12c5d1SDavid du Colombier "GAMMA", 0.57721566490153286060, /* Euler */
29*3e12c5d1SDavid du Colombier "DEG", 57.29577951308232087680, /* deg/radian */
30*3e12c5d1SDavid du Colombier "PHI", 1.61803398874989484820, /* golden ratio */
31*3e12c5d1SDavid du Colombier 0, 0
32*3e12c5d1SDavid du Colombier };
33*3e12c5d1SDavid du Colombier
34*3e12c5d1SDavid du Colombier static struct { /* Built-ins */
35*3e12c5d1SDavid du Colombier char *name;
36*3e12c5d1SDavid du Colombier double (*func)(double);
37*3e12c5d1SDavid du Colombier } builtins[] = {
38*3e12c5d1SDavid du Colombier "sin", sin,
39*3e12c5d1SDavid du Colombier "cos", cos,
40*3e12c5d1SDavid du Colombier "tan", tan,
41*3e12c5d1SDavid du Colombier "atan", atan,
42*3e12c5d1SDavid du Colombier "asin", Asin, /* checks range */
43*3e12c5d1SDavid du Colombier "acos", Acos, /* checks range */
44*3e12c5d1SDavid du Colombier "sinh", Sinh, /* checks range */
45*3e12c5d1SDavid du Colombier "cosh", Cosh, /* checks range */
46*3e12c5d1SDavid du Colombier "tanh", tanh,
47*3e12c5d1SDavid du Colombier "log", Log, /* checks range */
48*3e12c5d1SDavid du Colombier "log10", Log10, /* checks range */
49*3e12c5d1SDavid du Colombier "exp", Exp, /* checks range */
50*3e12c5d1SDavid du Colombier "sqrt", Sqrt, /* checks range */
51*3e12c5d1SDavid du Colombier "int", integer,
52*3e12c5d1SDavid du Colombier "abs", fabs,
53*3e12c5d1SDavid du Colombier 0, 0
54*3e12c5d1SDavid du Colombier };
55*3e12c5d1SDavid du Colombier
56*3e12c5d1SDavid du Colombier void
init(void)57*3e12c5d1SDavid du Colombier init(void) /* install constants and built-ins in table */
58*3e12c5d1SDavid du Colombier {
59*3e12c5d1SDavid du Colombier int i;
60*3e12c5d1SDavid du Colombier Symbol *s;
61*3e12c5d1SDavid du Colombier for (i = 0; keywords[i].name; i++)
62*3e12c5d1SDavid du Colombier install(keywords[i].name, keywords[i].kval, 0.0);
63*3e12c5d1SDavid du Colombier for (i = 0; consts[i].name; i++)
64*3e12c5d1SDavid du Colombier install(consts[i].name, VAR, consts[i].cval);
65*3e12c5d1SDavid du Colombier for (i = 0; builtins[i].name; i++) {
66*3e12c5d1SDavid du Colombier s = install(builtins[i].name, BLTIN, 0.0);
67*3e12c5d1SDavid du Colombier s->u.ptr = builtins[i].func;
68*3e12c5d1SDavid du Colombier }
69*3e12c5d1SDavid du Colombier }
70