?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. /*
  2. ** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $
  3. ** Standard mathematical library
  4. ** See Copyright Notice in lua.h
  5. */
  6.  
  7.  
  8. #include <stdlib.h>
  9. #include <math.h>
  10.  
  11. #define lmathlib_c
  12. #define LUA_LIB
  13.  
  14. #include "lua.h"
  15.  
  16. #include "lauxlib.h"
  17. #include "lualib.h"
  18.  
  19.  
  20. #undef PI
  21. #define PI (3.14159265358979323846)
  22. #define RADIANS_PER_DEGREE (PI/180.0)
  23.  
  24.  
  25.  
  26. static int math_abs (lua_State *L) {
  27.   lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));
  28.   return 1;
  29. }
  30.  
  31. static int math_sin (lua_State *L) {
  32.   lua_pushnumber(L, sin(luaL_checknumber(L, 1)));
  33.   return 1;
  34. }
  35.  
  36. static int math_sinh (lua_State *L) {
  37.   lua_pushnumber(L, sinh(luaL_checknumber(L, 1)));
  38.   return 1;
  39. }
  40.  
  41. static int math_cos (lua_State *L) {
  42.   lua_pushnumber(L, cos(luaL_checknumber(L, 1)));
  43.   return 1;
  44. }
  45.  
  46. static int math_cosh (lua_State *L) {
  47.   lua_pushnumber(L, cosh(luaL_checknumber(L, 1)));
  48.   return 1;
  49. }
  50.  
  51. static int math_tan (lua_State *L) {
  52.   lua_pushnumber(L, tan(luaL_checknumber(L, 1)));
  53.   return 1;
  54. }
  55.  
  56. static int math_tanh (lua_State *L) {
  57.   lua_pushnumber(L, tanh(luaL_checknumber(L, 1)));
  58.   return 1;
  59. }
  60.  
  61. static int math_asin (lua_State *L) {
  62.   lua_pushnumber(L, asin(luaL_checknumber(L, 1)));
  63.   return 1;
  64. }
  65.  
  66. static int math_acos (lua_State *L) {
  67.   lua_pushnumber(L, acos(luaL_checknumber(L, 1)));
  68.   return 1;
  69. }
  70.  
  71. static int math_atan (lua_State *L) {
  72.   lua_pushnumber(L, atan(luaL_checknumber(L, 1)));
  73.   return 1;
  74. }
  75.  
  76. static int math_atan2 (lua_State *L) {
  77.   lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
  78.   return 1;
  79. }
  80.  
  81. static int math_ceil (lua_State *L) {
  82.   lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));
  83.   return 1;
  84. }
  85.  
  86. static int math_floor (lua_State *L) {
  87.   lua_pushnumber(L, floor(luaL_checknumber(L, 1)));
  88.   return 1;
  89. }
  90.  
  91. static int math_fmod (lua_State *L) {
  92.   lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
  93.   return 1;
  94. }
  95.  
  96. static int math_modf (lua_State *L) {
  97.   double ip;
  98.   double fp = modf(luaL_checknumber(L, 1), &ip);
  99.   lua_pushnumber(L, ip);
  100.   lua_pushnumber(L, fp);
  101.   return 2;
  102. }
  103.  
  104. static int math_sqrt (lua_State *L) {
  105.   lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));
  106.   return 1;
  107. }
  108.  
  109. static int math_pow (lua_State *L) {
  110.   lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
  111.   return 1;
  112. }
  113.  
  114. static int math_log (lua_State *L) {
  115.   lua_pushnumber(L, log(luaL_checknumber(L, 1)));
  116.   return 1;
  117. }
  118.  
  119. static int math_log10 (lua_State *L) {
  120.   lua_pushnumber(L, log10(luaL_checknumber(L, 1)));
  121.   return 1;
  122. }
  123.  
  124. static int math_exp (lua_State *L) {
  125.   lua_pushnumber(L, exp(luaL_checknumber(L, 1)));
  126.   return 1;
  127. }
  128.  
  129. static int math_deg (lua_State *L) {
  130.   lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE);
  131.   return 1;
  132. }
  133.  
  134. static int math_rad (lua_State *L) {
  135.   lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE);
  136.   return 1;
  137. }
  138.  
  139. static int math_frexp (lua_State *L) {
  140.   int e;
  141.   lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));
  142.   lua_pushinteger(L, e);
  143.   return 2;
  144. }
  145.  
  146. static int math_ldexp (lua_State *L) {
  147.   lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));
  148.   return 1;
  149. }
  150.  
  151.  
  152.  
  153. static int math_min (lua_State *L) {
  154.   int n = lua_gettop(L);  /* number of arguments */
  155.   lua_Number dmin = luaL_checknumber(L, 1);
  156.   int i;
  157.   for (i=2; i<=n; i++) {
  158.     lua_Number d = luaL_checknumber(L, i);
  159.     if (d < dmin)
  160.       dmin = d;
  161.   }
  162.   lua_pushnumber(L, dmin);
  163.   return 1;
  164. }
  165.  
  166.  
  167. static int math_max (lua_State *L) {
  168.   int n = lua_gettop(L);  /* number of arguments */
  169.   lua_Number dmax = luaL_checknumber(L, 1);
  170.   int i;
  171.   for (i=2; i<=n; i++) {
  172.     lua_Number d = luaL_checknumber(L, i);
  173.     if (d > dmax)
  174.       dmax = d;
  175.   }
  176.   lua_pushnumber(L, dmax);
  177.   return 1;
  178. }
  179.  
  180.  
  181. static int math_random (lua_State *L) {
  182.   /* the `%' avoids the (rare) case of r==1, and is needed also because on
  183.      some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */
  184.   lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;
  185.   switch (lua_gettop(L)) {  /* check number of arguments */
  186.     case 0: {  /* no arguments */
  187.       lua_pushnumber(L, r);  /* Number between 0 and 1 */
  188.       break;
  189.     }
  190.     case 1: {  /* only upper limit */
  191.       int u = luaL_checkint(L, 1);
  192.       luaL_argcheck(L, 1<=u, 1, "interval is empty");
  193.       lua_pushnumber(L, floor(r*u)+1);  /* int between 1 and `u' */
  194.       break;
  195.     }
  196.     case 2: {  /* lower and upper limits */
  197.       int l = luaL_checkint(L, 1);
  198.       int u = luaL_checkint(L, 2);
  199.       luaL_argcheck(L, l<=u, 2, "interval is empty");
  200.       lua_pushnumber(L, floor(r*(u-l+1))+l);  /* int between `l' and `u' */
  201.       break;
  202.     }
  203.     default: return luaL_error(L, "wrong number of arguments");
  204.   }
  205.   return 1;
  206. }
  207.  
  208.  
  209. static int math_randomseed (lua_State *L) {
  210.   srand(luaL_checkint(L, 1));
  211.   return 0;
  212. }
  213.  
  214.  
  215. static const luaL_Reg mathlib[] = {
  216.   {"abs",   math_abs},
  217.   {"acos",  math_acos},
  218.   {"asin",  math_asin},
  219.   {"atan2", math_atan2},
  220.   {"atan",  math_atan},
  221.   {"ceil",  math_ceil},
  222.   {"cosh",   math_cosh},
  223.   {"cos",   math_cos},
  224.   {"deg",   math_deg},
  225.   {"exp",   math_exp},
  226.   {"floor", math_floor},
  227.   {"fmod",   math_fmod},
  228.   {"frexp", math_frexp},
  229.   {"ldexp", math_ldexp},
  230.   {"log10", math_log10},
  231.   {"log",   math_log},
  232.   {"max",   math_max},
  233.   {"min",   math_min},
  234.   {"modf",   math_modf},
  235.   {"pow",   math_pow},
  236.   {"rad",   math_rad},
  237.   {"random",     math_random},
  238.   {"randomseed", math_randomseed},
  239.   {"sinh",   math_sinh},
  240.   {"sin",   math_sin},
  241.   {"sqrt",  math_sqrt},
  242.   {"tanh",   math_tanh},
  243.   {"tan",   math_tan},
  244.   {NULL, NULL}
  245. };
  246.  
  247.  
  248. /*
  249. ** Open math library
  250. */
  251. LUALIB_API int luaopen_math (lua_State *L) {
  252.   luaL_register(L, LUA_MATHLIBNAME, mathlib);
  253.   lua_pushnumber(L, PI);
  254.   lua_setfield(L, -2, "pi");
  255.   lua_pushnumber(L, HUGE_VAL);
  256.   lua_setfield(L, -2, "huge");
  257. #if defined(LUA_COMPAT_MOD)
  258.   lua_getfield(L, -1, "fmod");
  259.   lua_setfield(L, -2, "mod");
  260. #endif
  261.   return 1;
  262. }
  263.  
  264.