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 | ||