-- BLT, made for Lua 5.3 local blt = {} do local types local function serialize(val) local t = type(val) if (t == "number") then t = math.type(val) end local b, str = types["s"..t](val) b = (b << 3) | types[t] return string.char(b) .. str end local function deserialize(str, t) local tb = str:byte(1) local type_ = tb & 7 local b = tb >> 3 local v, l = types[type_](b, str:sub(2)) return v, l+1 end local function fromdouble(f) return 0, string.pack(" 0xFFFFFFFFFFFFFF) then return _fromlongint(i) end for j=0, 7 do len = len + 1 cmp2 = cmp2 | (0xFF << j) --print("fromint", i+((cmp2//2)), cmp2) --if (i+((cmp2//2)) <= cmp2) then if (math.abs(i) <= cmp2//2) then break end end if (i < 0) then i = i + (cmp2//2) end --i = i + (cmp2//2) local tmp = "" for j=0, len-1 do tmp = tmp .. string.char((i & (0xFF << (j*8))) >> (j*8)) end --local tmp = string.pack(" 0) then if (nindex == nmax) then local ib, dat = fromarray(t) tmp = tmp .. string.char(0) .. string.char(types.table_array | (ib << 3)) .. dat else for k, v in pairs(t) do if (type(k) == "number" and math.type(k) == "integer") then local ks = serialize(k) local vs = serialize(v) tmp = tmp .. ks .. vs end end end end return 0, tmp .. string.char(0,0) --nil,nil terminated end local function totbl(b, str) local t = {} local k = "" local v = "" local pos = 1 --print("topen") while true do --print("k", str:byte(pos), str:byte(pos) & 7) local k, l = deserialize(str:sub(pos)) pos = pos + l --print("v", str:byte(pos), str:byte(pos) & 7) if (str:byte(pos) & 7 == 6) then --print("ailen", str:byte(pos) & (7 ~ 0xFF)) local r, l = deserialize(str:sub(pos)) pos = pos + l for i=1, #r do t[i] = r[i] end else local v, l = deserialize(str:sub(pos)) pos = pos + l if (not v and not k) then --print("tclose") break end --print("decode", k, v) t[k] = v end end return t, pos-1 --how end -- Type LUT types = { ["nil"] = 0, float = 1, number = 1, integer = 2, string = 3, boolean = 4, table = 5, table_array = 6, --Meta-value [0] = function(b, str) return nil, 0 end, [1] = todouble, [2] = toint, [3] = tostr, [4] = tobool, [5] = totbl, [6] = toarray, snil = function()return 0, ""end, sfloat = fromdouble, sinteger = fromint, sstring = fromstr, sboolean = frombool, stable = fromtbl, stable_array = fromarray } function blt.serialize(...) local args = {...} local tmp = string.char(#args) for i=1, #args do local str = serialize(args[i]) tmp = tmp .. str end return tmp end local unpack = unpack or table.unpack function blt.deserialize(str) local args = {} local pos = 2 local amt = str:byte(1) local l for i=1, amt do local v, l = deserialize(str:sub(pos)) args[i] = v pos = pos + l end return unpack(args) end end