New, faster, stanza serialization
authorMatthew Wild <mwild1@gmail.com>
Wed, 10 Dec 2008 15:32:13 +0000 (15:32 +0000)
committerMatthew Wild <mwild1@gmail.com>
Wed, 10 Dec 2008 15:32:13 +0000 (15:32 +0000)
util/stanza.lua

index dceb0e7323603a1cd45d31c71df624220d113761..3f6c4b76dd884de2f88b4e3bf967209cb4d54069 100644 (file)
@@ -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