summaryrefslogtreecommitdiff
path: root/src/lua/tolua_lb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/tolua_lb.c')
-rw-r--r--src/lua/tolua_lb.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/lua/tolua_lb.c b/src/lua/tolua_lb.c
new file mode 100644
index 00000000..5fd4c337
--- /dev/null
+++ b/src/lua/tolua_lb.c
@@ -0,0 +1,160 @@
+/* tolua
+** Support code for Lua bindings.
+** Written by Waldemar Celes
+** TeCGraf/PUC-Rio
+** Jul 1998
+** $Id: tolua_lb.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $
+*/
+
+/* This code is free software; you can redistribute it and/or modify it.
+** The software provided hereunder is on an "as is" basis, and
+** the author has no obligation to provide maintenance, support, updates,
+** enhancements, or modifications.
+*/
+
+#include "tolua.h"
+#include "tolua_rg.h"
+#include "tolua_tm.h"
+#include "tolua_tt.h"
+
+
+int tolua_open (lua_State* L)
+{
+ int tolua_tolua_open (lua_State* L);
+ /* check if alread opened */
+ toluaI_getregistry(L,"TOLUA");
+ if (lua_isnil(L,-1))
+ {
+ lua_pushnumber(L,1);
+ toluaI_setregistry(L,"TOLUA");
+ toluaI_tt_init(L);
+ toluaI_tm_init(L);
+ lua_getglobal(L,"foreach");
+ toluaI_setregistry(L,"tolua_orig_foreach");
+ tolua_tolua_open(L); /* opens tolua own binding */
+ }
+ lua_pop(L,1);
+ return 1;
+}
+
+void tolua_using (lua_State* L, int module)
+{
+ toluaI_tm_using(L,module);
+}
+
+void tolua_class (lua_State* L, int derived, int base)
+{
+ int tag = lua_newtag(L); /* new tag of instances of that class */
+ toluaI_tm_setclass(L,derived);
+ toluaI_tm_linstance(L,tag,derived);
+ lua_pushvalue(L,derived);
+ lua_pushstring(L,".base");
+ lua_pushvalue(L,base);
+ lua_rawset(L,-3);
+ lua_pushstring(L,".itag");
+ lua_pushnumber(L,tag);
+ lua_rawset(L,-3);
+ lua_pop(L,1);
+}
+
+void tolua_instance (lua_State* L, int instance, int classobj)
+{
+ int tag;
+ lua_pushvalue(L,classobj);
+ lua_pushstring(L,".itag");
+ lua_gettable(L,-2);
+ tag = (int) lua_tonumber(L,-1);
+ lua_pop(L,2); /* number and table */
+ if (tag==0)
+ tolua_error(L,"unregistered 'classobj' in function 'tolua_instance'.");
+ lua_pushvalue(L,instance);
+ lua_settag(L,tag);
+ lua_pop(L,1);
+}
+
+static int filter (lua_State* L)
+{
+ int n = 1; /* name */
+ int v = 2; /* value */
+ int f = lua_gettop(L); /* function */
+ /* do not pass string fields starting with a dot */
+ if (!lua_isstring(L,n) || *lua_tostring(L,n)!='.')
+ {
+ lua_pushvalue(L,f);
+ lua_pushvalue(L,n);
+ lua_pushvalue(L,v);
+ lua_call(L,2,1);
+ }
+ else
+ lua_pushnil(L);
+ return 1;
+}
+
+void tolua_foreach (lua_State* L, int lo, int f)
+{
+ if (toluaI_tt_isusertype(L,lo))
+ {
+ toluaI_tm_pushmate(L,lo);
+ if (lua_isnil(L,-1))
+ return; /* no field in mate table */
+ else
+ lo = lua_gettop(L);
+ }
+ toluaI_getregistry(L,"tolua_orig_foreach");
+ lua_pushvalue(L,lo);
+ lua_pushvalue(L,f);
+ lua_pushcclosure(L,filter,1);
+ lua_call(L,2,1);
+}
+
+const char* tolua_type (lua_State* L, int lo)
+{
+ return toluaI_tt_getobjtype(L,lo);
+}
+
+int tolua_tag (lua_State* L, char* type)
+{
+ return toluaI_tt_gettag(L,type);
+}
+
+int tolua_base (lua_State* L, int lo)
+{
+ if (toluaI_tt_isusertype(L,lo))
+ {
+ toluaI_tm_pushclass(L,lo);
+ return lua_gettop(L);
+ }
+ else if (lua_istable(L,lo))
+ {
+ lua_pushvalue(L,lo);
+ lua_pushstring(L,".base");
+ lua_rawget(L,-2);
+ return -1;
+ }
+ else
+ return 0;
+}
+
+int tolua_cast (lua_State* L, int lo, char* type)
+{
+ if (lua_isuserdata(L,lo))
+ {
+ tolua_pushusertype(L,lua_touserdata(L,lo),toluaI_tt_gettag(L,type));
+ return -1;
+ }
+ else
+ return 0;
+}
+
+void tolua_takeownership (lua_State* L, int lo)
+{
+ if (toluaI_tt_isusertype(L,lo))
+ {
+ /* force garbage collection to avoid C to reuse a to-be-collected address */
+ lua_setgcthreshold(L,0);
+ tolua_doclone(L,lua_touserdata(L,lo),lua_tag(L,lo));
+ }
+ else
+ tolua_error(L,"cannot take ownership of specified obejct.");
+}
+