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