Cleanup, bug fixing, entities improvement, more documentation, Daniel.
diff --git a/tree.c b/tree.c
index aae8dbe..a477934 100644
--- a/tree.c
+++ b/tree.c
@@ -372,22 +372,34 @@
CHAR *val;
const CHAR *cur = value;
const CHAR *q;
+ xmlEntityPtr ent;
if (value == NULL) return(NULL);
q = cur;
while ((*cur != 0) && (cur - value < len)) {
if (*cur == '&') {
+ /*
+ * Save the current text.
+ */
if (cur != q) {
- node = xmlNewDocTextLen(doc, q, cur - q);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
+ xmlNodeAddContentLen(last, q, cur - q);
+ } else {
+ node = xmlNewDocTextLen(doc, q, cur - q);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
}
+ /*
+ * Read the entity string
+ */
cur++;
q = cur;
while ((*cur != 0) && (cur - value < len) && (*cur != ';')) cur++;
@@ -397,14 +409,32 @@
return(ret);
}
if (cur != q) {
+ /*
+ * Predefined entities don't generate nodes
+ */
val = xmlStrndup(q, cur - q);
- node = xmlNewReference(doc, val);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ ent = xmlGetDocEntity(doc, val);
+ if ((ent != NULL) &&
+ (ent->type == XML_INTERNAL_PREDEFINED_ENTITY)) {
+ if (last == NULL) {
+ node = xmlNewDocText(doc, ent->content);
+ last = ret = node;
+ } else
+ xmlNodeAddContent(last, ent->content);
+
+ } else {
+ /*
+ * Create a new REFERENCE_REF node
+ */
+ node = xmlNewReference(doc, val);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
free(val);
}
@@ -414,13 +444,21 @@
cur++;
}
if (cur != q) {
- node = xmlNewDocTextLen(doc, q, cur - q);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ /*
+ * Handle the last piece of text.
+ */
+ if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
+ xmlNodeAddContentLen(last, q, cur - q);
+ } else {
+ node = xmlNewDocTextLen(doc, q, cur - q);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
}
return(ret);
@@ -442,22 +480,34 @@
CHAR *val;
const CHAR *cur = value;
const CHAR *q;
+ xmlEntityPtr ent;
if (value == NULL) return(NULL);
q = cur;
while (*cur != 0) {
if (*cur == '&') {
+ /*
+ * Save the current text.
+ */
if (cur != q) {
- node = xmlNewDocTextLen(doc, q, cur - q);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
+ xmlNodeAddContentLen(last, q, cur - q);
+ } else {
+ node = xmlNewDocTextLen(doc, q, cur - q);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
}
+ /*
+ * Read the entity string
+ */
cur++;
q = cur;
while ((*cur != 0) && (*cur != ';')) cur++;
@@ -467,14 +517,33 @@
return(ret);
}
if (cur != q) {
+ /*
+ * Predefined entities don't generate nodes
+ */
val = xmlStrndup(q, cur - q);
- node = xmlNewReference(doc, val);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ ent = xmlGetDocEntity(doc, val);
+ if ((ent != NULL) &&
+ (ent->type == XML_INTERNAL_PREDEFINED_ENTITY)) {
+ if (last == NULL) {
+ node = xmlNewDocText(doc, ent->content);
+ last = ret = node;
+ } else
+ xmlNodeAddContent(last, ent->content);
+
+ } else {
+ /*
+ * Create a new REFERENCE_REF node
+ */
+ val = xmlStrndup(q, cur - q);
+ node = xmlNewReference(doc, val);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
free(val);
}
@@ -484,13 +553,21 @@
cur++;
}
if (cur != q) {
- node = xmlNewDocTextLen(doc, q, cur - q);
- if (node == NULL) return(ret);
- if (last == NULL)
- last = ret = node;
- else {
- last->next = node;
- last = node;
+ /*
+ * Handle the last piece of text.
+ */
+ if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
+ xmlNodeAddContentLen(last, q, cur - q);
+ } else {
+ node = xmlNewDocTextLen(doc, q, cur - q);
+ if (node == NULL) return(ret);
+ if (last == NULL)
+ last = ret = node;
+ else {
+ last->next = node;
+ node->prev = last;
+ last = node;
+ }
}
}
return(ret);
@@ -2129,46 +2206,3 @@
return(ret * sizeof(CHAR));
}
-/************************************************************************
- * *
- * Debug *
- * *
- ************************************************************************/
-
-#ifdef STANDALONE
-int main(void) {
- xmlDocPtr doc;
- xmlNodePtr tree, subtree;
- xmlNsPtr ns1;
- xmlNsPtr ns2;
-
- /*
- * build a fake XML document
- */
- doc = xmlNewDoc("1.0");
- ns1 = xmlNewNs(doc, "http://www.ietf.org/standards/dav/", "D");
- ns2 = xmlNewNs(doc, "http://www.w3.com/standards/z39.50/", "Z");
- doc->root = xmlNewDocNode(doc, ns1, "multistatus", NULL);
- tree = xmlNewChild(doc->root, NULL, "response", NULL);
- subtree = xmlNewChild(tree, NULL, "prop", NULL);
- xmlNewChild(subtree, ns2, "Authors", NULL);
- subtree = xmlNewChild(tree, NULL, "status", "HTTP/1.1 420 Method Failure");
- tree = xmlNewChild(doc->root, NULL, "response", NULL);
- subtree = xmlNewChild(tree, NULL, "prop", NULL);
- xmlNewChild(subtree, ns2, "Copyright-Owner", NULL);
- subtree = xmlNewChild(tree, NULL, "status", "HTTP/1.1 409 Conflict");
- tree = xmlNewChild(doc->root, NULL, "responsedescription",
- "Copyright Owner can not be deleted or altered");
-
- /*
- * print it.
- */
- xmlDocDump(stdout, doc);
-
- /*
- * free it.
- */
- xmlFreeDoc(doc);
- return(0);
-}
-#endif