221 lines
7.3 KiB
Diff
221 lines
7.3 KiB
Diff
From de6d869a8ef5ca327231fb73489f4c9024d8757a Mon Sep 17 00:00:00 2001
|
||
From: Nick Wellnhofer <wellnhofer@aevum.de>
|
||
Date: Sat, 27 Apr 2019 14:33:29 +0200
|
||
Subject: [PATCH 15/26] Fix numbering in non-Latin scripts
|
||
|
||
The `token` type wasn't wide enough to hold a Unicode code point.
|
||
---
|
||
libxslt/numbers.c | 24 +++++++++--------
|
||
tests/docs/bug-219.xml | 22 +++++++++++++++
|
||
tests/general/bug-219.out | 68 +++++++++++++++++++++++++++++++++++++++++++++++
|
||
tests/general/bug-219.xsl | 17 ++++++++++++
|
||
4 files changed, 120 insertions(+), 11 deletions(-)
|
||
create mode 100644 tests/docs/bug-219.xml
|
||
create mode 100644 tests/general/bug-219.out
|
||
create mode 100644 tests/general/bug-219.xsl
|
||
|
||
diff --git a/libxslt/numbers.c b/libxslt/numbers.c
|
||
index 75c31eb..0a2a51c 100644
|
||
--- a/libxslt/numbers.c
|
||
+++ b/libxslt/numbers.c
|
||
@@ -36,7 +36,7 @@
|
||
|
||
#define SYMBOL_QUOTE ((xmlChar)'\'')
|
||
|
||
-#define DEFAULT_TOKEN (xmlChar)'0'
|
||
+#define DEFAULT_TOKEN '0'
|
||
#define DEFAULT_SEPARATOR "."
|
||
|
||
#define MAX_TOKENS 1024
|
||
@@ -45,7 +45,7 @@ typedef struct _xsltFormatToken xsltFormatToken;
|
||
typedef xsltFormatToken *xsltFormatTokenPtr;
|
||
struct _xsltFormatToken {
|
||
xmlChar *separator;
|
||
- xmlChar token;
|
||
+ int token;
|
||
int width;
|
||
};
|
||
|
||
@@ -107,20 +107,22 @@ xsltUTF8Charcmp(xmlChar *utf1, xmlChar *utf2) {
|
||
(xsltUTF8Charcmp((letter), (self)->patternSeparator) == 0))
|
||
|
||
#define IS_DIGIT_ZERO(x) xsltIsDigitZero(x)
|
||
-#define IS_DIGIT_ONE(x) xsltIsDigitZero((xmlChar)(x)-1)
|
||
+#define IS_DIGIT_ONE(x) xsltIsDigitZero((x)-1)
|
||
|
||
static int
|
||
xsltIsDigitZero(unsigned int ch)
|
||
{
|
||
/*
|
||
* Reference: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
|
||
+ *
|
||
+ * There a many more digit ranges in newer Unicode versions. These
|
||
+ * are only the zeros that match Digit in XML 1.0 (IS_DIGIT macro).
|
||
*/
|
||
switch (ch) {
|
||
case 0x0030: case 0x0660: case 0x06F0: case 0x0966:
|
||
case 0x09E6: case 0x0A66: case 0x0AE6: case 0x0B66:
|
||
case 0x0C66: case 0x0CE6: case 0x0D66: case 0x0E50:
|
||
- case 0x0E60: case 0x0F20: case 0x1040: case 0x17E0:
|
||
- case 0x1810: case 0xFF10:
|
||
+ case 0x0ED0: case 0x0F20:
|
||
return TRUE;
|
||
default:
|
||
return FALSE;
|
||
@@ -383,13 +385,13 @@ xsltNumberFormatTokenize(const xmlChar *format,
|
||
ix += len;
|
||
val = xmlStringCurrentChar(NULL, format+ix, &len);
|
||
} else {
|
||
- tokens->tokens[tokens->nTokens].token = (xmlChar)'0';
|
||
+ tokens->tokens[tokens->nTokens].token = '0';
|
||
tokens->tokens[tokens->nTokens].width = 1;
|
||
}
|
||
- } else if ( (val == (xmlChar)'A') ||
|
||
- (val == (xmlChar)'a') ||
|
||
- (val == (xmlChar)'I') ||
|
||
- (val == (xmlChar)'i') ) {
|
||
+ } else if ( (val == 'A') ||
|
||
+ (val == 'a') ||
|
||
+ (val == 'I') ||
|
||
+ (val == 'i') ) {
|
||
tokens->tokens[tokens->nTokens].token = val;
|
||
ix += len;
|
||
val = xmlStringCurrentChar(NULL, format+ix, &len);
|
||
@@ -400,7 +402,7 @@ xsltNumberFormatTokenize(const xmlChar *format,
|
||
* not support a numbering sequence that starts with that
|
||
* token, it must use a format token of 1."
|
||
*/
|
||
- tokens->tokens[tokens->nTokens].token = (xmlChar)'0';
|
||
+ tokens->tokens[tokens->nTokens].token = '0';
|
||
tokens->tokens[tokens->nTokens].width = 1;
|
||
}
|
||
/*
|
||
diff --git a/tests/docs/bug-219.xml b/tests/docs/bug-219.xml
|
||
new file mode 100644
|
||
index 0000000..6549781
|
||
--- /dev/null
|
||
+++ b/tests/docs/bug-219.xml
|
||
@@ -0,0 +1,22 @@
|
||
+<test>
|
||
+ <formats>
|
||
+ <format>٠١</format>
|
||
+ <format>۰۱</format>
|
||
+ <format>०१</format>
|
||
+ <format>০১</format>
|
||
+ <format>੦੧</format>
|
||
+ <format>૦૧</format>
|
||
+ <format>୦୧</format>
|
||
+ <format>౦౧</format>
|
||
+ <format>೦೧</format>
|
||
+ <format>൦൧</format>
|
||
+ <format>๐๑</format>
|
||
+ <format>໐໑</format>
|
||
+ <format>༠༡</format>
|
||
+ </formats>
|
||
+ <values>
|
||
+ <value>0</value>
|
||
+ <value>9</value>
|
||
+ <value>1234567890</value>
|
||
+ </values>
|
||
+</test>
|
||
diff --git a/tests/general/bug-219.out b/tests/general/bug-219.out
|
||
new file mode 100644
|
||
index 0000000..908043c
|
||
--- /dev/null
|
||
+++ b/tests/general/bug-219.out
|
||
@@ -0,0 +1,68 @@
|
||
+<?xml version="1.0"?>
|
||
+<results>
|
||
+ <format f="٠١">
|
||
+ <value v="0">٠٠</value>
|
||
+ <value v="9">٠٩</value>
|
||
+ <value v="1234567890">١٢٣٤٥٦٧٨٩٠</value>
|
||
+ </format>
|
||
+ <format f="۰۱">
|
||
+ <value v="0">۰۰</value>
|
||
+ <value v="9">۰۹</value>
|
||
+ <value v="1234567890">۱۲۳۴۵۶۷۸۹۰</value>
|
||
+ </format>
|
||
+ <format f="०१">
|
||
+ <value v="0">००</value>
|
||
+ <value v="9">०९</value>
|
||
+ <value v="1234567890">१२३४५६७८९०</value>
|
||
+ </format>
|
||
+ <format f="০১">
|
||
+ <value v="0">০০</value>
|
||
+ <value v="9">০৯</value>
|
||
+ <value v="1234567890">১২৩৪৫৬৭৮৯০</value>
|
||
+ </format>
|
||
+ <format f="੦੧">
|
||
+ <value v="0">੦੦</value>
|
||
+ <value v="9">੦੯</value>
|
||
+ <value v="1234567890">੧੨੩੪੫੬੭੮੯੦</value>
|
||
+ </format>
|
||
+ <format f="૦૧">
|
||
+ <value v="0">૦૦</value>
|
||
+ <value v="9">૦૯</value>
|
||
+ <value v="1234567890">૧૨૩૪૫૬૭૮૯૦</value>
|
||
+ </format>
|
||
+ <format f="୦୧">
|
||
+ <value v="0">୦୦</value>
|
||
+ <value v="9">୦୯</value>
|
||
+ <value v="1234567890">୧୨୩୪୫୬୭୮୯୦</value>
|
||
+ </format>
|
||
+ <format f="౦౧">
|
||
+ <value v="0">౦౦</value>
|
||
+ <value v="9">౦౯</value>
|
||
+ <value v="1234567890">౧౨౩౪౫౬౭౮౯౦</value>
|
||
+ </format>
|
||
+ <format f="೦೧">
|
||
+ <value v="0">೦೦</value>
|
||
+ <value v="9">೦೯</value>
|
||
+ <value v="1234567890">೧೨೩೪೫೬೭೮೯೦</value>
|
||
+ </format>
|
||
+ <format f="൦൧">
|
||
+ <value v="0">൦൦</value>
|
||
+ <value v="9">൦൯</value>
|
||
+ <value v="1234567890">൧൨൩൪൫൬൭൮൯൦</value>
|
||
+ </format>
|
||
+ <format f="๐๑">
|
||
+ <value v="0">๐๐</value>
|
||
+ <value v="9">๐๙</value>
|
||
+ <value v="1234567890">๑๒๓๔๕๖๗๘๙๐</value>
|
||
+ </format>
|
||
+ <format f="໐໑">
|
||
+ <value v="0">໐໐</value>
|
||
+ <value v="9">໐໙</value>
|
||
+ <value v="1234567890">໑໒໓໔໕໖໗໘໙໐</value>
|
||
+ </format>
|
||
+ <format f="༠༡">
|
||
+ <value v="0">༠༠</value>
|
||
+ <value v="9">༠༩</value>
|
||
+ <value v="1234567890">༡༢༣༤༥༦༧༨༩༠</value>
|
||
+ </format>
|
||
+</results>
|
||
diff --git a/tests/general/bug-219.xsl b/tests/general/bug-219.xsl
|
||
new file mode 100644
|
||
index 0000000..e291994
|
||
--- /dev/null
|
||
+++ b/tests/general/bug-219.xsl
|
||
@@ -0,0 +1,17 @@
|
||
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||
+ <xsl:output indent="yes"/>
|
||
+ <xsl:template match="test">
|
||
+ <results>
|
||
+ <xsl:for-each select="formats/format">
|
||
+ <format f="{.}">
|
||
+ <xsl:variable name="f" select="."/>
|
||
+ <xsl:for-each select="/test/values/value">
|
||
+ <value v="{.}">
|
||
+ <xsl:number value="." format="{$f}"/>
|
||
+ </value>
|
||
+ </xsl:for-each>
|
||
+ </format>
|
||
+ </xsl:for-each>
|
||
+ </results>
|
||
+ </xsl:template>
|
||
+</xsl:stylesheet>
|
||
--
|
||
1.8.3.1
|
||
|