diff options
author | setser <[email protected]> | 2022-05-09 00:13:37 +0300 |
---|---|---|
committer | setser <[email protected]> | 2022-05-09 00:13:37 +0300 |
commit | e87e3fc8d0e04eb7ba3eee221bb91613b527ad85 (patch) | |
tree | 5279c128bdbdf902b9a08d9fae8e55b91910a553 /contrib/libs/libxml/xpointer.c | |
parent | f4f3e4024a1f32bd0bc3fa20239025a1b179e42d (diff) |
Update libxml to 2.9.13
ref:f572491d236694e847142c36f0f5546c649e05d7
Diffstat (limited to 'contrib/libs/libxml/xpointer.c')
-rw-r--r-- | contrib/libs/libxml/xpointer.c | 129 |
1 files changed, 66 insertions, 63 deletions
diff --git a/contrib/libs/libxml/xpointer.c b/contrib/libs/libxml/xpointer.c index c1732a584a6..afeaa2ecf99 100644 --- a/contrib/libs/libxml/xpointer.c +++ b/contrib/libs/libxml/xpointer.c @@ -70,7 +70,7 @@ /** * xmlXPtrErrMemory: - * @extra: extra informations + * @extra: extra information * * Handle a redefinition of attribute error */ @@ -86,7 +86,7 @@ xmlXPtrErrMemory(const char *extra) /** * xmlXPtrErr: * @ctxt: an XPTR evaluation context - * @extra: extra informations + * @extra: extra information * * Handle a redefinition of attribute error */ @@ -851,7 +851,6 @@ static void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name); * * Dirty macros, i.e. one need to make assumption on the context to use them * - * CUR_PTR return the current pointer to the xmlChar to be parsed. * CUR returns the current xmlChar value, i.e. a 8 bit value * in ISO-Latin or UTF-8. * This should be used internally by the parser @@ -871,7 +870,6 @@ static void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name); #define CUR (*ctxt->cur) #define SKIP(val) ctxt->cur += (val) #define NXT(val) ctxt->cur[(val)] -#define CUR_PTR ctxt->cur #define SKIP_BLANKS \ while (IS_BLANK_CH(*(ctxt->cur))) NEXT @@ -999,55 +997,63 @@ xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { } if (xmlStrEqual(name, (xmlChar *) "xpointer")) { - const xmlChar *left = CUR_PTR; + const xmlChar *oldBase = ctxt->base; + const xmlChar *oldCur = ctxt->cur; - CUR_PTR = buffer; + ctxt->cur = ctxt->base = buffer; /* * To evaluate an xpointer scheme element (4.3) we need: * context initialized to the root - * context position initalized to 1 + * context position initialized to 1 * context size initialized to 1 */ ctxt->context->node = (xmlNodePtr)ctxt->context->doc; ctxt->context->proximityPosition = 1; ctxt->context->contextSize = 1; xmlXPathEvalExpr(ctxt); - CUR_PTR=left; + ctxt->base = oldBase; + ctxt->cur = oldCur; } else if (xmlStrEqual(name, (xmlChar *) "element")) { - const xmlChar *left = CUR_PTR; + const xmlChar *oldBase = ctxt->base; + const xmlChar *oldCur = ctxt->cur; xmlChar *name2; - CUR_PTR = buffer; + ctxt->cur = ctxt->base = buffer; if (buffer[0] == '/') { xmlXPathRoot(ctxt); xmlXPtrEvalChildSeq(ctxt, NULL); } else { name2 = xmlXPathParseName(ctxt); if (name2 == NULL) { - CUR_PTR = left; + ctxt->base = oldBase; + ctxt->cur = oldCur; xmlFree(buffer); xmlFree(name); XP_ERROR(XPATH_EXPR_ERROR); } xmlXPtrEvalChildSeq(ctxt, name2); } - CUR_PTR = left; + ctxt->base = oldBase; + ctxt->cur = oldCur; #ifdef XPTR_XMLNS_SCHEME } else if (xmlStrEqual(name, (xmlChar *) "xmlns")) { - const xmlChar *left = CUR_PTR; + const xmlChar *oldBase = ctxt->base; + const xmlChar *oldCur = ctxt->cur; xmlChar *prefix; - xmlChar *URI; - xmlURIPtr value; - CUR_PTR = buffer; + ctxt->cur = ctxt->base = buffer; prefix = xmlXPathParseNCName(ctxt); if (prefix == NULL) { + ctxt->base = oldBase; + ctxt->cur = oldCur; xmlFree(buffer); xmlFree(name); XP_ERROR(XPTR_SYNTAX_ERROR); } SKIP_BLANKS; if (CUR != '=') { + ctxt->base = oldBase; + ctxt->cur = oldCur; xmlFree(prefix); xmlFree(buffer); xmlFree(name); @@ -1055,27 +1061,10 @@ xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { } NEXT; SKIP_BLANKS; - /* @@ check escaping in the XPointer WD */ - value = xmlParseURI((const char *)ctxt->cur); - if (value == NULL) { - xmlFree(prefix); - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - URI = xmlSaveUri(value); - xmlFreeURI(value); - if (URI == NULL) { - xmlFree(prefix); - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPATH_MEMORY_ERROR); - } - - xmlXPathRegisterNs(ctxt->context, prefix, URI); - CUR_PTR = left; - xmlFree(URI); + xmlXPathRegisterNs(ctxt->context, prefix, ctxt->cur); + ctxt->base = oldBase; + ctxt->cur = oldCur; xmlFree(prefix); #endif /* XPTR_XMLNS_SCHEME */ } else { @@ -1352,7 +1341,7 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { xmlXPathObjectPtr init = NULL; int stack = 0; - xmlXPathInit(); + xmlInitParser(); if ((ctx == NULL) || (str == NULL)) return(NULL); @@ -1470,16 +1459,16 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { return(list); } else { tmp = xmlCopyNode(cur, 0); - if (list == NULL) + if (list == NULL) { list = tmp; - else { + parent = tmp; + } else { if (last != NULL) - xmlAddNextSibling(last, tmp); + parent = xmlAddNextSibling(last, tmp); else - xmlAddChild(parent, tmp); + parent = xmlAddChild(parent, tmp); } last = NULL; - parent = tmp; if (index2 > 1) { end = xmlXPtrGetNthChild(cur, index2 - 1); @@ -1536,7 +1525,7 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_NODE: - /* Do not copy DTD informations */ + /* Do not copy DTD information */ break; case XML_ENTITY_DECL: TODO /* handle crossing entities -> stack needed */ @@ -1561,8 +1550,7 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { if (last != NULL) xmlAddNextSibling(last, tmp); else { - xmlAddChild(parent, tmp); - last = tmp; + last = xmlAddChild(parent, tmp); } } } @@ -2200,7 +2188,6 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { XP_ERROR(XPATH_MEMORY_ERROR) set = tmp; } - oldset = (xmlLocationSetPtr) set->user; /* * The loop is to compute the covering range for each item and add it @@ -2210,9 +2197,12 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathFreeObject(set); XP_ERROR(XPATH_MEMORY_ERROR); } - for (i = 0;i < oldset->locNr;i++) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrInsideRange(ctxt, oldset->locTab[i])); + oldset = (xmlLocationSetPtr) set->user; + if (oldset != NULL) { + for (i = 0;i < oldset->locNr;i++) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrInsideRange(ctxt, oldset->locTab[i])); + } } /* @@ -2706,10 +2696,10 @@ static void xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { int i, startindex, endindex = 0, fendindex; xmlNodePtr start, end = 0, fend; - xmlXPathObjectPtr set; + xmlXPathObjectPtr set = NULL; xmlLocationSetPtr oldset; - xmlLocationSetPtr newset; - xmlXPathObjectPtr string; + xmlLocationSetPtr newset = NULL; + xmlXPathObjectPtr string = NULL; xmlXPathObjectPtr position = NULL; xmlXPathObjectPtr number = NULL; int found, pos = 0, num = 0; @@ -2721,29 +2711,39 @@ xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { XP_ERROR(XPATH_INVALID_ARITY); if (nargs >= 4) { - CHECK_TYPE(XPATH_NUMBER); + if ((ctxt->value == NULL) || (ctxt->value->type != XPATH_NUMBER)) { + xmlXPathErr(ctxt, XPATH_INVALID_TYPE); + goto error; + } number = valuePop(ctxt); if (number != NULL) num = (int) number->floatval; } if (nargs >= 3) { - CHECK_TYPE(XPATH_NUMBER); + if ((ctxt->value == NULL) || (ctxt->value->type != XPATH_NUMBER)) { + xmlXPathErr(ctxt, XPATH_INVALID_TYPE); + goto error; + } position = valuePop(ctxt); if (position != NULL) pos = (int) position->floatval; } - CHECK_TYPE(XPATH_STRING); + if ((ctxt->value == NULL) || (ctxt->value->type != XPATH_STRING)) { + xmlXPathErr(ctxt, XPATH_INVALID_TYPE); + goto error; + } string = valuePop(ctxt); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - + (ctxt->value->type != XPATH_NODESET))) { + xmlXPathErr(ctxt, XPATH_INVALID_TYPE); + goto error; + } set = valuePop(ctxt); newset = xmlXPtrLocationSetCreate(NULL); if (newset == NULL) { - xmlXPathFreeObject(set); - XP_ERROR(XPATH_MEMORY_ERROR); + xmlXPathErr(ctxt, XPATH_MEMORY_ERROR); + goto error; } if (set->nodesetval == NULL) { goto error; @@ -2756,8 +2756,10 @@ xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { */ tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); xmlXPathFreeObject(set); - if (tmp == NULL) - XP_ERROR(XPATH_MEMORY_ERROR) + if (tmp == NULL) { + xmlXPathErr(ctxt, XPATH_MEMORY_ERROR); + goto error; + } set = tmp; } oldset = (xmlLocationSetPtr) set->user; @@ -2830,7 +2832,8 @@ xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { * Save the new value and cleanup */ error: - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); + if (newset != NULL) + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); xmlXPathFreeObject(set); xmlXPathFreeObject(string); if (position) xmlXPathFreeObject(position); |