| 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 |  | 
|---|
| 22 | static 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 |  | 
|---|
| 31 | static SQInteger math_rand(HSQUIRRELVM v) | 
|---|
| 32 | { | 
|---|
| 33 | sq_pushinteger(v,rand()); | 
|---|
| 34 | return 1; | 
|---|
| 35 | } | 
|---|
| 36 |  | 
|---|
| 37 | static 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 |  | 
|---|
| 45 | SINGLE_ARG_FUNC(sqrt) | 
|---|
| 46 | SINGLE_ARG_FUNC(fabs) | 
|---|
| 47 | SINGLE_ARG_FUNC(sin) | 
|---|
| 48 | SINGLE_ARG_FUNC(cos) | 
|---|
| 49 | SINGLE_ARG_FUNC(asin) | 
|---|
| 50 | SINGLE_ARG_FUNC(acos) | 
|---|
| 51 | SINGLE_ARG_FUNC(log) | 
|---|
| 52 | SINGLE_ARG_FUNC(log10) | 
|---|
| 53 | SINGLE_ARG_FUNC(tan) | 
|---|
| 54 | SINGLE_ARG_FUNC(atan) | 
|---|
| 55 | TWO_ARGS_FUNC(atan2) | 
|---|
| 56 | TWO_ARGS_FUNC(pow) | 
|---|
| 57 | SINGLE_ARG_FUNC(floor) | 
|---|
| 58 | SINGLE_ARG_FUNC(ceil) | 
|---|
| 59 | SINGLE_ARG_FUNC(exp) | 
|---|
| 60 |  | 
|---|
| 61 | #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck} | 
|---|
| 62 | static 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 |  | 
|---|
| 89 | SQRESULT 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 |  | 
|---|