require "parse-bin" -- TOOLS -- Deep coparison of data structures -- http://snippets.luacode.org/snippets/Deep_Comparison_of_Two_Values_3 -- renamed from 'deepcompare' to 'table.equal' function table.equal(t1,t2,ignore_mt) local ty1 = type(t1) local ty2 = type(t2) if ty1 ~= ty2 then return false end -- non-table types can be directly compared if ty1 ~= 'table' and ty2 ~= 'table' then return t1 == t2 end -- as well as tables which have the metamethod __eq local mt = getmetatable(t1) if not ignore_mt and mt and mt.__eq then return t1 == t2 end for k1,v1 in pairs(t1) do local v2 = t2[k1] if v2 == nil or not table.equal(v1,v2) then return false end end for k2,v2 in pairs(t2) do local v1 = t1[k2] if v1 == nil or not table.equal(v1,v2) then return false end end return true end -- TEST local bytes = {1,2,3} local tab = {u16=513, u8=3} local spec = {{{'int','U',16}, 'u16'}, {{'int','U',8}, 'u8'}} function test1() local stream = parse.array2stream({1,2,3}) -- function ones() return 0xFF end -- parse.int(ones, {}, 'S', 32) -- parse.type(ones, {}, {'int', 'S', 32}) -- parse.table(ones, {}, {{{'int', 'S', 32}, 'a'}}) -- parse.table(ones, {}, {{{'int','U',16}, 'u16'}, {{'int','U',8}, 'u8'}}) local tab2 = parse.table(stream, {}, spec) return table.equal(tab2, tab) end function test2() local out2 = {} local stream = unparse.array2stream(out2) unparse.table(stream, {u16=513,u8=3}, {}, spec) return table.equal(out2, bytes) end -- Test for array and struct sub-tables. structs = { super_struct= {{{'int','U',8},'v'}, {{'int','U',8},'s'}, {{'int','U',16},'c'}, {{'struct','sub_struct'},'t'}, {{'int','U',64},'l'}}, sub_struct= {{{'int','U',32},'b'}, {{'array',5,{'int','U',16}},'e'}, {{'int','U',16},'q'}} } struct_bytes = {11,1,10,0,9,0,0,0,3,0,4,0,5,0,6,0,7,0,8,0,2,0,0,0,0,0,0,0} struct_tab = { s=1, l=2, t={ e={3,4,5,6,7}, q=8, b=9}, c=10, v=11} function test3() local tab = parse.array2table(struct_bytes, structs, structs.super_struct) return table.equal(tab, struct_tab) end function test4() local bytes = unparse.table2array(struct_tab, structs, structs.super_struct) return table.equal(bytes, struct_bytes) end function test5() return parse.array2table(nil, structs, structs.super_struct) end print (test1()) print (test2()) print (test3()) print (test4())