immunio 0.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +234 -0
  3. data/README.md +147 -0
  4. data/bin/immunio +5 -0
  5. data/lib/immunio.rb +29 -0
  6. data/lib/immunio/agent.rb +260 -0
  7. data/lib/immunio/authentication.rb +96 -0
  8. data/lib/immunio/blocked_app.rb +38 -0
  9. data/lib/immunio/channel.rb +432 -0
  10. data/lib/immunio/cli.rb +39 -0
  11. data/lib/immunio/context.rb +114 -0
  12. data/lib/immunio/errors.rb +43 -0
  13. data/lib/immunio/immunio_ca.crt +45 -0
  14. data/lib/immunio/logger.rb +87 -0
  15. data/lib/immunio/plugins/action_dispatch.rb +45 -0
  16. data/lib/immunio/plugins/action_view.rb +431 -0
  17. data/lib/immunio/plugins/active_record.rb +707 -0
  18. data/lib/immunio/plugins/active_record_relation.rb +370 -0
  19. data/lib/immunio/plugins/authlogic.rb +80 -0
  20. data/lib/immunio/plugins/csrf.rb +24 -0
  21. data/lib/immunio/plugins/devise.rb +40 -0
  22. data/lib/immunio/plugins/environment_reporter.rb +69 -0
  23. data/lib/immunio/plugins/eval.rb +51 -0
  24. data/lib/immunio/plugins/exception_handler.rb +55 -0
  25. data/lib/immunio/plugins/gems_tracker.rb +5 -0
  26. data/lib/immunio/plugins/haml.rb +36 -0
  27. data/lib/immunio/plugins/http_finisher.rb +50 -0
  28. data/lib/immunio/plugins/http_tracker.rb +203 -0
  29. data/lib/immunio/plugins/io.rb +96 -0
  30. data/lib/immunio/plugins/redirect.rb +42 -0
  31. data/lib/immunio/plugins/warden.rb +66 -0
  32. data/lib/immunio/processor.rb +234 -0
  33. data/lib/immunio/rails.rb +26 -0
  34. data/lib/immunio/request.rb +139 -0
  35. data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
  36. data/lib/immunio/rufus_lua_ext/state.rb +157 -0
  37. data/lib/immunio/rufus_lua_ext/table.rb +137 -0
  38. data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
  39. data/lib/immunio/version.rb +5 -0
  40. data/lib/immunio/vm.rb +291 -0
  41. data/lua-hooks/ext/all.c +78 -0
  42. data/lua-hooks/ext/bitop/README +22 -0
  43. data/lua-hooks/ext/bitop/bit.c +189 -0
  44. data/lua-hooks/ext/extconf.rb +38 -0
  45. data/lua-hooks/ext/libinjection/COPYING +37 -0
  46. data/lua-hooks/ext/libinjection/libinjection.h +65 -0
  47. data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
  48. data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
  49. data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
  50. data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
  51. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
  52. data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
  53. data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
  54. data/lua-hooks/ext/libinjection/lualib.c +109 -0
  55. data/lua-hooks/ext/lpeg/HISTORY +90 -0
  56. data/lua-hooks/ext/lpeg/lpcap.c +537 -0
  57. data/lua-hooks/ext/lpeg/lpcap.h +43 -0
  58. data/lua-hooks/ext/lpeg/lpcode.c +986 -0
  59. data/lua-hooks/ext/lpeg/lpcode.h +34 -0
  60. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  61. data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
  62. data/lua-hooks/ext/lpeg/lpprint.c +244 -0
  63. data/lua-hooks/ext/lpeg/lpprint.h +35 -0
  64. data/lua-hooks/ext/lpeg/lptree.c +1238 -0
  65. data/lua-hooks/ext/lpeg/lptree.h +77 -0
  66. data/lua-hooks/ext/lpeg/lptypes.h +149 -0
  67. data/lua-hooks/ext/lpeg/lpvm.c +355 -0
  68. data/lua-hooks/ext/lpeg/lpvm.h +58 -0
  69. data/lua-hooks/ext/lpeg/makefile +55 -0
  70. data/lua-hooks/ext/lpeg/re.html +498 -0
  71. data/lua-hooks/ext/lpeg/test.lua +1409 -0
  72. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
  73. data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
  74. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
  75. data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
  76. data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
  77. data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
  78. data/lua-hooks/ext/lua-snapshot/README.md +18 -0
  79. data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
  80. data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
  81. data/lua-hooks/ext/lua/COPYRIGHT +34 -0
  82. data/lua-hooks/ext/lua/lapi.c +1087 -0
  83. data/lua-hooks/ext/lua/lapi.h +16 -0
  84. data/lua-hooks/ext/lua/lauxlib.c +652 -0
  85. data/lua-hooks/ext/lua/lauxlib.h +174 -0
  86. data/lua-hooks/ext/lua/lbaselib.c +659 -0
  87. data/lua-hooks/ext/lua/lcode.c +831 -0
  88. data/lua-hooks/ext/lua/lcode.h +76 -0
  89. data/lua-hooks/ext/lua/ldblib.c +398 -0
  90. data/lua-hooks/ext/lua/ldebug.c +638 -0
  91. data/lua-hooks/ext/lua/ldebug.h +33 -0
  92. data/lua-hooks/ext/lua/ldo.c +519 -0
  93. data/lua-hooks/ext/lua/ldo.h +57 -0
  94. data/lua-hooks/ext/lua/ldump.c +164 -0
  95. data/lua-hooks/ext/lua/lfunc.c +174 -0
  96. data/lua-hooks/ext/lua/lfunc.h +34 -0
  97. data/lua-hooks/ext/lua/lgc.c +710 -0
  98. data/lua-hooks/ext/lua/lgc.h +110 -0
  99. data/lua-hooks/ext/lua/linit.c +38 -0
  100. data/lua-hooks/ext/lua/liolib.c +556 -0
  101. data/lua-hooks/ext/lua/llex.c +463 -0
  102. data/lua-hooks/ext/lua/llex.h +81 -0
  103. data/lua-hooks/ext/lua/llimits.h +128 -0
  104. data/lua-hooks/ext/lua/lmathlib.c +263 -0
  105. data/lua-hooks/ext/lua/lmem.c +86 -0
  106. data/lua-hooks/ext/lua/lmem.h +49 -0
  107. data/lua-hooks/ext/lua/loadlib.c +705 -0
  108. data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
  109. data/lua-hooks/ext/lua/lobject.c +214 -0
  110. data/lua-hooks/ext/lua/lobject.h +381 -0
  111. data/lua-hooks/ext/lua/lopcodes.c +102 -0
  112. data/lua-hooks/ext/lua/lopcodes.h +268 -0
  113. data/lua-hooks/ext/lua/loslib.c +243 -0
  114. data/lua-hooks/ext/lua/lparser.c +1339 -0
  115. data/lua-hooks/ext/lua/lparser.h +82 -0
  116. data/lua-hooks/ext/lua/lstate.c +214 -0
  117. data/lua-hooks/ext/lua/lstate.h +169 -0
  118. data/lua-hooks/ext/lua/lstring.c +111 -0
  119. data/lua-hooks/ext/lua/lstring.h +31 -0
  120. data/lua-hooks/ext/lua/lstrlib.c +871 -0
  121. data/lua-hooks/ext/lua/ltable.c +588 -0
  122. data/lua-hooks/ext/lua/ltable.h +40 -0
  123. data/lua-hooks/ext/lua/ltablib.c +287 -0
  124. data/lua-hooks/ext/lua/ltm.c +75 -0
  125. data/lua-hooks/ext/lua/ltm.h +54 -0
  126. data/lua-hooks/ext/lua/lua.c +392 -0
  127. data/lua-hooks/ext/lua/lua.def +131 -0
  128. data/lua-hooks/ext/lua/lua.h +388 -0
  129. data/lua-hooks/ext/lua/lua.rc +28 -0
  130. data/lua-hooks/ext/lua/lua_dll.rc +26 -0
  131. data/lua-hooks/ext/lua/luac.c +200 -0
  132. data/lua-hooks/ext/lua/luac.rc +1 -0
  133. data/lua-hooks/ext/lua/luaconf.h +763 -0
  134. data/lua-hooks/ext/lua/luaconf.h.in +724 -0
  135. data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
  136. data/lua-hooks/ext/lua/lualib.h +53 -0
  137. data/lua-hooks/ext/lua/lundump.c +227 -0
  138. data/lua-hooks/ext/lua/lundump.h +36 -0
  139. data/lua-hooks/ext/lua/lvm.c +767 -0
  140. data/lua-hooks/ext/lua/lvm.h +36 -0
  141. data/lua-hooks/ext/lua/lzio.c +82 -0
  142. data/lua-hooks/ext/lua/lzio.h +67 -0
  143. data/lua-hooks/ext/lua/print.c +227 -0
  144. data/lua-hooks/ext/luautf8/README.md +152 -0
  145. data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
  146. data/lua-hooks/ext/luautf8/unidata.h +3064 -0
  147. data/lua-hooks/lib/boot.lua +254 -0
  148. data/lua-hooks/lib/encode.lua +4 -0
  149. data/lua-hooks/lib/lexers/LICENSE +21 -0
  150. data/lua-hooks/lib/lexers/bash.lua +134 -0
  151. data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
  152. data/lua-hooks/lib/lexers/css.lua +216 -0
  153. data/lua-hooks/lib/lexers/html.lua +106 -0
  154. data/lua-hooks/lib/lexers/javascript.lua +68 -0
  155. data/lua-hooks/lib/lexers/lexer.lua +1575 -0
  156. data/lua-hooks/lib/lexers/markers.lua +33 -0
  157. metadata +308 -0
@@ -0,0 +1,81 @@
1
+ /*
2
+ ** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Lexical Analyzer
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef llex_h
8
+ #define llex_h
9
+
10
+ #include "lobject.h"
11
+ #include "lzio.h"
12
+
13
+
14
+ #define FIRST_RESERVED 257
15
+
16
+ /* maximum length of a reserved word */
17
+ #define TOKEN_LEN (sizeof("function")/sizeof(char))
18
+
19
+
20
+ /*
21
+ * WARNING: if you change the order of this enumeration,
22
+ * grep "ORDER RESERVED"
23
+ */
24
+ enum RESERVED {
25
+ /* terminal symbols denoted by reserved words */
26
+ TK_AND = FIRST_RESERVED, TK_BREAK,
27
+ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
28
+ TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
29
+ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
30
+ /* other terminal symbols */
31
+ TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,
32
+ TK_NAME, TK_STRING, TK_EOS
33
+ };
34
+
35
+ /* number of reserved words */
36
+ #define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1))
37
+
38
+
39
+ /* array with token `names' */
40
+ LUAI_DATA const char *const luaX_tokens [];
41
+
42
+
43
+ typedef union {
44
+ lua_Number r;
45
+ TString *ts;
46
+ } SemInfo; /* semantics information */
47
+
48
+
49
+ typedef struct Token {
50
+ int token;
51
+ SemInfo seminfo;
52
+ } Token;
53
+
54
+
55
+ typedef struct LexState {
56
+ int current; /* current character (charint) */
57
+ int linenumber; /* input line counter */
58
+ int lastline; /* line of last token `consumed' */
59
+ Token t; /* current token */
60
+ Token lookahead; /* look ahead token */
61
+ struct FuncState *fs; /* `FuncState' is private to the parser */
62
+ struct lua_State *L;
63
+ ZIO *z; /* input stream */
64
+ Mbuffer *buff; /* buffer for tokens */
65
+ TString *source; /* current source name */
66
+ char decpoint; /* locale decimal point */
67
+ } LexState;
68
+
69
+
70
+ LUAI_FUNC void luaX_init (lua_State *L);
71
+ LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,
72
+ TString *source);
73
+ LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);
74
+ LUAI_FUNC void luaX_next (LexState *ls);
75
+ LUAI_FUNC void luaX_lookahead (LexState *ls);
76
+ LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token);
77
+ LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s);
78
+ LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);
79
+
80
+
81
+ #endif
@@ -0,0 +1,128 @@
1
+ /*
2
+ ** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Limits, basic types, and some other `installation-dependent' definitions
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef llimits_h
8
+ #define llimits_h
9
+
10
+
11
+ #include <limits.h>
12
+ #include <stddef.h>
13
+
14
+
15
+ #include "lua.h"
16
+
17
+
18
+ typedef LUAI_UINT32 lu_int32;
19
+
20
+ typedef LUAI_UMEM lu_mem;
21
+
22
+ typedef LUAI_MEM l_mem;
23
+
24
+
25
+
26
+ /* chars used as small naturals (so that `char' is reserved for characters) */
27
+ typedef unsigned char lu_byte;
28
+
29
+
30
+ #define MAX_SIZET ((size_t)(~(size_t)0)-2)
31
+
32
+ #define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2)
33
+
34
+
35
+ #define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */
36
+
37
+ /*
38
+ ** conversion of pointer to integer
39
+ ** this is for hashing only; there is no problem if the integer
40
+ ** cannot hold the whole pointer value
41
+ */
42
+ #define IntPoint(p) ((unsigned int)(lu_mem)(p))
43
+
44
+
45
+
46
+ /* type to ensure maximum alignment */
47
+ typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
48
+
49
+
50
+ /* result of a `usual argument conversion' over lua_Number */
51
+ typedef LUAI_UACNUMBER l_uacNumber;
52
+
53
+
54
+ /* internal assertions for in-house debugging */
55
+ #ifdef lua_assert
56
+
57
+ #define check_exp(c,e) (lua_assert(c), (e))
58
+ #define api_check(l,e) lua_assert(e)
59
+
60
+ #else
61
+
62
+ #define lua_assert(c) ((void)0)
63
+ #define check_exp(c,e) (e)
64
+ #define api_check luai_apicheck
65
+
66
+ #endif
67
+
68
+
69
+ #ifndef UNUSED
70
+ #define UNUSED(x) ((void)(x)) /* to avoid warnings */
71
+ #endif
72
+
73
+
74
+ #ifndef cast
75
+ #define cast(t, exp) ((t)(exp))
76
+ #endif
77
+
78
+ #define cast_byte(i) cast(lu_byte, (i))
79
+ #define cast_num(i) cast(lua_Number, (i))
80
+ #define cast_int(i) cast(int, (i))
81
+
82
+
83
+
84
+ /*
85
+ ** type for virtual-machine instructions
86
+ ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
87
+ */
88
+ typedef lu_int32 Instruction;
89
+
90
+
91
+
92
+ /* maximum stack for a Lua function */
93
+ #define MAXSTACK 250
94
+
95
+
96
+
97
+ /* minimum size for the string table (must be power of 2) */
98
+ #ifndef MINSTRTABSIZE
99
+ #define MINSTRTABSIZE 32
100
+ #endif
101
+
102
+
103
+ /* minimum size for string buffer */
104
+ #ifndef LUA_MINBUFFER
105
+ #define LUA_MINBUFFER 32
106
+ #endif
107
+
108
+
109
+ #ifndef lua_lock
110
+ #define lua_lock(L) ((void) 0)
111
+ #define lua_unlock(L) ((void) 0)
112
+ #endif
113
+
114
+ #ifndef luai_threadyield
115
+ #define luai_threadyield(L) {lua_unlock(L); lua_lock(L);}
116
+ #endif
117
+
118
+
119
+ /*
120
+ ** macro to control inclusion of some hard tests on stack reallocation
121
+ */
122
+ #ifndef HARDSTACKTESTS
123
+ #define condhardstacktests(x) ((void)0)
124
+ #else
125
+ #define condhardstacktests(x) x
126
+ #endif
127
+
128
+ #endif
@@ -0,0 +1,263 @@
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
+