/*
** mathlib.c
** Mathematics library to LUA
*/

char *rcs_mathlib="$Id: mathlib.c,v 1.25 1997/06/19 18:03:04 roberto Exp roberto $";

#include <stdlib.h>
#include <math.h>

#include "lualib.h"
#include "auxlib.h"
#include "lua.h"

#ifndef PI
#define PI          3.14159265358979323846
#endif
#define TODEGREE(a) ((a)*180.0/PI)
#define TORAD(a)    ((a)*PI/180.0)

static void math_abs (void)
{
 double d = luaL_check_number(1); 
 if (d < 0) d = -d;
 lua_pushnumber (d);
}


static void math_sin (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (sin(TORAD(d)));
}



static void math_cos (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (cos(TORAD(d)));
}



static void math_tan (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (tan(TORAD(d)));
}


static void math_asin (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (TODEGREE(asin(d)));
}


static void math_acos (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (TODEGREE(acos(d)));
}


static void math_atan (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (TODEGREE(atan(d)));
}


static void math_atan2 (void)
{
 double d1 = luaL_check_number(1);
 double d2 = luaL_check_number(2);
 lua_pushnumber (TODEGREE(atan2(d1, d2)));
}


static void math_ceil (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (ceil(d));
}


static void math_floor (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (floor(d));
}

static void math_mod (void)
{
  float x = luaL_check_number(1);
  float y = luaL_check_number(2);
  lua_pushnumber(fmod(x, y));
}


static void math_sqrt (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (sqrt(d));
}


static void math_pow (void)
{
  double d1 = luaL_check_number(1);
  double d2 = luaL_check_number(2);
  lua_pushnumber(pow(d1,d2));
}

static void math_min (void)
{
 int i=1;
 double dmin = luaL_check_number(i);
 while (lua_getparam(++i) != LUA_NOOBJECT)
 {
  double d = luaL_check_number(i);
  if (d < dmin) dmin = d;
 }
 lua_pushnumber (dmin);
}

static void math_max (void)
{
 int i=1;
 double dmax = luaL_check_number(i);
 while (lua_getparam(++i) != LUA_NOOBJECT)
 {
  double d = luaL_check_number(i);
  if (d > dmax) dmax = d;
 }
 lua_pushnumber (dmax);
}

static void math_log (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (log(d));
}


static void math_log10 (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (log10(d));
}


static void math_exp (void)
{
 double d = luaL_check_number(1);
 lua_pushnumber (exp(d));
}

static void math_deg (void)
{
 float d = luaL_check_number(1);
 lua_pushnumber (d*180./PI);
}

static void math_rad (void)
{
 float d = luaL_check_number(1);
 lua_pushnumber (d/180.*PI);
}

static void math_random (void)
{
  double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX;
  if (lua_getparam(1) == LUA_NOOBJECT)
    lua_pushnumber(r);
  else
    lua_pushnumber((int)(r*luaL_check_number(1)) + 1);
}

static void math_randomseed (void)
{
  srand(luaL_check_number(1));
}


static struct luaL_reg mathlib[] = {
{"abs",   math_abs},
{"sin",   math_sin},
{"cos",   math_cos},
{"tan",   math_tan},
{"asin",  math_asin},
{"acos",  math_acos},
{"atan",  math_atan},
{"atan2",  math_atan2},
{"ceil",  math_ceil},
{"floor", math_floor},
{"mod",   math_mod},
{"sqrt",  math_sqrt},
{"min",   math_min},
{"max",   math_max},
{"log",   math_log},
{"log10", math_log10},
{"exp",   math_exp},
{"deg",   math_deg},
{"rad",   math_rad},
{"random",     math_random},
{"randomseed", math_randomseed}
};

/*
** Open math library
*/
void mathlib_open (void)
{
  luaL_openlib(mathlib, (sizeof(mathlib)/sizeof(mathlib[0])));
  lua_pushcfunction(math_pow);
  lua_pushnumber(0);  /* to get its tag */
  lua_settagmethod(lua_tag(lua_pop()), "pow");
}

