summaryrefslogtreecommitdiff
path: root/i18nutil
diff options
context:
space:
mode:
authorAlex Henrie <alexhenrie24@gmail.com>2019-12-20 09:23:06 -0700
committerEike Rathke <erack@redhat.com>2019-12-20 23:21:14 +0100
commit209fc9fd7fa433947af0bf86e210d73fa7f5a045 (patch)
tree197497404028caaa08b52c2dcf712d554b3cb039 /i18nutil
parentaeab5bfa024f7d15099730fa536d78b5a7a7ea01 (diff)
Add case table for Deseret and Osage
For characters like these that are in Unicode's Supplementary Multilingual Plane, only the low surrogate changes when changing case. Change-Id: I2c4e9880b4c41a6ecfc333bb2710cf1db3f80da7 Reviewed-on: https://gerrit.libreoffice.org/85621 Tested-by: Jenkins Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'i18nutil')
-rw-r--r--i18nutil/source/utility/casefolding.cxx17
-rw-r--r--i18nutil/source/utility/casefolding_data.h33
2 files changed, 46 insertions, 4 deletions
diff --git a/i18nutil/source/utility/casefolding.cxx b/i18nutil/source/utility/casefolding.cxx
index 0b01565a4466..cf3a716701e3 100644
--- a/i18nutil/source/utility/casefolding.cxx
+++ b/i18nutil/source/utility/casefolding.cxx
@@ -24,6 +24,7 @@
#include <i18nutil/transliteration.hxx>
#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/uno/RuntimeException.hpp>
+#include <rtl/character.hxx>
using namespace com::sun::star::lang;
using namespace com::sun::star::uno;
@@ -91,13 +92,21 @@ const Mapping& casefolding::getConditionalValue(const sal_Unicode* str, sal_Int3
Mapping casefolding::getValue(const sal_Unicode* str, sal_Int32 pos, sal_Int32 len, Locale const & aLocale, MappingType nMappingType)
{
- Mapping dummy = { 0, 1, { 0, 0, 0 } };
- sal_Int16 address = CaseMappingIndex[str[pos] >> 8];
+ Mapping dummy = { 0, 1, { str[pos], 0, 0 } };
+
+ sal_uInt32 c;
+ if (pos > 0 && rtl::isHighSurrogate(str[pos-1]) && rtl::isLowSurrogate(str[pos])) {
+ c = rtl::combineSurrogates(str[pos-1], str[pos]);
+ if (c >= SAL_N_ELEMENTS(CaseMappingIndex) * 256)
+ return dummy;
+ } else {
+ c = str[pos];
+ }
- dummy.map[0] = str[pos];
+ sal_Int16 address = CaseMappingIndex[c >> 8];
if (address >= 0) {
- address = (address << 8) + (str[pos] & 0xFF);
+ address = (address << 8) + (c & 0xFF);
if (static_cast<MappingType>(CaseMappingValue[address].type) & nMappingType) {
MappingType type = static_cast<MappingType>(CaseMappingValue[address].type);
if (type & MappingType::NotValue) {
diff --git a/i18nutil/source/utility/casefolding_data.h b/i18nutil/source/utility/casefolding_data.h
index 1cd912b2200d..20c5cc714103 100644
--- a/i18nutil/source/utility/casefolding_data.h
+++ b/i18nutil/source/utility/casefolding_data.h
@@ -56,6 +56,7 @@ static const sal_Int8 CaseMappingIndex[] = {
-1, -1, -1, -1, -1, -1, -1, -1, // e800 - efff
-1, -1, -1, -1, -1, -1, -1, -1, // f000 - f7ff
-1, -1, -1, 0x0b, -1, -1, -1, 0x0c, // f800 - ffff
+ -1, -1, -1, -1, 0x0d, -1, -1, -1, // 10000 - 107ff
};
@@ -489,6 +490,38 @@ static const Value CaseMappingValue[] = {
{0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff0 - fff7
{0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff8 - ffff
+ {0x6a, 0xDC28}, {0x6a, 0xDC29}, {0x6a, 0xDC2A}, {0x6a, 0xDC2B}, {0x6a, 0xDC2C}, {0x6a, 0xDC2D}, {0x6a, 0xDC2E}, {0x6a, 0xDC2F}, // 10400 - 10407
+ {0x6a, 0xDC30}, {0x6a, 0xDC31}, {0x6a, 0xDC32}, {0x6a, 0xDC33}, {0x6a, 0xDC34}, {0x6a, 0xDC35}, {0x6a, 0xDC36}, {0x6a, 0xDC37}, // 10408 - 1040f
+ {0x6a, 0xDC38}, {0x6a, 0xDC39}, {0x6a, 0xDC3A}, {0x6a, 0xDC3B}, {0x6a, 0xDC3C}, {0x6a, 0xDC3D}, {0x6a, 0xDC3E}, {0x6a, 0xDC3F}, // 10410 - 10417
+ {0x6a, 0xDC40}, {0x6a, 0xDC41}, {0x6a, 0xDC42}, {0x6a, 0xDC43}, {0x6a, 0xDC44}, {0x6a, 0xDC45}, {0x6a, 0xDC46}, {0x6a, 0xDC47}, // 10418 - 1041f
+ {0x6a, 0xDC48}, {0x6a, 0xDC49}, {0x6a, 0xDC4A}, {0x6a, 0xDC4B}, {0x6a, 0xDC4C}, {0x6a, 0xDC4D}, {0x6a, 0xDC4E}, {0x6a, 0xDC4F}, // 10420 - 10427
+ {0x15, 0xDC00}, {0x15, 0xDC01}, {0x15, 0xDC02}, {0x15, 0xDC03}, {0x15, 0xDC04}, {0x15, 0xDC05}, {0x15, 0xDC06}, {0x15, 0xDC07}, // 10428 - 1042f
+ {0x15, 0xDC08}, {0x15, 0xDC09}, {0x15, 0xDC0A}, {0x15, 0xDC0B}, {0x15, 0xDC0C}, {0x15, 0xDC0D}, {0x15, 0xDC0E}, {0x15, 0xDC0F}, // 10430 - 10437
+ {0x15, 0xDC10}, {0x15, 0xDC11}, {0x15, 0xDC12}, {0x15, 0xDC13}, {0x15, 0xDC14}, {0x15, 0xDC15}, {0x15, 0xDC16}, {0x15, 0xDC17}, // 10438 - 1043f
+ {0x15, 0xDC18}, {0x15, 0xDC19}, {0x15, 0xDC1A}, {0x15, 0xDC1B}, {0x15, 0xDC1C}, {0x15, 0xDC1D}, {0x15, 0xDC1E}, {0x15, 0xDC1F}, // 10440 - 10447
+ {0x15, 0xDC20}, {0x15, 0xDC21}, {0x15, 0xDC22}, {0x15, 0xDC23}, {0x15, 0xDC24}, {0x15, 0xDC25}, {0x15, 0xDC26}, {0x15, 0xDC27}, // 10448 - 1044f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10450 - 10457
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10458 - 1045f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10460 - 10467
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10468 - 1046f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10470 - 10477
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10478 - 1047f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10480 - 10487
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10488 - 1048f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10490 - 10497
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 10498 - 1049f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 104a0 - 104a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 104a8 - 104af
+ {0x6a, 0xDCD8}, {0x6a, 0xDCD9}, {0x6a, 0xDCDA}, {0x6a, 0xDCDB}, {0x6a, 0xDCDC}, {0x6a, 0xDCDD}, {0x6a, 0xDCDE}, {0x6a, 0xDCDF}, // 104b0 - 104b7
+ {0x6a, 0xDCE0}, {0x6a, 0xDCE1}, {0x6a, 0xDCE2}, {0x6a, 0xDCE3}, {0x6a, 0xDCE4}, {0x6a, 0xDCE5}, {0x6a, 0xDCE6}, {0x6a, 0xDCE7}, // 104b8 - 104bf
+ {0x6a, 0xDCE8}, {0x6a, 0xDCE9}, {0x6a, 0xDCEA}, {0x6a, 0xDCEB}, {0x6a, 0xDCEC}, {0x6a, 0xDCED}, {0x6a, 0xDCEE}, {0x6a, 0xDCEF}, // 104c0 - 104c7
+ {0x6a, 0xDCF0}, {0x6a, 0xDCF1}, {0x6a, 0xDCF2}, {0x6a, 0xDCF3}, {0x6a, 0xDCF4}, {0x6a, 0xDCF5}, {0x6a, 0xDCF6}, {0x6a, 0xDCF7}, // 104c8 - 104cf
+ {0x6a, 0xDCF8}, {0x6a, 0xDCF9}, {0x6a, 0xDCFA}, {0x6a, 0xDCFB}, {0x6a, 0x0000}, {0x6a, 0x0000}, {0x6a, 0x0000}, {0x6a, 0x0000}, // 104d0 - 104d7
+ {0x15, 0xDCB0}, {0x15, 0xDCB1}, {0x15, 0xDCB2}, {0x15, 0xDCB3}, {0x15, 0xDCB4}, {0x15, 0xDCB5}, {0x15, 0xDCB6}, {0x15, 0xDCB7}, // 104d8 - 104df
+ {0x15, 0xDCB8}, {0x15, 0xDCB9}, {0x15, 0xDCBA}, {0x15, 0xDCBB}, {0x15, 0xDCBC}, {0x15, 0xDCBD}, {0x15, 0xDCBE}, {0x15, 0xDCBF}, // 104e0 - 104e7
+ {0x15, 0xDCC0}, {0x15, 0xDCC1}, {0x15, 0xDCC2}, {0x15, 0xDCC3}, {0x15, 0xDCC4}, {0x15, 0xDCC5}, {0x15, 0xDCC6}, {0x15, 0xDCC7}, // 104e8 - 104ef
+ {0x15, 0xDCD0}, {0x15, 0xDCD1}, {0x15, 0xDCD2}, {0x15, 0xDCD3}, {0x15, 0xDCD4}, {0x15, 0xDCD5}, {0x15, 0xDCD6}, {0x15, 0xDCD7}, // 104f0 - 104f7
+ {0x15, 0xDCD8}, {0x15, 0xDCD9}, {0x15, 0xDCDA}, {0x15, 0xDCDB}, {0x15, 0x0000}, {0x15, 0x0000}, {0x15, 0x0000}, {0x15, 0x0000}, // 104f8 - 104ff
};