diff options
Diffstat (limited to 'lmathlib.c')
| -rw-r--r-- | lmathlib.c | 144 |
1 files changed, 73 insertions, 71 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lmathlib.c,v 1.18 1999/08/16 20:52:00 roberto Exp roberto $ | 2 | ** $Id: lmathlib.c,v 1.19 1999/08/18 14:40:51 roberto Exp roberto $ |
| 3 | ** Lua standard mathematical library | 3 | ** Lua standard mathematical library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -8,14 +8,16 @@ | |||
| 8 | #include <stdlib.h> | 8 | #include <stdlib.h> |
| 9 | #include <math.h> | 9 | #include <math.h> |
| 10 | 10 | ||
| 11 | #define LUA_REENTRANT | ||
| 12 | |||
| 11 | #include "lauxlib.h" | 13 | #include "lauxlib.h" |
| 12 | #include "lua.h" | 14 | #include "lua.h" |
| 13 | #include "lualib.h" | 15 | #include "lualib.h" |
| 14 | 16 | ||
| 15 | 17 | ||
| 16 | #undef PI | 18 | #undef PI |
| 17 | #define PI (3.14159265358979323846) | 19 | #define PI (3.14159265358979323846) |
| 18 | #define RADIANS_PER_DEGREE (PI/180.0) | 20 | #define RADIANS_PER_DEGREE (PI/180.0) |
| 19 | 21 | ||
| 20 | 22 | ||
| 21 | 23 | ||
| @@ -32,138 +34,138 @@ | |||
| 32 | #endif | 34 | #endif |
| 33 | 35 | ||
| 34 | 36 | ||
| 35 | static void math_abs (void) { | 37 | static void math_abs (lua_State *L) { |
| 36 | lua_pushnumber(fabs(luaL_check_number(1))); | 38 | lua_pushnumber(L, fabs(luaL_check_number(L, 1))); |
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | static void math_sin (void) { | 41 | static void math_sin (lua_State *L) { |
| 40 | lua_pushnumber(sin(TORAD(luaL_check_number(1)))); | 42 | lua_pushnumber(L, sin(TORAD(luaL_check_number(L, 1)))); |
| 41 | } | 43 | } |
| 42 | 44 | ||
| 43 | static void math_cos (void) { | 45 | static void math_cos (lua_State *L) { |
| 44 | lua_pushnumber(cos(TORAD(luaL_check_number(1)))); | 46 | lua_pushnumber(L, cos(TORAD(luaL_check_number(L, 1)))); |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 47 | static void math_tan (void) { | 49 | static void math_tan (lua_State *L) { |
| 48 | lua_pushnumber(tan(TORAD(luaL_check_number(1)))); | 50 | lua_pushnumber(L, tan(TORAD(luaL_check_number(L, 1)))); |
| 49 | } | 51 | } |
| 50 | 52 | ||
| 51 | static void math_asin (void) { | 53 | static void math_asin (lua_State *L) { |
| 52 | lua_pushnumber(FROMRAD(asin(luaL_check_number(1)))); | 54 | lua_pushnumber(L, FROMRAD(asin(luaL_check_number(L, 1)))); |
| 53 | } | 55 | } |
| 54 | 56 | ||
| 55 | static void math_acos (void) { | 57 | static void math_acos (lua_State *L) { |
| 56 | lua_pushnumber(FROMRAD(acos(luaL_check_number(1)))); | 58 | lua_pushnumber(L, FROMRAD(acos(luaL_check_number(L, 1)))); |
| 57 | } | 59 | } |
| 58 | 60 | ||
| 59 | static void math_atan (void) { | 61 | static void math_atan (lua_State *L) { |
| 60 | lua_pushnumber(FROMRAD(atan(luaL_check_number(1)))); | 62 | lua_pushnumber(L, FROMRAD(atan(luaL_check_number(L, 1)))); |
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | static void math_atan2 (void) { | 65 | static void math_atan2 (lua_State *L) { |
| 64 | lua_pushnumber(FROMRAD(atan2(luaL_check_number(1), luaL_check_number(2)))); | 66 | lua_pushnumber(L, FROMRAD(atan2(luaL_check_number(L, 1), luaL_check_number(L, 2)))); |
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | static void math_ceil (void) { | 69 | static void math_ceil (lua_State *L) { |
| 68 | lua_pushnumber(ceil(luaL_check_number(1))); | 70 | lua_pushnumber(L, ceil(luaL_check_number(L, 1))); |
| 69 | } | 71 | } |
| 70 | 72 | ||
| 71 | static void math_floor (void) { | 73 | static void math_floor (lua_State *L) { |
| 72 | lua_pushnumber(floor(luaL_check_number(1))); | 74 | lua_pushnumber(L, floor(luaL_check_number(L, 1))); |
| 73 | } | 75 | } |
| 74 | 76 | ||
| 75 | static void math_mod (void) { | 77 | static void math_mod (lua_State *L) { |
| 76 | lua_pushnumber(fmod(luaL_check_number(1), luaL_check_number(2))); | 78 | lua_pushnumber(L, fmod(luaL_check_number(L, 1), luaL_check_number(L, 2))); |
| 77 | } | 79 | } |
| 78 | 80 | ||
| 79 | static void math_sqrt (void) { | 81 | static void math_sqrt (lua_State *L) { |
| 80 | lua_pushnumber(sqrt(luaL_check_number(1))); | 82 | lua_pushnumber(L, sqrt(luaL_check_number(L, 1))); |
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | static void math_pow (void) { | 85 | static void math_pow (lua_State *L) { |
| 84 | lua_pushnumber(pow(luaL_check_number(1), luaL_check_number(2))); | 86 | lua_pushnumber(L, pow(luaL_check_number(L, 1), luaL_check_number(L, 2))); |
| 85 | } | 87 | } |
| 86 | 88 | ||
| 87 | static void math_log (void) { | 89 | static void math_log (lua_State *L) { |
| 88 | lua_pushnumber(log(luaL_check_number(1))); | 90 | lua_pushnumber(L, log(luaL_check_number(L, 1))); |
| 89 | } | 91 | } |
| 90 | 92 | ||
| 91 | static void math_log10 (void) { | 93 | static void math_log10 (lua_State *L) { |
| 92 | lua_pushnumber(log10(luaL_check_number(1))); | 94 | lua_pushnumber(L, log10(luaL_check_number(L, 1))); |
| 93 | } | 95 | } |
| 94 | 96 | ||
| 95 | static void math_exp (void) { | 97 | static void math_exp (lua_State *L) { |
| 96 | lua_pushnumber(exp(luaL_check_number(1))); | 98 | lua_pushnumber(L, exp(luaL_check_number(L, 1))); |
| 97 | } | 99 | } |
| 98 | 100 | ||
| 99 | static void math_deg (void) { | 101 | static void math_deg (lua_State *L) { |
| 100 | lua_pushnumber(luaL_check_number(1)/RADIANS_PER_DEGREE); | 102 | lua_pushnumber(L, luaL_check_number(L, 1)/RADIANS_PER_DEGREE); |
| 101 | } | 103 | } |
| 102 | 104 | ||
| 103 | static void math_rad (void) { | 105 | static void math_rad (lua_State *L) { |
| 104 | lua_pushnumber(luaL_check_number(1)*RADIANS_PER_DEGREE); | 106 | lua_pushnumber(L, luaL_check_number(L, 1)*RADIANS_PER_DEGREE); |
| 105 | } | 107 | } |
| 106 | 108 | ||
| 107 | static void math_frexp (void) { | 109 | static void math_frexp (lua_State *L) { |
| 108 | int e; | 110 | int e; |
| 109 | lua_pushnumber(frexp(luaL_check_number(1), &e)); | 111 | lua_pushnumber(L, frexp(luaL_check_number(L, 1), &e)); |
| 110 | lua_pushnumber(e); | 112 | lua_pushnumber(L, e); |
| 111 | } | 113 | } |
| 112 | 114 | ||
| 113 | static void math_ldexp (void) { | 115 | static void math_ldexp (lua_State *L) { |
| 114 | lua_pushnumber(ldexp(luaL_check_number(1), luaL_check_int(2))); | 116 | lua_pushnumber(L, ldexp(luaL_check_number(L, 1), luaL_check_int(L, 2))); |
| 115 | } | 117 | } |
| 116 | 118 | ||
| 117 | 119 | ||
| 118 | 120 | ||
| 119 | static void math_min (void) { | 121 | static void math_min (lua_State *L) { |
| 120 | int i = 1; | 122 | int i = 1; |
| 121 | double dmin = luaL_check_number(i); | 123 | double dmin = luaL_check_number(L, i); |
| 122 | while (lua_getparam(++i) != LUA_NOOBJECT) { | 124 | while (lua_getparam(L, ++i) != LUA_NOOBJECT) { |
| 123 | double d = luaL_check_number(i); | 125 | double d = luaL_check_number(L, i); |
| 124 | if (d < dmin) | 126 | if (d < dmin) |
| 125 | dmin = d; | 127 | dmin = d; |
| 126 | } | 128 | } |
| 127 | lua_pushnumber(dmin); | 129 | lua_pushnumber(L, dmin); |
| 128 | } | 130 | } |
| 129 | 131 | ||
| 130 | 132 | ||
| 131 | static void math_max (void) { | 133 | static void math_max (lua_State *L) { |
| 132 | int i = 1; | 134 | int i = 1; |
| 133 | double dmax = luaL_check_number(i); | 135 | double dmax = luaL_check_number(L, i); |
| 134 | while (lua_getparam(++i) != LUA_NOOBJECT) { | 136 | while (lua_getparam(L, ++i) != LUA_NOOBJECT) { |
| 135 | double d = luaL_check_number(i); | 137 | double d = luaL_check_number(L, i); |
| 136 | if (d > dmax) | 138 | if (d > dmax) |
| 137 | dmax = d; | 139 | dmax = d; |
| 138 | } | 140 | } |
| 139 | lua_pushnumber(dmax); | 141 | lua_pushnumber(L, dmax); |
| 140 | } | 142 | } |
| 141 | 143 | ||
| 142 | 144 | ||
| 143 | static void math_random (void) { | 145 | static void math_random (lua_State *L) { |
| 144 | /* the '%' avoids the (rare) case of r==1, and is needed also because on | 146 | /* the '%' avoids the (rare) case of r==1, and is needed also because on |
| 145 | some systems (SunOS!) "rand()" may return a value bigger than RAND_MAX */ | 147 | some systems (SunOS!) "rand()" may return a value bigger than RAND_MAX */ |
| 146 | double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; | 148 | double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; |
| 147 | if (lua_getparam(1) == LUA_NOOBJECT) /* no arguments? */ | 149 | if (lua_getparam(L, 1) == LUA_NOOBJECT) /* no arguments? */ |
| 148 | lua_pushnumber(r); /* real between 0 & 1 */ | 150 | lua_pushnumber(L, r); /* real between 0 & 1 */ |
| 149 | else { | 151 | else { |
| 150 | int l, u; /* lower & upper limits */ | 152 | int l, u; /* lower & upper limits */ |
| 151 | if (lua_getparam(2) == LUA_NOOBJECT) { /* only one argument? */ | 153 | if (lua_getparam(L, 2) == LUA_NOOBJECT) { /* only one argument? */ |
| 152 | l = 1; | 154 | l = 1; |
| 153 | u = luaL_check_int(1); | 155 | u = luaL_check_int(L, 1); |
| 154 | } | 156 | } |
| 155 | else { /* two arguments */ | 157 | else { /* two arguments */ |
| 156 | l = luaL_check_int(1); | 158 | l = luaL_check_int(L, 1); |
| 157 | u = luaL_check_int(2); | 159 | u = luaL_check_int(L, 2); |
| 158 | } | 160 | } |
| 159 | luaL_arg_check(l<=u, 1, "interval is empty"); | 161 | luaL_arg_check(L, l<=u, 1, "interval is empty"); |
| 160 | lua_pushnumber((int)(r*(u-l+1))+l); /* integer between l & u */ | 162 | lua_pushnumber(L, (int)(r*(u-l+1))+l); /* integer between l & u */ |
| 161 | } | 163 | } |
| 162 | } | 164 | } |
| 163 | 165 | ||
| 164 | 166 | ||
| 165 | static void math_randomseed (void) { | 167 | static void math_randomseed (lua_State *L) { |
| 166 | srand(luaL_check_int(1)); | 168 | srand(luaL_check_int(L, 1)); |
| 167 | } | 169 | } |
| 168 | 170 | ||
| 169 | 171 | ||
| @@ -196,11 +198,11 @@ static const struct luaL_reg mathlib[] = { | |||
| 196 | /* | 198 | /* |
| 197 | ** Open math library | 199 | ** Open math library |
| 198 | */ | 200 | */ |
| 199 | void lua_mathlibopen (void) { | 201 | void lua_mathlibopen (lua_State *L) { |
| 200 | luaL_openlib(mathlib, (sizeof(mathlib)/sizeof(mathlib[0]))); | 202 | luaL_openlib(L, mathlib, (sizeof(mathlib)/sizeof(mathlib[0]))); |
| 201 | lua_pushcfunction(math_pow); | 203 | lua_pushcfunction(L, math_pow); |
| 202 | lua_pushnumber(0); /* to get its tag */ | 204 | lua_pushnumber(L, 0); /* to get its tag */ |
| 203 | lua_settagmethod(lua_tag(lua_pop()), "pow"); | 205 | lua_settagmethod(L, lua_tag(L, lua_pop(L)), "pow"); |
| 204 | lua_pushnumber(PI); lua_setglobal("PI"); | 206 | lua_pushnumber(L, PI); lua_setglobal(L, "PI"); |
| 205 | } | 207 | } |
| 206 | 208 | ||
