optimize indentation based on the new context Daniel

* xmlsave.c: optimize indentation based on the new context
Daniel
diff --git a/xmlsave.c b/xmlsave.c
index 2f8afcf..583fb58 100644
--- a/xmlsave.c
+++ b/xmlsave.c
@@ -17,6 +17,8 @@
 #ifdef LIBXML_HTML_ENABLED
 #include <libxml/HTMLtree.h>
 
+#define MAX_INDENT 60
+
 /************************************************************************
  *									*
  *			XHTML detection					*
@@ -83,6 +85,9 @@
     int options;
     int level;
     int format;
+    char indent[MAX_INDENT + 1];
+    int indent_nr;
+    int indent_size;
 };
 
 /************************************************************************
@@ -139,6 +144,29 @@
  *			Allocation and deallocation			*
  *									*
  ************************************************************************/
+/**
+ * xmlSaveCtxtInit:
+ * @ctxt: the saving context
+ *
+ * Initialize a saving context
+ */
+static void
+xmlSaveCtxtInit(xmlSaveCtxtPtr ctxt)
+{
+    int i;
+
+    if (ctxt == NULL) return;
+    if (xmlTreeIndentString == NULL) {
+        memset(&ctxt->indent[0], 0, MAX_INDENT + 1);
+    } else {
+	ctxt->indent_size = xmlStrlen((const xmlChar *) xmlTreeIndentString);
+	ctxt->indent_nr = MAX_INDENT / ctxt->indent_size;
+	for (i = 0;i < ctxt->indent_nr;i++)
+	    memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString,
+		   ctxt->indent_size);
+        ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0;
+    }
+}
 
 /**
  * xmlFreeSaveCtxt:
@@ -182,6 +210,8 @@
 	}
         ret->encoding = xmlStrdup((const xmlChar *)encoding);
     }
+    xmlSaveCtxtInit(ret);
+
     return(ret);
 }
 
@@ -378,7 +408,6 @@
  */
 static void
 xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
-    int i;
     xmlOutputBufferPtr buf;
 
     if (cur == NULL) return;
@@ -386,8 +415,10 @@
     while (cur != NULL) {
 	if ((ctxt->format) && (xmlIndentTreeOutput) &&
 	    (cur->type == XML_ELEMENT_NODE))
-	    for (i = 0;i < ctxt->level;i++)
-		xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+	    xmlOutputBufferWrite(buf, ctxt->indent_size *
+	                         (ctxt->level > ctxt->indent_nr ? 
+				  ctxt->indent_nr : ctxt->level),
+				 ctxt->indent);
         xmlNodeDumpOutputInternal(ctxt, cur);
 	if (ctxt->format) {
 	    xmlOutputBufferWriteString(buf, "\n");
@@ -404,7 +435,7 @@
  */
 static void
 xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
-    int i, format;
+    int format;
     xmlNodePtr tmp;
     xmlChar *start, *end;
     xmlOutputBufferPtr buf;
@@ -568,8 +599,10 @@
 	xmlNodeListDumpOutput(ctxt, cur->children);
 	if (ctxt->level > 0) ctxt->level--;
 	if ((xmlIndentTreeOutput) && (ctxt->format))
-	    for (i = 0;i < ctxt->level;i++)
-		xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+	    xmlOutputBufferWrite(buf, ctxt->indent_size *
+	                         (ctxt->level > ctxt->indent_nr ? 
+				  ctxt->indent_nr : ctxt->level),
+				 ctxt->indent);
     }
     xmlOutputBufferWriteString(buf, "</");
     if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
@@ -830,7 +863,6 @@
  */
 static void
 xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
-    int i;
     xmlOutputBufferPtr buf;
 
     if (cur == NULL) return;
@@ -838,8 +870,10 @@
     while (cur != NULL) {
 	if ((ctxt->format) && (xmlIndentTreeOutput) &&
 	    (cur->type == XML_ELEMENT_NODE))
-	    for (i = 0;i < ctxt->level;i++)
-		xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+	    xmlOutputBufferWrite(buf, ctxt->indent_size *
+	                         (ctxt->level > ctxt->indent_nr ? 
+				  ctxt->indent_nr : ctxt->level),
+				 ctxt->indent);
         xhtmlNodeDumpOutput(ctxt, cur);
 	if (ctxt->format) {
 	    xmlOutputBufferWriteString(buf, "\n");
@@ -861,7 +895,7 @@
  */
 static void
 xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
-    int i, format;
+    int format;
     xmlNodePtr tmp;
     xmlChar *start, *end;
     xmlOutputBufferPtr buf;
@@ -1098,8 +1132,10 @@
 	xhtmlNodeListDumpOutput(ctxt, cur->children);
 	if (ctxt->level > 0) ctxt->level--;
 	if ((xmlIndentTreeOutput) && (format))
-	    for (i = 0;i < ctxt->level;i++)
-		xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+	    xmlOutputBufferWrite(buf, ctxt->indent_size *
+	                         (ctxt->level > ctxt->indent_nr ? 
+				  ctxt->indent_nr : ctxt->level),
+				 ctxt->indent);
     }
     xmlOutputBufferWriteString(buf, "</");
     if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
@@ -1570,6 +1606,7 @@
     ctxt.level = level;
     ctxt.format = format;
     ctxt.encoding = (const xmlChar *) encoding;
+    xmlSaveCtxtInit(&ctxt);
 
 #ifdef LIBXML_HTML_ENABLED
     dtd = xmlGetIntSubset(doc);
@@ -1663,6 +1700,7 @@
     ctxt.level = 0;
     ctxt.format = format;
     ctxt.encoding = (const xmlChar *) txt_encoding;
+    xmlSaveCtxtInit(&ctxt);
     xmlDocContentDumpOutput(&ctxt, out_doc);
     xmlOutputBufferFlush(out_buff);
     if (out_buff->conv != NULL) {
@@ -1779,6 +1817,7 @@
     ctxt.level = 0;
     ctxt.format = format;
     ctxt.encoding = (const xmlChar *) encoding;
+    xmlSaveCtxtInit(&ctxt);
     xmlDocContentDumpOutput(&ctxt, cur);
 
     ret = xmlOutputBufferClose(buf);
@@ -1821,6 +1860,7 @@
     ctxt.level = 0;
     ctxt.format = 0;
     ctxt.encoding = (const xmlChar *) encoding;
+    xmlSaveCtxtInit(&ctxt);
     xmlDocContentDumpOutput(&ctxt, cur);
     ret = xmlOutputBufferClose(buf);
     return(ret);
@@ -1853,6 +1893,7 @@
     ctxt.level = 0;
     ctxt.format = format;
     ctxt.encoding = (const xmlChar *) encoding;
+    xmlSaveCtxtInit(&ctxt);
     xmlDocContentDumpOutput(&ctxt, cur);
     ret = xmlOutputBufferClose(buf);
     return (ret);
@@ -1906,6 +1947,7 @@
     ctxt.level = 0;
     ctxt.format = format;
     ctxt.encoding = (const xmlChar *) encoding;
+    xmlSaveCtxtInit(&ctxt);
 
     xmlDocContentDumpOutput(&ctxt, cur);