--- Combines two or more numerically indexed tables into one.
-- @param tbl1 Table value to combine
-- @param tbl2 Table value to combine
--- @param tblN More values to combine
+-- @param ... More tables to combine
-- @return Table value containing all values of given tables
function combine(...)
local result = {}
return copy
end
--- Test whether the given table value is a numerically indexed table.
-function _is_numeric_table(t)
- local k = pairs(t)(t)
- return ( tonumber(k) ~= nil )
+
+--- Create a dynamic table which automatically creates subtables.
+-- @return Dynamic Table
+function dtable()
+ return setmetatable({}, { __index =
+ function(tbl, key)
+ return rawget(tbl, key)
+ or rawget(rawset(tbl, key, dtable()), key)
+ end
+ })
end
+
-- Serialize the contents of a table value.
function _serialize_table(t)
local data = ""
- if _is_numeric_table(t) then
- for i, v in ipairs(t) do
- v = serialize_data(v)
- data = data .. ( #data > 0 and ", " or "" ) .. v
- end
- else
- for k, v in pairs(t) do
- k = serialize_data(k)
- v = serialize_data(v)
- data = data .. ( #data > 0 and "; " or "" ) ..
- '[' .. k .. '] = ' .. v
- end
+ for k, v in pairs(t) do
+ k = serialize_data(k)
+ v = serialize_data(v)
+ data = data .. ( #data > 0 and ", " or "" ) ..
+ '[' .. k .. '] = ' .. v
end
return data
end
if val == nil then
return "nil"
elseif type(val) == "number" then
- return tostring(val)
+ return val
elseif type(val) == "string" then
- val = val:gsub("\\", "\\\\")
- :gsub("\r", "\\r")
- :gsub("\n", "\\n")
- :gsub('"','\\"')
- return '"' .. val .. '"'
+ return string.format("%q", val)
elseif type(val) == "boolean" then
return val and "true" or "false"
+ elseif type(val) == "function" then
+ return string.format("loadstring(%q)", get_bytecode(val))
elseif type(val) == "table" then
return "{ " .. _serialize_table(val) .. " }"
else
--
--- Return the current runtime bytecode of the given data. The byte code
--- will be stripped before it is returned if the given value is a function.
+-- will be stripped before it is returned.
-- @param val Value to return as bytecode
-- @return String value containing the bytecode of the given data
function get_bytecode(val)
+ local code
+
if type(val) == "function" then
- local code = string.dump(val)
- return code and strip_bytecode(code)
+ code = string.dump(val)
else
- return string.dump( loadstring( "return " .. serialize_data(val) ) )
+ code = string.dump( loadstring( "return " .. serialize_data(val) ) )
end
+
+ return code and strip_bytecode(code)
end
--- Strips unnescessary lua bytecode from given string. Information like line