176 lines
3.3 KiB
Lua
176 lines
3.3 KiB
Lua
table.pack = function(...)
|
|
return { n = select("#", ...); ... }
|
|
end
|
|
|
|
table.combine = function(a, b)
|
|
local r = {unpack(a)}
|
|
|
|
for i = 1, #b do
|
|
r[#a + i] = b[i]
|
|
end
|
|
|
|
return r;
|
|
end
|
|
|
|
-- Check item exist in table
|
|
table.has_item = function(tbl, item)
|
|
for _, value in ipairs(tbl) do
|
|
if value == item then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
table.has_item2 = function(tbl, item)
|
|
for _, value in pairs(tbl) do
|
|
if value == item then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
table.index_of = function(t, o)
|
|
if type(t) ~= "table" then
|
|
return nil
|
|
end
|
|
for i,v in ipairs(t) do
|
|
if o == v then
|
|
return i
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
table.adress = function(tbl)
|
|
local str = tostring(tbl)
|
|
|
|
return string.sub(str, 8, str:len())
|
|
end
|
|
|
|
-- Serialization and deserialization
|
|
local serialization = function(key, value)
|
|
local str = ""
|
|
|
|
if type(value) == "string" then
|
|
str = str .. tostring(key) .. "=\"" .. value .. "\","
|
|
elseif type(value) == "number" then
|
|
str = str .. tostring(key) .. "=" .. tostring(value) .. ","
|
|
elseif type(value) == "boolean" then
|
|
str = str .. tostring(key) .. "="
|
|
|
|
if value then
|
|
str = str .. "true"
|
|
else
|
|
str = str .. "false"
|
|
end
|
|
|
|
str = str .. ","
|
|
|
|
elseif type(value) == "table" then
|
|
str = str .. tostring(key) .. "=" .. table.serialization(value) .. ","
|
|
end
|
|
|
|
return str
|
|
end
|
|
|
|
local deserialization = function(str)
|
|
for i = 1, string.len(str) do
|
|
local value = string.sub(str, i, i)
|
|
|
|
if value == "=" then
|
|
local key = string.sub(str, 1, i - 1)
|
|
local value = string.sub(str, i + 1, string.len(str))
|
|
|
|
-- Check key
|
|
if string.sub(key, 1, 1) == "[" then
|
|
key = string.sub(key, 3, string.len(key) - 2)
|
|
else
|
|
key = tonumber(key)
|
|
end
|
|
|
|
-- Check value
|
|
if value == "true" then
|
|
value = true
|
|
elseif value == "false" then
|
|
value = false
|
|
elseif string.sub(value, 1, 1) == "\"" then
|
|
value = string.sub(value, 2, string.len(value) - 1)
|
|
elseif string.sub(value, 1, 1) == "{" then
|
|
value = table.deserialization(value)
|
|
else
|
|
value = tonumber(value)
|
|
end
|
|
|
|
return key, value
|
|
end
|
|
end
|
|
|
|
return nil, nil
|
|
end
|
|
|
|
table.serialization = function(tbl)
|
|
local str = "{"
|
|
|
|
for key, value in ipairs(tbl) do
|
|
str = str .. serialization(key, value)
|
|
end
|
|
for key, value in pairs(tbl) do
|
|
if type(key) ~= "number" then
|
|
str = str .. serialization("[\"" .. key .. "\"]", value)
|
|
end
|
|
end
|
|
|
|
str = str .. "}"
|
|
|
|
return str
|
|
end
|
|
|
|
table.deserialization = function(str)
|
|
local tbl = {}
|
|
|
|
-- Collected data
|
|
local data = ""
|
|
|
|
-- Checks
|
|
local c_list = 0
|
|
local c_str = false
|
|
|
|
for i = 2, string.len(str) do
|
|
local before_value = string.sub(str, i - 1, i - 1)
|
|
local value = string.sub(str, i, i)
|
|
|
|
-- If not inside a list or string
|
|
if value == "," and c_list == 0 then
|
|
-- Save propety
|
|
local key, val = deserialization(data)
|
|
|
|
if key then
|
|
tbl[key] = val
|
|
end
|
|
|
|
-- Search for new propety
|
|
data = ""
|
|
else
|
|
-- Detect string type
|
|
if value == "\"" and not before_value ~= "\\" then
|
|
c_str = not c_str
|
|
end
|
|
|
|
-- Detect list type
|
|
if not c_str then
|
|
if value == "{" then
|
|
c_list = c_list + 1
|
|
elseif value == "}" then
|
|
c_list = c_list - 1
|
|
end
|
|
end
|
|
|
|
-- save value
|
|
data = data .. value
|
|
end
|
|
end
|
|
|
|
return tbl
|
|
end
|