summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2023-04-28 15:52:00 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2023-05-06 16:33:11 +0200
commit641428aaaedb9b06561b93e11493a9b3453feec3 (patch)
tree96c3a6fc05c0a7d69dfec2e4cec3d7bc701a0817
parent2b9097f9e12d4ae0fa6d78819f17b0a96cbbd46a (diff)
downloadlibxslt-641428aaaedb9b06561b93e11493a9b3453feec3.tar.gz
Stop using xmlStringCurrentChar
xmlStringCurrentChar has been deprecated.
-rw-r--r--libxslt/numbers.c15
-rw-r--r--libxslt/pattern.c12
-rw-r--r--libxslt/xsltutils.c60
-rw-r--r--libxslt/xsltutils.h7
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