xref: /plan9/sys/src/cmd/hoc/init.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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