You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.0 KiB

local pairs = pairs;
local type = type;
local tostring = tostring;
local tonumber = tonumber;
local strsub = strsub;
local strfind = strfind;
local strbyte = strbyte;
local floor = floor;
local format = format;
local twipe = table.wipe;
local tinsert = tinsert;
local tsort = table.sort;
local strchar = strchar;
local bor = bit.bor;
local band = bit.band;
local tconcat = table.concat;
local lshift = bit.lshift;
local rshift = bit.rshift;
local tremove = tremove;
local next = next;
-- Sabc=S5+abcde
-- Sabc=N3+1.3
-- Sabc=0
-- Sabc=1
-- Sabc=T1234+...
-- Nabc=S1+x
local VUHDO_KEY_TO_ABBREV = {
["isFullDuration"] = "*a",
["useBackground"] = "*b",
["color"] = "*c",
["isStacks"] = "*d",
["isIcon"] = "*e",
["isColor"] = "*f",
["bright"] = "*g",
["others"] = "*h",
["icon"] = "*i",
["timer"] = "*j",
["animate"] = "*k",
["isClock"] = "*l",
["mine"] = "*m",
["name"] = "*n",
["useOpacity"] = "*o",
["countdownMode"] = "*p",
["radio"] = "*r",
["isManuallySet"] = "*s",
["useText"] = "*t",
["custom"] = "*u",
};
local VUHDO_ABBREV_TO_KEY = {
["*a"] = "isFullDuration",
["*b"] = "useBackground",
["*c"] = "color",
["*d"] = "isStacks",
["*e"] = "isIcon",
["*f"] = "isColor",
["*g"] = "bright",
["*h"] = "others",
["*i"] = "icon",
["*j"] = "timer",
["*k"] = "animate",
["*l"] = "isClock",
["*m"] = "mine",
["*n"] = "name",
["*o"] = "useOpacity",
["*p"] = "countdownMode",
["*r"] = "radio",
["*s"] = "isManuallySet",
["*t"] = "useText",
["*u"] = "custom",
};
--
local tStrValue; -- Mustn't be reused after recursion finished
function VUHDO_serializeTable(aTable)
local tString = "";
for tKey, tValue in pairs(aTable) do
tString = "number" == type(tKey)
and format("%sN%d=", tString, tKey) or format("%sS%s=", tString, VUHDO_KEY_TO_ABBREV[tKey] or tKey);
if "string" == type(tValue) then
tString = format("%sS%d+%s", tString, #tValue, tValue);
elseif "number" == type(tValue) then
tStrValue = format("%0.4f", tValue);
tString = format("%sN%d+%s", tString, #tStrValue, tStrValue);
elseif "boolean" == type(tValue) then
tString = tString .. (tValue and "1" or "0");
elseif "table" == type(tValue) then
local tNewString = VUHDO_serializeTable(tValue);
tString = format("%sT%d+%s", tString, #tNewString, tNewString);
end
end
return tString;
end
--
local tEndPos;
local tNumBytes;
local tValue;
local function VUHDO_getValueByLength(aString, aGleichPos)
tEndPos = strfind(aString, "+", aGleichPos + 2, true);
if not tEndPos then return nil, nil; end
tNumBytes = tonumber(strsub(aString, aGleichPos + 2, tEndPos - 1));
tValue = strsub(aString, tEndPos + 1, tEndPos + tNumBytes);
return tEndPos + tNumBytes + 1, tValue;
end
--
function VUHDO_deserializeTable(aString)
local tTable = { };
local tIndex = 1;
local tValueType;
local tGleichPos;
local tKey, tValue;
while tIndex <= #aString do
tGleichPos = strfind(aString, "=", tIndex + 1, true);
if tGleichPos then
tKey = strsub(aString, tIndex + 1, tGleichPos - 1);
if 78 == strbyte(aString, tIndex) then -- N
tKey = tonumber(tKey);
else -- S
tKey = VUHDO_ABBREV_TO_KEY[tKey] or tKey;
end
tValueType = strbyte(aString, tGleichPos + 1);
if 83 == tValueType then -- S
tIndex, tValue = VUHDO_getValueByLength(aString, tGleichPos);
elseif 78 == tValueType then -- N
tIndex, tValue = VUHDO_getValueByLength(aString, tGleichPos);
tValue = tonumber(tValue);
elseif 48 == tValueType then -- 0
tValue = false;
tIndex = tGleichPos + 2;
elseif 49 == tValueType then -- 1
tValue = true;
tIndex = tGleichPos + 2;
elseif 84 == tValueType then -- T
tIndex, tValue = VUHDO_getValueByLength(aString, tGleichPos);
tValue = VUHDO_deserializeTable(tValue);
else
return tTable;
end
else
return tTable;
end
if tKey and tValue ~= nil then
tTable[tKey] = tValue;
end
end
return tTable;
end