0
+ − 1 require"larray"
+ − 2 -- typesignature = require"typesignature"
+ − 3 local array_mt = {
+ − 4 __index = function(t,i)
+ − 5 if type(i) == "number" then
+ − 6 return larray.peek( t.pointer, t.typesize * (i-1), t.typeinfo )
+ − 7 else
+ − 8 local result = rawget(t,i)
+ − 9 if not result then
+ − 10 return getmetatable(t)[i]
+ − 11 end
+ − 12 end
+ − 13 end,
+ − 14 __newindex = function(t,i,v)
+ − 15 if type(i) == "number" then
+ − 16 return larray.poke( t.pointer, t.typesize * (i-1), t.typeinfo, v)
+ − 17 else
+ − 18 return rawset(t,i,v)
+ − 19 end
+ − 20 end,
+ − 21 copy = function(array,src,nelements)
+ − 22 return larray.copy( array.pointer, 0, src, 0, array.typesize * nelements)
+ − 23 end
+ − 24 }
+ − 25
+ − 26 --- Get type information from type signature.
+ − 27 --
+ − 28 -- @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
+ − 29 -- 'l' for C long long, 'f' for C float, 'd' for C double, 'p' for C pointer,
+ − 30 -- 'B' for ISO C99 _Bool_t/C++ bool, 'v' for C void. Upper-case characters 'CSIJL' refer to the corresponding unsigned C type.
+ − 31 -- Function signature syntax: 'name(argtypes..)resulttypes..;'
+ − 32 -- Structure signature syntax: 'name{fieldtypes..)fieldnames..;' the fieldnames are space separated text tokens.
+ − 33 -- Named objects can be refered using '<name>' syntax.
+ − 34 -- pointer types can be specified by prefixing multiple '*'.
+ − 35 -- function typesignature(signature)
+ − 36 -- end
+ − 37
+ − 38 --- Get size of fundamental C types.
+ − 39 -- @param typeinfo a simple C type signature string.
+ − 40 -- @see typesignature
+ − 41 function typesize(typesignature)
+ − 42 return typesizes[typesignature]
+ − 43 end
+ − 44
+ − 45 --- Create a lua-memory managed C array.
+ − 46 -- Arrays are represented as a table with fields.
+ − 47 -- @field pointer holds the address represented by a lua userdata object.
+ − 48 -- @return array object
+ − 49 function array(typeinfo, length)
+ − 50 local typesize = larray.sizeof(typeinfo)
+ − 51 local size = typesize * length
+ − 52 local pointer = larray.newudata(size)
+ − 53 local o = {
+ − 54 pointer = pointer,
+ − 55 size = size,
+ − 56 length = length,
+ − 57 typesize = typesize,
+ − 58 typeinfo = typeinfo,
+ − 59 }
+ − 60 setmetatable(o, array_mt)
+ − 61 return o
+ − 62 end
+ − 63
+ − 64