1 /* see copyright notice in squirrel.h */
\r
2 #include <squirrel.h>
\r
5 #include <sqstdmath.h>
\r
7 #define SINGLE_ARG_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
\r
9 sq_getfloat(v,2,&f); \
\r
10 sq_pushfloat(v,(SQFloat)_funcname(f)); \
\r
14 #define TWO_ARGS_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
\r
16 sq_getfloat(v,2,&p1); \
\r
17 sq_getfloat(v,3,&p2); \
\r
18 sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
\r
22 static SQInteger math_srand(HSQUIRRELVM v)
\r
25 if(SQ_FAILED(sq_getinteger(v,2,&i)))
\r
26 return sq_throwerror(v,_SC("invalid param"));
\r
27 srand((unsigned int)i);
\r
31 static SQInteger math_rand(HSQUIRRELVM v)
\r
33 sq_pushinteger(v,rand());
\r
37 static SQInteger math_abs(HSQUIRRELVM v)
\r
40 sq_getinteger(v,2,&n);
\r
41 sq_pushinteger(v,(SQInteger)abs((int)n));
\r
45 SINGLE_ARG_FUNC(sqrt)
\r
46 SINGLE_ARG_FUNC(fabs)
\r
47 SINGLE_ARG_FUNC(sin)
\r
48 SINGLE_ARG_FUNC(cos)
\r
49 SINGLE_ARG_FUNC(asin)
\r
50 SINGLE_ARG_FUNC(acos)
\r
51 SINGLE_ARG_FUNC(log)
\r
52 SINGLE_ARG_FUNC(log10)
\r
53 SINGLE_ARG_FUNC(tan)
\r
54 SINGLE_ARG_FUNC(atan)
\r
55 TWO_ARGS_FUNC(atan2)
\r
57 SINGLE_ARG_FUNC(floor)
\r
58 SINGLE_ARG_FUNC(ceil)
\r
59 SINGLE_ARG_FUNC(exp)
\r
61 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
\r
62 static SQRegFunction mathlib_funcs[] = {
\r
63 _DECL_FUNC(sqrt,2,_SC(".n")),
\r
64 _DECL_FUNC(sin,2,_SC(".n")),
\r
65 _DECL_FUNC(cos,2,_SC(".n")),
\r
66 _DECL_FUNC(asin,2,_SC(".n")),
\r
67 _DECL_FUNC(acos,2,_SC(".n")),
\r
68 _DECL_FUNC(log,2,_SC(".n")),
\r
69 _DECL_FUNC(log10,2,_SC(".n")),
\r
70 _DECL_FUNC(tan,2,_SC(".n")),
\r
71 _DECL_FUNC(atan,2,_SC(".n")),
\r
72 _DECL_FUNC(atan2,3,_SC(".nn")),
\r
73 _DECL_FUNC(pow,3,_SC(".nn")),
\r
74 _DECL_FUNC(floor,2,_SC(".n")),
\r
75 _DECL_FUNC(ceil,2,_SC(".n")),
\r
76 _DECL_FUNC(exp,2,_SC(".n")),
\r
77 _DECL_FUNC(srand,2,_SC(".n")),
\r
78 _DECL_FUNC(rand,1,NULL),
\r
79 _DECL_FUNC(fabs,2,_SC(".n")),
\r
80 _DECL_FUNC(abs,2,_SC(".n")),
\r
85 #define M_PI (3.14159265358979323846)
\r
88 SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
\r
91 while(mathlib_funcs[i].name!=0) {
\r
92 sq_pushstring(v,mathlib_funcs[i].name,-1);
\r
93 sq_newclosure(v,mathlib_funcs[i].f,0);
\r
94 sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);
\r
95 sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);
\r
96 sq_createslot(v,-3);
\r
99 sq_pushstring(v,_SC("RAND_MAX"),-1);
\r
100 sq_pushinteger(v,RAND_MAX);
\r
101 sq_createslot(v,-3);
\r
102 sq_pushstring(v,_SC("PI"),-1);
\r
103 sq_pushfloat(v,(SQFloat)M_PI);
\r
104 sq_createslot(v,-3);
\r