summaryrefslogtreecommitdiff
path: root/src/lua/array.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/array.lua')
-rw-r--r--src/lua/array.lua203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/lua/array.lua b/src/lua/array.lua
new file mode 100644
index 00000000..7929f8cd
--- /dev/null
+++ b/src/lua/array.lua
@@ -0,0 +1,203 @@
+-- tolua: array class
+-- Written by Waldemar Celes
+-- TeCGraf/PUC-Rio
+-- Jul 1999
+-- $Id: array.lua,v 1.2 2001/11/26 23:00:23 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.
+
+
+-- Array class
+-- Represents a extern array variable or a public member of a class.
+-- Stores all fields present in a declaration.
+classArray = {
+ _base = classDeclaration,
+}
+
+settag(classArray,tolua_tag)
+
+-- Print method
+function classArray:print (ident,close)
+ print(ident.."Array{")
+ print(ident.." mod = '"..self.mod.."',")
+ print(ident.." type = '"..self.type.."',")
+ print(ident.." ptr = '"..self.ptr.."',")
+ print(ident.." name = '"..self.name.."',")
+ print(ident.." def = '"..self.def.."',")
+ print(ident.." dim = '"..self.dim.."',")
+ print(ident.." ret = '"..self.ret.."',")
+ print(ident.."}"..close)
+end
+
+-- get variable value
+function classArray:getvalue (class,static)
+ if class and static then
+ return class..'::'..self.name..'[toluaI_index]'
+ elseif class then
+ return 'self->'..self.name..'[toluaI_index]'
+ else
+ return self.name..'[toluaI_index]'
+ end
+end
+
+-- Write binding functions
+function classArray:supcode ()
+ local class = self:inclass()
+
+ -- get function ------------------------------------------------
+ if class then
+ output("/* get function:",self.name," of class ",class," */")
+ else
+ output("/* get function:",self.name," */")
+ end
+ self.cgetname = self:cfuncname("toluaI_get")
+ output("static int",self.cgetname,"(lua_State* tolua_S)")
+ output("{")
+
+ -- declare index
+ output(' int toluaI_index;')
+
+ -- declare self, if the case
+ local _,_,static = strfind(self.mod,'^%s*(static)')
+ if class and static==nil then
+ output(' ',class,'*','self;')
+ output(' lua_pushstring(tolua_S,".self");')
+ output(' lua_rawget(tolua_S,1);')
+ output(' self = ')
+ output('(',class,'*) ')
+ output('lua_touserdata(tolua_S,-1);')
+ elseif static then
+ _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
+ end
+
+ -- check index
+ output(' if (!tolua_istype(tolua_S,2,LUA_TNUMBER,0))')
+ output(' tolua_error(tolua_S,"invalid type in array indexing.");')
+ output(' toluaI_index = (int)tolua_getnumber(tolua_S,2,0)-1;')
+ output(' if (toluaI_index<0 || toluaI_index>='..self.dim..')')
+ output(' tolua_error(tolua_S,"array indexing out of range.");')
+
+ -- return value
+ local t,ct = isbasic(self.type)
+ if t then
+ output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static)..');')
+ else
+ if self.ptr == '&' or self.ptr == '' then
+ output(' tolua_pushusertype(tolua_S,(void*)&'..self:getvalue(class,static)..',',self.tag,');')
+ else
+ output(' tolua_pushusertype(tolua_S,(void*)'..self:getvalue(class,static)..',',self.tag,');')
+ end
+ end
+ output(' return 1;')
+ output('}')
+ output('\n')
+
+ -- set function ------------------------------------------------
+ if not strfind(self.mod,'const') then
+ if class then
+ output("/* set function:",self.name," of class ",class," */")
+ else
+ output("/* set function:",self.name," */")
+ end
+ self.csetname = self:cfuncname("toluaI_set")
+ output("static int",self.csetname,"(lua_State* tolua_S)")
+ output("{")
+
+ -- declare index
+ output(' int toluaI_index;')
+
+ -- declare self, if the case
+ local _,_,static = strfind(self.mod,'^%s*(static)')
+ if class and static==nil then
+ output(' ',class,'*','self;')
+ output(' lua_pushstring(tolua_S,".self");')
+ output(' lua_rawget(tolua_S,1);')
+ output(' self = ')
+ output('(',class,'*) ')
+ output('lua_touserdata(tolua_S,-1);')
+ elseif static then
+ _,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
+ end
+
+ -- check index
+ output(' if (!tolua_istype(tolua_S,2,LUA_TNUMBER,0))')
+ output(' tolua_error(tolua_S,"invalid type in array indexing.");')
+ output(' toluaI_index = (int)tolua_getnumber(tolua_S,2,0)-1;')
+ output(' if (toluaI_index<0 || toluaI_index>='..self.dim..')')
+ output(' tolua_error(tolua_S,"array indexing out of range.");')
+
+ -- assign value
+ local ptr = ''
+ if self.ptr~='' then ptr = '*' end
+ output(' ')
+ if class and static then
+ output(class..'::'..self.name..'[toluaI_index]')
+ elseif class then
+ output('self->'..self.name..'[toluaI_index]')
+ else
+ output(self.name..'[toluaI_index]')
+ end
+ local t = isbasic(self.type)
+ output(' = ')
+ if not t and ptr=='' then output('*') end
+ output('((',self.mod,self.type)
+ if not t then
+ output('*')
+ end
+ output(') ')
+ local def = 0
+ if self.def ~= '' then def = self.def end
+ if t then
+ output('tolua_get'..t,'(tolua_S,3,',def,'));')
+ else
+ output('tolua_getusertype(tolua_S,3,',def,'));')
+ end
+ output(' return 0;')
+ output('}')
+ output('\n')
+ end
+
+end
+
+function classArray:register ()
+ local parent = self:inclass() or self:inmodule()
+ if parent then
+ if self.csetname then
+ output(' tolua_tablearray(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..','..self.csetname..');')
+ else
+ output(' tolua_tablearray(tolua_S,"'..parent..'","'..self.lname..'",'..self.cgetname..',NULL);')
+ end
+ else
+ if self.csetname then
+ output(' tolua_globalarray(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');')
+ else
+ output(' tolua_globalarray(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);')
+ end
+ end
+end
+
+function classArray:unregister ()
+ if self:inclass()==nil and self:inmodule()==nil then
+ output(' lua_pushnil(tolua_S); lua_setglobal(tolua_S,"'..self.lname..'");')
+ end
+end
+
+
+-- Internal constructor
+function _Array (t)
+ t._base = classArray
+ settag(t,tolua_tag)
+ append(t)
+ return t
+end
+
+-- Constructor
+-- Expects a string representing the variable declaration.
+function Array (s)
+ return _Array (Declaration(s,'var'))
+end
+
+