aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2008-12-10 15:32:13 +0000
committerMatthew Wild <mwild1@gmail.com>2008-12-10 15:32:13 +0000
commit8e253779f90cc222a82cdab224def4cf9813fdac (patch)
tree6d54aac465aafb1d184435d739c2e80997eb63f2
parent2ad1dbfa75b21cdab3fa200a641d1e2848e71df0 (diff)
downloadprosody-8e253779f90cc222a82cdab224def4cf9813fdac.tar.gz
prosody-8e253779f90cc222a82cdab224def4cf9813fdac.zip
New, faster, stanza serialization
-rw-r--r--util/stanza.lua38
1 files changed, 26 insertions, 12 deletions
diff --git a/util/stanza.lua b/util/stanza.lua
index dceb0e73..3f6c4b76 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -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 pairs = pairs;
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 @@ end
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, "</");
+ t_insert(buf, t.name);
+ 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</%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