lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


2011/12/9 PROXiCiDE <saiyuk7@gmail.com>:
> Xavier Wang <weasley.wx <at> gmail.com> writes:
>
>>
>> Maybe you can do something like this:
>>
>> function Test(s, a, ...)
>>   -- do something to calculate the first field
>>   local ret = --....
>>   return ret, Test(s, ...)
>> end
>>
>> ---------- Forwarded message ----------
>> From: PROXiCiDE <saiyuk7 <at> gmail.com>
>> Date: 2011/12/9
>> Subject: Returning a ellipses
>> To: lua-l <at> lists.lua.org
>>
>> I want to pass a function that supports
>> ellipses "..." and return several of
>> them into different variables..
>>
>> example
>>
>> function Test(...)
>> end
>>
>> a,b,c,d,e = Test(1,2,3,4,5)
>>
>> Reason for this being, i want to be able to
>> read a structured data into variables...
>>
>> example reason
>>
>> magic,version, headersize,directorycount,directorylocation =
>> ReadDirectory(f,"s",16,32,32,32)
>>
>> S = obviously a String
>> 16 = Int16
>> 32 = Int32
>>
>> I would actually parse the the ellipses using the
>> "var = select(i,...)" from a "for" statement
>>
>> But what i cant understand is how do i seperate
>> these into different variables
>> that are returned
>>
>>
>
>
> Well Test will be reading data from a binary file
> into these specific variables, the ellipses
> would hold the size of the data to be read from the file
>
> example
>
> function Test(f,...)
>  for i=1,select("#",...) do
>  local v = select(i,...)
>  if (type(v) == "number") then
>  store_var = FileReadSize(f,v)
>  end
>  return -- Store Variables here
> end
>
> a,b,c = Test(f,32,16,32)
>
>
>

You can use recurse to avoid table allocate, like this:

function Test(f, v, ...)
    if not v then return end
    return FileReadSize(f, v), Test(f, ...)
end

maybe you can use my lbuffer module[1], like this:
a, b, c = buffer(f):unpack "i4i2i4"

your second example can be this:
array = buffer(f):unpack "{magic=i2, header=i4, version=i4}"

[1]: https://github.com/starwing/lbuffer