1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-10-28 23:14:57 +03:00

Avoid using xmlBuffer for serialization

Mostly an optimization to avoid xmlBuffer->xmlBuf conversions
and use the new code.
This commit is contained in:
Daniel Veillard
2012-08-07 15:15:04 +08:00
parent 7f713494ad
commit c15df7d4ee

103
tree.c
View File

@@ -1267,13 +1267,13 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
const xmlChar *cur = value, *end = cur + len; const xmlChar *cur = value, *end = cur + len;
const xmlChar *q; const xmlChar *q;
xmlEntityPtr ent; xmlEntityPtr ent;
xmlBufferPtr buffer; xmlBufPtr buf;
if (value == NULL) return(NULL); if (value == NULL) return(NULL);
buffer = xmlBufferCreateSize(0); buf = xmlBufCreateSize(0);
if (buffer == NULL) return(NULL); if (buf == NULL) return(NULL);
xmlBufferSetAllocationScheme(buffer, XML_BUFFER_ALLOC_HYBRID); xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_HYBRID);
q = cur; q = cur;
while ((cur < end) && (*cur != 0)) { while ((cur < end) && (*cur != 0)) {
@@ -1285,7 +1285,7 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
* Save the current text. * Save the current text.
*/ */
if (cur != q) { if (cur != q) {
if (xmlBufferAdd(buffer, q, cur - q)) if (xmlBufAdd(buf, q, cur - q))
goto out; goto out;
} }
q = cur; q = cur;
@@ -1362,20 +1362,20 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
if ((ent != NULL) && if ((ent != NULL) &&
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
if (xmlBufferCat(buffer, ent->content)) if (xmlBufCat(buf, ent->content))
goto out; goto out;
} else { } else {
/* /*
* Flush buffer so far * Flush buffer so far
*/ */
if (buffer->use) { if (!xmlBufIsEmpty(buf)) {
node = xmlNewDocText(doc, NULL); node = xmlNewDocText(doc, NULL);
if (node == NULL) { if (node == NULL) {
if (val != NULL) xmlFree(val); if (val != NULL) xmlFree(val);
goto out; goto out;
} }
node->content = xmlBufferDetach(buffer); node->content = xmlBufDetach(buf);
if (last == NULL) { if (last == NULL) {
last = ret = node; last = ret = node;
@@ -1417,13 +1417,13 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
q = cur; q = cur;
} }
if (charval != 0) { if (charval != 0) {
xmlChar buf[10]; xmlChar buffer[10];
int l; int l;
l = xmlCopyCharMultiByte(buf, charval); l = xmlCopyCharMultiByte(buffer, charval);
buf[l] = 0; buffer[l] = 0;
if (xmlBufferCat(buffer, buf)) if (xmlBufCat(buf, buffer))
goto out; goto out;
charval = 0; charval = 0;
} }
@@ -1435,14 +1435,14 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
/* /*
* Handle the last piece of text. * Handle the last piece of text.
*/ */
if (xmlBufferAdd(buffer, q, cur - q)) if (xmlBufAdd(buf, q, cur - q))
goto out; goto out;
} }
if (buffer->use) { if (!xmlBufIsEmpty(buf)) {
node = xmlNewDocText(doc, NULL); node = xmlNewDocText(doc, NULL);
if (node == NULL) goto out; if (node == NULL) goto out;
node->content = xmlBufferDetach(buffer); node->content = xmlBufDetach(buf);
if (last == NULL) { if (last == NULL) {
last = ret = node; last = ret = node;
@@ -1454,7 +1454,7 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
} }
out: out:
xmlBufferFree(buffer); xmlBufFree(buf);
return(ret); return(ret);
} }
@@ -1475,13 +1475,13 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
const xmlChar *cur = value; const xmlChar *cur = value;
const xmlChar *q; const xmlChar *q;
xmlEntityPtr ent; xmlEntityPtr ent;
xmlBufferPtr buffer; xmlBufPtr buf;
if (value == NULL) return(NULL); if (value == NULL) return(NULL);
buffer = xmlBufferCreateSize(0); buf = xmlBufCreateSize(0);
if (buffer == NULL) return(NULL); if (buf == NULL) return(NULL);
xmlBufferSetAllocationScheme(buffer, XML_BUFFER_ALLOC_HYBRID); xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_HYBRID);
q = cur; q = cur;
while (*cur != 0) { while (*cur != 0) {
@@ -1493,7 +1493,7 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
* Save the current text. * Save the current text.
*/ */
if (cur != q) { if (cur != q) {
if (xmlBufferAdd(buffer, q, cur - q)) if (xmlBufAdd(buf, q, cur - q))
goto out; goto out;
} }
q = cur; q = cur;
@@ -1558,16 +1558,16 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
if ((ent != NULL) && if ((ent != NULL) &&
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
if (xmlBufferCat(buffer, ent->content)) if (xmlBufCat(buf, ent->content))
goto out; goto out;
} else { } else {
/* /*
* Flush buffer so far * Flush buffer so far
*/ */
if (buffer->use) { if (!xmlBufIsEmpty(buf)) {
node = xmlNewDocText(doc, NULL); node = xmlNewDocText(doc, NULL);
node->content = xmlBufferDetach(buffer); node->content = xmlBufDetach(buf);
if (last == NULL) { if (last == NULL) {
last = ret = node; last = ret = node;
@@ -1608,13 +1608,13 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
q = cur; q = cur;
} }
if (charval != 0) { if (charval != 0) {
xmlChar buf[10]; xmlChar buffer[10];
int len; int len;
len = xmlCopyCharMultiByte(buf, charval); len = xmlCopyCharMultiByte(buffer, charval);
buf[len] = 0; buffer[len] = 0;
if (xmlBufferCat(buffer, buf)) if (xmlBufCat(buf, buffer))
goto out; goto out;
charval = 0; charval = 0;
} }
@@ -1625,12 +1625,12 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
/* /*
* Handle the last piece of text. * Handle the last piece of text.
*/ */
xmlBufferAdd(buffer, q, cur - q); xmlBufAdd(buf, q, cur - q);
} }
if (buffer->use) { if (!xmlBufIsEmpty(buf)) {
node = xmlNewDocText(doc, NULL); node = xmlNewDocText(doc, NULL);
node->content = xmlBufferDetach(buffer); node->content = xmlBufDetach(buf);
if (last == NULL) { if (last == NULL) {
last = ret = node; last = ret = node;
@@ -1640,7 +1640,7 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
} }
out: out:
xmlBufferFree(buffer); xmlBufFree(buf);
return(ret); return(ret);
} }
@@ -5422,16 +5422,15 @@ xmlNodeGetContent(xmlNodePtr cur)
switch (cur->type) { switch (cur->type) {
case XML_DOCUMENT_FRAG_NODE: case XML_DOCUMENT_FRAG_NODE:
case XML_ELEMENT_NODE:{ case XML_ELEMENT_NODE:{
xmlBufferPtr buffer; xmlBufPtr buf;
xmlChar *ret; xmlChar *ret;
buffer = xmlBufferCreateSize(64); buf = xmlBufCreateSize(64);
if (buffer == NULL) if (buf == NULL)
return (NULL); return (NULL);
xmlNodeBufGetContent(buffer, cur); xmlBufGetNodeContent(buf, cur);
ret = buffer->content; ret = xmlBufDetach(buf);
buffer->content = NULL; xmlBufFree(buf);
xmlBufferFree(buffer);
return (ret); return (ret);
} }
case XML_ATTRIBUTE_NODE: case XML_ATTRIBUTE_NODE:
@@ -5443,7 +5442,7 @@ xmlNodeGetContent(xmlNodePtr cur)
return (NULL); return (NULL);
case XML_ENTITY_REF_NODE:{ case XML_ENTITY_REF_NODE:{
xmlEntityPtr ent; xmlEntityPtr ent;
xmlBufferPtr buffer; xmlBufPtr buf;
xmlChar *ret; xmlChar *ret;
/* lookup entity declaration */ /* lookup entity declaration */
@@ -5451,15 +5450,14 @@ xmlNodeGetContent(xmlNodePtr cur)
if (ent == NULL) if (ent == NULL)
return (NULL); return (NULL);
buffer = xmlBufferCreate(); buf = xmlBufCreate();
if (buffer == NULL) if (buf == NULL)
return (NULL); return (NULL);
xmlNodeBufGetContent(buffer, cur); xmlBufGetNodeContent(buf, cur);
ret = buffer->content; ret = xmlBufDetach(buf);
buffer->content = NULL; xmlBufFree(buf);
xmlBufferFree(buffer);
return (ret); return (ret);
} }
case XML_ENTITY_NODE: case XML_ENTITY_NODE:
@@ -5474,18 +5472,17 @@ xmlNodeGetContent(xmlNodePtr cur)
case XML_DOCB_DOCUMENT_NODE: case XML_DOCB_DOCUMENT_NODE:
#endif #endif
case XML_HTML_DOCUMENT_NODE: { case XML_HTML_DOCUMENT_NODE: {
xmlBufferPtr buffer; xmlBufPtr buf;
xmlChar *ret; xmlChar *ret;
buffer = xmlBufferCreate(); buf = xmlBufCreate();
if (buffer == NULL) if (buf == NULL)
return (NULL); return (NULL);
xmlNodeBufGetContent(buffer, (xmlNodePtr) cur); xmlBufGetNodeContent(buf, (xmlNodePtr) cur);
ret = buffer->content; ret = xmlBufDetach(buf);
buffer->content = NULL; xmlBufFree(buf);
xmlBufferFree(buffer);
return (ret); return (ret);
} }
case XML_NAMESPACE_DECL: { case XML_NAMESPACE_DECL: {