Darktide-Mod-Framework/vmf_source/scripts/mods/vmf/functions/table.lua
2018-02-12 13:22:11 +03:00

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