From 162acdaed08a869e11ee284b641a789c3c83f098 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 8 Nov 2022 11:05:50 +0100 Subject: [PATCH] xslt: Import upstream release 1.1.37. --- libs/xslt/libxslt/functions.c | 12 ++++++++---- libs/xslt/libxslt/keys.c | 2 +- libs/xslt/libxslt/numbers.c | 14 ++++++++++---- libs/xslt/libxslt/pattern.c | 22 +++++++++++----------- libs/xslt/libxslt/transform.c | 4 ++-- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/libs/xslt/libxslt/functions.c b/libs/xslt/libxslt/functions.c index fa8b6d93b20..ed2b002362d 100644 --- a/libs/xslt/libxslt/functions.c +++ b/libs/xslt/libxslt/functions.c @@ -608,7 +608,8 @@ xsltFormatNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) switch (nargs) { case 3: - CAST_TO_STRING; + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) + xmlXPathStringFunction(ctxt, 1); decimalObj = valuePop(ctxt); ncname = xsltSplitQName(sheet->dict, decimalObj->stringval, &prefix); if (prefix != NULL) { @@ -634,13 +635,16 @@ xsltFormatNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) } /* Intentional fall-through */ case 2: - CAST_TO_STRING; + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) + xmlXPathStringFunction(ctxt, 1); formatObj = valuePop(ctxt); - CAST_TO_NUMBER; + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) + xmlXPathNumberFunction(ctxt, 1); numberObj = valuePop(ctxt); break; default: - XP_ERROR(XPATH_INVALID_ARITY); + xmlXPathErr(ctxt, XPATH_INVALID_ARITY); + return; } if (formatValues != NULL) { diff --git a/libs/xslt/libxslt/keys.c b/libs/xslt/libxslt/keys.c index ecef5382638..ca0779c5be2 100644 --- a/libs/xslt/libxslt/keys.c +++ b/libs/xslt/libxslt/keys.c @@ -310,7 +310,7 @@ xsltAddKey(xsltStylesheetPtr style, const xmlChar *name, current = end = 0; while (match[current] != 0) { start = current; - while (IS_BLANK_CH(match[current])) + while (xmlIsBlank_ch(match[current])) current++; end = current; while ((match[end] != 0) && (match[end] != '|')) { diff --git a/libs/xslt/libxslt/numbers.c b/libs/xslt/libxslt/numbers.c index 4cb21254f4f..9c74f0d48d5 100644 --- a/libs/xslt/libxslt/numbers.c +++ b/libs/xslt/libxslt/numbers.c @@ -92,6 +92,12 @@ xsltUTF8Charcmp(xmlChar *utf1, xmlChar *utf2) { return xmlStrncmp(utf1, utf2, len); } +static int +xsltIsLetterDigit(int val) { + return xmlIsBaseCharQ(val) || xmlIsIdeographicQ(val) || + xmlIsDigitQ(val); +} + /***** Stop temp insert *****/ /************************************************************************ * * @@ -347,8 +353,8 @@ xsltNumberFormatTokenize(const xmlChar *format, * Insert initial non-alphanumeric token. * There is always such a token in the list, even if NULL */ - while (! (IS_LETTER(val=xmlStringCurrentChar(NULL, format+ix, &len)) || - IS_DIGIT(val)) ) { + while (!xsltIsLetterDigit(val = xmlStringCurrentChar(NULL, format+ix, + &len))) { if (format[ix] == 0) /* if end of format string */ break; /* while */ ix += len; @@ -414,7 +420,7 @@ xsltNumberFormatTokenize(const xmlChar *format, * to correspond to the Letter and Digit classes from XML (and * one wonders why XSLT doesn't refer to these instead). */ - while (IS_LETTER(val) || IS_DIGIT(val)) { + while (xsltIsLetterDigit(val)) { ix += len; val = xmlStringCurrentChar(NULL, format+ix, &len); } @@ -423,7 +429,7 @@ xsltNumberFormatTokenize(const xmlChar *format, * Insert temporary non-alphanumeric final tooken. */ j = ix; - while (! (IS_LETTER(val) || IS_DIGIT(val))) { + while (!xsltIsLetterDigit(val)) { if (val == 0) break; /* while */ ix += len; diff --git a/libs/xslt/libxslt/pattern.c b/libs/xslt/libxslt/pattern.c index 1944661c7f3..da3444f230e 100644 --- a/libs/xslt/libxslt/pattern.c +++ b/libs/xslt/libxslt/pattern.c @@ -1192,7 +1192,7 @@ xsltCompMatchClearCache(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp) { #define CUR_PTR ctxt->cur #define SKIP_BLANKS \ - while (IS_BLANK_CH(CUR)) NEXT + while (xmlIsBlank_ch(CUR)) NEXT #define CURRENT (*ctxt->cur) #define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) @@ -1235,11 +1235,11 @@ xsltScanLiteral(xsltParserContextPtr ctxt) { NEXT; cur = q = CUR_PTR; val = xmlStringCurrentChar(NULL, cur, &len); - while ((IS_CHAR(val)) && (val != '"')) { + while ((xmlIsCharQ(val)) && (val != '"')) { cur += len; val = xmlStringCurrentChar(NULL, cur, &len); } - if (!IS_CHAR(val)) { + if (!xmlIsCharQ(val)) { ctxt->error = 1; return(NULL); } else { @@ -1251,11 +1251,11 @@ xsltScanLiteral(xsltParserContextPtr ctxt) { NEXT; cur = q = CUR_PTR; val = xmlStringCurrentChar(NULL, cur, &len); - while ((IS_CHAR(val)) && (val != '\'')) { + while ((xmlIsCharQ(val)) && (val != '\'')) { cur += len; val = xmlStringCurrentChar(NULL, cur, &len); } - if (!IS_CHAR(val)) { + if (!xmlIsCharQ(val)) { ctxt->error = 1; return(NULL); } else { @@ -1264,7 +1264,6 @@ xsltScanLiteral(xsltParserContextPtr ctxt) { cur += len; CUR_PTR = cur; } else { - /* XP_ERROR(XPATH_START_LITERAL_ERROR); */ ctxt->error = 1; return(NULL); } @@ -1290,14 +1289,15 @@ xsltScanNCName(xsltParserContextPtr ctxt) { cur = q = CUR_PTR; val = xmlStringCurrentChar(NULL, cur, &len); - if (!IS_LETTER(val) && (val != '_')) + if (!xmlIsBaseCharQ(val) && !xmlIsIdeographicQ(val) && (val != '_')) return(NULL); - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || + while (xmlIsBaseCharQ(val) || xmlIsIdeographicQ(val) || + xmlIsDigitQ(val) || (val == '.') || (val == '-') || (val == '_') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { + xmlIsCombiningQ(val) || + xmlIsExtenderQ(val)) { cur += len; val = xmlStringCurrentChar(NULL, cur, &len); } @@ -1853,7 +1853,7 @@ xsltCompilePatternInternal(const xmlChar *pattern, xmlDocPtr doc, current = end = 0; while (pattern[current] != 0) { start = current; - while (IS_BLANK_CH(pattern[current])) + while (xmlIsBlank_ch(pattern[current])) current++; end = current; level = 0; diff --git a/libs/xslt/libxslt/transform.c b/libs/xslt/libxslt/transform.c index 2d8fd7f9abd..cb43bb47d99 100644 --- a/libs/xslt/libxslt/transform.c +++ b/libs/xslt/libxslt/transform.c @@ -3637,12 +3637,12 @@ xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node, element = elements; while (*element != 0) { - while (IS_BLANK_CH(*element)) + while (xmlIsBlank_ch(*element)) element++; if (*element == 0) break; end = element; - while ((*end != 0) && (!IS_BLANK_CH(*end))) + while ((*end != 0) && (!xmlIsBlank_ch(*end))) end++; element = xmlStrndup(element, end - element); if (element) {