diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2023-04-28 15:52:00 +0200 |
---|---|---|
committer | Nick Wellnhofer <wellnhofer@aevum.de> | 2023-05-06 16:33:11 +0200 |
commit | 641428aaaedb9b06561b93e11493a9b3453feec3 (patch) | |
tree | 96c3a6fc05c0a7d69dfec2e4cec3d7bc701a0817 | |
parent | 2b9097f9e12d4ae0fa6d78819f17b0a96cbbd46a (diff) | |
download | libxslt-641428aaaedb9b06561b93e11493a9b3453feec3.tar.gz |
Stop using xmlStringCurrentChar
xmlStringCurrentChar has been deprecated.
-rw-r--r-- | libxslt/numbers.c | 15 | ||||
-rw-r--r-- | libxslt/pattern.c | 12 | ||||
-rw-r--r-- | libxslt/xsltutils.c | 60 | ||||
-rw-r--r-- | libxslt/xsltutils.h | 7 |
4 files changed, 80 insertions, 14 deletions
diff --git a/libxslt/numbers.c b/libxslt/numbers.c index 1764abba..3cd881e3 100644 --- a/libxslt/numbers.c +++ b/libxslt/numbers.c @@ -353,8 +353,7 @@ xsltNumberFormatTokenize(const xmlChar *format, * Insert initial non-alphanumeric token. * There is always such a token in the list, even if NULL */ - while (!xsltIsLetterDigit(val = xmlStringCurrentChar(NULL, format+ix, - &len))) { + while (!xsltIsLetterDigit(val = xsltGetUTF8CharZ(format+ix, &len))) { if (format[ix] == 0) /* if end of format string */ break; /* while */ ix += len; @@ -377,19 +376,19 @@ xsltNumberFormatTokenize(const xmlChar *format, tokens->end = NULL; } - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); if (IS_DIGIT_ONE(val) || IS_DIGIT_ZERO(val)) { tokens->tokens[tokens->nTokens].width = 1; while (IS_DIGIT_ZERO(val)) { tokens->tokens[tokens->nTokens].width++; ix += len; - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); } if (IS_DIGIT_ONE(val)) { tokens->tokens[tokens->nTokens].token = val - 1; ix += len; - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); } else { tokens->tokens[tokens->nTokens].token = '0'; tokens->tokens[tokens->nTokens].width = 1; @@ -400,7 +399,7 @@ xsltNumberFormatTokenize(const xmlChar *format, (val == 'i') ) { tokens->tokens[tokens->nTokens].token = val; ix += len; - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); } else { /* XSLT section 7.7 * "Any other format token indicates a numbering sequence @@ -422,7 +421,7 @@ xsltNumberFormatTokenize(const xmlChar *format, */ while (xsltIsLetterDigit(val)) { ix += len; - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); } /* @@ -433,7 +432,7 @@ xsltNumberFormatTokenize(const xmlChar *format, if (val == 0) break; /* while */ ix += len; - val = xmlStringCurrentChar(NULL, format+ix, &len); + val = xsltGetUTF8CharZ(format+ix, &len); } if (ix > j) tokens->end = xmlStrndup(&format[j], ix - j); diff --git a/libxslt/pattern.c b/libxslt/pattern.c index 6e99b124..581f1791 100644 --- a/libxslt/pattern.c +++ b/libxslt/pattern.c @@ -1226,10 +1226,10 @@ xsltScanLiteral(xsltParserContextPtr ctxt) { if (CUR == '"') { NEXT; cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); while ((xmlIsCharQ(val)) && (val != '"')) { cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); } if (!xmlIsCharQ(val)) { ctxt->error = 1; @@ -1242,10 +1242,10 @@ xsltScanLiteral(xsltParserContextPtr ctxt) { } else if (CUR == '\'') { NEXT; cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); while ((xmlIsCharQ(val)) && (val != '\'')) { cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); } if (!xmlIsCharQ(val)) { ctxt->error = 1; @@ -1280,7 +1280,7 @@ xsltScanNCName(xsltParserContextPtr ctxt) { SKIP_BLANKS; cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); if (!xmlIsBaseCharQ(val) && !xmlIsIdeographicQ(val) && (val != '_')) return(NULL); @@ -1291,7 +1291,7 @@ xsltScanNCName(xsltParserContextPtr ctxt) { xmlIsCombiningQ(val) || xmlIsExtenderQ(val)) { cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); + val = xsltGetUTF8CharZ(cur, &len); } ret = xmlStrndup(q, cur - q); CUR_PTR = cur; diff --git a/libxslt/xsltutils.c b/libxslt/xsltutils.c index 1d3e82e5..3705d28f 100644 --- a/libxslt/xsltutils.c +++ b/libxslt/xsltutils.c @@ -305,6 +305,66 @@ error: return(-1); } +/** + * xsltGetUTF8CharZ: + * @utf: a sequence of UTF-8 encoded bytes + * @len: a pointer to @bytes len + * + * Read one UTF8 Char from a null-terminated string. + * + * Returns the char value or -1 in case of error and update @len with the + * number of bytes used + */ +int +xsltGetUTF8CharZ(const unsigned char *utf, int *len) { + unsigned int c; + + if (utf == NULL) + goto error; + if (len == NULL) + goto error; + + c = utf[0]; + if (c & 0x80) { + if ((utf[1] & 0xc0) != 0x80) + goto error; + if ((c & 0xe0) == 0xe0) { + if ((utf[2] & 0xc0) != 0x80) + goto error; + if ((c & 0xf0) == 0xf0) { + if ((c & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) + goto error; + *len = 4; + /* 4-byte code */ + c = (utf[0] & 0x7) << 18; + c |= (utf[1] & 0x3f) << 12; + c |= (utf[2] & 0x3f) << 6; + c |= utf[3] & 0x3f; + } else { + /* 3-byte code */ + *len = 3; + c = (utf[0] & 0xf) << 12; + c |= (utf[1] & 0x3f) << 6; + c |= utf[2] & 0x3f; + } + } else { + /* 2-byte code */ + *len = 2; + c = (utf[0] & 0x1f) << 6; + c |= utf[1] & 0x3f; + } + } else { + /* 1-byte code */ + *len = 1; + } + return(c); + +error: + if (len != NULL) + *len = 0; + return(-1); +} + #ifdef XSLT_REFACTORED /** diff --git a/libxslt/xsltutils.h b/libxslt/xsltutils.h index 0c5523ee..2514774b 100644 --- a/libxslt/xsltutils.h +++ b/libxslt/xsltutils.h @@ -91,6 +91,13 @@ XSLTPUBFUN const xmlChar * XSLTCALL XSLTPUBFUN int XSLTCALL xsltGetUTF8Char (const unsigned char *utf, int *len); +#ifdef IN_LIBXSLT +/** DOC_DISABLE */ +XSLTPUBFUN int XSLTCALL + xsltGetUTF8CharZ (const unsigned char *utf, + int *len); +/** DOC_ENABLE */ +#endif /* * XSLT Debug Tracing Tracing Types |