1/* see copyright notice in squirrel.h */
2#include <squirrel.h>
3#include <math.h>
4#include <stdlib.h>
5#include <sqstdmath.h>
6
7#define SINGLE_ARG_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
8 SQFloat f; \
9 sq_getfloat(v,2,&f); \
10 sq_pushfloat(v,(SQFloat)_funcname(f)); \
11 return 1; \
12}
13
14#define TWO_ARGS_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
15 SQFloat p1,p2; \
16 sq_getfloat(v,2,&p1); \
17 sq_getfloat(v,3,&p2); \
18 sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
19 return 1; \
20}
21
22static SQInteger math_srand(HSQUIRRELVM v)
23{
24 SQInteger i;
25 if(SQ_FAILED(sq_getinteger(v,2,&i)))
26 return sq_throwerror(v,_SC("invalid param"));
27 srand((unsigned int)i);
28 return 0;
29}
30
31static SQInteger math_rand(HSQUIRRELVM v)
32{
33 sq_pushinteger(v,rand());
34 return 1;
35}
36
37static SQInteger math_abs(HSQUIRRELVM v)
38{
39 SQInteger n;
40 sq_getinteger(v,2,&n);
41 sq_pushinteger(v,(SQInteger)abs((int)n));
42 return 1;
43}
44
45SINGLE_ARG_FUNC(sqrt)
46SINGLE_ARG_FUNC(fabs)
47SINGLE_ARG_FUNC(sin)
48SINGLE_ARG_FUNC(cos)
49SINGLE_ARG_FUNC(asin)
50SINGLE_ARG_FUNC(acos)
51SINGLE_ARG_FUNC(log)
52SINGLE_ARG_FUNC(log10)
53SINGLE_ARG_FUNC(tan)
54SINGLE_ARG_FUNC(atan)
55TWO_ARGS_FUNC(atan2)
56TWO_ARGS_FUNC(pow)
57SINGLE_ARG_FUNC(floor)
58SINGLE_ARG_FUNC(ceil)
59SINGLE_ARG_FUNC(exp)
60
61#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
62static const SQRegFunction mathlib_funcs[] = {
63 _DECL_FUNC(sqrt,2,_SC(".n")),
64 _DECL_FUNC(sin,2,_SC(".n")),
65 _DECL_FUNC(cos,2,_SC(".n")),
66 _DECL_FUNC(asin,2,_SC(".n")),
67 _DECL_FUNC(acos,2,_SC(".n")),
68 _DECL_FUNC(log,2,_SC(".n")),
69 _DECL_FUNC(log10,2,_SC(".n")),
70 _DECL_FUNC(tan,2,_SC(".n")),
71 _DECL_FUNC(atan,2,_SC(".n")),
72 _DECL_FUNC(atan2,3,_SC(".nn")),
73 _DECL_FUNC(pow,3,_SC(".nn")),
74 _DECL_FUNC(floor,2,_SC(".n")),
75 _DECL_FUNC(ceil,2,_SC(".n")),
76 _DECL_FUNC(exp,2,_SC(".n")),
77 _DECL_FUNC(srand,2,_SC(".n")),
78 _DECL_FUNC(rand,1,NULL),
79 _DECL_FUNC(fabs,2,_SC(".n")),
80 _DECL_FUNC(abs,2,_SC(".n")),
81 {NULL,(SQFUNCTION)0,0,NULL}
82};
83#undef _DECL_FUNC
84
85#ifndef M_PI
86#define M_PI (3.14159265358979323846)
87#endif
88
89SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
90{
91 SQInteger i=0;
92 while(mathlib_funcs[i].name!=0) {
93 sq_pushstring(v,mathlib_funcs[i].name,-1);
94 sq_newclosure(v,mathlib_funcs[i].f,0);
95 sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);
96 sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);
97 sq_newslot(v,-3,SQFalse);
98 i++;
99 }
100 sq_pushstring(v,_SC("RAND_MAX"),-1);
101 sq_pushinteger(v,RAND_MAX);
102 sq_newslot(v,-3,SQFalse);
103 sq_pushstring(v,_SC("PI"),-1);
104 sq_pushfloat(v,(SQFloat)M_PI);
105 sq_newslot(v,-3,SQFalse);
106 return SQ_OK;
107}
108