mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-30 22:43:14 +03:00
Bug fixes new Xinclude tests:
- nanoftp.c: fixed gcc 2.95 new warnings - SAX.c: fixed a stupid bug - tree.c: fixed a formatting problem when round-tripping from/to memory - xinclude.c: chased memleak, fixed a base problem - xpointer.c: added xmlXPtrBuildRangeNodeList(), finished ? xmlXPtrBuildNodeList() - TODO: updated - Makefile.am test/XInclude/docs test/XInclude/ents result/XInclude: adding a first small set of regression tests for XInclude Daniel
This commit is contained in:
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
Sun Nov 12 16:31:19 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
|
||||||
|
|
||||||
|
* nanoftp.c: fixed gcc 2.95 new warnings
|
||||||
|
* SAX.c: fixed a stupid bug
|
||||||
|
* tree.c: fixed a formatting problem when round-tripping
|
||||||
|
from/to memory
|
||||||
|
* xinclude.c: chased memleak, fixed a base problem
|
||||||
|
* xpointer.c: added xmlXPtrBuildRangeNodeList(), finished ?
|
||||||
|
xmlXPtrBuildNodeList()
|
||||||
|
* TODO: updated
|
||||||
|
* Makefile.am test/XInclude/docs test/XInclude/ents result/XInclude:
|
||||||
|
adding a first small set of regression tests for XInclude
|
||||||
|
|
||||||
Tue Nov 7 15:11:34 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
|
Tue Nov 7 15:11:34 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
|
||||||
|
|
||||||
* nanohttp.[ch]: applied Wayne Davison patches to access
|
* nanohttp.[ch]: applied Wayne Davison patches to access
|
||||||
|
20
Makefile.am
20
Makefile.am
@ -82,7 +82,7 @@ $(libxml_la_SOURCES): $(srcdir)/libxml
|
|||||||
|
|
||||||
testall : tests SVGtests SAXtests
|
testall : tests SVGtests SAXtests
|
||||||
|
|
||||||
tests: XMLtests XMLenttests HTMLtests Validtests URItests XPathtests XPtrtests
|
tests: XMLtests XMLenttests HTMLtests Validtests URItests XPathtests XPtrtests XIncludetests
|
||||||
|
|
||||||
HTMLtests : testHTML
|
HTMLtests : testHTML
|
||||||
@(rm -f .memdump ; touch .memdump)
|
@(rm -f .memdump ; touch .memdump)
|
||||||
@ -273,6 +273,24 @@ XPtrtests : testXPath
|
|||||||
rm result.$$name ; \
|
rm result.$$name ; \
|
||||||
fi ; fi ; done ; fi ; done)
|
fi ; fi ; done ; fi ; done)
|
||||||
|
|
||||||
|
XIncludetests : xmllint
|
||||||
|
@echo "##"
|
||||||
|
@echo "## XInclude regression tests"
|
||||||
|
@echo "##"
|
||||||
|
@(for i in $(srcdir)/test/XInclude/docs/* ; do \
|
||||||
|
name=`basename $$i`; \
|
||||||
|
if [ ! -d $$i ] ; then \
|
||||||
|
if [ ! -f $(srcdir)/result/XInclude/$$name ] ; then \
|
||||||
|
echo New test file $$name ; \
|
||||||
|
$(top_builddir)/xmllint --xinclude $$i > $(srcdir)/result/XInclude/$$name ; \
|
||||||
|
else \
|
||||||
|
echo Testing $$name ; \
|
||||||
|
$(top_builddir)/xmllint --xinclude $$i > result.$$name ; \
|
||||||
|
grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\
|
||||||
|
diff $(srcdir)/result/XInclude/$$name result.$$name ; \
|
||||||
|
rm result.$$name ; \
|
||||||
|
fi ; fi ; done)
|
||||||
|
|
||||||
SVGtests : xmllint
|
SVGtests : xmllint
|
||||||
@echo "##"
|
@echo "##"
|
||||||
@echo "## SVG parsing regression tests"
|
@echo "## SVG parsing regression tests"
|
||||||
|
2
SAX.c
2
SAX.c
@ -1668,7 +1668,7 @@ htmlDefaultSAXHandlerInit(void)
|
|||||||
htmlDefaultSAXHandler.endElement = endElement;
|
htmlDefaultSAXHandler.endElement = endElement;
|
||||||
htmlDefaultSAXHandler.reference = NULL;
|
htmlDefaultSAXHandler.reference = NULL;
|
||||||
htmlDefaultSAXHandler.characters = characters;
|
htmlDefaultSAXHandler.characters = characters;
|
||||||
xmlDefaultSAXHandler.cdataBlock = cdataBlock;
|
htmlDefaultSAXHandler.cdataBlock = cdataBlock;
|
||||||
htmlDefaultSAXHandler.ignorableWhitespace = ignorableWhitespace;
|
htmlDefaultSAXHandler.ignorableWhitespace = ignorableWhitespace;
|
||||||
htmlDefaultSAXHandler.processingInstruction = NULL;
|
htmlDefaultSAXHandler.processingInstruction = NULL;
|
||||||
htmlDefaultSAXHandler.comment = comment;
|
htmlDefaultSAXHandler.comment = comment;
|
||||||
|
2
TODO
2
TODO
@ -6,6 +6,8 @@
|
|||||||
TODO:
|
TODO:
|
||||||
=====
|
=====
|
||||||
|
|
||||||
|
- Computation of base when HTTP redirect occurs, might affect HTTP
|
||||||
|
interfaces.
|
||||||
- performances: there is still improvements needed when parsing Docbook DTD
|
- performances: there is still improvements needed when parsing Docbook DTD
|
||||||
a single function to optimize/avoid.
|
a single function to optimize/avoid.
|
||||||
- DOM needs
|
- DOM needs
|
||||||
|
@ -1310,7 +1310,7 @@ xmlNanoFTPGetConnection(void *ctx) {
|
|||||||
}
|
}
|
||||||
cur = &ctxt->controlBuf[ctxt->controlBufAnswer];
|
cur = &ctxt->controlBuf[ctxt->controlBufAnswer];
|
||||||
while (((*cur < '0') || (*cur > '9')) && *cur != '\0') cur++;
|
while (((*cur < '0') || (*cur > '9')) && *cur != '\0') cur++;
|
||||||
if (sscanf(cur, "%d,%d,%d,%d,%d,%d", &temp[0], &temp[1], &temp[2],
|
if (sscanf(cur, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2],
|
||||||
&temp[3], &temp[4], &temp[5]) != 6) {
|
&temp[3], &temp[4], &temp[5]) != 6) {
|
||||||
xmlGenericError(xmlGenericErrorContext,
|
xmlGenericError(xmlGenericErrorContext,
|
||||||
"Invalid answer to PASV\n");
|
"Invalid answer to PASV\n");
|
||||||
|
9
result/XInclude/include.xml
Normal file
9
result/XInclude/include.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including another XML document -->
|
||||||
|
<doc>
|
||||||
|
<p>something</p>
|
||||||
|
<p>really</p>
|
||||||
|
<p>simple</p>
|
||||||
|
</doc>
|
||||||
|
</x>
|
5
result/XInclude/nodes.xml
Normal file
5
result/XInclude/nodes.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including a set of nodes from an XML document -->
|
||||||
|
<p>something</p><p>really</p><p>simple</p>
|
||||||
|
</x>
|
6
result/XInclude/txtinclude.xml
Normal file
6
result/XInclude/txtinclude.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including another text document -->
|
||||||
|
this is some text in ASCII
|
||||||
|
|
||||||
|
</x>
|
4
test/XInclude/docs/include.xml
Normal file
4
test/XInclude/docs/include.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including another XML document -->
|
||||||
|
<xinclude:include href="../ents/something.xml"/>
|
||||||
|
</x>
|
4
test/XInclude/docs/nodes.xml
Normal file
4
test/XInclude/docs/nodes.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including a set of nodes from an XML document -->
|
||||||
|
<xinclude:include href="../ents/something.xml#xpointer(//p)"/>
|
||||||
|
</x>
|
4
test/XInclude/docs/txtinclude.xml
Normal file
4
test/XInclude/docs/txtinclude.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<x xmlns:xinclude="http://www.w3.org/1999/XML/xinclude">
|
||||||
|
<!-- Simple test of including another text document -->
|
||||||
|
<xinclude:include href="../ents/something.txt" parse="text"/>
|
||||||
|
</x>
|
1
test/XInclude/ents/something.txt
Normal file
1
test/XInclude/ents/something.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
this is some text in ASCII
|
5
test/XInclude/ents/something.xml
Normal file
5
test/XInclude/ents/something.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<doc>
|
||||||
|
<p>something</p>
|
||||||
|
<p>really</p>
|
||||||
|
<p>simple</p>
|
||||||
|
</doc>
|
12
tree.c
12
tree.c
@ -5119,7 +5119,7 @@ xmlDocContentDump(xmlBufferPtr buf, xmlDocPtr cur) {
|
|||||||
xmlNodePtr child = cur->children;
|
xmlNodePtr child = cur->children;
|
||||||
|
|
||||||
while (child != NULL) {
|
while (child != NULL) {
|
||||||
xmlNodeDump(buf, cur, child, 0, 1);
|
xmlNodeDump(buf, cur, child, 0, 0);
|
||||||
xmlBufferWriteChar(buf, "\n");
|
xmlBufferWriteChar(buf, "\n");
|
||||||
child = child->next;
|
child = child->next;
|
||||||
}
|
}
|
||||||
@ -5218,16 +5218,6 @@ xmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDtdPtr dtd, const char *encoding) {
|
|||||||
}
|
}
|
||||||
xmlOutputBufferWriteString(buf, " [\n");
|
xmlOutputBufferWriteString(buf, " [\n");
|
||||||
xmlNodeListDumpOutput(buf, dtd->doc, dtd->children, -1, 0, encoding);
|
xmlNodeListDumpOutput(buf, dtd->doc, dtd->children, -1, 0, encoding);
|
||||||
#if 0
|
|
||||||
if (dtd->entities != NULL)
|
|
||||||
xmlDumpEntitiesTable(buf, (xmlEntitiesTablePtr) dtd->entities);
|
|
||||||
if (dtd->notations != NULL)
|
|
||||||
xmlDumpNotationTable(buf, (xmlNotationTablePtr) dtd->notations);
|
|
||||||
if (dtd->elements != NULL)
|
|
||||||
xmlDumpElementTable(buf, (xmlElementTablePtr) dtd->elements);
|
|
||||||
if (dtd->attributes != NULL)
|
|
||||||
xmlDumpAttributeTable(buf, (xmlAttributeTablePtr) dtd->attributes);
|
|
||||||
#endif
|
|
||||||
xmlOutputBufferWriteString(buf, "]>");
|
xmlOutputBufferWriteString(buf, "]>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,6 +396,7 @@ loaded:
|
|||||||
xmlGenericError(xmlGenericErrorContext,
|
xmlGenericError(xmlGenericErrorContext,
|
||||||
"XInclude: XPointer evaluation failed: #%s\n",
|
"XInclude: XPointer evaluation failed: #%s\n",
|
||||||
fragment);
|
fragment);
|
||||||
|
xmlXPathFreeContext(xptrctxt);
|
||||||
xmlFree(URL);
|
xmlFree(URL);
|
||||||
xmlFree(fragment);
|
xmlFree(fragment);
|
||||||
return;
|
return;
|
||||||
@ -599,7 +600,11 @@ xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, int nr) {
|
|||||||
* compute the URI
|
* compute the URI
|
||||||
*/
|
*/
|
||||||
base = xmlNodeGetBase(ctxt->doc, cur);
|
base = xmlNodeGetBase(ctxt->doc, cur);
|
||||||
URI = xmlBuildURI(href, base);
|
if (base == NULL) {
|
||||||
|
URI = xmlBuildURI(href, ctxt->doc->URL);
|
||||||
|
} else {
|
||||||
|
URI = xmlBuildURI(href, base);
|
||||||
|
}
|
||||||
if (URI == NULL) {
|
if (URI == NULL) {
|
||||||
xmlChar *escbase;
|
xmlChar *escbase;
|
||||||
xmlChar *eschref;
|
xmlChar *eschref;
|
||||||
|
195
xpointer.c
195
xpointer.c
@ -55,6 +55,7 @@
|
|||||||
* *
|
* *
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur);
|
||||||
/**
|
/**
|
||||||
* xmlXPtrGetArity:
|
* xmlXPtrGetArity:
|
||||||
* @cur: the node
|
* @cur: the node
|
||||||
@ -1301,14 +1302,183 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) {
|
|||||||
return(res);
|
return(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlXPtrBuildRangeNodeList:
|
||||||
|
* @range: a range object
|
||||||
|
*
|
||||||
|
* Build a node list tree copy of the range
|
||||||
|
*
|
||||||
|
* Returns an xmlNodePtr list or NULL.
|
||||||
|
* the caller has to free the node tree.
|
||||||
|
*/
|
||||||
|
xmlNodePtr
|
||||||
|
xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) {
|
||||||
|
/* pointers to generated nodes */
|
||||||
|
xmlNodePtr list = NULL, last = NULL, parent = NULL, tmp;
|
||||||
|
/* pointers to traversal nodes */
|
||||||
|
xmlNodePtr start, cur, end;
|
||||||
|
int index, index2;
|
||||||
|
|
||||||
|
if (range == NULL)
|
||||||
|
return(NULL);
|
||||||
|
if (range->type != XPATH_RANGE)
|
||||||
|
return(NULL);
|
||||||
|
start = (xmlNodePtr) range->user;
|
||||||
|
|
||||||
|
if (start == NULL)
|
||||||
|
return(NULL);
|
||||||
|
end = range->user2;
|
||||||
|
if (end == NULL)
|
||||||
|
return(xmlCopyNode(start, 1));
|
||||||
|
|
||||||
|
cur = start;
|
||||||
|
index = range->index;
|
||||||
|
index2 = range->index2;
|
||||||
|
while (cur != NULL) {
|
||||||
|
if (cur == end) {
|
||||||
|
if (cur->type == XML_TEXT_NODE) {
|
||||||
|
const xmlChar *content = cur->content;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (content == NULL) {
|
||||||
|
tmp = xmlNewTextLen(NULL, 0);
|
||||||
|
} else {
|
||||||
|
len = index2;
|
||||||
|
if ((cur == start) && (index > 1)) {
|
||||||
|
content += (index - 1);
|
||||||
|
len -= (index - 1);
|
||||||
|
index = 0;
|
||||||
|
} else {
|
||||||
|
len = index2;
|
||||||
|
}
|
||||||
|
tmp = xmlNewTextLen(content, len);
|
||||||
|
}
|
||||||
|
/* single sub text node selection */
|
||||||
|
if (list == NULL)
|
||||||
|
return(tmp);
|
||||||
|
/* prune and return full set */
|
||||||
|
if (last != NULL)
|
||||||
|
xmlAddNextSibling(last, tmp);
|
||||||
|
else
|
||||||
|
xmlAddChild(parent, tmp);
|
||||||
|
return(list);
|
||||||
|
} else {
|
||||||
|
tmp = xmlCopyNode(cur, 0);
|
||||||
|
if (list == NULL)
|
||||||
|
list = tmp;
|
||||||
|
else {
|
||||||
|
if (last != NULL)
|
||||||
|
xmlAddNextSibling(last, tmp);
|
||||||
|
else
|
||||||
|
xmlAddChild(parent, tmp);
|
||||||
|
}
|
||||||
|
last = NULL;
|
||||||
|
parent = tmp;
|
||||||
|
|
||||||
|
if (index2 > 1) {
|
||||||
|
end = xmlXPtrGetNthChild(cur, index2 - 1);
|
||||||
|
index2 = 0;
|
||||||
|
}
|
||||||
|
if ((cur == start) && (index > 1)) {
|
||||||
|
cur = xmlXPtrGetNthChild(cur, index - 1);
|
||||||
|
index = 0;
|
||||||
|
} else {
|
||||||
|
cur = cur->children;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Now gather the remaining nodes from cur to end
|
||||||
|
*/
|
||||||
|
continue; /* while */
|
||||||
|
}
|
||||||
|
} else if ((cur == start) &&
|
||||||
|
(list == NULL) /* looks superfluous but ... */ ) {
|
||||||
|
if (cur->type == XML_TEXT_NODE) {
|
||||||
|
const xmlChar *content = cur->content;
|
||||||
|
|
||||||
|
if (content == NULL) {
|
||||||
|
tmp = xmlNewTextLen(NULL, 0);
|
||||||
|
} else {
|
||||||
|
if (index > 1) {
|
||||||
|
content += (index - 1);
|
||||||
|
}
|
||||||
|
tmp = xmlNewText(content);
|
||||||
|
}
|
||||||
|
last = list = tmp;
|
||||||
|
} else {
|
||||||
|
if ((cur == start) && (index > 1)) {
|
||||||
|
tmp = xmlCopyNode(cur, 0);
|
||||||
|
list = tmp;
|
||||||
|
parent = tmp;
|
||||||
|
last = NULL;
|
||||||
|
cur = xmlXPtrGetNthChild(cur, index - 1);
|
||||||
|
index = 0;
|
||||||
|
/*
|
||||||
|
* Now gather the remaining nodes from cur to end
|
||||||
|
*/
|
||||||
|
continue; /* while */
|
||||||
|
}
|
||||||
|
tmp = xmlCopyNode(cur, 1);
|
||||||
|
list = tmp;
|
||||||
|
parent = NULL;
|
||||||
|
last = tmp;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tmp = NULL;
|
||||||
|
switch (cur->type) {
|
||||||
|
case XML_DTD_NODE:
|
||||||
|
case XML_ELEMENT_DECL:
|
||||||
|
case XML_ATTRIBUTE_DECL:
|
||||||
|
case XML_ENTITY_NODE:
|
||||||
|
/* Do not copy DTD informations */
|
||||||
|
break;
|
||||||
|
case XML_ENTITY_DECL:
|
||||||
|
TODO /* handle csossing entities -> stack needed */
|
||||||
|
break;
|
||||||
|
case XML_XINCLUDE_START:
|
||||||
|
case XML_XINCLUDE_END:
|
||||||
|
/* don't consider it part of the tree content */
|
||||||
|
break;
|
||||||
|
case XML_ATTRIBUTE_NODE:
|
||||||
|
/* Humm, should not happen ! */
|
||||||
|
STRANGE
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
tmp = xmlCopyNode(cur, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tmp != NULL) {
|
||||||
|
if ((list == NULL) || ((last == NULL) && (parent == NULL))) {
|
||||||
|
STRANGE
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
if (last != NULL)
|
||||||
|
xmlAddNextSibling(last, tmp);
|
||||||
|
else {
|
||||||
|
xmlAddChild(parent, tmp);
|
||||||
|
last = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Skip to next node in document order
|
||||||
|
*/
|
||||||
|
if ((list == NULL) || ((last == NULL) && (parent == NULL))) {
|
||||||
|
STRANGE
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
cur = xmlXPtrAdvanceNode(cur);
|
||||||
|
}
|
||||||
|
return(list);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlXPtrBuildNodeList:
|
* xmlXPtrBuildNodeList:
|
||||||
* @obj: the XPointer result from the evaluation.
|
* @obj: the XPointer result from the evaluation.
|
||||||
*
|
*
|
||||||
* Build a node list copy of the XPointer result.
|
* Build a node list tree copy of the XPointer result.
|
||||||
*
|
*
|
||||||
* Returns an xmlNodePtr list or NULL.
|
* Returns an xmlNodePtr list or NULL.
|
||||||
* the caller has to free the node list.
|
* the caller has to free the node tree.
|
||||||
*/
|
*/
|
||||||
xmlNodePtr
|
xmlNodePtr
|
||||||
xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) {
|
xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) {
|
||||||
@ -1333,8 +1503,27 @@ xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XPATH_LOCATIONSET:
|
case XPATH_LOCATIONSET: {
|
||||||
|
xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user;
|
||||||
|
if (set == NULL)
|
||||||
|
return(NULL);
|
||||||
|
for (i = 0;i < set->locNr;i++) {
|
||||||
|
if (last == NULL)
|
||||||
|
list = last = xmlXPtrBuildNodeList(set->locTab[i]);
|
||||||
|
else
|
||||||
|
xmlAddNextSibling(last,
|
||||||
|
xmlXPtrBuildNodeList(set->locTab[i]));
|
||||||
|
if (last != NULL) {
|
||||||
|
while (last->next != NULL)
|
||||||
|
last = last->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case XPATH_RANGE:
|
||||||
|
return(xmlXPtrBuildRangeNodeList(obj));
|
||||||
|
case XPATH_POINT:
|
||||||
|
return(xmlCopyNode(obj->user, 0));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user