Diff

util/stanza.lua @ 613:6c09127b50fb

New, faster, stanza serialization
author Matthew Wild <mwild1@gmail.com>
date Wed, 10 Dec 2008 15:32:13 +0000
parent 519:cccd610a0ef9
child 615:4ae3e81513f3
line wrap: on
line diff
--- 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, "</");
+	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