109 lines
3.4 KiB
Lua
109 lines
3.4 KiB
Lua
--[[
|
|
Courtesy of: http://lua-users.org/wiki/SaveTableToFile
|
|
]]
|
|
local function exportstring(s)
|
|
return string.format("%q", s)
|
|
end
|
|
|
|
-- The Save Function
|
|
local function save(tbl, filename)
|
|
local charS, charE = " ", "\n"
|
|
local file, err = io.open(filename, "wb")
|
|
if err then
|
|
return err
|
|
end
|
|
|
|
-- Initialize variables for save procedure
|
|
local tables, lookup = { tbl }, { [tbl] = 1 }
|
|
file:write("return {" .. charE)
|
|
|
|
for idx, t in ipairs(tables) do
|
|
file:write("-- Table: {" .. idx .. "}" .. charE)
|
|
file:write("{" .. charE)
|
|
local thandled = {}
|
|
|
|
for i, v in ipairs(t) do
|
|
thandled[i] = true
|
|
local stype = type(v)
|
|
-- only handle value
|
|
if stype == "table" then
|
|
if not lookup[v] then
|
|
table.insert(tables, v)
|
|
lookup[v] = #tables
|
|
end
|
|
file:write(charS .. "{" .. lookup[v] .. "}," .. charE)
|
|
elseif stype == "string" then
|
|
file:write(charS .. exportstring(v) .. "," .. charE)
|
|
elseif stype == "number" then
|
|
file:write(charS .. tostring(v) .. "," .. charE)
|
|
end
|
|
end
|
|
|
|
for i, v in pairs(t) do
|
|
-- escape handled values
|
|
if not thandled[i] then
|
|
local str = ""
|
|
local stype = type(i)
|
|
-- handle index
|
|
if stype == "table" then
|
|
if not lookup[i] then
|
|
table.insert(tables, i)
|
|
lookup[i] = #tables
|
|
end
|
|
str = charS .. "[{" .. lookup[i] .. "}]="
|
|
elseif stype == "string" then
|
|
str = charS .. "[" .. exportstring(i) .. "]="
|
|
elseif stype == "number" then
|
|
str = charS .. "[" .. tostring(i) .. "]="
|
|
end
|
|
|
|
if str ~= "" then
|
|
stype = type(v)
|
|
-- handle value
|
|
if stype == "table" then
|
|
if not lookup[v] then
|
|
table.insert(tables, v)
|
|
lookup[v] = #tables
|
|
end
|
|
file:write(str .. "{" .. lookup[v] .. "}," .. charE)
|
|
elseif stype == "string" then
|
|
file:write(str .. exportstring(v) .. "," .. charE)
|
|
elseif stype == "number" then
|
|
file:write(str .. tostring(v) .. "," .. charE)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
file:write("}," .. charE)
|
|
end
|
|
file:write "}"
|
|
file:close()
|
|
end
|
|
|
|
-- The Load Function
|
|
local function load(sfile)
|
|
local ftables, err = loadfile(sfile)
|
|
if err then
|
|
return nil, err
|
|
end
|
|
local tables = ftables()
|
|
for idx = 1, #tables do
|
|
local tolinki = {}
|
|
for i, v in pairs(tables[idx]) do
|
|
if type(v) == "table" then
|
|
tables[idx][i] = tables[v[1]]
|
|
end
|
|
if type(i) == "table" and tables[i[1]] then
|
|
table.insert(tolinki, { i, tables[i[1]] })
|
|
end
|
|
end
|
|
-- link indices
|
|
for _, v in ipairs(tolinki) do
|
|
tables[idx][v[2]], tables[idx][v[1]] = tables[idx][v[1]], nil
|
|
end
|
|
end
|
|
return tables[1]
|
|
end
|
|
|
|
return { save = save, load = load }
|