summaryrefslogtreecommitdiff
path: root/worldedit/table_save.lua
diff options
context:
space:
mode:
authorAnthony Zhang <azhang9@gmail.com>2012-10-01 16:19:09 -0400
committerAnthony Zhang <azhang9@gmail.com>2012-10-01 16:20:20 -0400
commit12dfbd198d117b9d76e86a056f79b7276e8db0a6 (patch)
tree246020297cc9040c6365c8cec56544d503ff5b5c /worldedit/table_save.lua
parenta82ab9176f831b4f1beb9d2f3c3a7d582abf8b44 (diff)
Use modpack for easier installation (idea is taken from cornernote's mod format), fix some grammar in API reference, move chat command reference and API reference to separate files.
Diffstat (limited to 'worldedit/table_save.lua')
-rw-r--r--worldedit/table_save.lua133
1 files changed, 133 insertions, 0 deletions
diff --git a/worldedit/table_save.lua b/worldedit/table_save.lua
new file mode 100644
index 0000000..cbc18ae
--- /dev/null
+++ b/worldedit/table_save.lua
@@ -0,0 +1,133 @@
+--[[
+ 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 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 \ No newline at end of file