mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
speedup some node selection operations, this can have a significant impact
* xpath.c: speedup some node selection operations, this can have a significant impact on DocBook Norm's stylesheets * nanohttp.c: someone reported that SOCKLEN_T may not be defined make sure it's always the case * debugXML.c: distinguish CDATA and comments in ls operations Daniel
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
Wed Mar 13 11:00:59 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* xpath.c: speedup some node selection operations, this can
|
||||||
|
have a significant impact on DocBook Norm's stylesheets
|
||||||
|
* nanohttp.c: someone reported that SOCKLEN_T may not be defined
|
||||||
|
make sure it's always the case
|
||||||
|
* debugXML.c: distinguish CDATA and comments in ls operations
|
||||||
|
|
||||||
Tue Mar 12 19:45:24 CET 2002 Daniel Veillard <daniel@veillard.com>
|
Tue Mar 12 19:45:24 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* include/libxml/*.h: Heiko W. Rupp fixed a lot of comments
|
* include/libxml/*.h: Heiko W. Rupp fixed a lot of comments
|
||||||
|
@ -1148,7 +1148,7 @@ xmlLsOneNode(FILE *output, xmlNodePtr node) {
|
|||||||
fprintf(output, "t");
|
fprintf(output, "t");
|
||||||
break;
|
break;
|
||||||
case XML_CDATA_SECTION_NODE:
|
case XML_CDATA_SECTION_NODE:
|
||||||
fprintf(output, "c");
|
fprintf(output, "C");
|
||||||
break;
|
break;
|
||||||
case XML_ENTITY_REF_NODE:
|
case XML_ENTITY_REF_NODE:
|
||||||
fprintf(output, "e");
|
fprintf(output, "e");
|
||||||
|
@ -78,6 +78,12 @@
|
|||||||
#define SOCKET int
|
#define SOCKET int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SOCKLEN_T
|
||||||
|
#define SOCKLEN_T unsigned int
|
||||||
|
#endif
|
||||||
|
#ifndef SOCKET
|
||||||
|
#define SOCKET int
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
#define DEBUG_HTTP
|
#define DEBUG_HTTP
|
||||||
|
72
xpath.c
72
xpath.c
@ -1772,6 +1772,68 @@ xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
|
|||||||
return(val1);
|
return(val1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlXPathNodeSetMergeUnique:
|
||||||
|
* @val1: the first NodeSet or NULL
|
||||||
|
* @val2: the second NodeSet
|
||||||
|
*
|
||||||
|
* Merges two nodesets, all nodes from @val2 are added to @val1
|
||||||
|
* if @val1 is NULL, a new set is created and copied from @val2
|
||||||
|
*
|
||||||
|
* Returns @val1 once extended or NULL in case of error.
|
||||||
|
*/
|
||||||
|
static xmlNodeSetPtr
|
||||||
|
xmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
|
||||||
|
int i, initNr;
|
||||||
|
|
||||||
|
if (val2 == NULL) return(val1);
|
||||||
|
if (val1 == NULL) {
|
||||||
|
val1 = xmlXPathNodeSetCreate(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@ with_ns to check wether namespace nodes should be looked at @@ */
|
||||||
|
initNr = val1->nodeNr;
|
||||||
|
|
||||||
|
for (i = 0;i < val2->nodeNr;i++) {
|
||||||
|
/*
|
||||||
|
* grow the nodeTab if needed
|
||||||
|
*/
|
||||||
|
if (val1->nodeMax == 0) {
|
||||||
|
val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT *
|
||||||
|
sizeof(xmlNodePtr));
|
||||||
|
if (val1->nodeTab == NULL) {
|
||||||
|
xmlGenericError(xmlGenericErrorContext,
|
||||||
|
"xmlXPathNodeSetMerge: out of memory\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
memset(val1->nodeTab, 0 ,
|
||||||
|
XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr));
|
||||||
|
val1->nodeMax = XML_NODESET_DEFAULT;
|
||||||
|
} else if (val1->nodeNr == val1->nodeMax) {
|
||||||
|
xmlNodePtr *temp;
|
||||||
|
|
||||||
|
val1->nodeMax *= 2;
|
||||||
|
temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax *
|
||||||
|
sizeof(xmlNodePtr));
|
||||||
|
if (temp == NULL) {
|
||||||
|
xmlGenericError(xmlGenericErrorContext,
|
||||||
|
"xmlXPathNodeSetMerge: out of memory\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
val1->nodeTab = temp;
|
||||||
|
}
|
||||||
|
if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) {
|
||||||
|
xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i];
|
||||||
|
|
||||||
|
val1->nodeTab[val1->nodeNr++] =
|
||||||
|
xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
|
||||||
|
} else
|
||||||
|
val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return(val1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlXPathNodeSetDel:
|
* xmlXPathNodeSetDel:
|
||||||
* @cur: the initial node set
|
* @cur: the initial node set
|
||||||
@ -8233,6 +8295,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
xmlNodeSetPtr ret, list;
|
xmlNodeSetPtr ret, list;
|
||||||
xmlXPathTraversalFunction next = NULL;
|
xmlXPathTraversalFunction next = NULL;
|
||||||
void (*addNode) (xmlNodeSetPtr, xmlNodePtr);
|
void (*addNode) (xmlNodeSetPtr, xmlNodePtr);
|
||||||
|
xmlNodeSetPtr (*mergeNodeSet) (xmlNodeSetPtr, xmlNodeSetPtr);
|
||||||
xmlNodePtr cur = NULL;
|
xmlNodePtr cur = NULL;
|
||||||
xmlXPathObjectPtr obj;
|
xmlXPathObjectPtr obj;
|
||||||
xmlNodeSetPtr nodelist;
|
xmlNodeSetPtr nodelist;
|
||||||
@ -8241,6 +8304,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
CHECK_TYPE0(XPATH_NODESET);
|
CHECK_TYPE0(XPATH_NODESET);
|
||||||
obj = valuePop(ctxt);
|
obj = valuePop(ctxt);
|
||||||
addNode = xmlXPathNodeSetAdd;
|
addNode = xmlXPathNodeSetAdd;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMerge;
|
||||||
if (prefix != NULL) {
|
if (prefix != NULL) {
|
||||||
URI = xmlXPathNsLookup(ctxt->context, prefix);
|
URI = xmlXPathNsLookup(ctxt->context, prefix);
|
||||||
if (URI == NULL)
|
if (URI == NULL)
|
||||||
@ -8272,6 +8336,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
first = NULL;
|
first = NULL;
|
||||||
last = NULL;
|
last = NULL;
|
||||||
next = xmlXPathNextAttribute;
|
next = xmlXPathNextAttribute;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
case AXIS_CHILD:
|
case AXIS_CHILD:
|
||||||
#ifdef DEBUG_STEP
|
#ifdef DEBUG_STEP
|
||||||
@ -8279,6 +8344,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
#endif
|
#endif
|
||||||
last = NULL;
|
last = NULL;
|
||||||
next = xmlXPathNextChild;
|
next = xmlXPathNextChild;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
case AXIS_DESCENDANT:
|
case AXIS_DESCENDANT:
|
||||||
#ifdef DEBUG_STEP
|
#ifdef DEBUG_STEP
|
||||||
@ -8309,6 +8375,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
#endif
|
#endif
|
||||||
last = NULL;
|
last = NULL;
|
||||||
next = xmlXPathNextFollowingSibling;
|
next = xmlXPathNextFollowingSibling;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
case AXIS_NAMESPACE:
|
case AXIS_NAMESPACE:
|
||||||
#ifdef DEBUG_STEP
|
#ifdef DEBUG_STEP
|
||||||
@ -8317,6 +8384,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
first = NULL;
|
first = NULL;
|
||||||
last = NULL;
|
last = NULL;
|
||||||
next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
|
next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
case AXIS_PARENT:
|
case AXIS_PARENT:
|
||||||
#ifdef DEBUG_STEP
|
#ifdef DEBUG_STEP
|
||||||
@ -8339,6 +8407,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
#endif
|
#endif
|
||||||
first = NULL;
|
first = NULL;
|
||||||
next = xmlXPathNextPrecedingSibling;
|
next = xmlXPathNextPrecedingSibling;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
case AXIS_SELF:
|
case AXIS_SELF:
|
||||||
#ifdef DEBUG_STEP
|
#ifdef DEBUG_STEP
|
||||||
@ -8347,6 +8416,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
first = NULL;
|
first = NULL;
|
||||||
last = NULL;
|
last = NULL;
|
||||||
next = xmlXPathNextSelf;
|
next = xmlXPathNextSelf;
|
||||||
|
mergeNodeSet = xmlXPathNodeSetMergeUnique;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (next == NULL)
|
if (next == NULL)
|
||||||
@ -8591,7 +8661,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
|
|||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
ret = list;
|
ret = list;
|
||||||
} else {
|
} else {
|
||||||
ret = xmlXPathNodeSetMerge(ret, list);
|
ret = mergeNodeSet(ret, list);
|
||||||
xmlXPathFreeNodeSet(list);
|
xmlXPathFreeNodeSet(list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user