Index: third_party/libxml/src/xpointer.c |
diff --git a/third_party/libxml/src/xpointer.c b/third_party/libxml/src/xpointer.c |
index d74174a318f145e108614770fdda089c9fa9ddaa..d8a2e5994c8856906aabb031dcb52845269be13c 100644 |
--- a/third_party/libxml/src/xpointer.c |
+++ b/third_party/libxml/src/xpointer.c |
@@ -320,6 +320,45 @@ xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) { |
} |
/** |
+ * xmlXPtrNewRangeInternal: |
+ * @start: the starting node |
+ * @startindex: the start index |
+ * @end: the ending point |
+ * @endindex: the ending index |
+ * |
+ * Internal function to create a new xmlXPathObjectPtr of type range |
+ * |
+ * Returns the newly created object. |
+ */ |
+static xmlXPathObjectPtr |
+xmlXPtrNewRangeInternal(xmlNodePtr start, int startindex, |
+ xmlNodePtr end, int endindex) { |
+ xmlXPathObjectPtr ret; |
+ |
+ /* |
+ * Namespace nodes must be copied (see xmlXPathNodeSetDupNs). |
+ * Disallow them for now. |
+ */ |
+ if ((start != NULL) && (start->type == XML_NAMESPACE_DECL)) |
+ return(NULL); |
+ if ((end != NULL) && (end->type == XML_NAMESPACE_DECL)) |
+ return(NULL); |
+ |
+ ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
+ if (ret == NULL) { |
+ xmlXPtrErrMemory("allocating range"); |
+ return(NULL); |
+ } |
+ memset(ret, 0, sizeof(xmlXPathObject)); |
+ ret->type = XPATH_RANGE; |
+ ret->user = start; |
+ ret->index = startindex; |
+ ret->user2 = end; |
+ ret->index2 = endindex; |
+ return(ret); |
+} |
+ |
+/** |
* xmlXPtrNewRange: |
* @start: the starting node |
* @startindex: the start index |
@@ -344,17 +383,7 @@ xmlXPtrNewRange(xmlNodePtr start, int startindex, |
if (endindex < 0) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start; |
- ret->index = startindex; |
- ret->user2 = end; |
- ret->index2 = endindex; |
+ ret = xmlXPtrNewRangeInternal(start, startindex, end, endindex); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |
@@ -381,17 +410,8 @@ xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { |
if (end->type != XPATH_POINT) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start->user; |
- ret->index = start->index; |
- ret->user2 = end->user; |
- ret->index2 = end->index; |
+ ret = xmlXPtrNewRangeInternal(start->user, start->index, end->user, |
+ end->index); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |
@@ -416,17 +436,7 @@ xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { |
if (start->type != XPATH_POINT) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start->user; |
- ret->index = start->index; |
- ret->user2 = end; |
- ret->index2 = -1; |
+ ret = xmlXPtrNewRangeInternal(start->user, start->index, end, -1); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |
@@ -453,17 +463,7 @@ xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { |
if (end->type != XPATH_POINT) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start; |
- ret->index = -1; |
- ret->user2 = end->user; |
- ret->index2 = end->index; |
+ ret = xmlXPtrNewRangeInternal(start, -1, end->user, end->index); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |
@@ -486,17 +486,7 @@ xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { |
if (end == NULL) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start; |
- ret->index = -1; |
- ret->user2 = end; |
- ret->index2 = -1; |
+ ret = xmlXPtrNewRangeInternal(start, -1, end, -1); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |
@@ -516,17 +506,7 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { |
if (start == NULL) |
return(NULL); |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start; |
- ret->index = -1; |
- ret->user2 = NULL; |
- ret->index2 = -1; |
+ ret = xmlXPtrNewRangeInternal(start, -1, NULL, -1); |
return(ret); |
} |
@@ -541,6 +521,8 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { |
*/ |
xmlXPathObjectPtr |
xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { |
+ xmlNodePtr endNode; |
+ int endIndex; |
xmlXPathObjectPtr ret; |
if (start == NULL) |
@@ -549,7 +531,12 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { |
return(NULL); |
switch (end->type) { |
case XPATH_POINT: |
+ endNode = end->user; |
+ endIndex = end->index; |
+ break; |
case XPATH_RANGE: |
+ endNode = end->user2; |
+ endIndex = end->index2; |
break; |
case XPATH_NODESET: |
/* |
@@ -557,39 +544,15 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { |
*/ |
if (end->nodesetval->nodeNr <= 0) |
return(NULL); |
+ endNode = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; |
+ endIndex = -1; |
break; |
default: |
/* TODO */ |
return(NULL); |
} |
- ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); |
- if (ret == NULL) { |
- xmlXPtrErrMemory("allocating range"); |
- return(NULL); |
- } |
- memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); |
- ret->type = XPATH_RANGE; |
- ret->user = start; |
- ret->index = -1; |
- switch (end->type) { |
- case XPATH_POINT: |
- ret->user2 = end->user; |
- ret->index2 = end->index; |
- break; |
- case XPATH_RANGE: |
- ret->user2 = end->user2; |
- ret->index2 = end->index2; |
- break; |
- case XPATH_NODESET: { |
- ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; |
- ret->index2 = -1; |
- break; |
- } |
- default: |
- STRANGE |
- return(NULL); |
- } |
+ ret = xmlXPtrNewRangeInternal(start, -1, endNode, endIndex); |
xmlXPtrRangeCheckOrder(ret); |
return(ret); |
} |