Updated addon repository URL and improved debug output on download
[supertux.git] / external / squirrel / sqstdlib / sqstdmath.cpp
1 /* see copyright notice in squirrel.h */\r
2 #include <squirrel.h>\r
3 #include <math.h>\r
4 #include <stdlib.h>\r
5 #include <sqstdmath.h>\r
6 \r
7 #define SINGLE_ARG_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \\r
8         SQFloat f; \\r
9         sq_getfloat(v,2,&f); \\r
10         sq_pushfloat(v,(SQFloat)_funcname(f)); \\r
11         return 1; \\r
12 }\r
13 \r
14 #define TWO_ARGS_FUNC(_funcname) static SQInteger math_##_funcname(HSQUIRRELVM v){ \\r
15         SQFloat p1,p2; \\r
16         sq_getfloat(v,2,&p1); \\r
17         sq_getfloat(v,3,&p2); \\r
18         sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \\r
19         return 1; \\r
20 }\r
21 \r
22 static SQInteger math_srand(HSQUIRRELVM v)\r
23 {\r
24         SQInteger i;\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
28         return 0;\r
29 }\r
30 \r
31 static SQInteger math_rand(HSQUIRRELVM v)\r
32 {\r
33         sq_pushinteger(v,rand());\r
34         return 1;\r
35 }\r
36 \r
37 static SQInteger math_abs(HSQUIRRELVM v)\r
38 {\r
39         SQInteger n;\r
40         sq_getinteger(v,2,&n);\r
41         sq_pushinteger(v,(SQInteger)abs((int)n)); \r
42         return 1; \r
43 }\r
44 \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
56 TWO_ARGS_FUNC(pow)\r
57 SINGLE_ARG_FUNC(floor)\r
58 SINGLE_ARG_FUNC(ceil)\r
59 SINGLE_ARG_FUNC(exp)\r
60 \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
81         {0,0},\r
82 };\r
83 #undef _DECL_FUNC\r
84 \r
85 #ifndef M_PI\r
86 #define M_PI (3.14159265358979323846)\r
87 #endif\r
88 \r
89 SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)\r
90 {\r
91         SQInteger i=0;\r
92         while(mathlib_funcs[i].name!=0) {\r
93                 sq_pushstring(v,mathlib_funcs[i].name,-1);\r
94                 sq_newclosure(v,mathlib_funcs[i].f,0);\r
95                 sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);\r
96                 sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);\r
97                 sq_newslot(v,-3,SQFalse);\r
98                 i++;\r
99         }\r
100         sq_pushstring(v,_SC("RAND_MAX"),-1);\r
101         sq_pushinteger(v,RAND_MAX);\r
102         sq_newslot(v,-3,SQFalse);\r
103         sq_pushstring(v,_SC("PI"),-1);\r
104         sq_pushfloat(v,(SQFloat)M_PI);\r
105         sq_newslot(v,-3,SQFalse);\r
106         return SQ_OK;\r
107 }\r