/serialize.lua
http://timprojectenchanter.googlecode.com/ · Lua · 113 lines · 82 code · 7 blank · 24 comment · 33 complexity · 4640ea608df9e55ae90ff0fee25846a9 MD5 · raw file
- ----------------------------------------------------------------------------
- -- Serialize tables.
- -- It works only for tables without cycles and without functions or
- -- userdata inside it.
- -- @release $Id: serialize.lua 34 2010-04-19 21:18:00Z rpusztai $
- ----------------------------------------------------------------------------
- local ipairs, pairs, type = ipairs, pairs, type
- local format = string.format
- local sort, tinsert = table.sort, table.insert
- --
- local value = nil
- ----------------------------------------------------------------------------
- -- Serializes a table.
- -- @param tab Table representing the session.
- -- @param outf Function used to generate the output.
- -- @param ind String with indentation pattern (default = "").
- -- @param pre String with indentation prefix (default = "").
- ----------------------------------------------------------------------------
- local function tabledump (tab, outf, ind, pre)
- local sep_n, sep, _n = ",\n", ", ", "\n"
- if (not ind) or (ind == "") then ind = ""; sep_n = ", "; _n = "" end
- if not pre then pre = "" end
- outf ("{")
- local p = pre..ind
- -- prepare list of keys
- local keys = { boolean = {}, number = {}, string = {} }
- local total = 0
- for key in pairs (tab) do
- total = total + 1
- local t = type(key)
- if t == "string" then
- tinsert (keys.string, key)
- else
- keys[t][key] = true
- end
- end
- local many = total > 5
- if not many then sep_n = sep; _n = " " end
- outf (_n)
- -- serialize entries with numeric keys
- if many then
- local _f,_s,_v = ipairs(tab)
- if _f(_s,_v) then outf (p) end
- end
- local num = keys.number
- local ok = false
- -- entries with automatic index
- for key, val in ipairs (tab) do
- value (val, outf, ind, p)
- outf (sep)
- num[key] = nil
- ok = true
- end
- if ok and many then outf (_n) end
- -- entries with explicit index
- for key in pairs (num) do
- if many then outf (p) end
- outf ("[")
- outf (key)
- outf ("] = ")
- value (tab[key], outf, ind, p)
- outf (sep_n)
- end
- -- serialize entries with boolean keys
- local tr = keys.boolean[true]
- if tr then
- outf (format ("%s[true] = ", many and p or ''))
- value (tab[true], outf, ind, p)
- outf (sep_n)
- end
- local fa = keys.boolean[false]
- if fa then
- outf (format ("%s[false] = ", many and p or ''))
- value (tab[false], outf, ind, p)
- outf (sep_n)
- end
- -- serialize entries with string keys
- sort (keys.string)
- for _, key in ipairs (keys.string) do
- outf (format ("%s[%q] = ", many and p or '', key))
- value (tab[key], outf, ind, p)
- outf (sep_n)
- end
- if many then outf (pre) end
- outf ("}")
- end
- --
- -- Serializes a value.
- --
- value = function (v, outf, ind, pre)
- local t = type (v)
- if t == "string" then
- outf (format ("%q", v))
- elseif t == "number" then
- outf (tostring(v))
- elseif t == "boolean" then
- outf (tostring(v))
- elseif t == "table" then
- tabledump (v, outf, ind, pre)
- else
- outf (format ("%q", tostring(v)))
- end
- end
- ----------------------------------------------------------------------------
- serialize = tabledump
- return tabledump