applied patch from Geert Jansen to implement the save function to a

* xmlsave.c xmlIO.c include/libxml/xmlIO.h include/libxml/xmlsave.h:
  applied patch from Geert Jansen to implement the save function to
  a xmlBuffer, and a bit of cleanup.
Daniel
diff --git a/ChangeLog b/ChangeLog
index 61a0a3d..74f8e11 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Nov  9 09:54:54 CET 2005 Daniel Veillard <daniel@veillard.com>
+
+	* xmlsave.c xmlIO.c include/libxml/xmlIO.h include/libxml/xmlsave.h:
+	  applied patch from Geert Jansen to implement the save function to 
+	  a xmlBuffer, and a bit of cleanup.
+
 Mon Nov  7 14:58:39 CET 2005 Kasimier Buchcik <libxml2-cvs@cazic.net>
 
 	* xmlschemas.c xmlschemastypes.c: Fixed the type of the
diff --git a/include/libxml/xmlIO.h b/include/libxml/xmlIO.h
index e67b6e5..eea9ed6 100644
--- a/include/libxml/xmlIO.h
+++ b/include/libxml/xmlIO.h
@@ -232,6 +232,10 @@
 					 xmlCharEncodingHandlerPtr encoder);
 
 XMLPUBFUN xmlOutputBufferPtr XMLCALL
+	xmlOutputBufferCreateBuffer	(xmlBufferPtr buffer,
+					 xmlCharEncodingHandlerPtr encoder);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
 	xmlOutputBufferCreateFd		(int fd,
 					 xmlCharEncodingHandlerPtr encoder);
 
diff --git a/include/libxml/xmlsave.h b/include/libxml/xmlsave.h
index 766a2ac..c71c71a 100644
--- a/include/libxml/xmlsave.h
+++ b/include/libxml/xmlsave.h
@@ -45,14 +45,12 @@
 		xmlSaveToFilename	(const char *filename,
 					 const char *encoding,
 					 int options);
-/******
-  Not yet implemented.
 
 XMLPUBFUN xmlSaveCtxtPtr XMLCALL
 		xmlSaveToBuffer		(xmlBufferPtr buffer,
 					 const char *encoding,
 					 int options);
- ******/
+
 XMLPUBFUN xmlSaveCtxtPtr XMLCALL
 		xmlSaveToIO		(xmlOutputWriteCallback iowrite,
 					 xmlOutputCloseCallback ioclose,
diff --git a/xmlIO.c b/xmlIO.c
index 1dffa27..9e302ae 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -862,6 +862,41 @@
     return(ret);
 }
 
+#ifdef LIBXML_OUTPUT_ENABLED
+/**
+ * xmlBufferWrite:
+ * @context:  the xmlBuffer
+ * @buffer:  the data to write
+ * @len:  number of bytes to write
+ *
+ * Write @len bytes from @buffer to the xml buffer
+ *
+ * Returns the number of bytes written
+ */
+static int
+xmlBufferWrite (void * context, const char * buffer, int len) {
+    int ret;
+
+    ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
+    if (ret != 0)
+        return(-1);
+    return(len);
+}
+
+/**
+ * xmlBufferClose:
+ * @context:  the xmlBuffer
+ *
+ * Close a buffer
+ *
+ * Returns 0 or -1 in case of error
+ */
+static int
+xmlBufferClose (void * context) {
+    return(0);
+}
+#endif
+
 #ifdef HAVE_ZLIB_H
 /************************************************************************
  *									*
@@ -2438,6 +2473,33 @@
 
     return(ret);
 }
+
+/**
+ * xmlOutputBufferCreateBuffer:
+ * @buffer:  a xmlBufferPtr
+ * @encoder:  the encoding converter or NULL
+ *
+ * Create a buffered output for the progressive saving to a xmlBuffer
+ *
+ * Returns the new parser output or NULL
+ */
+xmlOutputBufferPtr
+xmlOutputBufferCreateBuffer(xmlBufferPtr buffer,
+                            xmlCharEncodingHandlerPtr encoder) {
+    xmlOutputBufferPtr ret;
+
+    if (buffer == NULL) return(NULL);
+
+    ret = xmlAllocOutputBuffer(encoder);
+    if (ret != NULL) {
+        ret->context = buffer;
+        ret->writecallback = xmlBufferWrite;
+        ret->closecallback = xmlBufferClose;
+    }
+
+    return(ret);
+}
+
 #endif /* LIBXML_OUTPUT_ENABLED */
 
 /**
diff --git a/xmlregexp.c b/xmlregexp.c
index fce1f1d..97e9be7 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -1526,8 +1526,8 @@
 		} else {
 		    newstate = xmlRegNewState(ctxt);
 		    xmlRegStatePush(ctxt, newstate);
-		    ctxt->state = newstate;
 		}
+		ctxt->state = newstate;
 		xmlFAGenerateCountedTransition(ctxt, atom->stop,
 			                       newstate, counter);
 	    }
diff --git a/xmlsave.c b/xmlsave.c
index 98d5dbe..ba35f32 100644
--- a/xmlsave.c
+++ b/xmlsave.c
@@ -344,9 +344,9 @@
         ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0;
     }
 
-	if (xmlSaveNoEmptyTags) {
-		ctxt->options |= XML_SAVE_NO_EMPTY;
-	}
+    if (xmlSaveNoEmptyTags) {
+	ctxt->options |= XML_SAVE_NO_EMPTY;
+    }
 }
 
 /**
@@ -400,10 +400,10 @@
      * Use the options
      */
 
-	/* Re-check this option as it may already have been set */
-	if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) {
-		options |= XML_SAVE_NO_EMPTY;
-	}
+    /* Re-check this option as it may already have been set */
+    if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) {
+	options |= XML_SAVE_NO_EMPTY;
+    }
 
     ret->options = options;
     if (options & XML_SAVE_FORMAT)
@@ -1477,13 +1477,36 @@
  * with the encoding and the options given
  *
  * Returns a new serialization context or NULL in case of error.
+ */
+
 xmlSaveCtxtPtr
 xmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options)
 {
-    TODO
-    return(NULL);
+    xmlSaveCtxtPtr ret;
+    xmlOutputBufferPtr out_buff;
+    xmlCharEncodingHandlerPtr handler;
+
+    ret = xmlNewSaveCtxt(encoding, options);
+    if (ret == NULL) return(NULL);
+
+    if (encoding != NULL) {
+        handler = xmlFindCharEncodingHandler(encoding);
+        if (handler == NULL) {
+            xmlFree(ret);
+            return(NULL);
+        }
+    } else
+        handler = NULL;
+    out_buff = xmlOutputBufferCreateBuffer(buffer, handler);
+    if (out_buff == NULL) {
+        xmlFree(ret);
+        if (handler) xmlCharEncCloseFunc(handler);
+        return(NULL);
+    }
+
+    ret->buf = out_buff;
+    return(ret);
 }
- */
 
 /**
  * xmlSaveToIO: