added a new API to split a QName without generating any memory allocation
* tree.c include/libxml/tree.h: added a new API to split a
QName without generating any memory allocation
* valid.c: fixed another problem with namespaces on element
in mixed content case
* python/tests/reader2.py: updated the testcase with
Bjorn Reese fix to reader for unsignificant white space
* parser.c HTMLparser.c: cleanup.
Daniel
diff --git a/ChangeLog b/ChangeLog
index a5f487e..a1bb3b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sun Aug 3 21:02:30 EDT 2003 Daniel Veillard <daniel@veillard.com>
+
+ * tree.c include/libxml/tree.h: added a new API to split a
+ QName without generating any memory allocation
+ * valid.c: fixed another problem with namespaces on element
+ in mixed content case
+ * python/tests/reader2.py: updated the testcase with
+ Bjorn Reese fix to reader for unsignificant white space
+ * parser.c HTMLparser.c: cleanup.
+
Sun Aug 3 20:55:40 EDT 2003 Daniel Veillard <daniel@veillard.com>
* catalog.c: trying to fix #118754 of possible recursion in the
diff --git a/HTMLparser.c b/HTMLparser.c
index 85be52d..d45eac2 100644
--- a/HTMLparser.c
+++ b/HTMLparser.c
@@ -4331,7 +4331,7 @@
*/
static int
htmlParseLookupSequence(htmlParserCtxtPtr ctxt, xmlChar first,
- xmlChar next, xmlChar third, int comment) {
+ xmlChar next, xmlChar third, int comment) {
int base, len;
htmlParserInputPtr in;
const xmlChar *buf;
diff --git a/include/libxml/tree.h b/include/libxml/tree.h
index c8467e8..4ca3c9a 100644
--- a/include/libxml/tree.h
+++ b/include/libxml/tree.h
@@ -556,6 +556,9 @@
int len);
xmlChar * xmlSplitQName2 (const xmlChar *name,
xmlChar **prefix);
+const xmlChar * xmlSplitQName3 (const xmlChar *name,
+ int *len);
+
/*
* Handling Buffers.
*/
diff --git a/parser.c b/parser.c
index 1291533..6e44896 100644
--- a/parser.c
+++ b/parser.c
@@ -1789,7 +1789,7 @@
c = *cur;
*prefix = ret;
if (c == 0) {
- return(xmlStrndup("", 0));
+ return(xmlStrndup(BAD_CAST "", 0));
}
len = 0;
diff --git a/python/tests/reader2.py b/python/tests/reader2.py
index afc3586..e325227 100755
--- a/python/tests/reader2.py
+++ b/python/tests/reader2.py
@@ -63,17 +63,17 @@
"""
expect="""10,test
1,test
-3,#text
+14,#text
1,x
1,c
3,#text
15,c
15,x
-3,#text
+14,#text
1,b
3,#text
15,b
-3,#text
+14,#text
15,test
"""
res=""
@@ -113,11 +113,11 @@
tst_ent = """<x>hello</x>"""
expect="""10 test
1 test
-3 #text
+14 #text
1 x
3 #text
15 x
-3 #text
+14 #text
15 test
"""
res=""
@@ -165,19 +165,19 @@
</test>"""
expect="""10 test 0
1 test 0
-3 #text 1
+14 #text 1
1 x 1
1 y 2
3 #text 3
15 y 2
15 x 1
-3 #text 1
+14 #text 1
1 x 1
1 y 2
3 #text 3
15 y 2
15 x 1
-3 #text 1
+14 #text 1
15 test 0
"""
res=""
@@ -218,11 +218,11 @@
</test>"""
expect="""10 test 0
1 test 0
-3 #text 1
+14 #text 1
5 x 1
-3 #text 1
+14 #text 1
5 x 1
-3 #text 1
+14 #text 1
15 test 0
"""
res=""
diff --git a/tree.c b/tree.c
index 114989e..ca1a7bb 100644
--- a/tree.c
+++ b/tree.c
@@ -236,6 +236,43 @@
return(ret);
}
+/**
+ * xmlSplitQName3:
+ * @name: the full QName
+ * @len: an int *
+ *
+ * parse an XML qualified name string,i
+ *
+ * returns NULL if it is not a Qualified Name, otherwise, update len
+ * with the lenght in byte of the prefix and return a pointer
+ */
+
+const xmlChar *
+xmlSplitQName3(const xmlChar *name, int *len) {
+ int l = 0;
+
+ if (name == NULL) return(NULL);
+ if (len == NULL) return(NULL);
+
+ /* nasty but valid */
+ if (name[0] == ':')
+ return(NULL);
+
+ /*
+ * we are not trying to validate but just to cut, and yes it will
+ * work even if this is as set of UTF-8 encoded chars
+ */
+ while ((name[l] != 0) && (name[l] != ':'))
+ l++;
+
+ if (name[l] == 0)
+ return(NULL);
+
+ *len = l;
+
+ return(&name[l+1]);
+}
+
/************************************************************************
* *
* Check Name, NCName and QName strings *
diff --git a/valid.c b/valid.c
index 9dee4bb..9a261f1 100644
--- a/valid.c
+++ b/valid.c
@@ -5059,24 +5059,55 @@
static int
xmlValidateCheckMixed(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
xmlElementContentPtr cont, const xmlChar *qname) {
- while (cont != NULL) {
- if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) {
- if (xmlStrEqual(cont->name, qname))
- return(1);
- } else if ((cont->type == XML_ELEMENT_CONTENT_OR) &&
- (cont->c1 != NULL) &&
- (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){
- if (xmlStrEqual(cont->c1->name, qname))
- return(1);
- } else if ((cont->type != XML_ELEMENT_CONTENT_OR) ||
- (cont->c1 == NULL) ||
- (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){
- /* Internal error !!! */
- xmlGenericError(xmlGenericErrorContext,
- "Internal: MIXED struct bad\n");
- break;
+ const xmlChar *name;
+ int plen;
+ name = xmlSplitQName3(qname, &plen);
+
+ if (name == NULL) {
+ while (cont != NULL) {
+ if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) {
+ if ((cont->prefix == NULL) && (xmlStrEqual(cont->name, qname)))
+ return(1);
+ } else if ((cont->type == XML_ELEMENT_CONTENT_OR) &&
+ (cont->c1 != NULL) &&
+ (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){
+ if ((cont->c1->prefix == NULL) &&
+ (xmlStrEqual(cont->c1->name, qname)))
+ return(1);
+ } else if ((cont->type != XML_ELEMENT_CONTENT_OR) ||
+ (cont->c1 == NULL) ||
+ (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){
+ /* Internal error !!! */
+ xmlGenericError(xmlGenericErrorContext,
+ "Internal: MIXED struct bad\n");
+ break;
+ }
+ cont = cont->c2;
}
- cont = cont->c2;
+ } else {
+ while (cont != NULL) {
+ if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) {
+ if ((cont->prefix != NULL) &&
+ (xmlStrncmp(cont->prefix, qname, plen) == 0) &&
+ (xmlStrEqual(cont->name, name)))
+ return(1);
+ } else if ((cont->type == XML_ELEMENT_CONTENT_OR) &&
+ (cont->c1 != NULL) &&
+ (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){
+ if ((cont->c1->prefix != NULL) &&
+ (xmlStrncmp(cont->c1->prefix, qname, plen) == 0) &&
+ (xmlStrEqual(cont->c1->name, name)))
+ return(1);
+ } else if ((cont->type != XML_ELEMENT_CONTENT_OR) ||
+ (cont->c1 == NULL) ||
+ (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){
+ /* Internal error !!! */
+ xmlGenericError(xmlGenericErrorContext,
+ "Internal: MIXED struct bad\n");
+ break;
+ }
+ cont = cont->c2;
+ }
}
return(0);
}