summaryrefslogtreecommitdiff
path: root/src/lua/tolua_rg.c
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2010-01-08 20:28:34 +0100
committerBardur Arantsson <bardur@scientician.net>2010-01-08 23:46:06 +0100
commit6aa48afdd57d03314fdf4be6c9da911c32277c84 (patch)
tree2dc401f9aae2dc6736d2fc3811c8f8099d3eabe6 /src/lua/tolua_rg.c
Import tome-2.3.5.
Diffstat (limited to 'src/lua/tolua_rg.c')
-rw-r--r--src/lua/tolua_rg.c243
1 files changed, 243 insertions, 0 deletions
diff --git a/src/lua/tolua_rg.c b/src/lua/tolua_rg.c
new file mode 100644
index 00000000..4337e9f9
--- /dev/null
+++ b/src/lua/tolua_rg.c
@@ -0,0 +1,243 @@
+/* tolua: register functions
+** Support code for Lua bindings.
+** Written by Waldemar Celes
+** TeCGraf/PUC-Rio
+** Jul 1998
+** $Id: tolua_rg.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 <stdio.h>
+
+#include "tolua.h"
+#include "tolua_rg.h"
+#include "tolua_tm.h"
+#include "tolua_tt.h"
+
+void tolua_globalvar (lua_State* L, char* name, lua_CFunction get, lua_CFunction set)
+{
+ lua_newtable(L);
+ lua_pushstring(L,".get");
+ lua_pushcfunction(L,get);
+ lua_settable(L,-3);
+ if (set)
+ {
+ lua_pushstring(L,".set");
+ lua_pushcfunction(L,set);
+ lua_settable(L,-3);
+ }
+ lua_pushvalue(L,-1); /* duplicate top */
+ lua_setglobal(L,name);
+ toluaI_tm_global(L,lua_gettop(L));
+ lua_pop(L,1);
+}
+
+static int toluaI_const_global_array (lua_State* L)
+{
+ lua_error(L,"value of const array cannot be changed");
+ return 0;
+}
+
+
+void tolua_globalarray (lua_State* L,char* name, lua_CFunction get, lua_CFunction set)
+{
+ int tag = lua_newtag(L);
+ lua_newtable(L);
+ lua_settag(L,tag);
+ lua_setglobal(L,name);
+
+ lua_pushcfunction(L,get);
+ lua_settagmethod(L,tag,"gettable");
+ if (set)
+ lua_pushcfunction(L,set);
+ else
+ lua_pushcfunction(L,toluaI_const_global_array);
+ lua_settagmethod(L,tag,"settable");
+}
+
+void tolua_tablevar
+(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set)
+{
+ lua_getglobal(L,table);
+
+ lua_pushstring(L,".get");
+ lua_gettable(L,-2);
+ lua_pushstring(L,name);
+ lua_pushcfunction(L,get);
+ lua_settable(L,-3);
+ lua_pop(L,1);
+ if (set)
+ {
+ lua_pushstring(L,".set");
+ lua_gettable(L,-2);
+ lua_pushstring(L,name);
+ lua_pushcfunction(L,set);
+ lua_settable(L,-3);
+ lua_pop(L,1);
+ }
+
+ lua_pop(L,1);
+}
+
+static int toluaI_get_array (lua_State* L)
+{
+ void* self = tolua_getuserdata(L,1,0);
+ const char* field = tolua_getstring(L,2,0);
+
+ if (!field)
+ tolua_error(L,"invalid 'field' in accessing array");
+ if (!self)
+ {
+ static char msg[BUFSIZ];
+ sprintf(msg,"invalid 'self' in accessing array '%s'",field);
+ tolua_error(L,msg);
+ }
+ toluaI_getregistry(L,"tolua_tbl_itype");
+ lua_pushnumber(L,lua_tag(L,1));
+ lua_gettable(L,-2);
+ lua_getglobal(L,lua_tostring(L,-1));
+ lua_pushstring(L,".array");
+ lua_gettable(L,-2);
+ lua_pushvalue(L,2); /* field */
+ lua_gettable(L,-2);
+ lua_pushstring(L,".self");
+ lua_pushvalue(L,1); /* self */
+ lua_rawset(L,-3);
+ return 1;
+}
+
+static int toluaI_const_array (lua_State* L)
+{
+ lua_error(L,"value of const field cannot be changed");
+ return 0;
+}
+
+void tolua_tablearray
+(lua_State* L, char* table, char* name, lua_CFunction get, lua_CFunction set)
+{
+ int tag = lua_newtag(L);
+ lua_getglobal(L,table);
+ lua_pushstring(L,".array");
+ lua_rawget(L,-2);
+ lua_pushstring(L,name);
+ lua_newtable(L);
+ lua_settag(L,tag);
+ lua_settable(L,-3);
+ lua_pop(L,2);
+
+ lua_pushcfunction(L,get);
+ lua_settagmethod(L,tag,"gettable");
+ if (set)
+ lua_pushcfunction(L,set);
+ else
+ lua_pushcfunction(L,toluaI_const_array);
+ lua_settagmethod(L,tag,"settable");
+
+ tolua_tablevar(L,table,name,toluaI_get_array,NULL);
+}
+
+void tolua_module (lua_State* L, char* name)
+{
+ lua_getglobal(L,name);
+ if (!lua_istable(L,-1))
+ {
+ lua_newtable(L);
+ lua_pushstring(L,".get");
+ lua_newtable(L);
+ lua_settable(L,-3);
+ lua_pushstring(L,".set");
+ lua_newtable(L);
+ lua_settable(L,-3);
+ lua_pushvalue(L,-1); /* duplicate top */
+ lua_setglobal(L,name);
+ toluaI_tm_module(L,lua_gettop(L));
+ lua_pop(L,1);
+ }
+ lua_pop(L,1);
+}
+
+void tolua_cclass (lua_State* L, char* name, char* base)
+{
+ int t;
+ lua_newtable(L);
+ lua_pushstring(L,".get");
+ lua_newtable(L);
+ lua_settable(L,-3);
+ lua_pushstring(L,".set");
+ lua_newtable(L);
+ lua_settable(L,-3);
+ lua_pushstring(L,".array");
+ lua_newtable(L);
+ lua_settable(L,-3);
+ if (*base != 0)
+ {
+ lua_pushstring(L,".base");
+ lua_getglobal(L,base);
+ lua_rawset(L,-3);
+ }
+ lua_pushvalue(L,-1); /* duplicate top */
+ lua_setglobal(L,name);
+ t = lua_gettop(L);
+ toluaI_tm_class(L,t,name);
+ toluaI_tt_class(L,t,name,base);
+ lua_pop(L,1);
+}
+
+
+void tolua_function (lua_State* L, char* parent, char* name, lua_CFunction func)
+{
+ if (parent==NULL)
+ {
+ lua_pushcfunction(L,func);
+ lua_setglobal(L,name);
+ }
+ else
+ {
+ lua_getglobal(L,parent);
+ lua_pushstring(L,name);
+ lua_pushcfunction(L,func);
+ lua_settable(L,-3);
+ lua_pop(L,1);
+ }
+}
+
+void tolua_constant (lua_State* L, char* parent, char* name, long value)
+{
+ if (parent==NULL)
+ {
+ lua_pushnumber(L,value);
+ lua_setglobal(L,name);
+ }
+ else
+ {
+ lua_getglobal(L,parent);
+ lua_pushstring(L,name);
+ lua_pushnumber(L,value);
+ lua_settable(L,-3);
+ lua_pop(L,1);
+ }
+}
+
+void toluaI_setregistry (lua_State* L, char* field)
+{
+ lua_getregistry(L);
+ lua_insert(L,-2);
+ lua_pushstring(L,field);
+ lua_insert(L,-2);
+ lua_settable(L,-3);
+ lua_pop(L,1);
+}
+
+void toluaI_getregistry (lua_State* L, char* field)
+{
+ lua_getregistry(L);
+ lua_pushstring(L,field);
+ lua_gettable(L,-2);
+ lua_insert(L,-2);
+ lua_pop(L,1);
+}