immunio 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +234 -0
- data/README.md +147 -0
- data/bin/immunio +5 -0
- data/lib/immunio.rb +29 -0
- data/lib/immunio/agent.rb +260 -0
- data/lib/immunio/authentication.rb +96 -0
- data/lib/immunio/blocked_app.rb +38 -0
- data/lib/immunio/channel.rb +432 -0
- data/lib/immunio/cli.rb +39 -0
- data/lib/immunio/context.rb +114 -0
- data/lib/immunio/errors.rb +43 -0
- data/lib/immunio/immunio_ca.crt +45 -0
- data/lib/immunio/logger.rb +87 -0
- data/lib/immunio/plugins/action_dispatch.rb +45 -0
- data/lib/immunio/plugins/action_view.rb +431 -0
- data/lib/immunio/plugins/active_record.rb +707 -0
- data/lib/immunio/plugins/active_record_relation.rb +370 -0
- data/lib/immunio/plugins/authlogic.rb +80 -0
- data/lib/immunio/plugins/csrf.rb +24 -0
- data/lib/immunio/plugins/devise.rb +40 -0
- data/lib/immunio/plugins/environment_reporter.rb +69 -0
- data/lib/immunio/plugins/eval.rb +51 -0
- data/lib/immunio/plugins/exception_handler.rb +55 -0
- data/lib/immunio/plugins/gems_tracker.rb +5 -0
- data/lib/immunio/plugins/haml.rb +36 -0
- data/lib/immunio/plugins/http_finisher.rb +50 -0
- data/lib/immunio/plugins/http_tracker.rb +203 -0
- data/lib/immunio/plugins/io.rb +96 -0
- data/lib/immunio/plugins/redirect.rb +42 -0
- data/lib/immunio/plugins/warden.rb +66 -0
- data/lib/immunio/processor.rb +234 -0
- data/lib/immunio/rails.rb +26 -0
- data/lib/immunio/request.rb +139 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
- data/lib/immunio/rufus_lua_ext/state.rb +157 -0
- data/lib/immunio/rufus_lua_ext/table.rb +137 -0
- data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
- data/lib/immunio/version.rb +5 -0
- data/lib/immunio/vm.rb +291 -0
- data/lua-hooks/ext/all.c +78 -0
- data/lua-hooks/ext/bitop/README +22 -0
- data/lua-hooks/ext/bitop/bit.c +189 -0
- data/lua-hooks/ext/extconf.rb +38 -0
- data/lua-hooks/ext/libinjection/COPYING +37 -0
- data/lua-hooks/ext/libinjection/libinjection.h +65 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
- data/lua-hooks/ext/libinjection/lualib.c +109 -0
- data/lua-hooks/ext/lpeg/HISTORY +90 -0
- data/lua-hooks/ext/lpeg/lpcap.c +537 -0
- data/lua-hooks/ext/lpeg/lpcap.h +43 -0
- data/lua-hooks/ext/lpeg/lpcode.c +986 -0
- data/lua-hooks/ext/lpeg/lpcode.h +34 -0
- data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
- data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
- data/lua-hooks/ext/lpeg/lpprint.c +244 -0
- data/lua-hooks/ext/lpeg/lpprint.h +35 -0
- data/lua-hooks/ext/lpeg/lptree.c +1238 -0
- data/lua-hooks/ext/lpeg/lptree.h +77 -0
- data/lua-hooks/ext/lpeg/lptypes.h +149 -0
- data/lua-hooks/ext/lpeg/lpvm.c +355 -0
- data/lua-hooks/ext/lpeg/lpvm.h +58 -0
- data/lua-hooks/ext/lpeg/makefile +55 -0
- data/lua-hooks/ext/lpeg/re.html +498 -0
- data/lua-hooks/ext/lpeg/test.lua +1409 -0
- data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
- data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
- data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
- data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
- data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
- data/lua-hooks/ext/lua-snapshot/README.md +18 -0
- data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
- data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
- data/lua-hooks/ext/lua/COPYRIGHT +34 -0
- data/lua-hooks/ext/lua/lapi.c +1087 -0
- data/lua-hooks/ext/lua/lapi.h +16 -0
- data/lua-hooks/ext/lua/lauxlib.c +652 -0
- data/lua-hooks/ext/lua/lauxlib.h +174 -0
- data/lua-hooks/ext/lua/lbaselib.c +659 -0
- data/lua-hooks/ext/lua/lcode.c +831 -0
- data/lua-hooks/ext/lua/lcode.h +76 -0
- data/lua-hooks/ext/lua/ldblib.c +398 -0
- data/lua-hooks/ext/lua/ldebug.c +638 -0
- data/lua-hooks/ext/lua/ldebug.h +33 -0
- data/lua-hooks/ext/lua/ldo.c +519 -0
- data/lua-hooks/ext/lua/ldo.h +57 -0
- data/lua-hooks/ext/lua/ldump.c +164 -0
- data/lua-hooks/ext/lua/lfunc.c +174 -0
- data/lua-hooks/ext/lua/lfunc.h +34 -0
- data/lua-hooks/ext/lua/lgc.c +710 -0
- data/lua-hooks/ext/lua/lgc.h +110 -0
- data/lua-hooks/ext/lua/linit.c +38 -0
- data/lua-hooks/ext/lua/liolib.c +556 -0
- data/lua-hooks/ext/lua/llex.c +463 -0
- data/lua-hooks/ext/lua/llex.h +81 -0
- data/lua-hooks/ext/lua/llimits.h +128 -0
- data/lua-hooks/ext/lua/lmathlib.c +263 -0
- data/lua-hooks/ext/lua/lmem.c +86 -0
- data/lua-hooks/ext/lua/lmem.h +49 -0
- data/lua-hooks/ext/lua/loadlib.c +705 -0
- data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
- data/lua-hooks/ext/lua/lobject.c +214 -0
- data/lua-hooks/ext/lua/lobject.h +381 -0
- data/lua-hooks/ext/lua/lopcodes.c +102 -0
- data/lua-hooks/ext/lua/lopcodes.h +268 -0
- data/lua-hooks/ext/lua/loslib.c +243 -0
- data/lua-hooks/ext/lua/lparser.c +1339 -0
- data/lua-hooks/ext/lua/lparser.h +82 -0
- data/lua-hooks/ext/lua/lstate.c +214 -0
- data/lua-hooks/ext/lua/lstate.h +169 -0
- data/lua-hooks/ext/lua/lstring.c +111 -0
- data/lua-hooks/ext/lua/lstring.h +31 -0
- data/lua-hooks/ext/lua/lstrlib.c +871 -0
- data/lua-hooks/ext/lua/ltable.c +588 -0
- data/lua-hooks/ext/lua/ltable.h +40 -0
- data/lua-hooks/ext/lua/ltablib.c +287 -0
- data/lua-hooks/ext/lua/ltm.c +75 -0
- data/lua-hooks/ext/lua/ltm.h +54 -0
- data/lua-hooks/ext/lua/lua.c +392 -0
- data/lua-hooks/ext/lua/lua.def +131 -0
- data/lua-hooks/ext/lua/lua.h +388 -0
- data/lua-hooks/ext/lua/lua.rc +28 -0
- data/lua-hooks/ext/lua/lua_dll.rc +26 -0
- data/lua-hooks/ext/lua/luac.c +200 -0
- data/lua-hooks/ext/lua/luac.rc +1 -0
- data/lua-hooks/ext/lua/luaconf.h +763 -0
- data/lua-hooks/ext/lua/luaconf.h.in +724 -0
- data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
- data/lua-hooks/ext/lua/lualib.h +53 -0
- data/lua-hooks/ext/lua/lundump.c +227 -0
- data/lua-hooks/ext/lua/lundump.h +36 -0
- data/lua-hooks/ext/lua/lvm.c +767 -0
- data/lua-hooks/ext/lua/lvm.h +36 -0
- data/lua-hooks/ext/lua/lzio.c +82 -0
- data/lua-hooks/ext/lua/lzio.h +67 -0
- data/lua-hooks/ext/lua/print.c +227 -0
- data/lua-hooks/ext/luautf8/README.md +152 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
- data/lua-hooks/ext/luautf8/unidata.h +3064 -0
- data/lua-hooks/lib/boot.lua +254 -0
- data/lua-hooks/lib/encode.lua +4 -0
- data/lua-hooks/lib/lexers/LICENSE +21 -0
- data/lua-hooks/lib/lexers/bash.lua +134 -0
- data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
- data/lua-hooks/lib/lexers/css.lua +216 -0
- data/lua-hooks/lib/lexers/html.lua +106 -0
- data/lua-hooks/lib/lexers/javascript.lua +68 -0
- data/lua-hooks/lib/lexers/lexer.lua +1575 -0
- data/lua-hooks/lib/lexers/markers.lua +33 -0
- metadata +308 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $
|
|
3
|
+
** Lua tables (hash)
|
|
4
|
+
** See Copyright Notice in lua.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#ifndef ltable_h
|
|
8
|
+
#define ltable_h
|
|
9
|
+
|
|
10
|
+
#include "lobject.h"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
#define gnode(t,i) (&(t)->node[i])
|
|
14
|
+
#define gkey(n) (&(n)->i_key.nk)
|
|
15
|
+
#define gval(n) (&(n)->i_val)
|
|
16
|
+
#define gnext(n) ((n)->i_key.nk.next)
|
|
17
|
+
|
|
18
|
+
#define key2tval(n) (&(n)->i_key.tvk)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);
|
|
22
|
+
LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);
|
|
23
|
+
LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
|
|
24
|
+
LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);
|
|
25
|
+
LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
|
|
26
|
+
LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
|
|
27
|
+
LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);
|
|
28
|
+
LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);
|
|
29
|
+
LUAI_FUNC void luaH_free (lua_State *L, Table *t);
|
|
30
|
+
LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
|
|
31
|
+
LUAI_FUNC int luaH_getn (Table *t);
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#if defined(LUA_DEBUG)
|
|
35
|
+
LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
|
|
36
|
+
LUAI_FUNC int luaH_isdummy (Node *n);
|
|
37
|
+
#endif
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#endif
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $
|
|
3
|
+
** Library for Table Manipulation
|
|
4
|
+
** See Copyright Notice in lua.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
#include <stddef.h>
|
|
9
|
+
|
|
10
|
+
#define ltablib_c
|
|
11
|
+
#define LUA_LIB
|
|
12
|
+
|
|
13
|
+
#include "lua.h"
|
|
14
|
+
|
|
15
|
+
#include "lauxlib.h"
|
|
16
|
+
#include "lualib.h"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
static int foreachi (lua_State *L) {
|
|
23
|
+
int i;
|
|
24
|
+
int n = aux_getn(L, 1);
|
|
25
|
+
luaL_checktype(L, 2, LUA_TFUNCTION);
|
|
26
|
+
for (i=1; i <= n; i++) {
|
|
27
|
+
lua_pushvalue(L, 2); /* function */
|
|
28
|
+
lua_pushinteger(L, i); /* 1st argument */
|
|
29
|
+
lua_rawgeti(L, 1, i); /* 2nd argument */
|
|
30
|
+
lua_call(L, 2, 1);
|
|
31
|
+
if (!lua_isnil(L, -1))
|
|
32
|
+
return 1;
|
|
33
|
+
lua_pop(L, 1); /* remove nil result */
|
|
34
|
+
}
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
static int foreach (lua_State *L) {
|
|
40
|
+
luaL_checktype(L, 1, LUA_TTABLE);
|
|
41
|
+
luaL_checktype(L, 2, LUA_TFUNCTION);
|
|
42
|
+
lua_pushnil(L); /* first key */
|
|
43
|
+
while (lua_next(L, 1)) {
|
|
44
|
+
lua_pushvalue(L, 2); /* function */
|
|
45
|
+
lua_pushvalue(L, -3); /* key */
|
|
46
|
+
lua_pushvalue(L, -3); /* value */
|
|
47
|
+
lua_call(L, 2, 1);
|
|
48
|
+
if (!lua_isnil(L, -1))
|
|
49
|
+
return 1;
|
|
50
|
+
lua_pop(L, 2); /* remove value and result */
|
|
51
|
+
}
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
static int maxn (lua_State *L) {
|
|
57
|
+
lua_Number max = 0;
|
|
58
|
+
luaL_checktype(L, 1, LUA_TTABLE);
|
|
59
|
+
lua_pushnil(L); /* first key */
|
|
60
|
+
while (lua_next(L, 1)) {
|
|
61
|
+
lua_pop(L, 1); /* remove value */
|
|
62
|
+
if (lua_type(L, -1) == LUA_TNUMBER) {
|
|
63
|
+
lua_Number v = lua_tonumber(L, -1);
|
|
64
|
+
if (v > max) max = v;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
lua_pushnumber(L, max);
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
static int getn (lua_State *L) {
|
|
73
|
+
lua_pushinteger(L, aux_getn(L, 1));
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
static int setn (lua_State *L) {
|
|
79
|
+
luaL_checktype(L, 1, LUA_TTABLE);
|
|
80
|
+
#ifndef luaL_setn
|
|
81
|
+
luaL_setn(L, 1, luaL_checkint(L, 2));
|
|
82
|
+
#else
|
|
83
|
+
luaL_error(L, LUA_QL("setn") " is obsolete");
|
|
84
|
+
#endif
|
|
85
|
+
lua_pushvalue(L, 1);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
static int tinsert (lua_State *L) {
|
|
91
|
+
int e = aux_getn(L, 1) + 1; /* first empty element */
|
|
92
|
+
int pos; /* where to insert new element */
|
|
93
|
+
switch (lua_gettop(L)) {
|
|
94
|
+
case 2: { /* called with only 2 arguments */
|
|
95
|
+
pos = e; /* insert new element at the end */
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case 3: {
|
|
99
|
+
int i;
|
|
100
|
+
pos = luaL_checkint(L, 2); /* 2nd argument is the position */
|
|
101
|
+
if (pos > e) e = pos; /* `grow' array if necessary */
|
|
102
|
+
for (i = e; i > pos; i--) { /* move up elements */
|
|
103
|
+
lua_rawgeti(L, 1, i-1);
|
|
104
|
+
lua_rawseti(L, 1, i); /* t[i] = t[i-1] */
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
default: {
|
|
109
|
+
return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
luaL_setn(L, 1, e); /* new size */
|
|
113
|
+
lua_rawseti(L, 1, pos); /* t[pos] = v */
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
static int tremove (lua_State *L) {
|
|
119
|
+
int e = aux_getn(L, 1);
|
|
120
|
+
int pos = luaL_optint(L, 2, e);
|
|
121
|
+
if (!(1 <= pos && pos <= e)) /* position is outside bounds? */
|
|
122
|
+
return 0; /* nothing to remove */
|
|
123
|
+
luaL_setn(L, 1, e - 1); /* t.n = n-1 */
|
|
124
|
+
lua_rawgeti(L, 1, pos); /* result = t[pos] */
|
|
125
|
+
for ( ;pos<e; pos++) {
|
|
126
|
+
lua_rawgeti(L, 1, pos+1);
|
|
127
|
+
lua_rawseti(L, 1, pos); /* t[pos] = t[pos+1] */
|
|
128
|
+
}
|
|
129
|
+
lua_pushnil(L);
|
|
130
|
+
lua_rawseti(L, 1, e); /* t[e] = nil */
|
|
131
|
+
return 1;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
static void addfield (lua_State *L, luaL_Buffer *b, int i) {
|
|
136
|
+
lua_rawgeti(L, 1, i);
|
|
137
|
+
if (!lua_isstring(L, -1))
|
|
138
|
+
luaL_error(L, "invalid value (%s) at index %d in table for "
|
|
139
|
+
LUA_QL("concat"), luaL_typename(L, -1), i);
|
|
140
|
+
luaL_addvalue(b);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
static int tconcat (lua_State *L) {
|
|
145
|
+
luaL_Buffer b;
|
|
146
|
+
size_t lsep;
|
|
147
|
+
int i, last;
|
|
148
|
+
const char *sep = luaL_optlstring(L, 2, "", &lsep);
|
|
149
|
+
luaL_checktype(L, 1, LUA_TTABLE);
|
|
150
|
+
i = luaL_optint(L, 3, 1);
|
|
151
|
+
last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
|
|
152
|
+
luaL_buffinit(L, &b);
|
|
153
|
+
for (; i < last; i++) {
|
|
154
|
+
addfield(L, &b, i);
|
|
155
|
+
luaL_addlstring(&b, sep, lsep);
|
|
156
|
+
}
|
|
157
|
+
if (i == last) /* add last value (if interval was not empty) */
|
|
158
|
+
addfield(L, &b, i);
|
|
159
|
+
luaL_pushresult(&b);
|
|
160
|
+
return 1;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
** {======================================================
|
|
167
|
+
** Quicksort
|
|
168
|
+
** (based on `Algorithms in MODULA-3', Robert Sedgewick;
|
|
169
|
+
** Addison-Wesley, 1993.)
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
static void set2 (lua_State *L, int i, int j) {
|
|
174
|
+
lua_rawseti(L, 1, i);
|
|
175
|
+
lua_rawseti(L, 1, j);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static int sort_comp (lua_State *L, int a, int b) {
|
|
179
|
+
if (!lua_isnil(L, 2)) { /* function? */
|
|
180
|
+
int res;
|
|
181
|
+
lua_pushvalue(L, 2);
|
|
182
|
+
lua_pushvalue(L, a-1); /* -1 to compensate function */
|
|
183
|
+
lua_pushvalue(L, b-2); /* -2 to compensate function and `a' */
|
|
184
|
+
lua_call(L, 2, 1);
|
|
185
|
+
res = lua_toboolean(L, -1);
|
|
186
|
+
lua_pop(L, 1);
|
|
187
|
+
return res;
|
|
188
|
+
}
|
|
189
|
+
else /* a < b? */
|
|
190
|
+
return lua_lessthan(L, a, b);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
static void auxsort (lua_State *L, int l, int u) {
|
|
194
|
+
while (l < u) { /* for tail recursion */
|
|
195
|
+
int i, j;
|
|
196
|
+
/* sort elements a[l], a[(l+u)/2] and a[u] */
|
|
197
|
+
lua_rawgeti(L, 1, l);
|
|
198
|
+
lua_rawgeti(L, 1, u);
|
|
199
|
+
if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */
|
|
200
|
+
set2(L, l, u); /* swap a[l] - a[u] */
|
|
201
|
+
else
|
|
202
|
+
lua_pop(L, 2);
|
|
203
|
+
if (u-l == 1) break; /* only 2 elements */
|
|
204
|
+
i = (l+u)/2;
|
|
205
|
+
lua_rawgeti(L, 1, i);
|
|
206
|
+
lua_rawgeti(L, 1, l);
|
|
207
|
+
if (sort_comp(L, -2, -1)) /* a[i]<a[l]? */
|
|
208
|
+
set2(L, i, l);
|
|
209
|
+
else {
|
|
210
|
+
lua_pop(L, 1); /* remove a[l] */
|
|
211
|
+
lua_rawgeti(L, 1, u);
|
|
212
|
+
if (sort_comp(L, -1, -2)) /* a[u]<a[i]? */
|
|
213
|
+
set2(L, i, u);
|
|
214
|
+
else
|
|
215
|
+
lua_pop(L, 2);
|
|
216
|
+
}
|
|
217
|
+
if (u-l == 2) break; /* only 3 elements */
|
|
218
|
+
lua_rawgeti(L, 1, i); /* Pivot */
|
|
219
|
+
lua_pushvalue(L, -1);
|
|
220
|
+
lua_rawgeti(L, 1, u-1);
|
|
221
|
+
set2(L, i, u-1);
|
|
222
|
+
/* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */
|
|
223
|
+
i = l; j = u-1;
|
|
224
|
+
for (;;) { /* invariant: a[l..i] <= P <= a[j..u] */
|
|
225
|
+
/* repeat ++i until a[i] >= P */
|
|
226
|
+
while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {
|
|
227
|
+
if (i>u) luaL_error(L, "invalid order function for sorting");
|
|
228
|
+
lua_pop(L, 1); /* remove a[i] */
|
|
229
|
+
}
|
|
230
|
+
/* repeat --j until a[j] <= P */
|
|
231
|
+
while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {
|
|
232
|
+
if (j<l) luaL_error(L, "invalid order function for sorting");
|
|
233
|
+
lua_pop(L, 1); /* remove a[j] */
|
|
234
|
+
}
|
|
235
|
+
if (j<i) {
|
|
236
|
+
lua_pop(L, 3); /* pop pivot, a[i], a[j] */
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
set2(L, i, j);
|
|
240
|
+
}
|
|
241
|
+
lua_rawgeti(L, 1, u-1);
|
|
242
|
+
lua_rawgeti(L, 1, i);
|
|
243
|
+
set2(L, u-1, i); /* swap pivot (a[u-1]) with a[i] */
|
|
244
|
+
/* a[l..i-1] <= a[i] == P <= a[i+1..u] */
|
|
245
|
+
/* adjust so that smaller half is in [j..i] and larger one in [l..u] */
|
|
246
|
+
if (i-l < u-i) {
|
|
247
|
+
j=l; i=i-1; l=i+2;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
j=i+1; i=u; u=j-2;
|
|
251
|
+
}
|
|
252
|
+
auxsort(L, j, i); /* call recursively the smaller one */
|
|
253
|
+
} /* repeat the routine for the larger one */
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static int sort (lua_State *L) {
|
|
257
|
+
int n = aux_getn(L, 1);
|
|
258
|
+
luaL_checkstack(L, 40, ""); /* assume array is smaller than 2^40 */
|
|
259
|
+
if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */
|
|
260
|
+
luaL_checktype(L, 2, LUA_TFUNCTION);
|
|
261
|
+
lua_settop(L, 2); /* make sure there is two arguments */
|
|
262
|
+
auxsort(L, 1, n);
|
|
263
|
+
return 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* }====================================================== */
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
static const luaL_Reg tab_funcs[] = {
|
|
270
|
+
{"concat", tconcat},
|
|
271
|
+
{"foreach", foreach},
|
|
272
|
+
{"foreachi", foreachi},
|
|
273
|
+
{"getn", getn},
|
|
274
|
+
{"maxn", maxn},
|
|
275
|
+
{"insert", tinsert},
|
|
276
|
+
{"remove", tremove},
|
|
277
|
+
{"setn", setn},
|
|
278
|
+
{"sort", sort},
|
|
279
|
+
{NULL, NULL}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
LUALIB_API int luaopen_table (lua_State *L) {
|
|
284
|
+
luaL_register(L, LUA_TABLIBNAME, tab_funcs);
|
|
285
|
+
return 1;
|
|
286
|
+
}
|
|
287
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
|
|
3
|
+
** Tag methods
|
|
4
|
+
** See Copyright Notice in lua.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
#include <string.h>
|
|
9
|
+
|
|
10
|
+
#define ltm_c
|
|
11
|
+
#define LUA_CORE
|
|
12
|
+
|
|
13
|
+
#include "lua.h"
|
|
14
|
+
|
|
15
|
+
#include "lobject.h"
|
|
16
|
+
#include "lstate.h"
|
|
17
|
+
#include "lstring.h"
|
|
18
|
+
#include "ltable.h"
|
|
19
|
+
#include "ltm.h"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
const char *const luaT_typenames[] = {
|
|
24
|
+
"nil", "boolean", "userdata", "number",
|
|
25
|
+
"string", "table", "function", "userdata", "thread",
|
|
26
|
+
"proto", "upval"
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
void luaT_init (lua_State *L) {
|
|
31
|
+
static const char *const luaT_eventname[] = { /* ORDER TM */
|
|
32
|
+
"__index", "__newindex",
|
|
33
|
+
"__gc", "__mode", "__eq",
|
|
34
|
+
"__add", "__sub", "__mul", "__div", "__mod",
|
|
35
|
+
"__pow", "__unm", "__len", "__lt", "__le",
|
|
36
|
+
"__concat", "__call"
|
|
37
|
+
};
|
|
38
|
+
int i;
|
|
39
|
+
for (i=0; i<TM_N; i++) {
|
|
40
|
+
G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
|
|
41
|
+
luaS_fix(G(L)->tmname[i]); /* never collect these names */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
** function to be used with macro "fasttm": optimized for absence of
|
|
48
|
+
** tag methods
|
|
49
|
+
*/
|
|
50
|
+
const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
|
|
51
|
+
const TValue *tm = luaH_getstr(events, ename);
|
|
52
|
+
lua_assert(event <= TM_EQ);
|
|
53
|
+
if (ttisnil(tm)) { /* no tag method? */
|
|
54
|
+
events->flags |= cast_byte(1u<<event); /* cache this fact */
|
|
55
|
+
return NULL;
|
|
56
|
+
}
|
|
57
|
+
else return tm;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
|
|
62
|
+
Table *mt;
|
|
63
|
+
switch (ttype(o)) {
|
|
64
|
+
case LUA_TTABLE:
|
|
65
|
+
mt = hvalue(o)->metatable;
|
|
66
|
+
break;
|
|
67
|
+
case LUA_TUSERDATA:
|
|
68
|
+
mt = uvalue(o)->metatable;
|
|
69
|
+
break;
|
|
70
|
+
default:
|
|
71
|
+
mt = G(L)->mt[ttype(o)];
|
|
72
|
+
}
|
|
73
|
+
return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);
|
|
74
|
+
}
|
|
75
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $
|
|
3
|
+
** Tag methods
|
|
4
|
+
** See Copyright Notice in lua.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#ifndef ltm_h
|
|
8
|
+
#define ltm_h
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
#include "lobject.h"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* WARNING: if you change the order of this enumeration,
|
|
16
|
+
* grep "ORDER TM"
|
|
17
|
+
*/
|
|
18
|
+
typedef enum {
|
|
19
|
+
TM_INDEX,
|
|
20
|
+
TM_NEWINDEX,
|
|
21
|
+
TM_GC,
|
|
22
|
+
TM_MODE,
|
|
23
|
+
TM_EQ, /* last tag method with `fast' access */
|
|
24
|
+
TM_ADD,
|
|
25
|
+
TM_SUB,
|
|
26
|
+
TM_MUL,
|
|
27
|
+
TM_DIV,
|
|
28
|
+
TM_MOD,
|
|
29
|
+
TM_POW,
|
|
30
|
+
TM_UNM,
|
|
31
|
+
TM_LEN,
|
|
32
|
+
TM_LT,
|
|
33
|
+
TM_LE,
|
|
34
|
+
TM_CONCAT,
|
|
35
|
+
TM_CALL,
|
|
36
|
+
TM_N /* number of elements in the enum */
|
|
37
|
+
} TMS;
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
|
|
42
|
+
((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
|
|
43
|
+
|
|
44
|
+
#define fasttm(l,et,e) gfasttm(G(l), et, e)
|
|
45
|
+
|
|
46
|
+
LUAI_DATA const char *const luaT_typenames[];
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
|
|
50
|
+
LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
|
|
51
|
+
TMS event);
|
|
52
|
+
LUAI_FUNC void luaT_init (lua_State *L);
|
|
53
|
+
|
|
54
|
+
#endif
|