d65dc73dfe
* better table view output in log
225 lines
No EOL
6 KiB
Lua
225 lines
No EOL
6 KiB
Lua
--[[
|
|
Copyright (C) 2014 HarpyWar (harpywar@gmail.com)
|
|
|
|
This file is a part of the PvPGN Project http://pvpgn.pro
|
|
Licensed under the same terms as Lua itself.
|
|
]]--
|
|
|
|
|
|
-- Clear table
|
|
function table.clear(_table)
|
|
for k in pairs(_table) do
|
|
_table[k] = nil
|
|
end
|
|
end
|
|
|
|
-- Get table size
|
|
function table.count(T)
|
|
if not T or not next(t) then return 0 end
|
|
|
|
local count = 0
|
|
for _ in pairs(T) do count = count + 1 end
|
|
return count
|
|
end
|
|
|
|
-- Get table slice from offset to length
|
|
function table.slice(values, offset, length)
|
|
local res = {}
|
|
local n = #values
|
|
-- default values for range
|
|
offset = offset or 0
|
|
if offset < 0 or offset > n then
|
|
return {}
|
|
end
|
|
length = length or n-offset
|
|
if length < 1 then
|
|
length = 1
|
|
elseif length > n-offset then
|
|
length = n-offset
|
|
end
|
|
|
|
for i = offset,offset+length-1 do
|
|
res[i-offset] = values[i]
|
|
end
|
|
return res
|
|
end
|
|
|
|
|
|
-- (Debug) Print contents of `tbl`, with indentation.
|
|
-- `indent` sets the initial level of indentation.
|
|
function table.dump(t, ident)
|
|
local output = ""
|
|
if not indent then indent = 0 end
|
|
|
|
-- if table has 0 index then display this key at start
|
|
if not (t[0] == nil) then
|
|
for k=0, #t do
|
|
local formatting = "\n" .. string.rep(" ", indent) .. k .. ": "
|
|
local v = t[k]
|
|
if type(v) == "table" then
|
|
v = "[" .. table.print(v, indent+1) .. "]"
|
|
elseif type(v) == 'boolean' then
|
|
v = tostring(v)
|
|
end
|
|
|
|
output = output .. formatting .. v
|
|
end
|
|
else
|
|
for k,v in pairs(t) do
|
|
local formatting = "\n" .. k .. ": "
|
|
local v = t[k]
|
|
if type(v) == "table" then
|
|
v = "[" .. table.print(v, indent+1) .. "]"
|
|
elseif type(v) == 'boolean' then
|
|
v = tostring(v)
|
|
end
|
|
|
|
output = output .. formatting .. v
|
|
end
|
|
end
|
|
return output
|
|
end
|
|
|
|
-- Find table key by value
|
|
function get_key_for_value( t, value )
|
|
for k,v in pairs(t) do
|
|
if v==value then return k end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--[[
|
|
Save Table to File
|
|
Load Table from File
|
|
v 1.0
|
|
|
|
Lua 5.2 compatible
|
|
|
|
Only Saves Tables, Numbers and Strings
|
|
Insides Table References are saved
|
|
Does not save Userdata, Metatables, Functions and indices of these
|
|
----------------------------------------------------
|
|
table.save( table , filename )
|
|
|
|
on failure: returns an error msg
|
|
|
|
----------------------------------------------------
|
|
table.load( filename or stringtable )
|
|
|
|
Loads a table that has been saved via the table.save function
|
|
|
|
on success: returns a previously saved table
|
|
on failure: returns as second argument an error msg
|
|
----------------------------------------------------
|
|
|
|
Licensed under the same terms as Lua itself.
|
|
]]--
|
|
do
|
|
-- declare local variables
|
|
--// exportstring( string )
|
|
--// returns a "Lua" portable version of the string
|
|
local function exportstring( s )
|
|
return string.format("%q", s)
|
|
end
|
|
|
|
--// The Save Function
|
|
function table.save( tbl,filename )
|
|
local charS,charE = " ","\n"
|
|
local file,err = io.open( filename, "wb" )
|
|
if err then return err end
|
|
|
|
-- initiate 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
|
|
function table.load( sfile )
|
|
local ftables,err = loadfile( sfile )
|
|
if err or not ftables() then return _,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
|
|
-- close do
|
|
end
|
|
|
|
-- ChillCode |