protot/3rdparty/luatables/utils/serialize.lua

129 lines
3.0 KiB
Lua

local function islist (t)
local itemcount = 0
local last_type = nil
for k,v in pairs(t) do
itemcount = itemcount + 1
if last_type == nil then
last_type = type(v)
end
if type(v) ~= last_type or (type(v) ~= "string" and type(v) ~= "number" and type(v) ~= "boolean" and type(v) ~= "table") then
return false
end
last_type = type(v)
end
if itemcount ~= #t then
return false
end
return true
end
local function cmp_alphanumeric (a, b)
if (type(a) == "string" and type(b) == "string" or type(a) == "number" and type(b) == "number") then
return a < b
else
return type(a) < type(b)
end
end
local function gen_ordered_indices (t)
local ordered_indices = {}
for k in pairs (t) do
table.insert (ordered_indices, k)
end
table.sort (ordered_indices, cmp_alphanumeric)
return ordered_indices
end
local function ordered_next (t, state)
if state == nil then
t.__orderedIndices = gen_ordered_indices (t)
local key = t.__orderedIndices[1]
return key, t[key]
end
local key = nil
for i = 1, table.getn(t.__orderedIndices) do
if t.__orderedIndices[i] == state then
key = t.__orderedIndices[i + 1]
end
end
if key then
return key, t[key]
end
t.__orderedIndices = nil
return
end
local function ordered_pairs (t)
return ordered_next, t, nil
end
function serialize (o, tabs, sorted)
local result = ""
local pairs_func = pairs
if sorted then
pairs_func = ordered_pairs
end
if tabs == nil then
tabs = ""
end
if type(o) == "number" then
result = result .. tostring(o)
elseif type(o) == "boolean" then
result = result .. tostring(o)
elseif type(o) == "string" then
result = result .. "\"" .. o .. "\""
elseif type(o) == "table" and islist(o) then
result = result .. "{"
local last_was_subtable = false
for i,v in ipairs(o) do
last_was_subtable = false
if type(v) == "table" then
last_was_subtable = true
result = result .. "\n" .. tabs .. " " .. serialize (v, tabs .. " ", sorted) .. ","
elseif type(v) == "string" then
result = result .. " \"" .. v .. "\","
else
result = result .. " " .. tostring (v) .. ","
end
end
if last_was_subtable then
result = result .. "\n" .. tabs
end
result = result .. "}"
elseif type(o) == "table" then
if o.dont_serialize_me then
return "{}"
end
result = result .. "{\n"
for k,v in pairs_func(o) do
if type(v) ~= "function" then
-- make sure that numbered keys are properly are indexified
if type(k) == "number" then
if type(v) == "number" then
result = result .. tabs .. " [" .. tostring(k) .. "] = " .. tostring(v) .. ",\n"
else
result = result .. tabs .. " [" .. tostring(k) .. "] = " .. serialize (v, tabs .. " ", sorted) .. ",\n"
end
else
result = result .. tabs .. " " .. tostring (k) .. " = " .. serialize(v, tabs .. " ", sorted) .. ",\n"
end
end
end
result = result .. tabs .. "}"
else
print ("not serializing entry of type " .. type(o) )
end
return result
end
return serialize