diff lua/luadyncall/src/array.lua @ 0:0cfcc391201f

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:26:28 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lua/luadyncall/src/array.lua	Thu Mar 19 22:26:28 2015 +0100
@@ -0,0 +1,64 @@
+require"larray"
+-- typesignature = require"typesignature"
+local array_mt = {
+  __index = function(t,i) 
+    if type(i) == "number" then
+      return larray.peek( t.pointer, t.typesize * (i-1), t.typeinfo ) 
+    else 
+      local result = rawget(t,i)
+      if not result then
+        return getmetatable(t)[i]
+      end
+    end
+  end,
+  __newindex = function(t,i,v) 
+    if type(i) == "number" then
+      return larray.poke( t.pointer, t.typesize * (i-1), t.typeinfo, v) 
+    else
+      return rawset(t,i,v)
+    end
+  end,
+  copy = function(array,src,nelements) 
+    return larray.copy( array.pointer, 0, src, 0, array.typesize * nelements)
+  end
+}
+
+--- Get type information from type signature.
+--
+-- @param signature string representing type informations. Fundamental type signatures are represented by characters such as 'c' for C char, 's' for C short, 'i' for C int, 'j' for C long
+-- 'l' for C long long, 'f' for C float, 'd' for C double, 'p' for C pointer,
+-- 'B' for ISO C99 _Bool_t/C++ bool, 'v' for C void. Upper-case characters 'CSIJL' refer to the corresponding unsigned C type.
+-- Function signature syntax: 'name(argtypes..)resulttypes..;'
+-- Structure signature syntax: 'name{fieldtypes..)fieldnames..;' the fieldnames are space separated text tokens.
+-- Named objects can be refered using '<name>' syntax.
+-- pointer types can be specified by prefixing multiple '*'.
+-- function typesignature(signature)
+-- end
+
+--- Get size of fundamental C types.
+-- @param typeinfo a simple C type signature string.
+-- @see typesignature
+function typesize(typesignature)
+  return typesizes[typesignature]
+end
+
+--- Create a lua-memory managed C array.
+-- Arrays are represented as a table with fields.
+-- @field pointer holds the address represented by a lua userdata object.
+-- @return array object
+function array(typeinfo, length)
+  local typesize = larray.sizeof(typeinfo)
+  local size     = typesize * length
+  local pointer  = larray.newudata(size)
+  local o = { 
+    pointer   = pointer, 
+    size      = size, 
+    length    = length, 
+    typesize  = typesize, 
+    typeinfo  = typeinfo,
+  }
+  setmetatable(o, array_mt)
+  return o
+end
+
+