# HG changeset patch # User Matthew Wild # Date 1228923133 0 # Node ID 6c09127b50fb6cf547dcd3721481f7f4cc3701e2 # Parent 0d44fc0a78f80b1cb74bb3c49dcef7b4662384d5 New, faster, stanza serialization diff -r 0d44fc0a78f8 -r 6c09127b50fb util/stanza.lua --- a/util/stanza.lua Wed Dec 10 15:29:14 2008 +0000 +++ b/util/stanza.lua Wed Dec 10 15:32:13 2008 +0000 @@ -20,6 +20,7 @@ local t_insert = table.insert; local t_remove = table.remove; +local t_concat = table.concat; local s_format = string.format; local tostring = tostring; local setmetatable = setmetatable; @@ -27,10 +28,10 @@ local ipairs = ipairs; local type = type; local next = next; -local print = print; +local print = print; local unpack = unpack; local s_gsub = string.gsub; -local os = os; +local os = os; local do_pretty_printing = not os.getenv("WINDIR"); local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; @@ -116,23 +117,36 @@ local xml_escape = xml_escape; -function stanza_mt.__tostring(t) - local children_text = ""; +local function dostring(t, buf, self, xml_escape) + t_insert(buf, "<"); + t_insert(buf, t.name); + for k, v in pairs(t.attr) do if type(k) == "string" then + t_insert(buf, " "); + t_insert(buf, k); + t_insert(buf, "='"); + t_insert(buf, (xml_escape(tostring(v)))); + t_insert(buf, "'"); + end end + t_insert(buf, ">"); for n, child in ipairs(t) do - if type(child) == "string" then - children_text = children_text .. xml_escape(child); + if child.name then + self(child, buf, self, xml_escape); else - children_text = children_text .. tostring(child); + t_insert(buf, (xml_escape(child))); end end + t_insert(buf, ""); +end - local attr_string = ""; - if t.attr then - for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end - end - return s_format("<%s%s>%s", t.name, attr_string, children_text, t.name); +function stanza_mt.__tostring(t) + local buf = {}; + dostring(t, buf, dostring, xml_escape); + return t_concat(buf); end + function stanza_mt.top_tag(t) local attr_string = ""; if t.attr then