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: