ICU-13177 Merging trunk to branch

X-SVN-Rev: 40168
This commit is contained in:
Shane Carr 2017-06-13 20:42:33 +00:00
commit d177e8b645
135 changed files with 20810 additions and 2882 deletions

View File

@ -110,7 +110,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuuc59.dll</OutputFile>
<OutputFile>..\..\bin\icuuc60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib\icuuc.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -152,7 +152,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuuc59d.dll</OutputFile>
<OutputFile>..\..\bin\icuuc60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib\icuucd.pdb</ProgramDatabaseFile>
@ -191,7 +191,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuuc59.dll</OutputFile>
<OutputFile>..\..\bin64\icuuc60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib64\icuuc.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -231,7 +231,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuuc59d.dll</OutputFile>
<OutputFile>..\..\bin64\icuuc60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib64\icuucd.pdb</ProgramDatabaseFile>

View File

@ -84,7 +84,7 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod
const uint8_t *inBytes=(const uint8_t *)udata_getMemory(memory);
const int32_t *inIndexes=(const int32_t *)inBytes;
int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4;
if(indexesLength<=IX_MIN_MAYBE_YES) {
if(indexesLength<=IX_MIN_YES_NO_MAPPINGS_ONLY) {
errorCode=U_INVALID_FORMAT_ERROR; // Not enough indexes.
return;
}

View File

@ -5,7 +5,7 @@
* Copyright (C) 2014, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* loadednormalizer2impl.h
* norm2allmodes.h
*
* created on: 2014sep07
* created by: Markus W. Scherer
@ -18,6 +18,7 @@
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/edits.h"
#include "unicode/normalizer2.h"
#include "unicode/unistr.h"
#include "cpputils.h"
@ -228,6 +229,22 @@ private:
impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode);
}
using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function.
void
normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink,
Edits *edits, UErrorCode &errorCode) const override {
if (U_FAILURE(errorCode)) {
return;
}
if (edits != nullptr) {
edits->reset();
}
const uint8_t *s = reinterpret_cast<const uint8_t *>(src.data());
impl.composeUTF8(options, s, s + src.length(),
onlyContiguous, TRUE, sink, edits, errorCode);
sink.Flush();
}
virtual void
normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize,
UnicodeString &safeMiddle,

View File

@ -20,6 +20,7 @@
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/edits.h"
#include "unicode/normalizer2.h"
#include "unicode/unistr.h"
#include "unicode/unorm.h"
@ -42,6 +43,20 @@ U_NAMESPACE_BEGIN
Normalizer2::~Normalizer2() {}
void
Normalizer2::normalizeUTF8(uint32_t /*options*/, StringPiece src, ByteSink &sink,
Edits *edits, UErrorCode &errorCode) const {
if (U_FAILURE(errorCode)) {
return;
}
if (edits != nullptr) {
errorCode = U_UNSUPPORTED_ERROR;
return;
}
UnicodeString src16 = UnicodeString::fromUTF8(src);
normalize(src16, errorCode).toUTF8(sink);
}
UBool
Normalizer2::getRawDecomposition(UChar32, UnicodeString &) const {
return FALSE;
@ -74,6 +89,19 @@ class NoopNormalizer2 : public Normalizer2 {
}
return dest;
}
void
normalizeUTF8(uint32_t /*options*/, StringPiece src, ByteSink &sink,
Edits *edits, UErrorCode &errorCode) const override {
if(U_SUCCESS(errorCode)) {
sink.Append(src.data(), src.length());
if (edits != nullptr) {
edits->reset();
edits->addUnchanged(src.length());
}
sink.Flush();
}
}
virtual UnicodeString &
normalizeSecondAndAppend(UnicodeString &first,
const UnicodeString &second,

View File

@ -20,10 +20,14 @@
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/bytestream.h"
#include "unicode/edits.h"
#include "unicode/normalizer2.h"
#include "unicode/stringoptions.h"
#include "unicode/udata.h"
#include "unicode/ustring.h"
#include "unicode/utf16.h"
#include "unicode/utf8.h"
#include "cmemory.h"
#include "mutex.h"
#include "normalizer2impl.h"
@ -35,6 +39,175 @@
U_NAMESPACE_BEGIN
namespace {
/**
* UTF-8 lead byte for minNoMaybeCP.
* Can be lower than the actual lead byte for c.
* Typically U+0300 for NFC/NFD, U+00A0 for NFKC/NFKD, U+0041 for NFKC_Casefold.
*/
inline uint8_t leadByteForCP(UChar32 c) {
if (c <= 0x7f) {
return (uint8_t)c;
} else if (c <= 0x7ff) {
return (uint8_t)(0xc0+(c>>6));
} else {
// Should not occur because ccc(U+0300)!=0.
return 0xe0;
}
}
/**
* Returns the code point from one single well-formed UTF-8 byte sequence
* between src and limit.
*
* UTrie2 UTF-8 macros do not assemble whole code points (for efficiency).
* When we do need the code point, we call this function.
* We should not need it for normalization-inert data (norm16==0).
* Illegal sequences yield the error value norm16==0 just like real normalization-inert code points.
*/
UChar32 codePointFromValidUTF8(const uint8_t *src, const uint8_t *limit) {
// Similar to U8_NEXT_UNSAFE(s, i, c).
U_ASSERT(src < limit);
uint8_t c = *src;
switch(limit-src) {
case 1:
return c;
case 2:
return ((c&0x1f)<<6) | (src[1]&0x3f);
case 3:
// no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar)
return (UChar)((c<<12) | ((src[1]&0x3f)<<6) | (src[2]&0x3f));
case 4:
return ((c&7)<<18) | ((src[1]&0x3f)<<12) | ((src[2]&0x3f)<<6) | (src[3]&0x3f);
default:
U_ASSERT(FALSE); // Should not occur.
return U_SENTINEL;
}
}
/**
* Returns the offset from the Jamo L base if [src, limit[ is a single Jamo L code point.
* Otherwise returns a negative value.
*/
int32_t getJamoLMinusBase(const uint8_t *src, const uint8_t *limit) {
// Jamo L: E1 84 80..92
if ((limit - src) == 3 && *src == 0xe1 && src[1] == 0x84) {
uint8_t l = src[2] - 0x80;
if (l < Hangul::JAMO_L_COUNT) {
return l;
}
}
return -1;
}
/**
* Returns the offset from the Jamo T base if [src, limit[ starts with a single Jamo T code point.
* Otherwise returns a negative value.
*/
int32_t getJamoTMinusBase(const uint8_t *src, const uint8_t *limit) {
// Jamo T: E1 86 A8..E1 87 82
if ((limit - src) >= 3 && *src == 0xe1) {
if (src[1] == 0x86) {
uint8_t t = src[2];
// The first Jamo T is U+11A8 but JAMO_T_BASE is 11A7.
// Offset 0 does not correspond to any conjoining Jamo.
if (0xa8 <= t && t <= 0xbf) {
return t - 0xa7;
}
} else if (src[1] == 0x87) {
uint8_t t = src[2];
if ((int8_t)t <= (int8_t)0x82) {
return t - (0xa7 - 0x40);
}
}
}
return -1;
}
void giveByteSinkAllocationHint(ByteSink &sink, int32_t desiredCapacity) {
char scratch[1];
int32_t capacity;
sink.GetAppendBuffer(1, desiredCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
}
/** The bytes at [src, nextSrc[ were mapped to valid (s16, s16Length). */
UBool
appendChange(const uint8_t *src, const uint8_t *nextSrc,
const char16_t *s16, int32_t s16Length,
ByteSink &sink, Edits *edits, UErrorCode &errorCode) {
U_ASSERT(U_SUCCESS(errorCode));
U_ASSERT((nextSrc - src) <= INT32_MAX); // ensured by caller
char scratch[200];
int32_t s8Length = 0;
for (int32_t i = 0; i < s16Length;) {
int32_t capacity;
int32_t desiredCapacity = s16Length - i;
if (desiredCapacity < (INT32_MAX / 3)) {
desiredCapacity *= 3; // max 3 UTF-8 bytes per UTF-16 code unit
} else if (desiredCapacity < (INT32_MAX / 2)) {
desiredCapacity *= 2;
} else {
desiredCapacity = INT32_MAX;
}
char *buffer = sink.GetAppendBuffer(U8_MAX_LENGTH, desiredCapacity,
scratch, UPRV_LENGTHOF(scratch), &capacity);
capacity -= U8_MAX_LENGTH - 1;
int32_t j = 0;
for (; i < s16Length && j < capacity;) {
UChar32 c;
U16_NEXT_UNSAFE(s16, i, c);
U8_APPEND_UNSAFE(buffer, j, c);
}
if (j > (INT32_MAX - s8Length)) {
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return FALSE;
}
sink.Append(buffer, j);
s8Length += j;
}
if (edits != nullptr) {
edits->addReplace((int32_t)(nextSrc - src), s8Length);
}
return TRUE;
}
/** The few bytes at [src, nextSrc[ were mapped to valid code point c. */
void
appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c,
ByteSink &sink, Edits *edits) {
char buffer[U8_MAX_LENGTH];
int32_t length = 0;
U8_APPEND_UNSAFE(buffer, length, c);
if (edits != nullptr) {
edits->addReplace((int32_t)(nextSrc - src), length);
}
sink.Append(buffer, length);
}
UBool
appendUnchanged(const uint8_t *s, const uint8_t *limit,
ByteSink &sink, uint32_t options, Edits *edits,
UErrorCode &errorCode) {
U_ASSERT(U_SUCCESS(errorCode));
if ((limit - s) > INT32_MAX) {
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return FALSE;
}
int32_t length = (int32_t)(limit - s);
if (length > 0) {
if (edits != nullptr) {
edits->addUnchanged(length);
}
if ((options & U_OMIT_UNCHANGED_TEXT) ==0) {
sink.Append(reinterpret_cast<const char *>(s), length);
}
}
return TRUE;
}
} // namespace
// ReorderingBuffer -------------------------------------------------------- ***
UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) {
@ -69,6 +242,32 @@ UBool ReorderingBuffer::equals(const UChar *otherStart, const UChar *otherLimit)
0==u_memcmp(start, otherStart, length);
}
UBool ReorderingBuffer::equals(const uint8_t *otherStart, const uint8_t *otherLimit) const {
U_ASSERT((otherLimit - otherStart) <= INT32_MAX); // ensured by caller
int32_t length = (int32_t)(limit - start);
int32_t otherLength = (int32_t)(otherLimit - otherStart);
// For equal strings, UTF-8 is at least as long as UTF-16, and at most three times as long.
if (otherLength < length || (otherLength / 3) > length) {
return FALSE;
}
// Compare valid strings from between normalization boundaries.
// (Invalid sequences are normalization-inert.)
for (int32_t i = 0, j = 0;;) {
if (i >= length) {
return j >= otherLength;
} else if (j >= otherLength) {
return FALSE;
}
// Not at the end of either string yet.
UChar32 c, other;
U16_NEXT_UNSAFE(start, i, c);
U8_NEXT_UNSAFE(otherStart, j, other);
if (c != other) {
return FALSE;
}
}
}
UBool ReorderingBuffer::appendSupplementary(UChar32 c, uint8_t cc, UErrorCode &errorCode) {
if(remainingCapacity<2 && !resize(2, errorCode)) {
return FALSE;
@ -615,6 +814,86 @@ UBool Normalizer2Impl::decompose(UChar32 c, uint16_t norm16,
}
}
const uint8_t *
Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit,
UBool stopAtCompBoundary, ReorderingBuffer &buffer,
UErrorCode &errorCode) const {
if (U_FAILURE(errorCode)) {
return nullptr;
}
// UTF-8 version of decomposeShort() + findNextCompBoundary() together
while (src < limit) {
const uint8_t *nextSrc = src;
uint16_t norm16;
UTRIE2_U8_NEXT16(normTrie, nextSrc, limit, norm16);
// Get the decomposition and the lead and trail cc's.
// Only loops for 1:1 algorithmic mappings.
UChar32 c = U_SENTINEL;
for (;;) {
if (stopAtCompBoundary && isCompYesAndZeroCC(norm16)) {
return src;
}
// norm16!=0 guarantees that [src, nextSrc[ is valid UTF-8.
// We do not see invalid UTF-8 here because
// its norm16==0 is normalization-inert,
// so it gets copied unchanged in the fast path,
// and we stop the slow path where invalid UTF-8 begins.
U_ASSERT(norm16 != 0);
if (isDecompYes(norm16)) {
if (c < 0) {
c = codePointFromValidUTF8(src, nextSrc);
}
// does not decompose
if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) {
return nullptr;
}
break;
} else if (isHangul(norm16)) {
// Hangul syllable: decompose algorithmically
if (c < 0) {
c = codePointFromValidUTF8(src, nextSrc);
}
char16_t jamos[3];
if (!buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode)) {
return nullptr;
}
break;
} else if (isDecompNoAlgorithmic(norm16)) {
if (c < 0) {
c = codePointFromValidUTF8(src, nextSrc);
}
c = mapAlgorithmic(c, norm16);
norm16 = getNorm16(c);
} else {
// The character decomposes, get everything from the variable-length extra data.
const uint16_t *mapping = getMapping(norm16);
uint16_t firstUnit = *mapping;
int32_t length = firstUnit & MAPPING_LENGTH_MASK;
uint8_t leadCC;
if (firstUnit & MAPPING_HAS_CCC_LCCC_WORD) {
leadCC = (uint8_t)(*(mapping-1) >> 8);
} else {
leadCC = 0;
}
if (stopAtCompBoundary && length != 0 && leadCC == 0) {
int32_t i = 1; // skip over the firstUnit
U16_NEXT_UNSAFE(mapping, i, c);
if (isCompYesAndZeroCC(getNorm16(c))) {
return src;
}
}
uint8_t trailCC = (uint8_t)(firstUnit >> 8);
if (!buffer.append((const char16_t *)mapping+1, length, leadCC, trailCC, errorCode)) {
return nullptr;
}
break;
}
}
src = nextSrc;
}
return src;
}
const UChar *
Normalizer2Impl::getDecomposition(UChar32 c, UChar buffer[4], int32_t &length) const {
const UChar *decomp=NULL;
@ -1481,6 +1760,330 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit,
}
}
namespace {
const int32_t COMP_NO_CP = 0xfffffc00; // U_SENTINEL << 10 (negative)
const int32_t COMP_BOUNDARY_BEFORE = 0x200;
const int32_t COMP_BOUNDARY_AFTER = 0x100;
} // namespace
/**
* Returns composition properties as an int with bit fields.
* Bits 31..10: algorithmic-decomp cp if that is compYes, else U_SENTINEL
* Bit 9: has boundary before
* Bit 8: has boundary after
* Bits 7..0: tccc if decompNo, else 0
*/
int32_t
Normalizer2Impl::getCompProps(const uint8_t *src, const uint8_t *limit,
uint16_t norm16, UBool onlyContiguous) const {
UChar32 c = U_SENTINEL;
for (;;) {
if (isInert(norm16)) {
return (c << 10) | COMP_BOUNDARY_BEFORE | COMP_BOUNDARY_AFTER;
} else if (norm16 <= minYesNo) {
int32_t props = COMP_BOUNDARY_BEFORE;
// Hangul: norm16==minYesNo
// Hangul LVT has a boundary after it.
// Hangul LV and non-inert yesYes characters combine forward.
if (isHangul(norm16)) {
// Do not modify c so that we don't confuse the fast path
// for algorithmic decompositions surrounded by boundaries.
UChar syllable;
if (c >= 0) {
syllable = (UChar)c;
} else {
// One branch of codePointFromValidUTF8(src, limit).
U_ASSERT((limit - src) == 3);
syllable = (UChar)((*src<<12) | ((src[1]&0x3f)<<6) | (src[2]&0x3f));
}
if (!Hangul::isHangulWithoutJamoT(syllable)) {
props |= COMP_BOUNDARY_AFTER;
}
}
return (c << 10) | props;
} else if (norm16 >= minMaybeYes) {
if (norm16 >= MIN_YES_YES_WITH_CC) {
return (c << 10);
} else {
// Do not return c>=0 for a compMaybe character.
return COMP_NO_CP;
}
} else if (isDecompNoAlgorithmic(norm16)) {
if (c < 0) {
c = codePointFromValidUTF8(src, limit);
}
c = mapAlgorithmic(c, norm16);
norm16 = getNorm16(c);
} else {
// c decomposes, get everything from the variable-length extra data.
const uint16_t *mapping = getMapping(norm16);
uint16_t firstUnit = *mapping;
int32_t props = firstUnit >> 8; // tccc
if (norm16 < minNoNo) {
props |= (c << 10) | COMP_BOUNDARY_BEFORE;
} else {
// Do not return c>=0 for a compNo character.
props |= COMP_NO_CP;
if ((firstUnit & MAPPING_LENGTH_MASK) != 0 &&
((firstUnit & MAPPING_HAS_CCC_LCCC_WORD) == 0 ||
(*(mapping-1) & 0xff00) == 0)) {
// The decomposition is not empty, and lccc==0.
int32_t i = 1; // skip over the firstUnit
UChar32 firstCP;
U16_NEXT_UNSAFE(mapping, i, firstCP);
if (isCompYesAndZeroCC(getNorm16(firstCP))) {
props |= COMP_BOUNDARY_BEFORE;
}
}
}
// comp-boundary-after if
// not MAPPING_NO_COMP_BOUNDARY_AFTER
// (which is set if
// c is not deleted, and
// it and its decomposition do not combine forward, and it has a starter)
// and if FCC then trailCC<=1
if ((firstUnit & MAPPING_NO_COMP_BOUNDARY_AFTER) == 0 &&
(!onlyContiguous || firstUnit <= 0x1ff)) {
props |= COMP_BOUNDARY_AFTER;
}
return props;
}
}
}
UBool
Normalizer2Impl::composeUTF8(uint32_t options,
const uint8_t *src, const uint8_t *limit,
UBool onlyContiguous, UBool doCompose,
ByteSink &sink, Edits *edits, UErrorCode &errorCode) const {
U_ASSERT(limit != nullptr);
uint8_t minNoMaybeLead = leadByteForCP(minCompNoMaybeCP);
for (;;) {
// Fast path: Scan over a sequence of characters below the minimum "no or maybe" code point,
// or with (compYes && ccc==0) properties.
const uint8_t *prevSrc = src;
const uint8_t *nextSrc;
uint16_t norm16 = 0;
for (;;) {
if (src == limit) {
if (src != prevSrc && doCompose) {
appendUnchanged(prevSrc, limit, sink, options, edits, errorCode);
}
return TRUE;
}
if (*src < minNoMaybeLead) {
++src;
} else {
nextSrc = src;
UTRIE2_U8_NEXT16(normTrie, nextSrc, limit, norm16);
if (isCompYesAndZeroCC(norm16)) {
src = nextSrc;
} else {
break;
}
}
}
// Copy this sequence.
// Omit the last character if there is not a boundary between it and the current one.
int32_t props = getCompProps(src, nextSrc, norm16, onlyContiguous);
int32_t prevProps = 0;
if (src != prevSrc) {
const uint8_t *p = src;
if ((props & COMP_BOUNDARY_BEFORE) == 0) {
uint16_t prevNorm16 = 0;
UTRIE2_U8_PREV16(normTrie, prevSrc, p, prevNorm16);
prevProps = getCompProps(p, src, prevNorm16, onlyContiguous);
if (prevProps & COMP_BOUNDARY_AFTER) {
p = src;
}
}
if (p != prevSrc) {
if (doCompose) {
if ((limit - prevSrc) <= INT32_MAX) {
// Allocation hint for the full remaining string,
// not just for what we are copying now.
giveByteSinkAllocationHint(sink, (int32_t)(limit - prevSrc));
}
if (!appendUnchanged(prevSrc, p, sink, options, edits, errorCode)) {
break;
}
}
prevSrc = p;
}
}
// isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo.
// The current character is either a "noNo" (has a mapping)
// or a "maybeYes" (combines backward)
// or a "yesYes" with ccc!=0.
// It is not a Hangul syllable or Jamo L because those have "yes" properties.
// Medium-fast path: Handle cases that do not require full decomposition and recomposition.
if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes
if (!doCompose) {
return FALSE;
}
// Fast path for mapping a character that is immediately surrounded by boundaries.
// In this case, we need not decompose around the current character
// So far, we only do this for algorithmic mappings to a compYes code point;
// props>=0 only when this is the case.
// Algorithmic mappings are common when the normalization data includes case folding.
// If we knew that a full decomposition is composition-normalized
// (does not partially recompose),
// or if we had the recomposition directly available in the data,
// then we could extend this fastpath to such mappings.
if (props >= 0 && // alg. decomp to compYes
prevSrc == src && // has boundary before
((props & COMP_BOUNDARY_AFTER) || hasCompBoundaryBefore(nextSrc, limit))) {
appendCodePoint(src, nextSrc, props >> 10, sink, edits);
src = nextSrc;
continue;
}
} else if (isJamoVT(norm16) && prevSrc != src) {
// Jamo L: E1 84 80..92
// Jamo V: E1 85 A1..B5
// Jamo T: E1 86 A8..E1 87 82
U_ASSERT((nextSrc - src) == 3 && *src == 0xe1);
UChar32 prev;
if (src[1] == 0x85) {
// The current character is a Jamo Vowel,
// compose with previous Jamo L and following Jamo T.
if ((prev = getJamoLMinusBase(prevSrc, src)) >= 0) {
if (!doCompose) {
return FALSE;
}
UChar32 syllable = Hangul::HANGUL_BASE +
(prev*Hangul::JAMO_V_COUNT + (src[2]-0xa1)) *
Hangul::JAMO_T_COUNT;
int32_t t = getJamoTMinusBase(nextSrc, limit);
if (t >= 0) {
nextSrc += 3;
syllable += t; // The next character was a Jamo T.
appendCodePoint(prevSrc, nextSrc, syllable, sink, edits);
src = nextSrc;
continue;
}
// If we see L+V+x where x!=T then we drop to the slow path,
// decompose and recompose.
// This is to deal with NFKC finding normal L and V but a
// compatibility variant of a T.
// We need to either fully compose that combination here
// (which would complicate the code and may not work with strange custom data)
// or use the slow path.
}
} else if (Hangul::isHangulWithoutJamoT(prev = codePointFromValidUTF8(prevSrc, src))) {
// The current character is a Jamo Trailing consonant,
// compose with previous Hangul LV that does not contain a Jamo T.
if (!doCompose) {
return FALSE;
}
UChar32 syllable = prev + getJamoTMinusBase(src, nextSrc);
appendCodePoint(prevSrc, nextSrc, syllable, sink, edits);
src = nextSrc;
continue;
}
} else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC
// One or more combining marks that do not combine-back:
// Check for canonical order, copy unchanged if ok and
// if followed by a character with a boundary-before.
uint8_t cc = (uint8_t)norm16; // cc!=0
if (onlyContiguous /* FCC */ && (uint8_t)prevProps > cc) {
// Fails FCD test, need to decompose and contiguously recompose.
if (!doCompose) {
return FALSE;
}
} else {
// If !onlyContiguous (not FCC), then we ignore the tccc of
// the previous character which passed the quick check "yes && ccc==0" test.
const uint8_t *p = nextSrc;
const uint8_t *q;
uint16_t n16;
for (;;) {
if (p == limit) {
if (doCompose) {
appendUnchanged(prevSrc, limit, sink, options, edits, errorCode);
}
return TRUE;
}
uint8_t prevCC = cc;
q = p;
UTRIE2_U8_NEXT16(normTrie, q, limit, n16);
if (n16 >= MIN_YES_YES_WITH_CC) {
cc = (uint8_t)n16;
if (prevCC > cc) {
if (!doCompose) {
return FALSE;
}
break;
}
} else {
break;
}
p = q;
}
// p is after the last in-order combining mark.
// If there is a boundary here, then we copy and continue.
// Copy some of hasCompBoundaryBefore() to postpone decoding the code point.
if (isCompYesAndZeroCC(n16) ||
(!isMaybeOrNonZeroCC(n16) &&
hasCompBoundaryBefore(codePointFromValidUTF8(p, q), n16))) {
if (doCompose && !appendUnchanged(prevSrc, p, sink, options, edits, errorCode)) {
return TRUE;
}
src = p;
continue;
}
// Use the slow path. There is no boundary in [nextSrc, p[.
nextSrc = p;
}
}
// Slow path: Find the nearest boundaries around the current character,
// decompose and recompose.
// TODO: Inefficient create&destroy of the buffer because
// we want to avoid creating one if we do not need it.
// Try to make it cheaper, try to use a plain char16_t[] on the stack
// until it overflows.
// TODO: Port this newer code with Edits support,
// and maybe with Appendable style if it does not noticeably hurt UnicodeString performance,
// back to UTF-16.
// Should be able to remove some then-unnecessary code from ReorderingBuffer.
// Might not need findNextCompBoundary() and such any more.
UnicodeString s16;
ReorderingBuffer buffer(*this, s16);
// Decompose the previous (if any) and current characters.
// We know there is not a boundary here.
decomposeShort(prevSrc, nextSrc, FALSE /* !stopAtCompBoundary */, buffer, errorCode);
// Decompose until the next boundary.
src = decomposeShort(nextSrc, limit, TRUE /* stopAtCompBoundary */, buffer, errorCode);
if (src == nullptr) { // U_FAILURE
break;
}
if ((src - prevSrc) > INT32_MAX) {
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return TRUE;
}
recompose(buffer, 0, onlyContiguous);
if (buffer.equals(prevSrc, src)) {
if (doCompose && !appendUnchanged(prevSrc, src, sink, options, edits, errorCode)) {
break;
}
} else if (doCompose) {
if (!appendChange(prevSrc, src, buffer.getStart(), buffer.length(),
sink, edits, errorCode)) {
break;
}
} else {
return TRUE;
}
}
return TRUE;
}
/**
* Does c have a composition boundary before it?
* True if its decomposition begins with a character that has
@ -1520,7 +2123,7 @@ UBool Normalizer2Impl::hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous, UBo
uint16_t norm16=getNorm16(c);
if(isInert(norm16)) {
return TRUE;
} else if(norm16<=minYesNo) {
} else if(norm16<minYesNoMappingsOnly) {
// Hangul: norm16==minYesNo
// Hangul LVT has a boundary after it.
// Hangul LV and non-inert yesYes characters combine forward.
@ -1548,6 +2151,19 @@ UBool Normalizer2Impl::hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous, UBo
}
}
UBool Normalizer2Impl::hasCompBoundaryBefore(const uint8_t *src, const uint8_t *limit) const {
if (src == limit) {
return FALSE;
}
const uint8_t *q = src;
uint16_t norm16;
UTRIE2_U8_NEXT16(normTrie, q, limit, norm16);
// Copy some of hasCompBoundaryBefore() to postpone decoding the code point.
return isCompYesAndZeroCC(norm16) ||
(!isMaybeOrNonZeroCC(norm16) &&
hasCompBoundaryBefore(codePointFromValidUTF8(src, q), norm16));
}
const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p) const {
BackwardUTrie2StringIterator iter(normTrie, start, p);
uint16_t norm16;
@ -2029,12 +2645,13 @@ unorm2_swap(const UDataSwapper *ds,
/* check data format and format version */
pInfo=(const UDataInfo *)((const char *)inData+4);
uint8_t formatVersion0=pInfo->formatVersion[0];
if(!(
pInfo->dataFormat[0]==0x4e && /* dataFormat="Nrm2" */
pInfo->dataFormat[1]==0x72 &&
pInfo->dataFormat[2]==0x6d &&
pInfo->dataFormat[3]==0x32 &&
(pInfo->formatVersion[0]==1 || pInfo->formatVersion[0]==2)
(formatVersion0==1 || formatVersion0==2)
)) {
udata_printError(ds, "unorm2_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as Normalizer2 data\n",
pInfo->dataFormat[0], pInfo->dataFormat[1],
@ -2048,10 +2665,16 @@ unorm2_swap(const UDataSwapper *ds,
outBytes=(uint8_t *)outData+headerSize;
inIndexes=(const int32_t *)inBytes;
int32_t minIndexesLength;
if(formatVersion0==1) {
minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_YES+1;
} else {
minIndexesLength=Normalizer2Impl::IX_MIN_YES_NO_MAPPINGS_ONLY+1;
}
if(length>=0) {
length-=headerSize;
if(length<(int32_t)sizeof(indexes)) {
if(length<minIndexesLength*4) {
udata_printError(ds, "unorm2_swap(): too few bytes (%d after header) for Normalizer2 data\n",
length);
*pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;

View File

@ -35,6 +35,9 @@ U_NAMESPACE_BEGIN
struct CanonIterData;
class ByteSink;
class Edits;
class U_COMMON_API Hangul {
public:
/* Korean Hangul and Jamo constants */
@ -135,6 +138,7 @@ public:
uint8_t getLastCC() const { return lastCC; }
UBool equals(const UChar *start, const UChar *limit) const;
UBool equals(const uint8_t *otherStart, const uint8_t *otherLimit) const;
// For Hangul composition, replacing the Leading consonant Jamo with the syllable.
void setLastChar(UChar c) {
@ -457,6 +461,12 @@ public:
UnicodeString &safeMiddle,
ReorderingBuffer &buffer,
UErrorCode &errorCode) const;
UBool composeUTF8(uint32_t options,
const uint8_t *src, const uint8_t *limit,
UBool onlyContiguous, UBool doCompose,
ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) const;
const UChar *makeFCD(const UChar *src, const UChar *limit,
ReorderingBuffer *buffer, UErrorCode &errorCode) const;
void makeFCDAndAppend(const UChar *src, const UChar *limit,
@ -568,12 +578,21 @@ private:
UBool decompose(UChar32 c, uint16_t norm16,
ReorderingBuffer &buffer, UErrorCode &errorCode) const;
const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit,
UBool stopAtCompBoundary, ReorderingBuffer &buffer,
UErrorCode &errorCode) const;
static int32_t combine(const uint16_t *list, UChar32 trail);
void addComposites(const uint16_t *list, UnicodeSet &set) const;
void recompose(ReorderingBuffer &buffer, int32_t recomposeStartIndex,
UBool onlyContiguous) const;
int32_t getCompProps(const uint8_t *src, const uint8_t *limit,
uint16_t norm16, UBool onlyContiguous) const;
UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const;
UBool hasCompBoundaryBefore(const uint8_t *src, const uint8_t *limit) const;
const UChar *findPreviousCompBoundary(const UChar *start, const UChar *p) const;
const UChar *findNextCompBoundary(const UChar *p, const UChar *limit) const;

View File

@ -939,30 +939,30 @@ static CharString *gSearchTZFileResult = NULL;
* This function is not thread safe - it uses a global, gSearchTZFileResult, to hold its results.
*/
static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
DIR* dirp = opendir(path);
DIR* subDirp = NULL;
DIR* dirp = NULL;
struct dirent* dirEntry = NULL;
char* result = NULL;
UErrorCode status = U_ZERO_ERROR;
/* Save the current path */
CharString curpath(path, -1, status);
if (U_FAILURE(status)) {
goto cleanupAndReturn;
}
dirp = opendir(path);
if (dirp == NULL) {
return result;
goto cleanupAndReturn;
}
if (gSearchTZFileResult == NULL) {
gSearchTZFileResult = new CharString;
if (gSearchTZFileResult == NULL) {
return NULL;
goto cleanupAndReturn;
}
ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup);
}
/* Save the current path */
UErrorCode status = U_ZERO_ERROR;
CharString curpath(path, -1, status);
if (U_FAILURE(status)) {
return NULL;
}
/* Check each entry in the directory. */
while((dirEntry = readdir(dirp)) != NULL) {
const char* dirName = dirEntry->d_name;
@ -971,15 +971,16 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
CharString newpath(curpath, status);
newpath.append(dirName, -1, status);
if (U_FAILURE(status)) {
return NULL;
break;
}
DIR* subDirp = NULL;
if ((subDirp = opendir(newpath.data())) != NULL) {
/* If this new path is a directory, make a recursive call with the newpath. */
closedir(subDirp);
newpath.append('/', status);
if (U_FAILURE(status)) {
return NULL;
break;
}
result = searchForTZFile(newpath.data(), tzInfo);
/*
@ -1003,7 +1004,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
gSearchTZFileResult->clear();
gSearchTZFileResult->append(zoneid, -1, status);
if (U_FAILURE(status)) {
return NULL;
break;
}
result = gSearchTZFileResult->data();
/* Get out after the first one found. */
@ -1012,7 +1013,11 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
}
}
}
closedir(dirp);
cleanupAndReturn:
if (dirp) {
closedir(dirp);
}
return result;
}
#endif
@ -1809,6 +1814,8 @@ The leftmost codepage (.xxx) wins.
}
// Now normalize the resulting name
correctedPOSIXLocale = static_cast<char *>(uprv_malloc(POSIX_LOCALE_CAPACITY + 1));
/* TODO: Should we just exit on memory allocation failure? */
if (correctedPOSIXLocale)
{
int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status);

View File

@ -61,7 +61,7 @@ enum {
/**
* Bit mask for getting just the options from a string compare options word
* that are relevant for case-insensitive string comparison.
* See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER.
* See stringoptions.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER.
* @internal
*/
#define _STRCASECMP_OPTIONS_MASK 0xffff
@ -69,10 +69,16 @@ enum {
/**
* Bit mask for getting just the options from a string compare options word
* that are relevant for case folding (of a single string or code point).
* See uchar.h.
*
* Currently only bit 0 for U_FOLD_CASE_EXCLUDE_SPECIAL_I.
* It is conceivable that at some point we might use one more bit for using uppercase sharp s.
* It is conceivable that at some point we might want the option to use only simple case foldings
* when operating on strings.
*
* See stringoptions.h.
* @internal
*/
#define _FOLD_CASE_OPTIONS_MASK 0xff
#define _FOLD_CASE_OPTIONS_MASK 7
/* single-code point functions */

View File

@ -164,7 +164,7 @@ appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity,
/* (not) original code point */
if(edits!=NULL) {
edits->addUnchanged(cpLength);
if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) {
if(options & U_OMIT_UNCHANGED_TEXT) {
return destIndex;
}
}
@ -282,7 +282,7 @@ appendUnchanged(uint8_t *dest, int32_t destIndex, int32_t destCapacity,
if(length>0) {
if(edits!=NULL) {
edits->addUnchanged(length);
if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) {
if(options & U_OMIT_UNCHANGED_TEXT) {
return destIndex;
}
}
@ -381,7 +381,7 @@ ucasemap_internalUTF8ToTitle(
const uint8_t *src, int32_t srcLength,
icu::Edits *edits,
UErrorCode &errorCode) {
if(U_FAILURE(errorCode)) {
if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) {
return 0;
}
@ -408,45 +408,38 @@ ucasemap_internalUTF8ToTitle(
}
/*
* Unicode 4 & 5 section 3.13 Default Case Operations:
*
* R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
* #29, "Text Boundaries." Between each pair of word boundaries, find the first
* cased character F. If F exists, map F to default_title(F); then map each
* subsequent character C to default_lower(C).
*
* In this implementation, segment [prev..index[ into 3 parts:
* a) uncased characters (copy as-is) [prev..titleStart[
* b) first case letter (titlecase) [titleStart..titleLimit[
* Segment [prev..index[ into 3 parts:
* a) skipped characters (copy as-is) [prev..titleStart[
* b) first letter (titlecase) [titleStart..titleLimit[
* c) subsequent characters (lowercase) [titleLimit..index[
*/
if(prev<index) {
/* find and copy uncased characters [prev..titleStart[ */
/* find and copy skipped characters [prev..titleStart[ */
int32_t titleStart=prev;
int32_t titleLimit=prev;
UChar32 c;
U8_NEXT(src, titleLimit, index, c);
if((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(c)) {
/* Adjust the titlecasing index (titleStart) to the next cased character. */
for(;;) {
if ((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0) {
// Adjust the titlecasing index to the next cased character,
// or to the next letter/number/symbol/private use.
// Stop with titleStart<titleLimit<=index
// if there is a character to be titlecased,
// or else stop with titleStart==titleLimit==index.
UBool toCased = (options&U_TITLECASE_ADJUST_TO_CASED) != 0;
while (toCased ? UCASE_NONE==ucase_getType(c) : !ustrcase_isLNS(c)) {
titleStart=titleLimit;
if(titleLimit==index) {
/*
* only uncased characters in [prev..index[
* stop with titleStart==titleLimit==index
*/
break;
}
U8_NEXT(src, titleLimit, index, c);
if(UCASE_NONE!=ucase_getType(c)) {
break; /* cased letter at [titleStart..titleLimit[ */
}
}
destIndex=appendUnchanged(dest, destIndex, destCapacity,
src+prev, titleStart-prev, options, edits);
if(destIndex<0) {
errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
if (prev < titleStart) {
destIndex=appendUnchanged(dest, destIndex, destCapacity,
src+prev, titleStart-prev, options, edits);
if(destIndex<0) {
errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
}
}
}
@ -666,7 +659,7 @@ int32_t toUpper(uint32_t options,
edits->addUnchanged(oldLength);
}
// Write unchanged text?
change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0;
change = (options & U_OMIT_UNCHANGED_TEXT) == 0;
}
}

View File

@ -9,16 +9,26 @@
#include "unicode/utypes.h"
#include "unicode/ucasemap.h"
#include "unicode/uchar.h"
#include "ucase.h"
#ifndef U_COMPARE_IGNORE_CASE
/* see also unorm.h */
/**
* Option bit for unorm_compare:
* Perform case-insensitive comparison.
* Bit mask for the titlecasing iterator options bit field.
* Currently only 3 out of 8 values are used:
* 0 (words), U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.
* See stringoptions.h.
* @internal
*/
#define U_COMPARE_IGNORE_CASE 0x10000
#endif
#define U_TITLECASE_ITERATOR_MASK 0xe0
/**
* Bit mask for the titlecasing index adjustment options bit set.
* Currently two bits are defined:
* U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED.
* See stringoptions.h.
* @internal
*/
#define U_TITLECASE_ADJUSTMENT_MASK 0x600
/**
* Internal API, used by u_strcasecmp() etc.
@ -32,7 +42,7 @@ u_strcmpFold(const UChar *s1, int32_t length1,
UErrorCode *pErrorCode);
/**
* Interanl API, used for detecting length of
* Internal API, used for detecting length of
* shared prefix case-insensitively.
* @param s1 input string 1
* @param length1 length of string 1, or -1 (NULL terminated)
@ -61,6 +71,40 @@ uprv_haveProperties(UErrorCode *pErrorCode);
#ifdef __cplusplus
U_NAMESPACE_BEGIN
/** Returns TRUE if the options are valid. Otherwise FALSE, and sets an error. */
inline UBool ustrcase_checkTitleAdjustmentOptions(uint32_t options, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return FALSE; }
if ((options & U_TITLECASE_ADJUSTMENT_MASK) == U_TITLECASE_ADJUSTMENT_MASK) {
// Both options together.
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
return FALSE;
}
return TRUE;
}
inline UBool ustrcase_isLNS(UChar32 c) {
// Letter, number, symbol,
// or a private use code point because those are typically used as letters or numbers.
// Consider modifier letters only if they are cased.
const uint32_t LNS = (U_GC_L_MASK|U_GC_N_MASK|U_GC_S_MASK|U_GC_CO_MASK) & ~U_GC_LM_MASK;
int gc = u_charType(c);
return (U_MASK(gc) & LNS) != 0 || (gc == U_MODIFIER_LETTER && ucase_getType(c) != UCASE_NONE);
}
#if !UCONFIG_NO_BREAK_ITERATION
/** Returns nullptr if error. Pass in either locale or locID, not both. */
U_CFUNC
BreakIterator *ustrcase_getTitleBreakIterator(
const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter,
LocalPointer<BreakIterator> &ownedIter, UErrorCode &errorCode);
#endif
U_NAMESPACE_END
#include "unicode/unistr.h" // for UStringCaseMapper
/*

View File

@ -42,11 +42,8 @@ int32_t CaseMap::utf8ToTitle(
UText utext=UTEXT_INITIALIZER;
utext_openUTF8(&utext, src, srcLength, &errorCode);
LocalPointer<BreakIterator> ownedIter;
iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode);
if(iter==NULL) {
iter=BreakIterator::createWordInstance(Locale(locale), errorCode);
ownedIter.adoptInstead(iter);
}
if(U_FAILURE(errorCode)) {
utext_close(&utext);
return 0;
}
@ -88,12 +85,19 @@ ucasemap_utf8ToTitle(UCaseMap *csm,
}
UText utext=UTEXT_INITIALIZER;
utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode);
if(csm->iter==NULL) {
csm->iter=BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode);
}
if (U_FAILURE(*pErrorCode)) {
return 0;
}
if(csm->iter==NULL) {
LocalPointer<BreakIterator> ownedIter;
BreakIterator *iter = ustrcase_getTitleBreakIterator(
nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode);
if (iter == nullptr) {
utext_close(&utext);
return 0;
}
csm->iter = ownedIter.orphan();
}
csm->iter->setText(&utext, *pErrorCode);
int32_t length=ucasemap_mapUTF8(
csm->caseLocale, csm->options, csm->iter,

View File

@ -1788,9 +1788,9 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,
0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,
0xeeb,0xeeb,0xeeb,0xeeb,0xefa,0xefa,0xeee,0xeee,0xef1,0xf00,0xefd,0x10e,0x10e,0x10e,0x10e,0x10e,
0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x25e,0x25e,0x25e,0x25e,0x25e,
0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x25e,0x25e,0x25e,0x25e,0x25e,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x237,0x237,0x237,0x237,0x237,0x237,0x237,
0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x237,0x237,0x237,0x237,0x237,0x237,0x237,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0xaec,0xaec,0xaef,0xaef,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0x72,0x72,0x72,0x72,
0x1563,0x1563,0x1563,0x1563,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1560,
@ -1805,9 +1805,9 @@ static const uint16_t propsVectorsTrie_index[29236]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x188d,0x1890,0x1890,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,
0x1890,0x1893,0x1893,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x174f,0x174f,0x174f,0x174f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,
0x1752,0x1752,0x1752,0x1752,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x183,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -1818,14 +1818,14 @@ static const uint16_t propsVectorsTrie_index[29236]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,
0x16bc,0x16bc,0x16bc,0x16bc,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0xdd7,0xdd7,0xdd4,0xdd4,0xdd4,0xdd7,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x22e,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,
0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x17e8,0x17e8,0x23a,0x17e8,0x17e8,0x23a,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x23a,0x23a,0x23a,0x23a,0x23a,
0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a,0x23a,0x23a,0x23a,0x23a,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x933,0x933,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
@ -1841,7 +1841,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x38d,0x1b,0x1b,0x39c,0x39c,0x1b,0x1b,0x39f,0x39f,0x393,0xd83,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x38d,0x1b,0x1b,0x1b,0x1b,0x3a5,0x3a5,0x1b,0x3a5,0x3a2,0x3a2,0x38d,0x38d,
0x1b,0x1b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x3a2,0x3a2,0x399,0x399,
0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x110a,0x1848,0x1845,0x1b,0x1b,0x1e,0xc93,0x3a8,0xc96,
0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x110a,0x184b,0x1848,0x1b,0x1b,0x1e,0xc93,0x3a8,0xc96,
0x1e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x1e,0x1e,0x1e,0x3b4,0x3b4,0x1e,0x1e,0x3b4,
0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b4,
0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b4,0x1e,0x1e,
@ -1856,7 +1856,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x3ba,0x3ba,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c3,0x3c3,0x3c0,0x21,0x21,0x3c6,0x21,0x21,0x21,
0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3c6,0xc9f,0xc99,0xc99,
0x21,0x21,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x13c8,0xc9c,0x21,0x21,
0x21,0x21,0x21,0x21,0x21,0x16cb,0x184b,0x184b,0x184b,0x184e,0x184e,0x184e,0x24,0x3c9,0x3d8,0x3d8,
0x21,0x21,0x21,0x21,0x21,0x16ce,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x24,0x3c9,0x3d8,0x3d8,
0x24,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x24,0x3de,0x3de,0x24,0x24,0x3de,
0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de,
0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de,0x24,0xca2,0x3de,0x3de,0x3de,0x3de,0x24,0x24,
@ -1877,9 +1877,9 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x14b8,0x405,0x405,0x405,
0x405,0x405,0x2a,0x2a,0x2a,0xf75,0x3f6,0x3f6,0x3f6,0x402,0x402,0x402,0x402,0x2a,0x3f6,0x3f6,
0x3f9,0x2a,0x3f6,0x3f6,0x3f6,0x3fc,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0x2a,
0xf75,0xf75,0x16ce,0x2a,0x2a,0x2a,0x2a,0x2a,0x405,0x405,0xf6f,0xf6f,0x2a,0x2a,0x3ff,0x3ff,
0xf75,0xf75,0x16d1,0x2a,0x2a,0x2a,0x2a,0x2a,0x405,0x405,0xf6f,0xf6f,0x2a,0x2a,0x3ff,0x3ff,
0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x178b,0x14bb,0x411,0x411,0x2d,0x417,0x417,0x417,
0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x178e,0x14bb,0x411,0x411,0x2d,0x417,0x417,0x417,
0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417,
0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417,
0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x2d,0x2d,0xcab,0xcae,0x411,0x408,
@ -1887,12 +1887,12 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x408,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x417,0x2d,
0x417,0x417,0xeb8,0xeb8,0x2d,0x2d,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,
0x2d,0xebb,0xebb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
0x1851,0x14be,0x423,0x423,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x30,0x429,0x429,
0x1854,0x14be,0x423,0x423,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x30,0x429,0x429,
0x429,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,
0x423,0x41a,0x41a,0x41a,0xf78,0x30,0x423,0x423,0x423,0x30,0x426,0x426,0x426,0x41d,0x12e7,0x178e,
0x30,0x30,0x30,0x30,0x1791,0x1791,0x1791,0x41a,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x16d1,
0x423,0x41a,0x41a,0x41a,0xf78,0x30,0x423,0x423,0x423,0x30,0x426,0x426,0x426,0x41d,0x12e7,0x1791,
0x30,0x30,0x30,0x30,0x1794,0x1794,0x1794,0x41a,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x16d4,
0x429,0x429,0xf78,0xf78,0x30,0x30,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,
0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x178e,0x178e,0x178e,0xf7e,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,
0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x1791,0x1791,0x1791,0xf7e,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,
0x33,0x33,0x9f6,0x9f6,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,
0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,
0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc,
@ -1942,8 +1942,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xa35,0xa35,0xa35,0x42,0x42,0x12f3,0x12f3,0xd92,0xd95,0xa2f,0xa38,0xa2c,0xa2c,0xa2c,0xa2c,0xa38,
0xa38,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,
0xa29,0xa29,0xa29,0xa29,0xa29,0x42,0x42,0x42,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,
0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x16d7,0x45,0x45,
0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x45,0x45,0xa4d,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,
0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x16da,0x45,0x45,
0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x45,0x45,0xa4d,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,
0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,
0xa50,0xa50,0xa50,0xa4a,0xa47,0x48,0x48,0x48,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,
0xa56,0xa56,0xa56,0xa53,0xa53,0xa53,0xa56,0xa56,0xa56,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,
@ -1977,7 +1977,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x504,0x504,0x504,0x504,0x504,0x501,0x501,0x501,0x501,0x504,0xab6,0xab6,0xb97,0xb9d,0xb9d,0xb9a,
0xb9a,0xb9a,0xb9a,0xda7,0xebe,0xebe,0xebe,0xebe,0x10f8,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x534,0x534,0x534,0xabf,0xec7,0xfbd,0xfbd,0xfbd,
0xfbd,0x1254,0x16dd,0x16dd,0x63,0x63,0x63,0x63,0x6c3,0x6c3,0x6c3,0x6c3,0x6c6,0x6c6,0x6c6,0x6c6,
0xfbd,0x1254,0x16e0,0x16e0,0x63,0x63,0x63,0x63,0x6c3,0x6c3,0x6c3,0x6c3,0x6c6,0x6c6,0x6c6,0x6c6,
0x6c6,0x6c6,0x540,0x540,0x53d,0x53d,0x53d,0x53d,0x567,0x567,0x567,0x567,0x567,0xac8,0xac8,0x66,
0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,
@ -1994,7 +1994,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ef,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ec,0xc3f,0xc3f,0x75,
0x75,0x90f,0x90f,0x8d9,0x8d9,0x7f2,0x7f5,0xc3c,0x78,0x78,0x78,0x78,0x78,0x807,0x807,0x807,
0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,
0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x10e6,0x18c0,0x78,0x7b,0x80a,0x80a,0x80a,
0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x10e6,0x18c3,0x78,0x7b,0x80a,0x80a,0x80a,
0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x7b,
0x8e2,0x8e2,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,
0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,
@ -2038,15 +2038,15 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,
0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,
0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x9c,0x9c,0x9c,
0xb1f,0xb1f,0xb1f,0xb1f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x185d,0x185d,0x185d,
0xb1f,0xb1f,0xb1f,0xb1f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x1860,0x1860,0x1860,
0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,
0xb25,0xb25,0xb25,0xa2,0xa2,0xa2,0xa2,0xa2,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,
0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,
0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xa5,0xa5,
0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa8,
0xa8,0xfc9,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,
0x16e3,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,
0x16e6,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,
0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,
0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xab,0xb4f,0xb4f,
0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,
@ -2088,8 +2088,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,
0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,
0x14e5,0x14e5,0xc3,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,
0x14e5,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1860,0xc3,0xc3,0xc3,0xc3,0xc3,
0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x16e6,0x16e6,0x16e6,0x16e6,0xc3,0xc3,0xc3,0xc3,
0x14e5,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1863,0xc3,0xc3,0xc3,0xc3,0xc3,
0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x16e9,0x16e9,0x16e9,0x16e9,0xc3,0xc3,0xc3,0xc3,
0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xd11,0xd11,0xd11,0xd11,
0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,
0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,
@ -2108,20 +2108,20 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xd1a,0xd1a,0xcf,0xd17,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,
0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,
0xd23,0xd23,0xd2,0xd2,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2,0xd2,
0xd2,0xd2,0xd2,0xd2,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
0x181e,0x181e,0x181e,0x181e,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd5,0xd26,0xd5,0xd26,0xd26,
0xd2,0xd2,0xd2,0xd2,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,
0x1821,0x1821,0x1821,0x1821,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd5,0xd26,0xd5,0xd26,0xd26,
0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,
0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd26,0xd26,0xd5,0xd5,0xd5,0xd26,0xd5,0xd5,0xd26,
0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,
0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,
0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0x14e8,0x14e8,0x1797,0x1797,0xde,
0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0x14e8,0x14e8,0x179a,0x179a,0xde,
0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x135,0x135,0x135,0x135,
0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,
0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde3,0xde3,0xde9,0xde9,0xde3,0xe1,0xe1,0xde6,0xde6,
0x10f5,0x10f5,0x10f5,0x10f5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,
0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,
0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,
0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14ee,0x1863,0x1863,0x1863,0x1863,0xe7,0x179a,0x1314,0x1137,0xee5,0xee5,
0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14ee,0x1866,0x1866,0x1866,0x1866,0xe7,0x179d,0x1314,0x1137,0xee5,0xee5,
0xdfe,0xdfb,0xdfe,0xdfb,0xdfb,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x1140,0x113d,0x1140,0x113d,0x113a,
0x113a,0x113a,0x13da,0x13d7,0xea,0xea,0xea,0xea,0xea,0xdf8,0xdf5,0xdf5,0xdf5,0xdf2,0xdf8,0xdf5,
0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,
@ -2146,8 +2146,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xe31,0xe31,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,
0xe2e,0xe2e,0x1143,0xfc,0xfc,0xfc,0xe2b,0xe2b,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff,0xff,0xff,
0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14f7,0x14fd,0x14fa,0x1842,0x179d,0x1866,0x1866,0x1866,
0x1866,0x1866,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14f7,0x14fd,0x14fa,0x1845,0x17a0,0x1869,0x1869,0x1869,
0x1869,0x1869,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,
0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,
0x102,0x102,0x102,0x102,0xe61,0xe61,0xe61,0xe5e,0xe5e,0xe55,0xe55,0xe5e,0xe5b,0xe5b,0xe5b,0xe5b,
0x105,0x105,0x105,0x105,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b7,0x12b4,0x159,0x159,
@ -2160,7 +2160,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xf09,0xf0f,0xf24,0xf24,0xf0c,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf06,
0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,
0xf09,0x111,0x111,0x111,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x13ef,0x1509,
0x1509,0x1509,0x17a0,0x114,0x1509,0x1509,0x16ef,0x16ef,0x16ef,0x16e9,0x16ef,0x16e9,0x114,0x114,0x114,0x114,
0x1509,0x1509,0x17a3,0x114,0x1509,0x1509,0x16f2,0x16f2,0x16f2,0x16ec,0x16f2,0x16ec,0x114,0x114,0x114,0x114,
0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,
0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1506,
0x13f2,0x13f2,0x131d,0x1020,0x1020,0x1020,0x1020,0x1020,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,
@ -2169,7 +2169,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf39,0xf39,
0xf39,0xf39,0x114f,0x114f,0x11a,0x11a,0x11a,0xf3c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,
0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,
0x150c,0x16f2,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
0x150c,0x16f5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,
0x11d,0x11d,0x11d,0x11d,0xf48,0xf48,0xf48,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,
0x1512,0x1512,0x1512,0x120,0xf45,0xf45,0xf45,0xf45,0x150f,0x120,0x120,0x120,0x120,0x120,0x120,0x120,
@ -2181,7 +2181,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x126,0x1047,0x1047,0x1047,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050,
0x1050,0x1050,0x1050,0x1050,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1065,0x1065,
0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,
0x129,0x129,0x129,0x129,0x108c,0x108c,0x108c,0x108c,0x1086,0x17a3,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,
0x129,0x129,0x129,0x129,0x108c,0x108c,0x108c,0x108c,0x1086,0x17a6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,
0x12c,0x12c,0x1092,0x1092,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x12c,0x12c,
0x12c,0x12c,0x12c,0x12c,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,
0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10aa,0x10ad,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,
@ -2215,12 +2215,12 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x150,0x150,0x150,0x150,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x117f,0x1182,0x1182,0x1182,0x1182,
0x1170,0x1170,0x150,0x150,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,
0x1569,0x1569,0x1566,0x1cb,0x12c6,0x12a5,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12a8,0x12a8,0x12a8,
0x12a8,0x12c0,0x12a8,0x12a8,0x12a8,0x12a8,0x12ae,0x1494,0x149a,0x1497,0x1491,0x18e1,0x16bf,0x16bf,0x153,0x153,
0x12a8,0x12c0,0x12a8,0x12a8,0x12a8,0x12a8,0x12ae,0x1494,0x149a,0x1497,0x1491,0x18e4,0x16bf,0x16bf,0x153,0x153,
0x153,0x153,0x153,0x153,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,
0x1197,0x1197,0x1197,0x1197,0x118e,0x118e,0x1191,0x119a,0x1194,0x1194,0x1194,0x119a,0x156,0x156,0x156,0x156,
0x156,0x156,0x156,0x156,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,
0x119d,0x119d,0x119d,0x119d,0x119d,0x12cc,0x11a3,0x12cf,0x11a3,0x11a3,0x11a3,0x11a3,0x11a0,0x11a0,0x11a0,0x11a3,
0x16f8,0x16fb,0x15c,0x15c,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
0x16fb,0x16fe,0x15c,0x15c,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,
0x1293,0x15f,0x15f,0x15f,0x11b8,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11af,0x11be,0x11be,0x11ac,0x11ac,
0x11ac,0x11ac,0x162,0x12ba,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x162,0x162,
@ -2248,18 +2248,18 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x126f,0x126f,0x126f,0x1272,0x1272,0x1272,0x1251,0x186,0x1374,0x127b,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,
0x1374,0x1374,0x1374,0x1374,0x1374,0x127b,0x1374,0x127b,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,
0x1371,0x1371,0x1401,0x1401,0x186,0x186,0x186,0x186,0x1377,0x1377,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,
0x1371,0x1278,0x1371,0x1278,0x1278,0x1371,0x1377,0x127e,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,
0x1821,0x1821,0x1821,0x1821,0x1821,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
0x1371,0x1278,0x1371,0x1278,0x1278,0x1371,0x1377,0x127e,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,
0x1824,0x1824,0x1824,0x1824,0x1824,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,
0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,
0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,
0x1329,0x1329,0x1329,0x1329,0x129f,0x1392,0x138f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x189,0x189,0x189,0x189,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,0x1299,
0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,
0x1299,0x1299,0x1392,0x1392,0x1392,0x1392,0x1392,0x138f,0x1392,0x1392,0x1392,0x1824,0x189,0x189,0x189,0x189,
0x1299,0x1299,0x1392,0x1392,0x1392,0x1392,0x1392,0x138f,0x1392,0x1392,0x1392,0x1827,0x189,0x189,0x189,0x189,
0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x13bf,0x13bf,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,
0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,
0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,
@ -2282,16 +2282,16 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1365,0x1365,0x1365,0x1365,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,
0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,
0x19b,0x19b,0x19b,0x19b,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548,
0x16b6,0x1548,0x1548,0x1548,0x177f,0x182d,0x182d,0x1869,0x1869,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,
0x16b6,0x1548,0x1548,0x1548,0x1782,0x1830,0x1830,0x186c,0x186c,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,
0x19e,0x19e,0x19e,0x19e,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1545,0x1545,0x1545,0x1548,0x1545,0x16b3,
0x16b3,0x19e,0x19e,0x19e,0x1548,0x1545,0x1545,0x1548,0x182d,0x182d,0x182d,0x18cc,0x18cc,0x19e,0x19e,0x19e,
0x16b3,0x19e,0x19e,0x19e,0x1548,0x1545,0x1545,0x1548,0x1830,0x1830,0x1830,0x18cf,0x18cf,0x19e,0x19e,0x19e,
0x19e,0x19e,0x19e,0x19e,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,
0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,
0x1a1,0x1a1,0x1a1,0x1a1,0x140d,0x154e,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,
0x140d,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1704,0x1704,0x1a4,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,
0x17af,0x17af,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,
0x17ac,0x17ac,0x17ac,0x17ac,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,
0x140d,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1707,0x1707,0x1a4,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,
0x17b2,0x17b2,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,
0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,
0x17af,0x17af,0x17af,0x17af,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,
0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,
0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413,
0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1413,
@ -2313,17 +2313,17 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1434,0x142e,0x142e,0x1434,0x1434,
0x143d,0x143d,0x1437,0x143a,0x143a,0x1434,0x1431,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,
0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,
0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1b0,0x1b0,0x1b0,0x1b0,0x1707,0x1707,0x1440,0x1440,
0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,
0x1b0,0x1b0,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,
0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1b0,0x1b0,0x1b0,0x1b0,0x170a,0x170a,0x1440,0x1440,
0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,
0x1b0,0x1b0,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,
0x144c,0x144c,0x144c,0x144c,0x144c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,
0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,
0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,
0x1449,0x1449,0x1449,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,
0x1b3,0x1b3,0x1b3,0x1446,0x1446,0x1446,0x1446,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,
0x144f,0x144f,0x144f,0x144f,0x1461,0x1464,0x1467,0x1467,0x1464,0x146a,0x146a,0x1455,0x1458,0x170d,0x170a,0x170a,
0x170a,0x1554,0x1b6,0x1b6,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1551,0x1713,
0x1716,0x1710,0x1719,0x1719,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1b9,0x1b9,0x1b9,
0x144f,0x144f,0x144f,0x144f,0x1461,0x1464,0x1467,0x1467,0x1464,0x146a,0x146a,0x1455,0x1458,0x1710,0x170d,0x170d,
0x170d,0x1554,0x1b6,0x1b6,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1551,0x1716,
0x1719,0x1713,0x171c,0x171c,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1b9,0x1b9,0x1b9,
0x1b9,0x1b9,0x1b9,0x1b9,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x1b9,0x1b9,
0x1b9,0x1b9,0x1b9,0x1b9,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1bc,0x1bc,0x1bc,0x1bc,
0x1bc,0x1bc,0x1bc,0x1bc,0x12c3,0x12c0,0x12c3,0x12ab,0x12c0,0x12c0,0x12c0,0x12c6,0x12c0,0x12c6,0x12c9,0x12c0,
@ -2344,21 +2344,21 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1d4,0x1d4,0x1d4,
0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,
0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,
0x171c,0x1581,0x1587,0x16c8,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1d7,0x1590,
0x171f,0x16c5,0x1587,0x16cb,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1d7,0x1590,
0x1590,0x1d7,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,
0x1590,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1590,
0x1590,0x1590,0x1d7,0x1d7,0x16c5,0x1590,0x1581,0x1587,0x1581,0x1587,0x1587,0x1587,0x1587,0x1d7,0x1d7,0x1587,
0x1587,0x1d7,0x1d7,0x158a,0x158a,0x158d,0x1d7,0x1d7,0x171f,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1581,
0x1590,0x1590,0x1d7,0x1d7,0x16c8,0x1590,0x1581,0x1587,0x1581,0x1587,0x1587,0x1587,0x1587,0x1d7,0x1d7,0x1587,
0x1587,0x1d7,0x1d7,0x158a,0x158a,0x158d,0x1d7,0x1d7,0x1722,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1581,
0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1593,0x1590,0x1590,0x1590,0x1590,0x1587,0x1587,0x1d7,0x1d7,0x1584,0x1584,
0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7,0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7,
0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,
0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x1da,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,
0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a2,0x15a2,0x15a2,0x1596,0x1596,0x1596,0x15a2,0x15a2,
0x1596,0x15a5,0x1599,0x1596,0x15ab,0x15ab,0x159f,0x15ab,0x15ab,0x159c,0x17b2,0x1da,0x15ba,0x15ba,0x15ba,0x15ae,
0x1596,0x15a5,0x1599,0x1596,0x15ab,0x15ab,0x159f,0x15ab,0x15ab,0x159c,0x17b5,0x1da,0x15ba,0x15ba,0x15ba,0x15ae,
0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15b1,0x15b4,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x15b7,0x15b7,0x15b7,0x15b7,
0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1722,0x1722,0x1722,0x1722,
0x15c6,0x15c3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x174c,0x174c,0x174c,0x174c,
0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x15cc,0x15cc,0x15cc,0x15cc,
0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1725,0x1725,0x1725,0x1725,
0x15c6,0x15c3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x174f,0x174f,0x174f,0x174f,
0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x15cc,0x15cc,0x15cc,0x15cc,
0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,
0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc,
0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,
@ -2391,8 +2391,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x204,0x204,0x204,0x204,0x204,0x1659,0x1659,0x1659,0x1659,0x204,0x204,0x204,0x1677,0x1677,0x1677,0x1677,
0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x165f,0x1671,0x1671,0x165f,0x165f,
0x165f,0x165f,0x20a,0x20a,0x1671,0x1671,0x1674,0x1674,0x165f,0x165f,0x1671,0x1665,0x1662,0x1668,0x167a,0x167a,
0x166b,0x166b,0x166e,0x166e,0x166e,0x167a,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,
0x172b,0x172b,0x172b,0x172b,0x1728,0x1728,0x1728,0x1728,0x1725,0x1725,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,
0x166b,0x166b,0x166e,0x166e,0x166e,0x167a,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,
0x172e,0x172e,0x172e,0x172e,0x172b,0x172b,0x172b,0x172b,0x1728,0x1728,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,
0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,
0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20d,0x167d,0x167d,0x167d,
0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,
@ -2408,92 +2408,92 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,
0x168f,0x168f,0x213,0x213,0x213,0x213,0x213,0x213,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,
0x169e,0x169e,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x216,0x216,0x216,0x216,0x216,
0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x16a4,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,
0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,
0x173d,0x173d,0x219,0x219,0x219,0x172e,0x172e,0x172e,0x173a,0x173a,0x172e,0x172e,0x172e,0x172e,0x173a,0x172e,
0x172e,0x172e,0x172e,0x1731,0x219,0x219,0x219,0x219,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,
0x1737,0x1737,0x1734,0x1734,0x1740,0x1740,0x1740,0x1734,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x21c,
0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x16a4,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,
0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,
0x1740,0x1740,0x219,0x219,0x219,0x1731,0x1731,0x1731,0x173d,0x173d,0x1731,0x1731,0x1731,0x1731,0x173d,0x1731,
0x1731,0x1731,0x1731,0x1734,0x219,0x219,0x219,0x219,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,
0x173a,0x173a,0x1737,0x1737,0x1743,0x1743,0x1743,0x1737,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x21c,
0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,
0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,
0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,
0x1755,0x1755,0x1755,0x222,0x1755,0x1755,0x222,0x222,0x222,0x222,0x222,0x1752,0x1752,0x1752,0x1752,0x1752,
0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x225,0x1758,0x225,0x1758,0x1758,0x1758,0x1758,0x225,0x1758,
0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x225,0x1758,
0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x175b,0x225,0x225,0x225,0x225,0x225,0x225,
0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,
0x1758,0x1758,0x1758,0x222,0x1758,0x1758,0x222,0x222,0x222,0x222,0x222,0x1755,0x1755,0x1755,0x1755,0x1755,
0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,0x225,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,
0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,
0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175e,0x225,0x225,0x225,0x225,0x225,0x225,
0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,
0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,
0x1767,0x1767,0x1767,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,
0x1764,0x1764,0x1764,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,
0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,
0x1761,0x1761,0x1761,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,
0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x22b,0x22b,0x22b,0x22b,
0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1788,0x1836,0x1836,0x1836,0x1836,0x1833,0x1836,0x18d2,
0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1836,0x1833,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,
0x1836,0x18d2,0x18d2,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1833,0x1830,0x1833,0x1836,0x1836,0x22b,
0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1830,0x1833,0x1833,0x1833,0x1833,0x1833,0x18cf,0x22b,0x22b,0x22b,
0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x18cf,
0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x22b,0x22b,0x22b,0x22b,
0x1764,0x1764,0x1764,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,
0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x22b,0x22b,0x22b,0x22b,
0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x178b,0x1839,0x1839,0x1839,0x1839,0x1836,0x1839,0x18d5,
0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1839,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,
0x1839,0x18d5,0x18d5,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1836,0x1833,0x1836,0x1839,0x1839,0x22b,
0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1833,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2,0x22b,0x22b,0x22b,
0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2,
0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x1785,0x1785,0x1785,0x1785,0x1785,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,
0x1833,0x1833,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x1788,0x1788,0x1788,0x1788,0x1788,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,
0x1836,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1785,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x18cf,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,
0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1788,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x18d2,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,
0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x176a,0x176a,0x176a,0x176a,0x1767,0x176a,0x176a,0x176d,
0x1770,0x176d,0x176d,0x176a,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,
0x22e,0x22e,0x22e,0x1767,0x1767,0x1767,0x1767,0x1767,0x17c4,0x17c4,0x17c4,0x17c4,0x17bb,0x17bb,0x17bb,0x17b5,
0x17b8,0x17b8,0x17b8,0x231,0x231,0x231,0x231,0x231,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,
0x17c1,0x17c1,0x231,0x231,0x231,0x231,0x17be,0x17be,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,
0x17df,0x234,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,
0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17dc,0x17ca,0x17ca,0x17ca,0x17ca,
0x17ca,0x17ca,0x17ca,0x234,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17dc,0x17cd,0x17df,0x17e2,0x17e2,0x17d6,
0x17d3,0x17d3,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x17d9,0x17d9,0x17d9,0x17d9,
0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,
0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x234,0x234,0x234,0x17ee,0x17f1,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,
0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x23a,
0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,
0x17e8,0x23a,0x23a,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x1839,0x18d5,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,
0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d,0x1770,
0x1773,0x1770,0x1770,0x176d,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,
0x22e,0x22e,0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be,0x17be,0x17b8,
0x17bb,0x17bb,0x17bb,0x231,0x231,0x231,0x231,0x231,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,
0x17c4,0x17c4,0x231,0x231,0x231,0x231,0x17c1,0x17c1,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,
0x17e2,0x234,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,
0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17df,0x17cd,0x17cd,0x17cd,0x17cd,
0x17cd,0x17cd,0x17cd,0x234,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17df,0x17d0,0x17e2,0x17e5,0x17e5,0x17d9,
0x17d6,0x17d6,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x17dc,0x17dc,0x17dc,0x17dc,
0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,
0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x234,0x234,0x234,0x17f1,0x17f4,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,
0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a,
0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,
0x17eb,0x23a,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x183c,0x18d8,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,
0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,
0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,
0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x240,0x240,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,
0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x240,0x17f4,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,
0x17eb,0x17f4,0x17eb,0x17eb,0x17f4,0x17eb,0x17eb,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,
0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x243,0x243,0x243,
0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,
0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x240,0x240,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,
0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x240,0x17f7,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,
0x17ee,0x17f7,0x17ee,0x17ee,0x17f7,0x17ee,0x17ee,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,
0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x243,0x243,0x243,
0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,
0x1812,0x1812,0x1803,0x17fd,0x17fd,0x1812,0x1800,0x1815,0x1815,0x1815,0x1815,0x1818,0x1818,0x180c,0x1809,0x1806,
0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x246,0x180c,0x246,0x1806,0x246,0x246,
0x1815,0x1815,0x1806,0x1800,0x1800,0x1815,0x1803,0x1818,0x1818,0x1818,0x1818,0x181b,0x181b,0x180f,0x180c,0x1809,
0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x246,0x180f,0x246,0x1809,0x246,0x246,
0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,
0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,
0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,
0x1821,0x1821,0x1821,0x1821,0x249,0x249,0x249,0x249,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,
0x181e,0x181e,0x181e,0x181e,0x249,0x249,0x249,0x249,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,
0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,
0x181b,0x181b,0x181b,0x181b,0x249,0x249,0x249,0x249,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,
0x183c,0x183c,0x183c,0x183c,0x183c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,
0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,
0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x24f,0x24f,0x24f,0x24f,0x24f,
0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,
0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,
0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x252,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x255,
0x187b,0x187b,0x255,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,
0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x255,
0x255,0x255,0x186f,0x255,0x186f,0x186f,0x255,0x186f,0x186f,0x186f,0x1872,0x186f,0x1875,0x1875,0x187e,0x186f,
0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x1878,0x1878,0x1878,0x1878,0x1878,0x1878,0x1878,0x1878,
0x1878,0x1878,0x255,0x255,0x255,0x255,0x255,0x255,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x181e,0x181e,0x181e,0x181e,0x249,0x249,0x249,0x249,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,
0x183f,0x183f,0x183f,0x183f,0x183f,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,
0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,
0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x24f,0x24f,0x24f,0x24f,0x24f,
0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x18de,0x18de,0x18de,0x18de,0x258,0x258,0x258,0x258,0x1896,0x1896,0x1896,0x1896,0x25b,0x25b,0x1899,0x1899,
0x1899,0x1899,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1893,
0x1884,0x1887,0x188a,0x189c,0x189c,0x25b,0x188d,0x188d,0x18ab,0x18ae,0x18bd,0x18bd,0x18ae,0x18b1,0x18ab,0x18a8,
0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1896,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1893,
0x1893,0x1881,0x1881,0x1881,0x1896,0x1896,0x1896,0x1896,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x252,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x255,
0x187e,0x187e,0x255,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,
0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x255,
0x255,0x255,0x1872,0x255,0x1872,0x1872,0x255,0x1872,0x1872,0x1872,0x1875,0x1872,0x1878,0x1878,0x1881,0x1872,
0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,
0x187b,0x187b,0x255,0x255,0x255,0x255,0x255,0x255,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,
0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,
0x18e1,0x18e1,0x18e1,0x18e1,0x258,0x258,0x258,0x258,0x1899,0x1899,0x1899,0x1899,0x25b,0x25b,0x189c,0x189c,
0x189c,0x189c,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896,
0x1887,0x188a,0x188d,0x189f,0x189f,0x25b,0x1890,0x1890,0x18ae,0x18b1,0x18c0,0x18c0,0x18b1,0x18b4,0x18ae,0x18ab,
0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1899,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896,
0x1896,0x1884,0x1884,0x1884,0x1899,0x1899,0x1899,0x1899,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x18d8,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,
0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x18db,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,
0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,
0x264,0x264,0x264,0x264,0x264,0x264,0x933,0x933,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,
0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0x267,0x267,
0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,
0x18c3,0x18c3,0x18c3,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,
0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,
0x18c6,0x18c6,0x18c6,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,
0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,
0xc4b,0xc4b,0xc4b,0x128d,0x128d,0x128d,0x26d,0x26d,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,
0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,
@ -2507,9 +2507,9 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x276,0x276,0x276,0x276,0x276,0x276,0x276,
0x276,0x276,0x276,0x276,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
0x13bc,0x13bc,0x279,0x279,0x1782,0x1782,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,
0x27c,0x27c,0x27c,0x27c,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,
0x18d8,0x18d8,0x18d8,0x18d8,0x1101,0x378,0x378,0x384,0xc8d,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
0x13bc,0x13bc,0x279,0x279,0x1785,0x1785,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,
0x27c,0x27c,0x27c,0x27c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,
0x18db,0x18db,0x18db,0x18db,0x1101,0x378,0x378,0x384,0xc8d,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,
0x387,0x387,0x387,0x387,0x384,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x384,0x384,0x384,
0x384,0x37e,0x1104,0x12db,0x387,0x900,0x903,0x37b,0x37b,0x1101,0x12d8,0x12d8,0x38a,0x38a,0x38a,0x38a,
@ -2518,8 +2518,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xeb5,0xd80,0xeb5,0xeb5,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387,
0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x12d8,0x12db,
0x37b,0x387,0x384,0x384,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x429,0x429,
0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x1854,
0x1854,0xf81,0x41a,0x423,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,
0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x1857,
0x1857,0xf81,0x41a,0x423,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,
0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0xb79,0xb79,0xd8c,0xd8c,0x885,
0xd8f,0x13ce,0x13ce,0x13ce,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,
0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,
@ -2543,7 +2543,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xaaa,0xaaa,0xb85,0xb85,0xb85,0xb85,0xb8b,0xcba,0xcb7,0xd9b,0xd9e,0xb88,0xd9e,0xd9e,0xd9e,0xd9e,
0xd9b,0xd9e,0xd9e,0xb82,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4f8,0x4fe,0x714,0x4fb,0x978,
0x999,0xab3,0xab3,0xab3,0xb94,0xb94,0xda4,0xda4,0xda4,0xda4,0x1125,0x1128,0x1128,0x12f9,0x149d,0x14c7,
0x14ca,0x14ca,0x16da,0x1857,0x50a,0x50a,0x522,0x6a2,0x507,0x69f,0x50a,0x51f,0x507,0x6a2,0x519,0x522,
0x14ca,0x14ca,0x16dd,0x185a,0x50a,0x50a,0x522,0x6a2,0x507,0x69f,0x50a,0x51f,0x507,0x6a2,0x519,0x522,
0x522,0x522,0x519,0x519,0x522,0x522,0x522,0x6ab,0x507,0x522,0x6a5,0x507,0x516,0x522,0x522,0x522,
0x522,0x522,0x507,0x507,0x50d,0x69f,0x6a8,0x507,0x522,0x507,0x6ae,0x507,0x522,0x510,0x528,0x6b1,
0x522,0x522,0x513,0x519,0x522,0x522,0x525,0x522,0x519,0x51c,0x51c,0x51c,0x51c,0xabc,0xab9,0xcbd,
@ -2642,7 +2642,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d9,0x5d9,0x5d9,0x5d9,
0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,
0x5d9,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5dc,0x5dc,0x5dc,0x5dc,
0xfc6,0xfc6,0xfc6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x16e0,0x16e0,0x831,0x837,0x837,0x843,
0xfc6,0xfc6,0xfc6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x16e3,0x16e3,0x831,0x837,0x837,0x843,
0x843,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x5eb,0x5eb,0x5e5,0x5eb,
0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,
0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,
@ -2795,7 +2795,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3a,0xb3a,0xb3a,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e3,0x16e3,0xb52,0xb49,0xb4f,0xb4f,
0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0xb52,0xb49,0xb4f,0xb4f,
0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,
0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,
0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,
@ -2903,7 +2903,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0x10f5,0x10f5,0x10f5,0x10f5,
0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0xecd,0xecd,0xecd,0xeca,
0xeca,0xeca,0xeca,0xeca,0x112e,0x137a,0x137a,0x137a,0x137a,0x12fc,0x12fc,0x12fc,0x137d,0x12ff,0x12ff,0x137d,
0x14cd,0x14cd,0x14cd,0x14cd,0x14d0,0x14d0,0x14d0,0x1794,0x1794,0x1794,0x1794,0x185a,0xee2,0xee2,0xee2,0xee2,
0x14cd,0x14cd,0x14cd,0x14cd,0x14d0,0x14d0,0x14d0,0x1797,0x1797,0x1797,0x1797,0x185d,0xee2,0xee2,0xee2,0xee2,
0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde,
0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xf03,0xf03,0xf03,0xf03,
0xf15,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf1e,0xf1e,0xf21,0xf1e,
@ -2931,7 +2931,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x14e5,0x14e5,0x14e5,0x14e5,0xffc,0xffc,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff0,0xff0,
0xff0,0xff0,0x1005,0x1002,0xff0,0x1149,0x13e0,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e6,0x13e6,
0x1500,0x14f4,0x14f4,0x14f1,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1017,0x1014,0x1014,0x1023,
0x101a,0x1320,0x131d,0x16ec,0x1320,0x131d,0x13ef,0x13ec,0x1503,0x1503,0x1509,0x1503,0x1509,0x1503,0x1509,0x1503,
0x101a,0x1320,0x131d,0x16ef,0x1320,0x131d,0x13ef,0x13ec,0x1503,0x1503,0x1509,0x1503,0x1509,0x1503,0x1509,0x1503,
0x1509,0x1503,0x1509,0x1503,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,
0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,
0x1023,0x101a,0x1023,0x101a,0x101d,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x1023,0x101a,0x1023,
@ -2952,7 +2952,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1080,0x107a,0x107d,0x10fe,0x1071,0x1071,0x1071,0x1077,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,
0x1074,0x1074,0x1077,0x1083,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,
0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,
0x1080,0x107a,0x1080,0x107a,0x1518,0x1515,0x1518,0x1515,0x151b,0x151b,0x16f5,0x13fe,0x108c,0x108c,0x108f,0x108f,
0x1080,0x107a,0x1080,0x107a,0x1518,0x1515,0x1518,0x1515,0x151b,0x151b,0x16f8,0x13fe,0x108c,0x108c,0x108f,0x108f,
0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,
0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108c,0x108c,0x108c,0x108c,
0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x1095,0x1095,
@ -2968,8 +2968,8 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,
0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,
0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e9,0x10e9,0x10e9,0x10e9,0x128a,0x128a,0x128a,0x128a,
0x128a,0x128a,0x128a,0x128a,0x1488,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x18c3,0x18c3,
0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,
0x128a,0x128a,0x128a,0x128a,0x1488,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x18c6,0x18c6,
0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,
0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x1155,0x1155,
0x1158,0x1158,0x115e,0x1155,0x1155,0x1155,0x1155,0x1155,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,
0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,
@ -3009,7 +3009,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1302,0x1302,0x1302,0x1302,0x1257,0x125d,0x1284,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x1260,0x1284,0x1284,
0x1260,0x1284,0x1257,0x1260,0x1260,0x1263,0x1284,0x1257,0x1257,0x1284,0x125a,0x125a,0x1371,0x1371,0x1371,0x1371,
0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x126c,0x126c,0x126c,0x126c,0x138c,0x136b,0x1275,0x138c,0x138c,0x138c,
0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1821,0x1821,0x1821,0x1821,0x1821,0x1374,0x1374,0x127b,0x1374,
0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1824,0x1824,0x1824,0x1824,0x1824,0x1374,0x1374,0x127b,0x1374,
0x1374,0x1374,0x127b,0x1374,0x1374,0x1374,0x1275,0x1275,0x1275,0x1275,0x1275,0x136e,0x1371,0x1371,0x1371,0x1371,
0x1371,0x1371,0x1371,0x1278,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1278,0x12a2,0x12a2,0x12a2,0x12a2,
0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,
@ -3022,9 +3022,9 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,
0x1362,0x1362,0x1362,0x1362,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,
0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,
0x1368,0x1368,0x1368,0x1368,0x1398,0x1395,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
0x18c9,0x18c9,0x18c9,0x18c9,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,
0x1368,0x1368,0x1368,0x1368,0x1398,0x1395,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,
0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,
0x18cc,0x18cc,0x18cc,0x18cc,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x139e,0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,
0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,
@ -3034,17 +3034,17 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x1533,0x1533,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1776,0x1776,0x1776,
0x13a1,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1779,0x1779,0x1779,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1776,0x1776,
0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1779,0x1779,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a4,0x1536,0x1536,0x153c,0x153c,0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x153c,0x153c,
0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x16aa,0x13a1,0x13a7,0x13a1,0x13a1,0x13a7,0x1542,0x1542,0x153c,0x153c,0x1776,
0x1776,0x1776,0x1776,0x1776,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,
0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x16aa,0x13a1,0x13a7,0x13a1,0x13a1,0x13a7,0x1542,0x1542,0x153c,0x153c,0x1779,
0x1779,0x1779,0x1779,0x1779,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a4,0x13a1,0x13a1,
0x13a1,0x1536,0x1536,0x153c,0x16aa,0x153c,0x1536,0x153c,0x1776,0x1776,0x1776,0x1779,0x1779,0x1779,0x1779,0x1779,
0x13a1,0x1536,0x1536,0x153c,0x16aa,0x153c,0x1536,0x153c,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,
0x13a1,0x153c,0x13a7,0x13a7,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,
@ -3053,17 +3053,17 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,
0x13a1,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x16aa,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1536,0x1776,0x1404,0x1404,0x1404,0x1404,0x1533,0x1533,0x1533,0x1533,
0x1533,0x1539,0x153c,0x1776,0x1776,0x1776,0x1776,0x16fe,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x16aa,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1536,0x1779,0x1404,0x1404,0x1404,0x1404,0x1533,0x1533,0x1533,0x1533,
0x1533,0x1539,0x153c,0x1779,0x1779,0x1779,0x1779,0x1701,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,
0x153c,0x1536,0x1536,0x153c,0x1542,0x1542,0x153c,0x153c,0x153c,0x153c,0x182a,0x1536,0x1536,0x1536,0x1536,0x1536,
0x153c,0x1536,0x1536,0x153c,0x1542,0x1542,0x153c,0x153c,0x153c,0x153c,0x182d,0x1536,0x1536,0x1536,0x1536,0x1536,
0x1536,0x153c,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x153f,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,
0x1536,0x1536,0x1536,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,
0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,
0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e,
0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x148e,
0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,
0x13ad,0x16b0,0x16b0,0x177c,0x177c,0x13b0,0x13b0,0x13b0,0x13ad,0x13ad,0x13ad,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,
0x13ad,0x16b0,0x16b0,0x177f,0x177f,0x13b0,0x13b0,0x13b0,0x13ad,0x13ad,0x13ad,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,
0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,
0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,
0x13b3,0x13b3,0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,
@ -3071,7 +3071,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x13b3,0x13b3,0x13b3,0x13b3,0x13b9,0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,
0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,
0x17a9,0x17a9,0x17a6,0x1701,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x1407,0x1407,0x1407,0x1407,0x1407,0x1407,
0x17ac,0x17ac,0x17a9,0x1704,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x1407,0x1407,0x1407,0x1407,0x1407,0x1407,
0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x154b,
0x1416,0x1416,0x1416,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,
0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,
@ -3088,7 +3088,7 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x153c,0x153c,0x1536,
0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x1536,0x1536,
0x1542,0x1536,0x1536,0x1536,0x1536,0x16ad,0x16ad,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,
0x1827,0x153c,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x153c,0x1536,
0x182a,0x153c,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x153c,0x1536,
0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1563,0x1563,0x1563,0x1563,
0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,
0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1575,0x1575,0x1575,0x1575,
@ -3135,52 +3135,52 @@ static const uint16_t propsVectorsTrie_index[29236]={
0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,
0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a7,0x16a7,0x16a7,0x16a7,
0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,
0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x1707,0x1707,0x1707,0x1707,
0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,
0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1743,0x1743,0x1743,0x1743,
0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,
0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1749,0x1746,
0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,
0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,
0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c,
0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x170a,0x170a,0x170a,0x170a,
0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,
0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x1746,0x1746,0x1746,0x1746,
0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,
0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x174c,0x1749,
0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,
0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,
0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,
0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,
0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,
0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,
0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,
0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,
0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,
0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,
0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,
0x1767,0x1767,0x1767,0x176a,0x176a,0x176a,0x176a,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,
0x1767,0x1767,0x1767,0x1767,0x1767,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x1767,0x176a,0x176a,
0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,
0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,
0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,
0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,
0x17c7,0x17c7,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,
0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,
0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,
0x176a,0x176a,0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d,
0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,
0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,
0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,
0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,
0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,
0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,
0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,
0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,
0x1815,0x1815,0x1815,0x1815,0x1815,0x1812,0x1812,0x1812,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,
0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,
0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,
0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,
0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,
0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,
0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,
0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,
0x1818,0x1818,0x1818,0x1818,0x1818,0x1815,0x1815,0x1815,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,
0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,
0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,
0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,
0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,
0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,
0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,0x1896,
0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,
0x18b7,0x18b7,0x18b7,0x18a2,0x18a8,0x18a5,0x18a5,0x18a5,0x18a5,0x18b4,0x18ba,0x18a5,0x18a5,0x18a5,0x18a5,0x18b1,
0x18b7,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18b4,0x18b4,0x18a5,0x18a5,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,
0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,
0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,
0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,
0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,
0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,
0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,
0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,
0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,
0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,
0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,
0x18ba,0x18ba,0x18ba,0x18a5,0x18ab,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18bd,0x18a8,0x18a8,0x18a8,0x18a8,0x18b4,
0x18ba,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18b7,0x18a8,0x18a8,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,
0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,
0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,
0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,
0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,
0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,
0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,
0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,
0,0,0,0
};
@ -3199,7 +3199,7 @@ static const UTrie2 propsVectorsTrie={
NULL, 0, FALSE, FALSE, 0, NULL
};
static const uint32_t propsVectors[6372]={
static const uint32_t propsVectors[6375]={
0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67,
0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0,
0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0,
@ -3564,43 +3564,43 @@ static const uint32_t propsVectors[6372]={
0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,
0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0,
0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfc0,0x4000000,0x200000,0x7040f7c4,0x80000,0x918820,0x7080af7b,
0x2802400,0x962460,0x7080dfc0,0x2802400,0x962460,0x70c0e4c2,0x2802400,0x962460,0x70c0e4c2,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,
0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,
0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,
0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,
0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x200000,
0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,
0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,
0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1,0x7c00100,0x1830000,
0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100,0x220400,0x80010165,
0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000,0x8001044c,0x4000000,
0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670,0x4000010,0x400000,
0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x7a904de0,0x800ace00,0x4000000,0x30e00000,0x800acf00,
0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400,0x9000171a,0x4000000,
0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00,0x24000000,0x400000,
0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100,0x962460,0x9000d202,
0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,
0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8,0x2806400,0x962460,
0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,
0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,
0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,
0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,
0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,
0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00,0x4000000,0x30e00000,
0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,
0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,0x962460,0xa000120f,0x2802400,
0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,0xa000581e,0x7c00100,0x230400,
0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500,0x4000000,0x200000,0xa00114af,
0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,0x230400,0xa00114af,0x7c00100,
0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,0xa00116b0,0x4000000,0x500000,
0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,0xc000010,0x448000,0xa0011722,
0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,0x200000,0xa00118b1,0x4000000,
0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,0xa00118b1,0xc000010,0x448000,
0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000,0x30e00000,0xa00b0500,
0x4000000,0x30e00000,0xa00b0500,0x4000000,0xb28045a0,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000,0xa00b1596,0x7c00300,
0xe30000,0xa040af86,0x6800400,0x962540};
0x2802400,0x962460,0x7080dfc0,0x2802400,0x962460,0x70c0e4c2,0x2802100,0x962460,0x70c0e4c2,0x2802400,0x962460,0x70c0e4c2,0x6800100,0x962540,0x8000120f,0x7c00100,
0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,
0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,
0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,
0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,
0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,
0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,
0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,
0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,
0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,
0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,
0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x7a904de0,0x800ace00,
0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,
0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,
0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,
0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,
0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,
0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,
0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,
0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,
0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,
0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,
0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,
0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,
0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,
0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,
0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500,
0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,
0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,
0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,
0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,
0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,
0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,
0x4000000,0x30e00000,0xa00b0500,0x4000000,0x30e00000,0xa00b0500,0x4000000,0xb28045a0,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,
0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af86,0x6800400,0x962540};
static const int32_t countPropsVectors=6372;
static const int32_t countPropsVectors=6375;
static const int32_t propsVectorsColumns=3;
static const uint16_t scriptExtensions[198]={
0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22,
@ -3617,6 +3617,6 @@ static const uint16_t scriptExtensions[198]={
0xa,0xae,0xa,0x8023,0xa,0xb2,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,
2,0x8007,0x89,0x69,0x8087,0};
static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2962,0x2962,0x2962,0x2962,0x6280,3,0x7b64,0x7bc7,0x7bc7,0x7bc7,0xb18b1,0x2a75631,0,0,0,0};
static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2962,0x2962,0x2962,0x2962,0x6280,3,0x7b67,0x7bca,0x7bca,0x7bca,0xb18b1,0x2a75631,0,0,0,0};
#endif // INCLUDED_FROM_UCHAR_C

View File

@ -588,7 +588,7 @@ ucurr_forLocale(const char* locale,
idDelim[0] = 0;
}
const UChar* s; // Currency code from data file.
const UChar* s = NULL; // Currency code from data file.
if (id[0] == 0) {
// No point looking in the data for an empty string.
// This is what we would get.

View File

@ -36,7 +36,7 @@ public:
* The source string and the destination buffer must not overlap.
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
* @param dest A buffer for the result string. The result will be NUL-terminated if
@ -71,7 +71,7 @@ public:
* The source string and the destination buffer must not overlap.
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
* @param dest A buffer for the result string. The result will be NUL-terminated if
@ -112,8 +112,10 @@ public:
* all others. (This can be modified with options bits.)
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT,
* U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT,
* U_TITLECASE_NO_LOWERCASE,
* U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,
* U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.
* @param iter A break iterator to find the first characters of words that are to be titlecased.
* It is set to the source string (setText())
* and used one or more times for iteration (first() and next()).
@ -159,7 +161,7 @@ public:
* The result may be longer or shorter than the original.
* The source string and the destination buffer must not overlap.
*
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT,
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT,
* U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
@ -195,7 +197,7 @@ public:
* The source string and the destination buffer must not overlap.
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
* @param dest A buffer for the result string. The result will be NUL-terminated if
@ -230,7 +232,7 @@ public:
* The source string and the destination buffer must not overlap.
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.
* @param dest A buffer for the result string. The result will be NUL-terminated if
@ -271,10 +273,12 @@ public:
* all others. (This can be modified with options bits.)
*
* @param locale The locale ID. ("" = root locale, NULL = default locale.)
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT,
* U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT.
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT,
* U_TITLECASE_NO_LOWERCASE,
* U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,
* U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.
* @param iter A break iterator to find the first characters of words that are to be titlecased.
* It is set to the source string (setText())
* It is set to the source string (setUText())
* and used one or more times for iteration (first() and next()).
* If NULL, then a word break iterator for the locale is used
* (or something equivalent).
@ -317,7 +321,7 @@ public:
* The result may be longer or shorter than the original.
* The source string and the destination buffer must not overlap.
*
* @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT,
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT,
* U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I.
* @param src The original string.
* @param srcLength The length of the original string. If -1, then src must be NUL-terminated.

View File

@ -28,12 +28,15 @@
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/stringpiece.h"
#include "unicode/uniset.h"
#include "unicode/unistr.h"
#include "unicode/unorm2.h"
U_NAMESPACE_BEGIN
class ByteSink;
/**
* Unicode normalization functionality for standard Unicode normalization or
* for using custom mapping tables.
@ -215,6 +218,34 @@ public:
normalize(const UnicodeString &src,
UnicodeString &dest,
UErrorCode &errorCode) const = 0;
/**
* Normalizes a UTF-8 string and optionally records how source substrings
* relate to changed and unchanged result substrings.
*
* Currently implemented completely only for "compose" modes,
* such as for NFC, NFKC, and NFKC_Casefold
* (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS).
* Otherwise currently converts to & from UTF-16 and does not support edits.
*
* @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT.
* @param src Source UTF-8 string.
* @param sink A ByteSink to which the normalized UTF-8 result string is written.
* sink.Flush() is called at the end.
* @param edits Records edits for index mapping, working with styled text,
* and getting only changes (if any).
* The Edits contents is undefined if any error occurs.
* This function calls edits->reset() first. edits can be nullptr.
* @param errorCode Standard ICU error code. Its input value must
* pass the U_SUCCESS() test, or else the function returns
* immediately. Check for U_FAILURE() on output or use with
* function chaining. (See User Guide for details.)
* @internal ICU 60 technology preview, may be changed or removed in the future
*/
virtual void
normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink,
Edits *edits, UErrorCode &errorCode) const;
/**
* Appends the normalized form of the second string to the first string
* (merging them at the boundary) and returns the first string.

View File

@ -0,0 +1,187 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// stringoptions.h
// created: 2017jun08 Markus W. Scherer
#ifndef __STRINGOPTIONS_H__
#define __STRINGOPTIONS_H__
#include "unicode/utypes.h"
/**
* \file
* \brief C API: Bit set option bit constants for various string and character processing functions.
*/
/**
* Option value for case folding: Use default mappings defined in CaseFolding.txt.
*
* @stable ICU 2.0
*/
#define U_FOLD_CASE_DEFAULT 0
/**
* Option value for case folding:
*
* Use the modified set of mappings provided in CaseFolding.txt to handle dotted I
* and dotless i appropriately for Turkic languages (tr, az).
*
* Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that
* are to be included for default mappings and
* excluded for the Turkic-specific mappings.
*
* Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that
* are to be excluded for default mappings and
* included for the Turkic-specific mappings.
*
* @stable ICU 2.0
*/
#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1
#ifndef U_HIDE_DRAFT_API
/**
* Titlecase the string as a whole rather than each word.
* (Titlecase only the character at index 0, possibly adjusted.)
* Option bits value for titlecasing APIs that take an options bit set.
*
* It is an error to specify multiple titlecasing iterator options together,
* including both an options bit and an explicit BreakIterator.
*
* @see U_TITLECASE_ADJUST_TO_CASED
* @draft ICU 60
*/
#define U_TITLECASE_WHOLE_STRING 0x20
/**
* Titlecase sentences rather than words.
* (Titlecase only the first character of each sentence, possibly adjusted.)
* Option bits value for titlecasing APIs that take an options bit set.
*
* It is an error to specify multiple titlecasing iterator options together,
* including both an options bit and an explicit BreakIterator.
*
* @see U_TITLECASE_ADJUST_TO_CASED
* @draft ICU 60
*/
#define U_TITLECASE_SENTENCES 0x40
#endif // U_HIDE_DRAFT_API
/**
* Do not lowercase non-initial parts of words when titlecasing.
* Option bit for titlecasing APIs that take an options bit set.
*
* By default, titlecasing will titlecase the character at each
* (possibly adjusted) BreakIterator index and
* lowercase all other characters up to the next iterator index.
* With this option, the other characters will not be modified.
*
* @see U_TITLECASE_ADJUST_TO_CASED
* @see UnicodeString::toTitle
* @see CaseMap::toTitle
* @see ucasemap_setOptions
* @see ucasemap_toTitle
* @see ucasemap_utf8ToTitle
* @stable ICU 3.8
*/
#define U_TITLECASE_NO_LOWERCASE 0x100
/**
* Do not adjust the titlecasing BreakIterator indexes;
* titlecase exactly the characters at breaks from the iterator.
* Option bit for titlecasing APIs that take an options bit set.
*
* By default, titlecasing will take each break iterator index,
* adjust it to the next relevant character (see U_TITLECASE_ADJUST_TO_CASED),
* and titlecase that one.
*
* Other characters are lowercased.
*
* It is an error to specify multiple titlecasing adjustment options together.
*
* @see U_TITLECASE_ADJUST_TO_CASED
* @see U_TITLECASE_NO_LOWERCASE
* @see UnicodeString::toTitle
* @see CaseMap::toTitle
* @see ucasemap_setOptions
* @see ucasemap_toTitle
* @see ucasemap_utf8ToTitle
* @stable ICU 3.8
*/
#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200
#ifndef U_HIDE_DRAFT_API
/**
* Adjust each titlecasing BreakIterator index to the next cased character.
* (See the Unicode Standard, chapter 3, Default Case Conversion, R3 toTitlecase(X).)
* Option bit for titlecasing APIs that take an options bit set.
*
* This used to be the default index adjustment in ICU.
* Since ICU 60, the default index adjustment is to the next character that is
* a letter, number, symbol, or private use code point.
* (Uncased modifier letters are skipped.)
* The difference in behavior is small for word titlecasing,
* but the new adjustment is much better for whole-string and sentence titlecasing:
* It yields "49ers" and "«丰(abc)»" instead of "49Ers" and "«丰(Abc)»".
*
* It is an error to specify multiple titlecasing adjustment options together.
*
* @see U_TITLECASE_NO_BREAK_ADJUSTMENT
* @draft ICU 60
*/
#define U_TITLECASE_ADJUST_TO_CASED 0x400
/**
* Omit unchanged text when recording how source substrings
* relate to changed and unchanged result substrings.
* Used for example in some case-mapping and normalization functions.
*
* @see CaseMap
* @see Edits
* @see Normalizer2
* @draft ICU 60
*/
#define U_OMIT_UNCHANGED_TEXT 0x4000
#endif // U_HIDE_DRAFT_API
/**
* Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
* Compare strings in code point order instead of code unit order.
* @stable ICU 2.2
*/
#define U_COMPARE_CODE_POINT_ORDER 0x8000
/**
* Option bit for unorm_compare:
* Perform case-insensitive comparison.
* @stable ICU 2.2
*/
#define U_COMPARE_IGNORE_CASE 0x10000
/**
* Option bit for unorm_compare:
* Both input strings are assumed to fulfill FCD conditions.
* @stable ICU 2.2
*/
#define UNORM_INPUT_IS_FCD 0x20000
// Related definitions elsewhere.
// Options that are not meaningful in the same functions
// can share the same bits.
//
// Public:
// unicode/unorm.h #define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20
//
// Internal: (may change or be removed)
// ucase.h #define _STRCASECMP_OPTIONS_MASK 0xffff
// ucase.h #define _FOLD_CASE_OPTIONS_MASK 7
// ucasemap_imp.h #define U_TITLECASE_ITERATOR_MASK 0xe0
// ucasemap_imp.h #define U_TITLECASE_ADJUSTMENT_MASK 0x600
// ustr_imp.h #define _STRNCMP_STYLE 0x1000
// unormcmp.cpp #define _COMPARE_EQUIV 0x80000
#endif // __STRINGOPTIONS_H__

View File

@ -23,6 +23,7 @@
#include "unicode/utypes.h"
#include "unicode/localpointer.h"
#include "unicode/stringoptions.h"
#include "unicode/ustring.h"
/**
@ -144,56 +145,6 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode);
U_STABLE void U_EXPORT2
ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode);
/**
* Do not lowercase non-initial parts of words when titlecasing.
* Option bit for titlecasing APIs that take an options bit set.
*
* By default, titlecasing will titlecase the first cased character
* of a word and lowercase all other characters.
* With this option, the other characters will not be modified.
*
* @see ucasemap_setOptions
* @see ucasemap_toTitle
* @see ucasemap_utf8ToTitle
* @see UnicodeString::toTitle
* @stable ICU 3.8
*/
#define U_TITLECASE_NO_LOWERCASE 0x100
/**
* Do not adjust the titlecasing indexes from BreakIterator::next() indexes;
* titlecase exactly the characters at breaks from the iterator.
* Option bit for titlecasing APIs that take an options bit set.
*
* By default, titlecasing will take each break iterator index,
* adjust it by looking for the next cased character, and titlecase that one.
* Other characters are lowercased.
*
* This follows Unicode 4 & 5 section 3.13 Default Case Operations:
*
* R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
* #29, "Text Boundaries." Between each pair of word boundaries, find the first
* cased character F. If F exists, map F to default_title(F); then map each
* subsequent character C to default_lower(C).
*
* @see ucasemap_setOptions
* @see ucasemap_toTitle
* @see ucasemap_utf8ToTitle
* @see UnicodeString::toTitle
* @see U_TITLECASE_NO_LOWERCASE
* @stable ICU 3.8
*/
#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200
/**
* Omit unchanged text when case-mapping with Edits.
*
* @see CaseMap
* @see Edits
* @draft ICU 59
*/
#define UCASEMAP_OMIT_UNCHANGED_TEXT 0x4000
#if !UCONFIG_NO_BREAK_ITERATION
/**
@ -251,7 +202,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode
* The standard titlecase iterator for the root locale implements the
* algorithm of Unicode TR 21.
*
* This function uses only the setUText(), first(), next() and close() methods of the
* This function uses only the setText(), first() and next() methods of the
* provided break iterator.
*
* The result may be longer or shorter than the original.

View File

@ -26,6 +26,7 @@
#define UCHAR_H
#include "unicode/utypes.h"
#include "unicode/stringoptions.h"
U_CDECL_BEGIN
@ -3569,27 +3570,6 @@ u_toupper(UChar32 c);
U_STABLE UChar32 U_EXPORT2
u_totitle(UChar32 c);
/** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */
#define U_FOLD_CASE_DEFAULT 0
/**
* Option value for case folding:
*
* Use the modified set of mappings provided in CaseFolding.txt to handle dotted I
* and dotless i appropriately for Turkic languages (tr, az).
*
* Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that
* are to be included for default mappings and
* excluded for the Turkic-specific mappings.
*
* Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that
* are to be excluded for default mappings and
* included for the Turkic-specific mappings.
*
* @stable ICU 2.0
*/
#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1
/**
* The given character is mapped to its case folding equivalent according to
* UnicodeData.txt and CaseFolding.txt;

View File

@ -38,16 +38,6 @@
struct UConverter; // unicode/ucnv.h
#ifndef U_COMPARE_CODE_POINT_ORDER
/* see also ustring.h and unorm.h */
/**
* Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
* Compare strings in code point order instead of code unit order.
* @stable ICU 2.2
*/
#define U_COMPARE_CODE_POINT_ORDER 0x8000
#endif
#ifndef USTRING_H
/**
* \ingroup ustring_ustrlen
@ -2785,11 +2775,11 @@ public:
* break iterator is opened.
* Otherwise the provided iterator is set to the string's text.
* @param locale The locale to consider.
* @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE,
* U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED,
* U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES.
* @param options Options bit set, see ucasemap_open().
* @return A reference to this.
* @see U_TITLECASE_NO_LOWERCASE
* @see U_TITLECASE_NO_BREAK_ADJUSTMENT
* @see ucasemap_open
* @stable ICU 3.8
*/
UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options);

View File

@ -32,6 +32,7 @@
#include "unicode/utypes.h"
#include "unicode/localpointer.h"
#include "unicode/stringoptions.h"
#include "unicode/uset.h"
/**
@ -526,30 +527,6 @@ unorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c);
U_STABLE UBool U_EXPORT2
unorm2_isInert(const UNormalizer2 *norm2, UChar32 c);
/**
* Option bit for unorm_compare:
* Both input strings are assumed to fulfill FCD conditions.
* @stable ICU 2.2
*/
#define UNORM_INPUT_IS_FCD 0x20000
/**
* Option bit for unorm_compare:
* Perform case-insensitive comparison.
* @stable ICU 2.2
*/
#define U_COMPARE_IGNORE_CASE 0x10000
#ifndef U_COMPARE_CODE_POINT_ORDER
/* see also unistr.h and ustring.h */
/**
* Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
* Compare strings in code point order instead of code unit order.
* @stable ICU 2.2
*/
#define U_COMPARE_CODE_POINT_ORDER 0x8000
#endif
/**
* Compares two strings for canonical equivalence.
* Further options include case-insensitive comparison and

View File

@ -497,16 +497,6 @@ u_strCompare(const UChar *s1, int32_t length1,
U_STABLE int32_t U_EXPORT2
u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder);
#ifndef U_COMPARE_CODE_POINT_ORDER
/* see also unistr.h and unorm.h */
/**
* Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
* Compare strings in code point order instead of code unit order.
* @stable ICU 2.2
*/
#define U_COMPARE_CODE_POINT_ORDER 0x8000
#endif
/**
* Compare two strings case-insensitively using full case folding.
* This is equivalent to

View File

@ -58,19 +58,19 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
#define U_ICU_VERSION_MAJOR_NUM 59
#define U_ICU_VERSION_MAJOR_NUM 60
/** The current ICU minor version as an integer.
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
#define U_ICU_VERSION_MINOR_NUM 1
#define U_ICU_VERSION_MINOR_NUM 0
/** The current ICU patchlevel version as an integer.
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
#define U_ICU_VERSION_PATCHLEVEL_NUM 0
#define U_ICU_VERSION_PATCHLEVEL_NUM 1
/** The current ICU build level version as an integer.
* This value is for use by ICU clients. It defaults to 0.
@ -84,7 +84,7 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
#define U_ICU_VERSION_SUFFIX _59
#define U_ICU_VERSION_SUFFIX _60
/**
* \def U_DEF2_ICU_ENTRY_POINT_RENAME
@ -119,14 +119,14 @@
* This value will change in the subsequent releases of ICU
* @stable ICU 2.4
*/
#define U_ICU_VERSION "59.1"
#define U_ICU_VERSION "60.0.1"
/** The current ICU library major/minor version as a string without dots, for library name suffixes.
* This value will change in the subsequent releases of ICU
* @stable ICU 2.6
*/
#if U_PLATFORM_HAS_WINUWP_API == 0
#define U_ICU_VERSION_SHORT "59"
#define U_ICU_VERSION_SHORT "60"
#else
// U_DISABLE_RENAMING does not impact dat file name
#define U_ICU_VERSION_SHORT
@ -136,7 +136,7 @@
/** Data version in ICU4C.
* @internal ICU 4.4 Internal Use Only
**/
#define U_ICU_DATA_VERSION "59.1"
#define U_ICU_DATA_VERSION "60.0.1"
#endif /* U_HIDE_INTERNAL_API */
/*===========================================================================

View File

@ -162,7 +162,7 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER
iter->setText(oldString);
}
#endif
stringCaseMapper(caseLocale, options | UCASEMAP_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR
stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR
replacementChars, UPRV_LENGTHOF(replacementChars),
oldArray, oldLength, &edits, errorCode);
if (U_SUCCESS(errorCode)) {

View File

@ -30,31 +30,26 @@
U_NAMESPACE_BEGIN
UnicodeString &
UnicodeString::toTitle(BreakIterator *titleIter) {
return toTitle(titleIter, Locale::getDefault(), 0);
UnicodeString::toTitle(BreakIterator *iter) {
return toTitle(iter, Locale::getDefault(), 0);
}
UnicodeString &
UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) {
return toTitle(titleIter, locale, 0);
UnicodeString::toTitle(BreakIterator *iter, const Locale &locale) {
return toTitle(iter, locale, 0);
}
UnicodeString &
UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) {
BreakIterator *bi=titleIter;
if(bi==NULL) {
UErrorCode errorCode=U_ZERO_ERROR;
bi=BreakIterator::createWordInstance(locale, errorCode);
if(U_FAILURE(errorCode)) {
setToBogus();
return *this;
UnicodeString::toTitle(BreakIterator *iter, const Locale &locale, uint32_t options) {
LocalPointer<BreakIterator> ownedIter;
UErrorCode errorCode = U_ZERO_ERROR;
iter = ustrcase_getTitleBreakIterator(&locale, "", options, iter, ownedIter, errorCode);
if (iter == nullptr) {
setToBogus();
return *this;
}
}
caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle);
if(titleIter==NULL) {
delete bi;
}
return *this;
caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, iter, ustrcase_internalToTitle);
return *this;
}
U_NAMESPACE_END

View File

@ -1083,6 +1083,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r,
pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char));
if(pathBuf == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
ures_close(mainRes);
return NULL;
}
}

View File

@ -23,46 +23,153 @@
#include "unicode/brkiter.h"
#include "unicode/casemap.h"
#include "unicode/chariter.h"
#include "unicode/localpointer.h"
#include "unicode/ubrk.h"
#include "unicode/ucasemap.h"
#include "unicode/utext.h"
#include "cmemory.h"
#include "uassert.h"
#include "ucase.h"
#include "ucasemap_imp.h"
U_NAMESPACE_USE
U_NAMESPACE_BEGIN
/* functions available in the common library (for unistr_case.cpp) */
/**
* Whole-string BreakIterator.
* Titlecasing only calls setText(), first(), and next().
* We implement the rest only to satisfy the abstract interface.
*/
class WholeStringBreakIterator : public BreakIterator {
public:
WholeStringBreakIterator() : BreakIterator(), length(0) {}
~WholeStringBreakIterator() override;
UBool operator==(const BreakIterator&) const override;
BreakIterator *clone() const override;
static UClassID U_EXPORT2 getStaticClassID();
UClassID getDynamicClassID() const override;
CharacterIterator &getText() const override;
UText *getUText(UText *fillIn, UErrorCode &errorCode) const override;
void setText(const UnicodeString &text) override;
void setText(UText *text, UErrorCode &errorCode) override;
void adoptText(CharacterIterator* it) override;
int32_t first() override;
int32_t last() override;
int32_t previous() override;
int32_t next() override;
int32_t current() const override;
int32_t following(int32_t offset) override;
int32_t preceding(int32_t offset) override;
UBool isBoundary(int32_t offset) override;
int32_t next(int32_t n) override;
BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize,
UErrorCode &errorCode) override;
BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) override;
/* public API functions */
private:
int32_t length;
};
U_CAPI int32_t U_EXPORT2
u_strToTitle(UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
UBreakIterator *titleIter,
const char *locale,
UErrorCode *pErrorCode) {
LocalPointer<BreakIterator> ownedIter;
BreakIterator *iter;
if(titleIter!=NULL) {
iter=reinterpret_cast<BreakIterator *>(titleIter);
} else {
iter=BreakIterator::createWordInstance(Locale(locale), *pErrorCode);
ownedIter.adoptInstead(iter);
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(WholeStringBreakIterator)
WholeStringBreakIterator::~WholeStringBreakIterator() {}
UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; }
BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; }
CharacterIterator &WholeStringBreakIterator::getText() const {
U_ASSERT(FALSE); // really should not be called
// Returns a null reference.
// Otherwise we would have to define a dummy CharacterIterator,
// and either have it as a field and const_cast it to a non-const reference,
// or have it via a pointer and return a reference to that.
CharacterIterator *none = nullptr;
return *none;
}
UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const {
if (U_SUCCESS(errorCode)) {
errorCode = U_UNSUPPORTED_ERROR;
}
if(U_FAILURE(*pErrorCode)) {
return 0;
}
UnicodeString s(srcLength<0, src, srcLength);
iter->setText(s);
return ustrcase_mapWithOverlap(
ustrcase_getCaseLocale(locale), 0, iter,
dest, destCapacity,
src, srcLength,
ustrcase_internalToTitle, *pErrorCode);
return nullptr;
}
U_NAMESPACE_BEGIN
void WholeStringBreakIterator::setText(const UnicodeString &text) {
length = text.length();
}
void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
int64_t length64 = utext_nativeLength(text);
if (length64 <= INT32_MAX) {
length = (int32_t)length64;
} else {
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
}
}
}
void WholeStringBreakIterator::adoptText(CharacterIterator* it) {
U_ASSERT(FALSE); // should not be called
length = it->getLength();
delete it;
}
int32_t WholeStringBreakIterator::first() { return 0; }
int32_t WholeStringBreakIterator::last() { return length; }
int32_t WholeStringBreakIterator::previous() { return 0; }
int32_t WholeStringBreakIterator::next() { return length; }
int32_t WholeStringBreakIterator::current() const { return 0; }
int32_t WholeStringBreakIterator::following(int32_t /*offset*/) { return length; }
int32_t WholeStringBreakIterator::preceding(int32_t /*offset*/) { return 0; }
UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; }
int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; }
BreakIterator *WholeStringBreakIterator::createBufferClone(
void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
errorCode = U_UNSUPPORTED_ERROR;
}
return nullptr;
}
BreakIterator &WholeStringBreakIterator::refreshInputText(
UText * /*input*/, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
errorCode = U_UNSUPPORTED_ERROR;
}
return *this;
}
U_CFUNC
BreakIterator *ustrcase_getTitleBreakIterator(
const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter,
LocalPointer<BreakIterator> &ownedIter, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return nullptr; }
options &= U_TITLECASE_ITERATOR_MASK;
if (options != 0 && iter != nullptr) {
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
return nullptr;
}
if (iter == nullptr) {
switch (options) {
case 0:
iter = BreakIterator::createWordInstance(
locale != nullptr ? *locale : Locale(locID), errorCode);
break;
case U_TITLECASE_WHOLE_STRING:
iter = new WholeStringBreakIterator();
if (iter == nullptr) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
}
break;
case U_TITLECASE_SENTENCES:
iter = BreakIterator::createSentenceInstance(
locale != nullptr ? *locale : Locale(locID), errorCode);
break;
default:
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
break;
}
ownedIter.adoptInstead(iter);
}
return iter;
}
int32_t CaseMap::toTitle(
const char *locale, uint32_t options, BreakIterator *iter,
@ -70,11 +177,8 @@ int32_t CaseMap::toTitle(
UChar *dest, int32_t destCapacity, Edits *edits,
UErrorCode &errorCode) {
LocalPointer<BreakIterator> ownedIter;
iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode);
if(iter==NULL) {
iter=BreakIterator::createWordInstance(Locale(locale), errorCode);
ownedIter.adoptInstead(iter);
}
if(U_FAILURE(errorCode)) {
return 0;
}
UnicodeString s(srcLength<0, src, srcLength);
@ -88,6 +192,30 @@ int32_t CaseMap::toTitle(
U_NAMESPACE_END
U_NAMESPACE_USE
U_CAPI int32_t U_EXPORT2
u_strToTitle(UChar *dest, int32_t destCapacity,
const UChar *src, int32_t srcLength,
UBreakIterator *titleIter,
const char *locale,
UErrorCode *pErrorCode) {
LocalPointer<BreakIterator> ownedIter;
BreakIterator *iter = ustrcase_getTitleBreakIterator(
nullptr, locale, 0, reinterpret_cast<BreakIterator *>(titleIter),
ownedIter, *pErrorCode);
if (iter == nullptr) {
return 0;
}
UnicodeString s(srcLength<0, src, srcLength);
iter->setText(s);
return ustrcase_mapWithOverlap(
ustrcase_getCaseLocale(locale), 0, iter,
dest, destCapacity,
src, srcLength,
ustrcase_internalToTitle, *pErrorCode);
}
U_CAPI int32_t U_EXPORT2
ucasemap_toTitle(UCaseMap *csm,
UChar *dest, int32_t destCapacity,
@ -97,10 +225,13 @@ ucasemap_toTitle(UCaseMap *csm,
return 0;
}
if (csm->iter == NULL) {
csm->iter = BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode);
}
if (U_FAILURE(*pErrorCode)) {
return 0;
LocalPointer<BreakIterator> ownedIter;
BreakIterator *iter = ustrcase_getTitleBreakIterator(
nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode);
if (iter == nullptr) {
return 0;
}
csm->iter = ownedIter.orphan();
}
UnicodeString s(srcLength<0, src, srcLength);
csm->iter->setText(s);

View File

@ -72,7 +72,7 @@ appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity,
/* (not) original code point */
if(edits!=NULL) {
edits->addUnchanged(cpLength);
if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) {
if(options & U_OMIT_UNCHANGED_TEXT) {
return destIndex;
}
}
@ -149,7 +149,7 @@ appendUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity,
if(length>0) {
if(edits!=NULL) {
edits->addUnchanged(length);
if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) {
if(options & U_OMIT_UNCHANGED_TEXT) {
return destIndex;
}
}
@ -237,7 +237,7 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it
const UChar *src, int32_t srcLength,
icu::Edits *edits,
UErrorCode &errorCode) {
if(U_FAILURE(errorCode)) {
if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) {
return 0;
}
@ -264,45 +264,38 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it
}
/*
* Unicode 4 & 5 section 3.13 Default Case Operations:
*
* R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
* #29, "Text Boundaries." Between each pair of word boundaries, find the first
* cased character F. If F exists, map F to default_title(F); then map each
* subsequent character C to default_lower(C).
*
* In this implementation, segment [prev..index[ into 3 parts:
* a) uncased characters (copy as-is) [prev..titleStart[
* b) first case letter (titlecase) [titleStart..titleLimit[
* Segment [prev..index[ into 3 parts:
* a) skipped characters (copy as-is) [prev..titleStart[
* b) first letter (titlecase) [titleStart..titleLimit[
* c) subsequent characters (lowercase) [titleLimit..index[
*/
if(prev<index) {
/* find and copy uncased characters [prev..titleStart[ */
// Find and copy skipped characters [prev..titleStart[
int32_t titleStart=prev;
int32_t titleLimit=prev;
UChar32 c;
U16_NEXT(src, titleLimit, index, c);
if((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(c)) {
/* Adjust the titlecasing index (titleStart) to the next cased character. */
for(;;) {
if ((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0) {
// Adjust the titlecasing index to the next cased character,
// or to the next letter/number/symbol/private use.
// Stop with titleStart<titleLimit<=index
// if there is a character to be titlecased,
// or else stop with titleStart==titleLimit==index.
UBool toCased = (options&U_TITLECASE_ADJUST_TO_CASED) != 0;
while (toCased ? UCASE_NONE==ucase_getType(c) : !ustrcase_isLNS(c)) {
titleStart=titleLimit;
if(titleLimit==index) {
/*
* only uncased characters in [prev..index[
* stop with titleStart==titleLimit==index
*/
break;
}
U16_NEXT(src, titleLimit, index, c);
if(UCASE_NONE!=ucase_getType(c)) {
break; /* cased letter at [titleStart..titleLimit[ */
}
}
destIndex=appendUnchanged(dest, destIndex, destCapacity,
src+prev, titleStart-prev, options, edits);
if(destIndex<0) {
errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
if (prev < titleStart) {
destIndex=appendUnchanged(dest, destIndex, destCapacity,
src+prev, titleStart-prev, options, edits);
if(destIndex<0) {
errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
}
}
}
@ -965,7 +958,7 @@ int32_t toUpper(uint32_t options,
edits->addUnchanged(oldLength);
}
// Write unchanged text?
change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0;
change = (options & U_OMIT_UNCHANGED_TEXT) == 0;
}
}

View File

@ -1015,8 +1015,8 @@ UTS46::checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) c
) {
info.isOkBiDi=FALSE;
}
// Get the directionalities of the intervening characters.
uint32_t mask=0;
// Add the directionalities of the intervening characters.
uint32_t mask=firstMask|lastMask;
while(i<labelLength) {
U16_NEXT_UNSAFE(label, i, c);
mask|=U_MASK(u_charDirection(c));
@ -1045,7 +1045,7 @@ UTS46::checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) c
// label. [...]
// The following rule, consisting of six conditions, applies to labels
// in BIDI domain names.
if(((firstMask|mask|lastMask)&R_AL_AN_MASK)!=0) {
if((mask&R_AL_AN_MASK)!=0) {
info.isBiDi=TRUE;
}
}

View File

@ -2040,7 +2040,7 @@ zh{
"<*㦀𢠃戧戨戩截戫戬搫搴搻搿摋摌摍摎摏摐摑摓摔摕摗摘摙摚摛摜摝摞摟摠摢摣摤摥摦摧摪摫摬摭摱摲摳摴摵摶摷摸摺摻摼摽摾摿撁撂撄撇㨯㨱㨲㨳㨴㨵㨶㨷㨸㨹𢲷𢳂𢳆𢳉𢴇𢴈𢴒摖撦敱敲敳斠斡斲𣂷旖旗暚暛暜暝暞暟暠暡暢暣暤暥暦暧暨㬍㬎㬏㬐𣉖𣉞𣉢朄朅朢㬺㬻榊榍榎榏榐榑榒榓榕榖榗榙榚"
"<*榛榜榝榞榟榠榡榢榣榤榥榦榧榨榩榪榫榬榭榮榯榰榱榲榳榴榵榶榷榸榹榺榻榼榽榾榿槀槁槂槃槄槅槆槇槈槉槊構槌槍槎槏槐槑槒槓槔槕槖槗様槙槚槛槜槝槞槟槠槡樮﨔㮼𣖻𣗍𣗎𣗏𣗳𣘀樃歉歊歋歌歍歰歴殝殞殟殠殡毃毄𣫺毾氲氳滎滌滫滬滭滮滯滰滱滲滳滴滵滶滷滸滹滺滻滼滽滾滿漁漂漃漄漅漆"
"<*漇漈漉漊漌漍漎漏漑漒演漕漖漗漘漙漚漛漜漝漞漟漠漡漢漣漤漥漧漨漩漪漫漬漭漮漯漰漱漲漳漴漵漶漷漸漹漺漻漼漾潀潂潃潄潅潆潇潈潉潊潋潌潍㴽㵆𣻗𣻷𣻸𣻹𣻺𣻻𣻼𣼵𣽁潎潳煕煛煹煻煼煽煾煿熀熁熂熃熄熅熆熇熈熉熊熋熌熍熎熏熐熑熒熓熔熕熖熗熘熙蒸㷧㷨𤌍𤌚𤌴𤍈爳爾牄牓牔㸢犒犓犔犕"
"<*犖犗獃獄獌獍獏獐獑獒獔獕瑠瑡瑢瑣瑤瑥瑦瑧瑨瑪瑫瑭瑮瑰瑱瑲瑳瑴瑵瑶瑷瑸㻧㻩𤧬𤧭𤧶𤧷𤧸𤧹𤧻𤨎𤨒𤨓甀甂甃甄甅甆𤭮甧畻畼畽疐疑瘇瘈瘉瘊瘋瘌瘍瘎瘑瘒瘓瘔瘕瘖瘗瘘瘧皶皷皸皹盠盡盢監睮睯睰睱睲睳睴睵睶睷睸睺睻睼睽睾睿瞀瞁瞂瞃瞄瞅瞆䁓𥈠𥈡硾碝碞碟碠碡碢碣碤碥碦碧碨碩碪碫"
"<*犖犗獃獄獌獍獏獐獑獒獔獕瑠瑡瑢瑣瑤瑥瑦瑧瑨瑪瑫瑭瑮瑰瑱瑲瑳瑴瑵瑶瑷瑸㻧㻩𤧬𤧭𤧶𤧷𤧸𤧹𤧻𤨎𤨒𤨓甀甂甃甄甅甆𤭮甧畻畼畽疐疑瘇瘈瘉瘊瘋瘌瘍瘎瘑瘒瘓瘔瘕瘖瘗瘘瘧皶皷皸皹盠盡盢監睮睯睰睱睲睳睴睵睶睷睸睺睻睼睽睾睿瞀瞁瞂瞃瞄瞅瞆䁓𥈠𥈡硾碝碞碟碠碡碢碣碤碥碦碧碨碩碪碫"
"<*碬碭碮碯碱碲碳碴碵碶碷碸碹磁䃈禇禈禉禊禋禌禍禎福禐禑禒禓禔禕禖禗禘禙稦稧稨稩稪稫稬稭種稯稰稱稲稳穊䅧稵窨窩窪窫窬窭𥧌竬竭端竰𥪜竮筵箁箂箃箄箅箆箇箈箉箊箋箌箍箎箏箐箑箒箓箔箕箖算箘箙箚箛箜箝箞箟箠管箢箣箤箥箦箧箨箩箪箫䈁䈂䈃䈄䈅䈆䈇䈈䈉䈊䈋䈌䈍𥮳𥮴𥯆箸粶粷粸"
"<*粹粺粻粼粽精粿糁𥺦𥺼綖緐綜綝綞綟綠綡綢綣綤綥綦綧綨綩綪綫綬維綮綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緑緒緔緕䋨䋩䋬䋭䋱𦁈𦁤缥缦缧缨缩缪缫罁罂罯罰罱罳罴羫翞翟翠翡翢翣翤𦑊翥耣耤耥聙聚聛聜聝聞聟聡聢聣䎺𦖠肇肈腐腿膀膁膂膃膄膅膆膇膈膉"
"<*膊膋膌膍膎膏膑䐠䐥䐦𦞙𦞳𦞴𦟌臧臺與舓舔舕舞艊艋艌艍𦩑𦩒䓝䓞䓟䓡䓤䓩䓪䓫䓬蒐蒑蒒蒓蒔蒕蒖蒗蒘蒙蒚蒛蒜蒝蒞蒟蒠蒡蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒯蒰蒱蒲蒳蒴蒵蒶蒷蒹蒺蒻蒼蒽蒾蒿蓀蓁蓂蓃蓄蓆蓇蓉蓊蓋蓌蓍蓎蓏蓐蓑蓒蓓蓔蓕蓖蓗蓘蓙蓚蓛蓜蓝蓟蓡蓢蓣蓤蓦𦵴𦶠𦶡𦶢𦶣𦶤𦶥𦶦𦶧𦶮𦷜"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -633,7 +633,12 @@ en{
Year{"{0} {1}"}
}
availableFormats{
Bh{"h B"}
Bhm{"h:mm B"}
Bhms{"h:mm:ss B"}
E{"ccc"}
EBhm{"E h:mm B"}
EBhms{"E h:mm:ss B"}
EHm{"E HH:mm"}
EHms{"E HH:mm:ss"}
Ed{"d E"}

View File

@ -966,7 +966,12 @@ root{
Year{"{1} {0}"}
}
availableFormats{
Bh{"h B"}
Bhm{"h:mm B"}
Bhms{"h:mm:ss B"}
E{"ccc"}
EBhm{"E h:mm B"}
EBhms{"E h:mm:ss B"}
EHm{"E HH:mm"}
EHms{"E HH:mm:ss"}
Ed{"d, E"}

View File

@ -1133,7 +1133,12 @@ zh{
Timezone{"{1}{0}"}
}
availableFormats{
Bh{"Bh时"}
Bhm{"Bh:mm"}
Bhms{"Bh:mm:ss"}
E{"ccc"}
EBhm{"EBh:mm"}
EBms{"EBh:mm:ss"}
EHm{"EHH:mm"}
EHms{"EHH:mm:ss"}
Ed{"d日E"}

View File

@ -12,10 +12,10 @@
##############################################################################
# Keep the following in sync with the version - see common/unicode/uvernum.h
U_ICUDATA_NAME=icudt59
U_ICUDATA_NAME=icudt60
##############################################################################
!IF "$(UWP)" == "UWP"
U_ICUDATA_NAME=icudt
U_ICUDATA_NAME=icudt60
!ENDIF
U_ICUDATA_ENDIAN_SUFFIX=l
UNICODE_VERSION=10.0

View File

@ -1,5 +1,5 @@
# Fractional UCA Table, generated from the UCA DUCET
# 2017-05-03
# 2017-06-05
# VERSION: UCA=10.0.0, UCD=10.0.0
# For a description of the format and usage, see
# http://www.unicode.org/reports/tr35/tr35-collation.html
@ -102,7 +102,7 @@
[radical 91=⽚片:片𤖨-𤖫版㸝㸞𤖬-𤖰𬌓𬌔𭷉牉牊𤖱-𤖹𭷊𭷋㸟-㸡𤖺-𤖿𪺢𤗀-𤗆𪺣𪺤𬌕𭷌牋-牍𤗇-𤗗𪺥牎-牒𤗘-𤗡牓牔㸢𤗢-𤗧牕-牗𤗨-𤗹𪺦㸣𤗺-𤗾𭷍㸤𤗿-𤘂𭷎牘𤘃㸥𤘄𬌖]
[radical 92=⽛牙:牙㸦𤘅𤘆𪺧𭷏𤘇𭷐㸧𤘈𤘉𬌗𭷑𤘊𤘋牚𤘌-𤘏𪺨𭷒𤘐𤘑𬌘𤘒𤘓]
[radical 93=⽜牛:牛牜𤘔𭷓牝-牟㸨𤘕-𤘗𬌙𭷔牠-牤㸩㸪𤘘-𤘛𪺩𬌚牥-牬㸫-㸯𤘜-𤘷𬌛𬌜𭷕-𭷙牭-牵㸰-㸴𤘸-𤙐𪺪𪺫𫞢𬌝𭷚-𭷝牶-牺㸵-㸸𤙑-𤙚𪺬-𪺮𬌞𬌟𭷞𭷟牻-牿犁㸹-㹀𤙛-𤙮𬌠𭷠-𭷣犀犂-犋㹁-㹃𤙯-𤚌𪺯𬌡𬌢𭷤-𭷬犌-犑㹅-㹈𤚍-𤚛𤚝-𤚨𤚿𪺰𬌣-𬌥𭷭犒-犗㹄㹉-㹋𤚩-𤚾𤛀-𤛉𪺱-𪺳𬌦𬌧𭷮𭷯犘-犛㹌-㹐𤛊-𤛖𤛘-𤛠𪺴𬌨𭷰-𭷳犜-犟㹑-㹓𤛡-𤛮𪺵𭷴𭷵犠㹔-㹖𤛯-𤛸㹗㹘𤛹𤛺犡-犦㹙𤛻-𤜁𭷶犧犨𤜂-𤜆㹚𤜇-𤜋𪺶犩㹛𤜌-𤜓𭷷犪𤜔-𤜘犫𤜙]
[radical 94=⽝犬:犬-犮𡗜𤜚𬌩犯犰𤜛-𤜠𭷸犱-犸𤜡-𤜮𬌪𬌫𭷹犹-狈㹜-㹠𤜯-𤝎𤝮𪺷𭷺-𭷾狉-狞㹡-㹪𤝏-𤝭𪺸𪺹𫞣𬌬𬌭𭷿-𭸃狟-狲㹫-㹰𤝯-𤞘𤞣𪺺𪺻𬌮-𬌱𭸄-𭸉狳-猃㹱-㹸𤞙-𤞢𤞤-𤟂𪺼𪺽𬌲-𬌴𭸊-𭸑猄-猡猪猫㹹-㺀𤟃-𤟛𪺾-𪻁𫞤𬌵-𬌷𭸒-𭸖猢-猩猬-猹獁㺁-㺆𤟜-𤟴𤟶-𤠌𪻂-𪻅𬌸-𬌼𭸗-𭸠猺-獀獂獃獅-獊㺇-㺍𤠍-𤠸𪻆𪻇𬌽-𬍀𭸡獄獌-獒獔獕㺎-㺓𤠹-𤡢𪻈𬍁-𬍅𭸢-𭸧獋獖-獤㺔-㺙𤡣-𤢋𪻉𬍆𬍇𭸨-𭸬獥-獭㺚-㺜𤢌-𤢥𬍈-𬍊𭸭獮-獴㺝-㺟𤢦-𤢳𪻊𬍋𭸮𭸯獵-獸㺠𤢴-𤣄𪻋𬍌𭸰𭸱獹-獻㺡㺢𤣅-𤣌𪻌獼獽㺣-㺦𤣍-𤣐𬍍𭸲獾獿𤣑-𤣖𭸳玀𤣗-𤣚玁-玃𤣛-𤣞㺧𤣟-𤣢𬍎𤣣𤣤𭸴]
[radical 94=⽝犬:犬-犮𡗜𤜚𬌩犯犰𤜛-𤜠𭷸犱-犸𤜡-𤜮𬌪𬌫𭷹犹-狈㹜-㹠𤜯-𤝎𤝮𪺷𭷺-𭷾狉-狞㹡-㹪𤝏-𤝭𪺸𪺹𫞣𬌬𬌭𭷿-𭸃狟-狲㹫-㹰𤝯-𤞘𤞣𪺺𪺻𬌮-𬌱𭸄-𭸉狳-猃㹱-㹸𤞙-𤞢𤞤-𤟂𪺼𪺽𬌲-𬌴𭸊-𭸑猄-猡猪猫㹹-㺀𤟃-𤟛𪺾-𪻁𫞤𬌵-𬌷𭸒-𭸖猢-猩猬-猹獁㺁-㺆𤟜-𤟴𤟶-𤠌𪻂-𪻅𬌸-𬌼𭸗-𭸠猺-獀獂獃獅-獊㺇-㺍𤠍-𤠸𪻆𪻇𬌽-𬍀𭸡獄獌-獕㺎-㺓𤠹-𤡢𪻈𬍁-𬍅𭸢-𭸧獋獖-獤㺔-㺙𤡣-𤢋𪻉𬍆𬍇𭸨-𭸬獥-獭㺚-㺜𤢌-𤢥𬍈-𬍊𭸭獮-獴㺝-㺟𤢦-𤢳𪻊𬍋𭸮𭸯獵-獸㺠𤢴-𤣄𪻋𬍌𭸰𭸱獹-獻㺡㺢𤣅-𤣌𪻌獼獽㺣-㺦𤣍-𤣐𬍍𭸲獾獿𤣑-𤣖𭸳玀𤣗-𤣚玁-玃𤣛-𤣞㺧𤣟-𤣢𬍎𤣣𤣤𭸴]
[radical 95=⽞玄:玄𤣥玅𤣦玆-玈𤣧𤣨𬍏]
[radical 96=⽟玉:玉王𤣩玊玌-玑㺨-㺫𤣪-𤣬𪻍𭸵玒-玛㺬-㺯𤣭-𤣸𬍐𬍑玜-玱㺰-㺶𤣹-𤤎𪻎-𪻔𫞥𬍒-𬍖𭸶-𭸻玲-珑㺷-㺾𤤏-𤤴𪻕𪻖𬍗-𬍝𭸼-𭹃珒-珲琉㺿-㻈𠴦𤤵-𤥕𪻗-𪻟𫞦𬍞-𬍤𭹄-𭹋珳-珶珸-琈琊-琓㻉-㻐𤥖-𤥺𪻠-𪻥𬍥-𬍩𭹌-𭹔珷琔-琝琟-琼㻑-㻜𤥻-𤦮𪻦-𪻲𫞧𬍪-𬍳𭹕-𭹢琞琽-瑟㻝-㻦𤦯-𤧩𪻳-𪼂𬍴-𬍺𭹣-𭹪瑠-瑸㻧-㻪𤧪-𤨓𪼃-𪼏𫞨𬍻-𬎄𭹫-𭹮瑹-璌璎璓㻫-㻴𤨔-𤨿𤩁𪼐-𪼖𫞩𬎅-𬎊𭹯-𭹵璍璏-璒璔-璡璣璤㻵-㻼𤩀𤩂-𤩪𪼗-𪼠𬎋-𬎒𭹶-𭹿璢璥-璴㻽-㼂𤩫-𤪊𪼡-𪼦𬎓-𬎖𭺀-𭺈璵-瓂𤪋-𤪨𤪴𪼧𪼨𬎗-𬎙𭺉-𭺌瓃-瓋㼃-㼆𤪩-𤪳𤪵-𤪽𪼩-𪼫𬎚𭺍-𭺐瓌-瓒㼇𤪾-𤫈𪼬-𪼯𬎛-𬎝𭺑瓓-瓖𤫉-𤫓𪼰𭺒𭺓瓗-瓙𤫔-𤫘𭺔-𭺖瓚㼈𤫙-𤫟𪼱瓛𤫠𪼲𬎞𤫣-𤫧𬎟𬎠𤫢𤫨𬎡𤫩]
[radical 97=⽠瓜:瓜瓝𤫪𪼳㼉㼊𤫫-𤫯𪼴𭺗瓞瓟㼋㼌𤫰-𤫴𬎢𬎣𭺘瓠㼍㼎𤫵-𤫹㼏𤫺-𤬀瓡𤬁-𤬆𪼵㼐-㼒𤬈-𤬌㼓㼔𤬇𤬍𤬐-𤬕瓢𤬎𤬏𤬖𭺙𤬗㼕𤬘-𤬚𭺚瓣𤬛-𤬝瓤𤬞-𤬡瓥𤬢㼖𤬣-𤬥]

View File

@ -1,5 +1,5 @@
# UCA_Rules_SHORT.txt
# Date: 2017-05-03, 21:57:09 GMT
# Date: 2017-06-05, 23:16:51 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html

View File

@ -12,6 +12,15 @@
* created by: Markus W. Scherer
*
* change log for Unicode updates
*
* For each new Unicode version, during the beta period,
* I copy the change log for the previous version to the top of this file.
* I adjust the versions, tickets, URLs, and paths.
* I work my way through the steps listed in the log, top to bottom,
* adjusting the log as necessary.
* I report problems to the UTC and/or CLDR and/or ICU.
* Before the data is final, I "turn the crank" several more times,
* using appropriate subsets of the steps.
---------------------------------------------------------------------------- ***
@ -51,11 +60,11 @@ http://www.unicode.org/reports/tr44/tr44-19.html
* Command-line environment setup
UNICODE_DATA=~/unidata/uni10/20170503
UNICODE_DATA=~/unidata/uni10/20170605
CLDR_SRC=~/svn.cldr/uni10
ICU_ROOT=~/svn.icu/uni10
ICU_SRC=$ICU_ROOT/src
ICUDT=icudt59b
ICUDT=icudt60b
ICU4C_DATA_IN=$ICU_SRC/icu4c/source/data/in
ICU4C_UNIDATA=$ICU_SRC/icu4c/source/data/unidata
export LD_LIBRARY_PATH=$ICU_ROOT/dbg/icu4c/lib
@ -329,17 +338,17 @@ set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/svn.icu/uni10/src/icu4c)
- $ICU_ROOT/dbg/icu4c$ make ICU4J_ROOT=/tmp/icu4j icu4j-data-install
output:
...
Unicode .icu files built to ./out/build/icudt59l
Unicode .icu files built to ./out/build/icudt60l
echo timestamp > uni-core-data
mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt59b
mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt59b
mkdir -p ./out/icu4j/com/ibm/icu/impl/data/icudt60b
mkdir -p ./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt60b
echo pnames.icu uprops.icu ucase.icu ubidi.icu nfc.nrm > ./out/icu4j/add.txt
LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt59l.dat ./out/icu4j/icudt59b.dat -a ./out/icu4j/add.txt -s ./out/build/icudt59l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt59b
mv ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt59b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt59b"
jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt59b/
LD_LIBRARY_PATH=../lib:../stubdata:../tools/ctestfw:$LD_LIBRARY_PATH ../bin/icupkg ./out/tmp/icudt60l.dat ./out/icu4j/icudt60b.dat -a ./out/icu4j/add.txt -s ./out/build/icudt60l -x '*' -tb -d ./out/icu4j/com/ibm/icu/impl/data/icudt60b
mv ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/zoneinfo64.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/metaZones.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/timezoneTypes.res" ./out/icu4j/"com/ibm/icu/impl/data/icudt60b/windowsZones.res" "./out/icu4j/tzdata/com/ibm/icu/impl/data/icudt60b"
jar cf ./out/icu4j/icudata.jar -C ./out/icu4j com/ibm/icu/impl/data/icudt60b/
mkdir -p /tmp/icu4j/main/shared/data
cp ./out/icu4j/icudata.jar /tmp/icu4j/main/shared/data
jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt59b/
jar cf ./out/icu4j/icutzdata.jar -C ./out/icu4j/tzdata com/ibm/icu/impl/data/icudt60b/
mkdir -p /tmp/icu4j/main/shared/data
cp ./out/icu4j/icutzdata.jar /tmp/icu4j/main/shared/data
make[1]: Leaving directory `/usr/local/google/home/mscherer/svn.icu/uni10/dbg/icu4c/data'
@ -373,7 +382,7 @@ or
cd $ICU_SRC/icu4c/source/data/unidata
cp confusables.txt confusablesWholeScript.txt NormalizationCorrections.txt NormalizationTest.txt SpecialCasing.txt UnicodeData.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
cd ../../test/testdata
cp BidiCharacterTest.txt BidiTest.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
cp BidiCharacterTest.txt BidiTest.txt IdnaTest.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
cp $UNICODE_DATA/ucd/CompositionExclusions.txt $ICU_SRC/icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode
* run & fix ICU4J tests

View File

@ -627,6 +627,7 @@ value;hst;NA;Not_Applicable
value;hst;T;Trailing_Jamo
value;hst;V;Vowel_Jamo
value;InPC;Bottom;Bottom
value;InPC;Bottom_And_Left;Bottom_And_Left
value;InPC;Bottom_And_Right;Bottom_And_Right
value;InPC;Left;Left
value;InPC;Left_And_Right;Left_And_Right
@ -3390,8 +3391,10 @@ cp;07EE;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=C
cp;07EF;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO COMBINING LONG HIGH TONE;SB=EX;WB=Extend;-XIDS
cp;07F0;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO COMBINING LONG LOW TONE;SB=EX;WB=Extend;-XIDS
cp;07F1;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO COMBINING LONG RISING TONE;SB=EX;WB=Extend;-XIDS
# Other diacritics
cp;07F2;-Alpha;bc=NSM;ccc=220;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO COMBINING NASALIZATION MARK;SB=EX;WB=Extend;-XIDS
cp;07F3;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;jt=T;lb=CM;na=NKO COMBINING DOUBLE DOT ABOVE;SB=EX;WB=Extend;-XIDS
# Tonal apostrophes
cp;07F4;CI;Dia;gc=Lm;jt=U;na=NKO HIGH TONE APOSTROPHE
cp;07F5;CI;Dia;gc=Lm;jt=U;na=NKO LOW TONE APOSTROPHE
# Symbol
@ -4713,7 +4716,7 @@ unassigned;0D50..0D53
cp;0D54;age=9.0;InSC=Consonant_Dead;na=MALAYALAM LETTER CHILLU M
cp;0D55;age=9.0;InSC=Consonant_Dead;na=MALAYALAM LETTER CHILLU Y
cp;0D56;age=9.0;InSC=Consonant_Dead;na=MALAYALAM LETTER CHILLU LLL
# Various signs
# Dependent vowel sign
cp;0D57;gc=Mc;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Right;InSC=Vowel_Dependent;lb=CM;na=MALAYALAM AU LENGTH MARK;NFC_QC=M;NFKC_QC=M;SB=EX;WB=Extend;-XIDS
# Minor fractions
cp;0D58;age=9.0;-Alpha;gc=No;-IDC;-IDS;InSC=Other;na=MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;nt=Nu;nv=1/160;SB=XX;WB=XX;-XIDC;-XIDS
@ -8041,14 +8044,14 @@ cp;1A54;IDS;na=TAI THAM LETTER GREAT SA;XIDS
# Consonant signs
cp;1A55;gc=Mc;GCB=SM;InPC=Left;InSC=Consonant_Medial;na=TAI THAM CONSONANT SIGN MEDIAL RA;SB=EX;WB=Extend
cp;1A56;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Medial;jt=T;na=TAI THAM CONSONANT SIGN MEDIAL LA;SB=EX;WB=Extend
cp;1A57;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Final;na=TAI THAM CONSONANT SIGN LA TANG LAI;SB=EX;WB=Extend
cp;1A57;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Subjoined;na=TAI THAM CONSONANT SIGN LA TANG LAI;SB=EX;WB=Extend
cp;1A58;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Consonant_Final;jt=T;na=TAI THAM SIGN MAI KANG LAI;SB=EX;WB=Extend
cp;1A59;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN FINAL NGA;SB=EX;WB=Extend
cp;1A5A;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN LOW PA;SB=EX;WB=Extend
cp;1A5B;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;SB=EX;WB=Extend
cp;1A5C;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN MA;SB=EX;WB=Extend
cp;1A5D;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN BA;SB=EX;WB=Extend
cp;1A5E;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Final;jt=T;na=TAI THAM CONSONANT SIGN SA;SB=EX;WB=Extend
cp;1A5A;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Consonant_Succeeding_Repha;jt=T;na=TAI THAM CONSONANT SIGN LOW PA;SB=EX;WB=Extend
cp;1A5B;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Subjoined;jt=T;na=TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;SB=EX;WB=Extend
cp;1A5C;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Subjoined;jt=T;na=TAI THAM CONSONANT SIGN MA;SB=EX;WB=Extend
cp;1A5D;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Subjoined;jt=T;na=TAI THAM CONSONANT SIGN BA;SB=EX;WB=Extend
cp;1A5E;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Bottom;InSC=Consonant_Subjoined;jt=T;na=TAI THAM CONSONANT SIGN SA;SB=EX;WB=Extend
unassigned;1A5F
# Sign
cp;1A60;-Alpha;bc=NSM;ccc=9;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;Gr_Link;InSC=Invisible_Stacker;jt=T;na=TAI THAM SIGN SAKOT;SB=EX;WB=Extend
@ -8072,7 +8075,7 @@ cp;1A70;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;na=TAI THAM VOWEL SIGN OO;SB
cp;1A71;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;na=TAI THAM VOWEL SIGN AI;SB=EX;WB=Extend
cp;1A72;gc=Mc;GCB=SM;InPC=Left;InSC=Vowel_Dependent;na=TAI THAM VOWEL SIGN THAM AI;SB=EX;WB=Extend
cp;1A73;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;na=TAI THAM VOWEL SIGN OA ABOVE;SB=EX;WB=Extend
cp;1A74;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=T;na=TAI THAM SIGN MAI KANG;SB=EX;WB=Extend
cp;1A74;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Bindu;jt=T;na=TAI THAM SIGN MAI KANG;SB=EX;WB=Extend
# Tone marks
cp;1A75;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Tone_Mark;jt=T;na=TAI THAM SIGN TONE-1;SB=EX;WB=Extend
cp;1A76;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Tone_Mark;jt=T;na=TAI THAM SIGN TONE-2;SB=EX;WB=Extend
@ -8080,7 +8083,7 @@ cp;1A77;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=
cp;1A78;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Tone_Mark;jt=T;na=TAI THAM SIGN KHUEN TONE-4;SB=EX;WB=Extend
cp;1A79;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Tone_Mark;jt=T;na=TAI THAM SIGN KHUEN TONE-5;SB=EX;WB=Extend
# Other marks
cp;1A7A;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Syllable_Modifier;jt=T;na=TAI THAM SIGN RA HAAM;SB=EX;WB=Extend
cp;1A7A;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Pure_Killer;jt=T;na=TAI THAM SIGN RA HAAM;SB=EX;WB=Extend
cp;1A7B;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Syllable_Modifier;jt=T;na=TAI THAM SIGN MAI SAM;SB=EX;WB=Extend
cp;1A7C;-Alpha;bc=NSM;ccc=230;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Syllable_Modifier;jt=T;na=TAI THAM SIGN KHUEN-LUE KARAN;SB=EX;WB=Extend
unassigned;1A7D..1A7E
@ -13872,13 +13875,15 @@ cp;302C;bc=NSM;ccc=232;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;IDC;jt=T;lb=CM;na=IDE
cp;302D;bc=NSM;ccc=222;CI;Dia;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;IDC;jt=T;lb=CM;na=IDEOGRAPHIC ENTERING TONE MARK;SB=EX;sc=Zinh;scx=Bopo Hani;WB=Extend;XIDC
cp;302E;bc=L;ccc=224;Dia;gc=Mc;GCB=EX;-Gr_Base;Gr_Ext;IDC;lb=CM;na=HANGUL SINGLE DOT TONE MARK;SB=EX;sc=Hang;scx=<script>;WB=Extend;XIDC
cp;302F;bc=L;ccc=224;Dia;gc=Mc;GCB=EX;-Gr_Base;Gr_Ext;IDC;lb=CM;na=HANGUL DOUBLE DOT TONE MARK;SB=EX;sc=Hang;scx=<script>;WB=Extend;XIDC
# Other CJK symbols
# Other CJK punctuation
cp;3030;Dash;Emoji;gc=Pd;na=WAVY DASH;Pat_Syn;SB=XX;scx=Bopo Hang Hani Hira Kana;vo=Tr
# Kana repeat marks
cp;3031;Alpha;bc=L;CI;Ext;gc=Lm;IDC;IDS;na=VERTICAL KANA REPEAT MARK;scx=Hira Kana;WB=KA;XIDC;XIDS
cp;3032;Alpha;bc=L;CI;Ext;gc=Lm;IDC;IDS;na=VERTICAL KANA REPEAT WITH VOICED SOUND MARK;scx=Hira Kana;WB=KA;XIDC;XIDS
cp;3033;Alpha;bc=L;CI;Ext;gc=Lm;IDC;IDS;na=VERTICAL KANA REPEAT MARK UPPER HALF;scx=Hira Kana;WB=KA;XIDC;XIDS
cp;3034;Alpha;bc=L;CI;Ext;gc=Lm;IDC;IDS;na=VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;scx=Hira Kana;WB=KA;XIDC;XIDS
cp;3035;Alpha;bc=L;CI;Ext;gc=Lm;IDC;IDS;lb=CM;na=VERTICAL KANA REPEAT MARK LOWER HALF;scx=Hira Kana;WB=KA;XIDC;XIDS
# Other CJK symbols
cp;3036;CWKCF;dm=3012;dt=Com;gc=So;na=CIRCLED POSTAL MARK;NFKC_CF=3012;NFKC_QC=N;NFKD_QC=N;SB=XX;scx=<script>
cp;3037;gc=So;na=IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;SB=XX;scx=Bopo Hang Hani Hira Kana
# Additional Suzhou numerals
@ -17577,7 +17582,7 @@ cp;A9BC;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;InPC=Top;InSC=Vowel_Dependent;jt=
# Dependent consonant signs
cp;A9BD;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Subjoined;lb=CM;na=JAVANESE CONSONANT SIGN KERET;SB=EX;WB=Extend
cp;A9BE;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Medial;lb=CM;na=JAVANESE CONSONANT SIGN PENGKAL;SB=EX;WB=Extend
cp;A9BF;gc=Mc;GCB=SM;InPC=Right;InSC=Consonant_Medial;lb=CM;na=JAVANESE CONSONANT SIGN CAKRA;SB=EX;WB=Extend
cp;A9BF;gc=Mc;GCB=SM;InPC=Bottom_And_Left;InSC=Consonant_Medial;lb=CM;na=JAVANESE CONSONANT SIGN CAKRA;SB=EX;WB=Extend
# Sign
cp;A9C0;-Alpha;ccc=9;Dia;gc=Mc;GCB=SM;Gr_Link;InPC=Bottom_And_Right;InSC=Virama;lb=CM;na=JAVANESE PANGKON;SB=EX;WB=Extend
# Punctuation
@ -24101,7 +24106,7 @@ block;11300..1137F;age=7.0;Alpha;blk=Grantha;gc=Lo;Gr_Base;IDC;IDS;InSC=Consonan
# 11300..1137F Grantha
# Various signs
cp;11300;age=8.0;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN COMBINING ANUSVARA ABOVE;SB=EX;WB=Extend;-XIDS
cp;11301;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN CANDRABINDU;SB=EX;WB=Extend;-XIDS
cp;11301;bc=NSM;CI;gc=Mn;GCB=EX;-Gr_Base;Gr_Ext;-IDS;InPC=Top;InSC=Bindu;jt=T;lb=CM;na=GRANTHA SIGN CANDRABINDU;SB=EX;scx=Gran Taml;WB=Extend;-XIDS
cp;11302;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Bindu;lb=CM;na=GRANTHA SIGN ANUSVARA;SB=EX;WB=Extend;-XIDS
cp;11303;gc=Mc;GCB=SM;-IDS;InPC=Right;InSC=Visarga;lb=CM;na=GRANTHA SIGN VISARGA;SB=EX;scx=Gran Taml;WB=Extend;-XIDS
unassigned;11304
@ -30531,6 +30536,7 @@ cp;1B1DA;na=NUSHU CHARACTER-1B1DA
cp;1B1DB;na=NUSHU CHARACTER-1B1DB
cp;1B1DC;na=NUSHU CHARACTER-1B1DC
cp;1B1DD;na=NUSHU CHARACTER-1B1DD
# Six-stroke characters
cp;1B1DE;na=NUSHU CHARACTER-1B1DE
cp;1B1DF;na=NUSHU CHARACTER-1B1DF
cp;1B1E0;na=NUSHU CHARACTER-1B1E0
@ -36322,6 +36328,7 @@ cp;1F9D5;Emoji_Modifier_Base;GCB=EB;lb=EB;na=PERSON WITH HEADSCARF;WB=EB
cp;1F9D6;Emoji_Modifier_Base;GCB=EB;lb=EB;na=PERSON IN STEAMY ROOM;WB=EB
cp;1F9D7;Emoji_Modifier_Base;GCB=EB;lb=EB;na=PERSON CLIMBING;WB=EB
cp;1F9D8;Emoji_Modifier_Base;GCB=EB;lb=EB;na=PERSON IN LOTUS POSITION;WB=EB
# Fantasy beings
cp;1F9D9;Emoji_Modifier_Base;GCB=EB;lb=EB;na=MAGE;WB=EB
cp;1F9DA;Emoji_Modifier_Base;GCB=EB;lb=EB;na=FAIRY;WB=EB
cp;1F9DB;Emoji_Modifier_Base;GCB=EB;lb=EB;na=VAMPIRE;WB=EB

View File

@ -134,15 +134,18 @@ U_NAMESPACE_BEGIN
// class DateTimePatternGenerator
// *****************************************************************************
static const UChar Canonical_Items[] = {
// GyQMwWEdDFHmsSv
CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, LOW_D, CAP_D, CAP_F,
// GyQMwWEDFdaHmsSv
CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E,
CAP_D, CAP_F, LOW_D, LOW_A, // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J
CAP_H, LOW_M, LOW_S, CAP_S, LOW_V, 0
};
static const dtTypeElem dtTypes[] = {
// patternChar, field, type, minLen, weight
{CAP_G, UDATPG_ERA_FIELD, DT_SHORT, 1, 3,},
{CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0},
{CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0},
{CAP_G, UDATPG_ERA_FIELD, DT_NARROW, 5, 0},
{LOW_Y, UDATPG_YEAR_FIELD, DT_NUMERIC, 1, 20},
{CAP_Y, UDATPG_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 20},
{LOW_U, UDATPG_YEAR_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 20},
@ -150,12 +153,16 @@ static const dtTypeElem dtTypes[] = {
{CAP_U, UDATPG_YEAR_FIELD, DT_SHORT, 1, 3},
{CAP_U, UDATPG_YEAR_FIELD, DT_LONG, 4, 0},
{CAP_U, UDATPG_YEAR_FIELD, DT_NARROW, 5, 0},
{CAP_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC, 1, 2},
{CAP_Q, UDATPG_QUARTER_FIELD, DT_SHORT, 3, 0},
{CAP_Q, UDATPG_QUARTER_FIELD, DT_LONG, 4, 0},
{CAP_Q, UDATPG_QUARTER_FIELD, DT_NARROW, 5, 0},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC + DT_DELTA, 1, 2},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT + DT_DELTA, 3, 0},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG + DT_DELTA, 4, 0},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT - DT_DELTA, 3, 0},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG - DT_DELTA, 4, 0},
{LOW_Q, UDATPG_QUARTER_FIELD, DT_NARROW - DT_DELTA, 5, 0},
{CAP_M, UDATPG_MONTH_FIELD, DT_NUMERIC, 1, 2},
{CAP_M, UDATPG_MONTH_FIELD, DT_SHORT, 3, 0},
{CAP_M, UDATPG_MONTH_FIELD, DT_LONG, 4, 0},
@ -165,32 +172,66 @@ static const dtTypeElem dtTypes[] = {
{CAP_L, UDATPG_MONTH_FIELD, DT_LONG - DT_DELTA, 4, 0},
{CAP_L, UDATPG_MONTH_FIELD, DT_NARROW - DT_DELTA, 5, 0},
{LOW_L, UDATPG_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 1},
{LOW_W, UDATPG_WEEK_OF_YEAR_FIELD, DT_NUMERIC, 1, 2},
{CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 0},
{CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC, 1, 0},
{CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORT, 1, 3},
{CAP_E, UDATPG_WEEKDAY_FIELD, DT_LONG, 4, 0},
{CAP_E, UDATPG_WEEKDAY_FIELD, DT_NARROW, 5, 0},
{CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER, 6, 0},
{LOW_C, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 2},
{LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORT - 2*DT_DELTA, 3, 0},
{LOW_C, UDATPG_WEEKDAY_FIELD, DT_LONG - 2*DT_DELTA, 4, 0},
{LOW_C, UDATPG_WEEKDAY_FIELD, DT_NARROW - 2*DT_DELTA, 5, 0},
{LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORTER - 2*DT_DELTA, 6, 0},
{LOW_E, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // LOW_E is currently not used in CLDR data, should not be canonical
{LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORT - DT_DELTA, 3, 0},
{LOW_E, UDATPG_WEEKDAY_FIELD, DT_LONG - DT_DELTA, 4, 0},
{LOW_E, UDATPG_WEEKDAY_FIELD, DT_NARROW - DT_DELTA, 5, 0},
{LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER - DT_DELTA, 6, 0},
{LOW_D, UDATPG_DAY_FIELD, DT_NUMERIC, 1, 2},
{CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 3},
{CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 0},
{LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + 3*DT_DELTA, 1, 20}, // really internal use, so we don't care
{LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 0},
{LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, // really internal use, so we don't care
{CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC, 1, 3},
{CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC, 1, 0},
{LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 3},
{LOW_A, UDATPG_DAYPERIOD_FIELD, DT_LONG, 4, 0},
{LOW_A, UDATPG_DAYPERIOD_FIELD, DT_NARROW, 5, 0},
{LOW_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - DT_DELTA, 1, 3},
{LOW_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - DT_DELTA, 4, 0},
{LOW_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - DT_DELTA, 5, 0},
// b needs to be closer to a than to B, so we make this 3*DT_DELTA
{CAP_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - 3*DT_DELTA, 1, 3},
{CAP_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - 3*DT_DELTA, 4, 0},
{CAP_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - 3*DT_DELTA, 5, 0},
{CAP_H, UDATPG_HOUR_FIELD, DT_NUMERIC + 10*DT_DELTA, 1, 2}, // 24 hour
{LOW_K, UDATPG_HOUR_FIELD, DT_NUMERIC + 11*DT_DELTA, 1, 2}, // 24 hour
{LOW_H, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12 hour
{CAP_K, UDATPG_HOUR_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // 12 hour
// The C code has had versions of the following 3, keep & update. Should not need these, but...
// Without these, certain tests using e.g. staticGetSkeleton fail because j/J in patterns
// get skipped instead of mapped to the right hour chars, for example in
// DateFormatTest::TestPatternFromSkeleton
// IntlTestDateTimePatternGeneratorAPI:: testStaticGetSkeleton
// DateIntervalFormatTest::testTicket11985
// Need to investigate better handling of jJC replacement e.g. in staticGetSkeleton.
{CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 5*DT_DELTA, 1, 2}, // 12/24 hour no AM/PM
{LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 6*DT_DELTA, 1, 6}, // 12/24 hour
{CAP_C, UDATPG_HOUR_FIELD, DT_NUMERIC + 7*DT_DELTA, 1, 6}, // 12/24 hour with preferred dayPeriods for 12
{LOW_M, UDATPG_MINUTE_FIELD, DT_NUMERIC, 1, 2},
{LOW_S, UDATPG_SECOND_FIELD, DT_NUMERIC, 1, 2},
{CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000},
{CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 1000},
{CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000},
{CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC, 1, 1000},
{LOW_V, UDATPG_ZONE_FIELD, DT_SHORT - 2*DT_DELTA, 1, 0},
{LOW_V, UDATPG_ZONE_FIELD, DT_LONG - 2*DT_DELTA, 4, 0},
{LOW_Z, UDATPG_ZONE_FIELD, DT_SHORT, 1, 3},
@ -202,24 +243,27 @@ static const dtTypeElem dtTypes[] = {
{CAP_O, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0},
{CAP_V, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 1, 0},
{CAP_V, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 2, 0},
{CAP_V, UDATPG_ZONE_FIELD, DT_LONG-1 - DT_DELTA, 3, 0},
{CAP_V, UDATPG_ZONE_FIELD, DT_LONG-2 - DT_DELTA, 4, 0},
{CAP_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0},
{CAP_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0},
{CAP_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0},
{LOW_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0},
{LOW_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0},
{LOW_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0},
{LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour
{CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour no AM/PM
{0, UDATPG_FIELD_COUNT, 0, 0, 0} , // last row of dtTypes[]
};
static const char* const CLDR_FIELD_APPEND[] = {
"Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", "Day", "*", "*", "*",
"Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week",
"*", "*", "Day", "*", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J
"Hour", "Minute", "Second", "*", "Timezone"
};
static const char* const CLDR_FIELD_NAME[] = {
"era", "year", "quarter", "month", "week", "*", "weekday", "*", "*", "day", "dayperiod",
"era", "year", "quarter", "month", "week", "weekOfMonth", "weekday",
"dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J
"hour", "minute", "second", "*", "zone"
};
@ -963,47 +1007,13 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate
int32_t timeMask=(1<<UDATPG_FIELD_COUNT) - 1 - dateMask;
// Replace hour metacharacters 'j', 'C' and 'J', set flags as necessary
UnicodeString patternFormCopy = UnicodeString(patternForm);
int32_t patPos, patLen = patternFormCopy.length();
UBool inQuoted = FALSE;
for (patPos = 0; patPos < patLen; patPos++) {
UChar patChr = patternFormCopy.charAt(patPos);
if (patChr == SINGLE_QUOTE) {
inQuoted = !inQuoted;
} else if (!inQuoted) {
if (patChr == LOW_J) {
patternFormCopy.setCharAt(patPos, fDefaultHourFormatChar);
} else if (patChr == CAP_C) {
AllowedHourFormat preferred;
if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) {
preferred = (AllowedHourFormat)fAllowedHourFormats[0];
} else {
status = U_INVALID_FORMAT_ERROR;
return UnicodeString();
}
if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) {
patternFormCopy.setCharAt(patPos, CAP_H);
} else {
patternFormCopy.setCharAt(patPos, LOW_H);
}
if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) {
flags |= kDTPGSkeletonUsesCapB;
} else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) {
flags |= kDTPGSkeletonUsesLowB;
}
} else if (patChr == CAP_J) {
// Get pattern for skeleton with H, then replace H or k
// with fDefaultHourFormatChar (if different)
patternFormCopy.setCharAt(patPos, CAP_H);
flags |= kDTPGSkeletonUsesCapJ;
}
}
UnicodeString patternFormMapped = mapSkeletonMetacharacters(patternForm, &flags, status);
if (U_FAILURE(status)) {
return UnicodeString();
}
resultPattern.remove();
dtMatcher->set(patternFormCopy, fp);
dtMatcher->set(patternFormMapped, fp);
const PtnSkeleton* specifiedSkeleton=NULL;
bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, &specifiedSkeleton);
if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) {
@ -1032,6 +1042,82 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate
return resultPattern;
}
/*
* Map a skeleton that may have metacharacters jJC to one without, by replacing
* the metacharacters with locale-appropriate fields of of h/H/k/K and of a/b/B
* (depends on fDefaultHourFormatChar and fAllowedHourFormats being set, which in
* turn depends on initData having been run). This method also updates the flags
* as necessary. Returns the updated skeleton.
*/
UnicodeString
DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status) {
UnicodeString patternFormMapped;
patternFormMapped.remove();
UBool inQuoted = FALSE;
int32_t patPos, patLen = patternForm.length();
for (patPos = 0; patPos < patLen; patPos++) {
UChar patChr = patternForm.charAt(patPos);
if (patChr == SINGLE_QUOTE) {
inQuoted = !inQuoted;
} else if (!inQuoted) {
// Handle special mappings for 'j' and 'C' in which fields lengths
// 1,3,5 => hour field length 1
// 2,4,6 => hour field length 2
// 1,2 => abbreviated dayPeriod (field length 1..3)
// 3,4 => long dayPeriod (field length 4)
// 5,6 => narrow dayPeriod (field length 5)
if (patChr == LOW_J || patChr == CAP_C) {
int32_t extraLen = 0; // 1 less than total field length
while (patPos+1 < patLen && patternForm.charAt(patPos+1)==patChr) {
extraLen++;
patPos++;
}
int32_t hourLen = 1 + (extraLen & 1);
int32_t dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1);
UChar hourChar = LOW_H;
UChar dayPeriodChar = LOW_A;
if (patChr == LOW_J) {
hourChar = fDefaultHourFormatChar;
} else {
AllowedHourFormat preferred;
if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) {
preferred = (AllowedHourFormat)fAllowedHourFormats[0];
} else {
status = U_INVALID_FORMAT_ERROR;
return UnicodeString();
}
if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) {
hourChar = CAP_H;
}
// in #13183 just add b/B to skeleton, no longer need to set special flags
if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) {
dayPeriodChar = CAP_B;
} else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) {
dayPeriodChar = LOW_B;
}
}
if (hourChar==CAP_H || hourChar==LOW_K) {
dayPeriodLen = 0;
}
while (dayPeriodLen-- > 0) {
patternFormMapped.append(dayPeriodChar);
}
while (hourLen-- > 0) {
patternFormMapped.append(hourChar);
}
} else if (patChr == CAP_J) {
// Get pattern for skeleton with H, then replace H or k
// with fDefaultHourFormatChar (if different)
patternFormMapped.append(CAP_H);
*flags |= kDTPGSkeletonUsesCapJ;
} else {
patternFormMapped.append(patChr);
}
}
}
return patternFormMapped;
}
UnicodeString
DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern,
const UnicodeString& skeleton,
@ -1299,17 +1385,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern,
const dtTypeElem *row = &dtTypes[canonicalIndex];
int32_t typeValue = row->field;
// Handle special day periods.
if (typeValue == UDATPG_DAYPERIOD_FIELD && flags != 0) {
UChar c = NONE; // '0'
if (flags & kDTPGSkeletonUsesCapB) { c = CAP_B; }
if (flags & kDTPGSkeletonUsesLowB) { c = LOW_B; }
if (c != NONE) {
for (int32_t i = 0; i < field.length(); ++i)
field.setCharAt(i, c);
}
}
// handle day periods - with #13183, no longer need special handling here, integrated with normal types
if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) {
field += decimal;
@ -1841,12 +1917,14 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton
for (i=0; i<UDATPG_FIELD_COUNT; ++i) {
skeletonResult.type[i] = NONE;
}
skeletonResult.original.clear();
skeletonResult.baseOriginal.clear();
skeletonResult.addedDefaultDayPeriod = FALSE;
fp->set(pattern);
for (i=0; i < fp->itemNumber; i++) {
const UnicodeString& value = fp->items[i];
if ( value.charAt(0) == LOW_A ) {
continue; // skip 'a'
}
// don't skip 'a' anymore, dayPeriod handled specially below
if ( fp->isQuoteLiteral(value) ) {
UnicodeString quoteLiteral;
@ -1861,7 +1939,7 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton
int32_t field = row->field;
skeletonResult.original.populate(field, value);
UChar repeatChar = row->patternChar;
int32_t repeatCount = row->minLen; // #7930 removes cap at 3
int32_t repeatCount = row->minLen;
skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount);
int16_t subField = row->type;
if ( row->type > 0) {
@ -1869,6 +1947,30 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton
}
skeletonResult.type[field] = subField;
}
// #13183, handle special behavior for day period characters (a, b, B)
if (!skeletonResult.original.isFieldEmpty(UDATPG_HOUR_FIELD)) {
if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) {
// We have a skeleton with 12-hour-cycle format
if (skeletonResult.original.isFieldEmpty(UDATPG_DAYPERIOD_FIELD)) {
// But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a")
for (i = 0; dtTypes[i].patternChar != 0; i++) {
if ( dtTypes[i].field == UDATPG_DAYPERIOD_FIELD ) {
// first entry for UDATPG_DAYPERIOD_FIELD
skeletonResult.original.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
skeletonResult.baseOriginal.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen);
skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = dtTypes[i].type;
skeletonResult.addedDefaultDayPeriod = TRUE;
break;
}
}
}
} else {
// Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it)
skeletonResult.original.clearField(UDATPG_DAYPERIOD_FIELD);
skeletonResult.baseOriginal.clearField(UDATPG_DAYPERIOD_FIELD);
skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = NONE;
}
}
copyFrom(skeletonResult);
}
@ -2290,13 +2392,27 @@ PtnSkeleton::equals(const PtnSkeleton& other) const {
UnicodeString
PtnSkeleton::getSkeleton() const {
UnicodeString result;
return original.appendTo(result);
result = original.appendTo(result);
int32_t pos;
if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) {
// for backward compatibility: if DateTimeMatcher.set added a single 'a' that
// was not in the provided skeleton, remove it here before returning skeleton.
result.remove(pos, 1);
}
return result;
}
UnicodeString
PtnSkeleton::getBaseSkeleton() const {
UnicodeString result;
return baseOriginal.appendTo(result);
result = baseOriginal.appendTo(result);
int32_t pos;
if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) {
// for backward compatibility: if DateTimeMatcher.set added a single 'a' that
// was not in the provided skeleton, remove it here before returning skeleton.
result.remove(pos, 1);
}
return result;
}
UChar

View File

@ -92,10 +92,11 @@
#define LOW_X ((UChar)0x0078)
#define LOW_Y ((UChar)0x0079)
#define LOW_Z ((UChar)0x007A)
#define DT_SHORT -0x102
#define DT_LONG -0x103
#define DT_NUMERIC 0x100
#define DT_NARROW -0x101
#define DT_SHORTER -0x102
#define DT_SHORT -0x103
#define DT_LONG -0x104
#define DT_NUMERIC 0x100
#define DT_DELTA 0x10
U_NAMESPACE_BEGIN
@ -155,6 +156,7 @@ public:
int32_t type[UDATPG_FIELD_COUNT];
SkeletonFields original;
SkeletonFields baseOriginal;
UBool addedDefaultDayPeriod;
PtnSkeleton();
PtnSkeleton(const PtnSkeleton& other);

View File

@ -113,7 +113,7 @@
<AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuin59.dll</OutputFile>
<OutputFile>..\..\bin\icuin60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib\icuin.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -158,7 +158,7 @@
<AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuin59d.dll</OutputFile>
<OutputFile>..\..\bin\icuin60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib\icuind.pdb</ProgramDatabaseFile>
@ -200,7 +200,7 @@
<AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuin59.dll</OutputFile>
<OutputFile>..\..\bin64\icuin60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib64\icuin.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -243,7 +243,7 @@
<AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuin59d.dll</OutputFile>
<OutputFile>..\..\bin64\icuin60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib64\icuind.pdb</ProgramDatabaseFile>

View File

@ -24,6 +24,7 @@
#include "nfrlist.h"
#include "patternprops.h"
#include "putilimp.h"
#include "uassert.h"
#ifdef RBNF_DEBUG
#include "cmemory.h"
@ -836,11 +837,18 @@ int64_t util64_pow(int32_t base, uint16_t exponent) {
}
int64_t result = 1;
int64_t pow = base;
while (exponent > 0) {
if ((exponent & 1) == 1) {
UBool safe = TRUE;
while (exponent > 0) {
U_ASSERT(safe);
if ((exponent & 1) == 1) {
result *= pow;
}
pow *= pow;
if (pow >= 0x100000000L) {
// The next step will push us out of bounds
safe = FALSE;
} else {
pow *= pow;
}
exponent >>= 1;
}
return result;

View File

@ -316,13 +316,33 @@ public:
private:
void inc(void) { ++p; ch = 0xffff; }
UBool checkInc(UChar c) { if (p < e && (ch == c || *p == c)) { inc(); return TRUE; } return FALSE; }
UBool check(UChar c) { return p < e && (ch == c || *p == c); }
void skipWhitespace(void) { while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) inc();}
UBool inList(UChar c, const UChar* list) const {
if (*list == SPACE && PatternProps::isWhiteSpace(c)) return TRUE;
while (*list && *list != c) ++list; return *list == c;
inline void inc(void) {
++p;
ch = 0xffff;
}
inline UBool checkInc(UChar c) {
if (p < e && (ch == c || *p == c)) {
inc();
return TRUE;
}
return FALSE;
}
inline UBool check(UChar c) {
return p < e && (ch == c || *p == c);
}
inline void skipWhitespace(void) {
while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) {
inc();
}
}
inline UBool inList(UChar c, const UChar* list) const {
if (*list == SPACE && PatternProps::isWhiteSpace(c)) {
return TRUE;
}
while (*list && *list != c) {
++list;
}
return *list == c;
}
void parseError(const char* msg);

View File

@ -206,11 +206,11 @@ public:
* @return conflicting status. The value could be UDATPG_NO_CONFLICT,
* UDATPG_BASE_CONFLICT or UDATPG_CONFLICT.
* @stable ICU 3.8
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample
* <p>
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample
* <p>
*/
UDateTimePatternConflict addPattern(const UnicodeString& pattern,
UBool override,
@ -312,11 +312,11 @@ public:
* @return bestPattern
* The best pattern found from the given skeleton.
* @stable ICU 3.8
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample
* <p>
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample
* <p>
*/
UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status);
@ -360,11 +360,11 @@ public:
* which must not indicate a failure before the function call.
* @return pattern adjusted to match the skeleton fields widths and subtypes.
* @stable ICU 3.8
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample
* <p>
* <p>
* <h4>Sample code</h4>
* \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1
* \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample
* <p>
*/
UnicodeString replaceFieldTypes(const UnicodeString& pattern,
const UnicodeString& skeleton,
@ -526,9 +526,8 @@ private:
enum {
kDTPGNoFlags = 0,
kDTPGFixFractionalSeconds = 1,
kDTPGSkeletonUsesCapJ = 2,
kDTPGSkeletonUsesLowB = 3,
kDTPGSkeletonUsesCapB = 4
kDTPGSkeletonUsesCapJ = 2
// with #13183, no longer need flags for b, B
};
void initData(const Locale &locale, UErrorCode &status);
@ -546,6 +545,7 @@ private:
UDateTimePatternField getAppendNameNumber(const char* field) const;
UnicodeString& getMutableAppendItemName(UDateTimePatternField field);
void getAppendName(UDateTimePatternField field, UnicodeString& value);
UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status);
int32_t getCanonicalIndex(const UnicodeString& field);
const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, const PtnSkeleton** specifiedSkeletonPtr = 0);
UnicodeString adjustFieldTypes(const UnicodeString& pattern, const PtnSkeleton* specifiedSkeleton, int32_t flags, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS);

View File

@ -1747,26 +1747,16 @@ VTimeZone::write(VTZWriter& writer, UErrorCode& status) const {
}
}
} else {
UVector *customProps = NULL;
UnicodeString icutzprop;
UVector customProps(nullptr, uhash_compareUnicodeString, status);
if (olsonzid.length() > 0 && icutzver.length() > 0) {
customProps = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status);
if (U_FAILURE(status)) {
return;
}
UnicodeString *icutzprop = new UnicodeString(ICU_TZINFO_PROP);
icutzprop->append(olsonzid);
icutzprop->append((UChar)0x005B/*'['*/);
icutzprop->append(icutzver);
icutzprop->append((UChar)0x005D/*']'*/);
customProps->addElement(icutzprop, status);
if (U_FAILURE(status)) {
delete icutzprop;
delete customProps;
return;
}
icutzprop.append(olsonzid);
icutzprop.append(u'[');
icutzprop.append(icutzver);
icutzprop.append(u']');
customProps.addElement(&icutzprop, status);
}
writeZone(writer, *tz, customProps, status);
delete customProps;
writeZone(writer, *tz, &customProps, status);
}
}

View File

@ -113,7 +113,7 @@
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuio59.dll</OutputFile>
<OutputFile>..\..\bin\icuio60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib\icuio.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -158,7 +158,7 @@
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\icuio59d.dll</OutputFile>
<OutputFile>..\..\bin\icuio60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib\icuiod.pdb</ProgramDatabaseFile>
@ -200,7 +200,7 @@
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuio59.dll</OutputFile>
<OutputFile>..\..\bin64\icuio60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib64\icuio.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -243,7 +243,7 @@
<AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\icuio59d.dll</OutputFile>
<OutputFile>..\..\bin64\icuio60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib64\icuiod.pdb</ProgramDatabaseFile>

View File

@ -112,7 +112,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\iculx59.dll</OutputFile>
<OutputFile>..\..\bin\iculx60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib\iculx.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -156,7 +156,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin\iculx59d.dll</OutputFile>
<OutputFile>..\..\bin\iculx60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib\iculxd.pdb</ProgramDatabaseFile>
@ -197,7 +197,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\iculx59.dll</OutputFile>
<OutputFile>..\..\bin64\iculx60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\lib64\iculx.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -239,7 +239,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\bin64\iculx59d.dll</OutputFile>
<OutputFile>..\..\bin64\iculx60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\lib64\iculxd.pdb</ProgramDatabaseFile>

View File

@ -118,7 +118,7 @@
<Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
</PreLinkEvent>
<Link>
<OutputFile>..\..\bin\icudt59.dll</OutputFile>
<OutputFile>..\..\bin\icudt60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<ProgramDatabaseFile>.\x86\Release\icudt.pdb</ProgramDatabaseFile>
@ -165,7 +165,7 @@
<Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
</PreLinkEvent>
<Link>
<OutputFile>..\..\bin\icudt59.dll</OutputFile>
<OutputFile>..\..\bin\icudt60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x86\Debug/icudt.pdb</ProgramDatabaseFile>
<NoEntryPoint>true</NoEntryPoint>
@ -212,7 +212,7 @@
<Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
</PreLinkEvent>
<Link>
<OutputFile>..\..\bin64\icudt59.dll</OutputFile>
<OutputFile>..\..\bin64\icudt60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<ProgramDatabaseFile>.\x64\Release\icudt.pdb</ProgramDatabaseFile>
@ -257,7 +257,7 @@
<Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
</PreLinkEvent>
<Link>
<OutputFile>..\..\bin64\icudt59.dll</OutputFile>
<OutputFile>..\..\bin64\icudt60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\x64\Debug/icudt.pdb</ProgramDatabaseFile>
<NoEntryPoint>true</NoEntryPoint>

View File

@ -35,6 +35,7 @@ void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool e
TESTCASE(2, testAllFieldPatterns);
TESTCASE(3, testStaticGetSkeleton);
TESTCASE(4, testC);
TESTCASE(5, testSkeletonsWithDayPeriods);
default: name = ""; break;
}
}
@ -355,6 +356,16 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
UnicodeString("MMMMMd"),
};
const char* testGetSkeletonAndBase[][3] = {
// pattern skeleton baseSkeleton
{ "dd-MMM", "MMMdd", "MMMd" },
{ "dd/MMMM/yy", "yyMMMMdd", "yMMMMd" },
{ "h", "h", "h" },
{ "ah", "ah", "ah" },
{ "aaaah", "aaaah", "aaaah" },
{ "Bh", "Bh", "Bh" }
};
UnicodeString newDecimal(" "); // space
UnicodeString newAppendItemName("hrs.");
UnicodeString newAppendItemFormat("{1} {0}");
@ -510,34 +521,25 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
}
// ======== Test getSkeleton and getBaseSkeleton
status = U_ZERO_ERROR;
pattern = UnicodeString("dd-MMM");
UnicodeString expectedSkeleton = UnicodeString("MMMdd");
UnicodeString expectedBaseSkeleton = UnicodeString("MMMd");
UnicodeString retSkeleton = gen->getSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
errln("ERROR: Unexpected result from getSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
}
retSkeleton = gen->getBaseSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedBaseSkeleton) {
errln("ERROR: Unexpected result from getBaseSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
int32_t i, count = UPRV_LENGTHOF(testGetSkeletonAndBase);
for (i = 0; i < count; i++) {
status = U_ZERO_ERROR;
pattern = UnicodeString(testGetSkeletonAndBase[i][0]);
UnicodeString expectedSkeleton = UnicodeString(testGetSkeletonAndBase[i][1]);
UnicodeString expectedBaseSkeleton = UnicodeString(testGetSkeletonAndBase[i][2]);
UnicodeString retSkeleton = gen->getSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
errln("ERROR: Unexpected result from getSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
}
retSkeleton = gen->getBaseSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedBaseSkeleton) {
errln("ERROR: Unexpected result from getBaseSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
}
}
pattern = UnicodeString("dd/MMMM/yy");
expectedSkeleton = UnicodeString("yyMMMMdd");
expectedBaseSkeleton = UnicodeString("yMMMMd");
retSkeleton = gen->getSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
errln("ERROR: Unexpected result from getSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
}
retSkeleton = gen->getBaseSkeleton(pattern, status);
if(U_FAILURE(status) || retSkeleton != expectedBaseSkeleton) {
errln("ERROR: Unexpected result from getBaseSkeleton().\n");
errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
}
delete format;
delete zone;
delete gen;
@ -710,7 +712,6 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
return;
}
UChar newChar;
int32_t i;
for (i=0; i<10; ++i) {
UnicodeString randomSkeleton;
int32_t len = rand() % 20;
@ -770,7 +771,7 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
}
UnicodeString returnPattern, *ptrSkeleton;
ptrSkeletonEnum->reset(status);
int32_t count=ptrSkeletonEnum->count(status);
count=ptrSkeletonEnum->count(status);
for (i=0; i<count; ++i) {
ptrSkeleton = (UnicodeString *)ptrSkeletonEnum->snext(status);
returnPattern = test->getPatternForSkeleton(*ptrSkeleton);
@ -976,13 +977,17 @@ void IntlTestDateTimePatternGeneratorAPI::testAllFieldPatterns(/*char *par*/)
{ 'e', {1,2,3,4,5,6}, "Eec" }, // local day of week
{ 'c', {1,2,3,4,5,6}, "Eec" }, // standalone local day of week
// day period
// { 'a', {1,0}, "a" }, // am or pm // not clear this one is supposed to work (it doesn't)
{ 'a', {1,2,3,4,5,0}, "a" }, // am or pm
{ 'b', {1,2,3,4,5,0}, "b" }, // dayPeriod AM/PM/noon
{ 'B', {1,2,3,4,5,0}, "B" }, // dayPeriod ranges
// hour
{ 'h', {1,2,0}, "hK" }, // 12 (1-12)
{ 'H', {1,2,0}, "Hk" }, // 24 (0-23)
{ 'K', {1,2,0}, "hK" }, // 12 (0-11)
{ 'k', {1,2,0}, "Hk" }, // 24 (1-24)
{ 'j', {1,2,0}, "hHKk" }, // locale default
{ 'J', {1,2,0}, "hHKk" }, // locale default, without any dayPeriod
{ 'C', {1,2,0}, "hHKk" }, // locale allowed first entry, possibly with b or B
// minute
{ 'm', {1,2,0}, "m" }, // x
// second & fractions
@ -1084,25 +1089,39 @@ void IntlTestDateTimePatternGeneratorAPI::testStaticGetSkeleton(/*char *par*/)
}
void IntlTestDateTimePatternGeneratorAPI::testC() {
UErrorCode status = U_ZERO_ERROR;
const int32_t numLocales = 6;
const char* tests[numLocales][3] = {
{"zh", "Cm", "Bh:mm"},
{"de", "Cm", "HH:mm"},
{"en", "Cm", "h:mm a"},
{"en-BN", "Cm", "h:mm b"},
{"gu-IN", "Cm", "h:mm B"},
{"und-IN", "Cm", "h:mm a"},
const char* tests[][3] = {
// These may change with actual data for Bhmm/bhmm skeletons
{"zh", "Cm", "Bh:mm"},
{"zh", "CCm", "Bhh:mm"},
{"zh", "CCCm", "BBBBh:mm"},
{"zh", "CCCCm", "BBBBhh:mm"},
{"zh", "CCCCCm", "BBBBBh:mm"},
{"zh", "CCCCCCm", "BBBBBhh:mm"},
{"de", "Cm", "HH:mm"},
{"de", "CCm", "HH:mm"},
{"de", "CCCm", "HH:mm"},
{"de", "CCCCm", "HH:mm"},
{"en", "Cm", "h:mm a"},
{"en", "CCm", "hh:mm a"},
{"en", "CCCm", "h:mm aaaa"},
{"en", "CCCCm", "hh:mm aaaa"},
{"en", "CCCCCm", "h:mm aaaaa"},
{"en", "CCCCCCm", "hh:mm aaaaa"},
{"en-BN", "Cm", "h:mm b"},
{"gu-IN", "Cm", "h:mm B"},
{"und-IN", "Cm", "h:mm a"}
};
for (int32_t i = 0; i < numLocales; ++i) {
UErrorCode status = U_ZERO_ERROR;
int32_t numTests = UPRV_LENGTHOF(tests);
for (int32_t i = 0; i < numTests; ++i) {
DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(Locale(tests[i][0]), status);
if (gen == NULL) {
dataerrln("FAIL: DateTimePatternGenerator::createInstance failed for %s", tests[i][0]);
return;
}
UnicodeString pattern = gen->getBestPattern(tests[i][1], status);
UDateTimePatternMatchOptions options = UDATPG_MATCH_HOUR_FIELD_LENGTH;
UnicodeString pattern = gen->getBestPattern(tests[i][1], options, status);
UnicodeString expectedPattern = tests[i][2];
char message[100] = "\0";
@ -1114,4 +1133,81 @@ void IntlTestDateTimePatternGeneratorAPI::testC() {
}
}
enum { kCharBufMax = 31 };
void IntlTestDateTimePatternGeneratorAPI::testSkeletonsWithDayPeriods() {
const char * patterns[] = {
// since icu4c getEmptyInstance does not call addCanonicalItems (unlike J), set these here:
"a", // should get internal skeleton a
"H", // should get internalskeleton H
"m", // should get internalskeleton m
"s", // should get internalskeleton s
// patterns from which to construct sample data for a locale
//"H", // should get internalskeleton H
"h a", // should get internalskeleton ah
"B h", // should get internalskeleton Bh
};
const char* testItems[][2] = {
// sample requested skeletons and results
// skel pattern
{ "H", "H"},
{ "HH", "HH"},
{ "aH", "H"},
{ "aHH", "HH"},
{ "BH", "H"},
{ "BHH", "HH"},
{ "BBBBH", "H"},
{ "h", "h a"},
{ "hh", "hh a"},
{ "ah", "h a"},
{ "ahh", "hh a"},
{ "aaaah", "h aaaa"},
{ "aaaahh", "hh aaaa"},
{ "bh", "h b"},
{ "bhh", "hh b"},
{ "bbbbh", "h bbbb"},
{ "Bh", "B h"},
{ "Bhh", "B hh"},
{ "BBBBh", "BBBB h"},
{ "BBBBhh", "BBBB hh"},
{ "a", "a"},
{ "aaaaa", "aaaaa"},
{ "b", "b"},
{ "bbbb", "bbbb"},
{ "B", "B"},
{ "BBBB", "BBBB"},
};
UErrorCode status = U_ZERO_ERROR;
DateTimePatternGenerator *gen = DateTimePatternGenerator::createEmptyInstance(status);
if (U_FAILURE(status)) {
errln("ERROR: createEmptyInstance fails, status: %s", u_errorName(status));
} else {
int32_t i, len = UPRV_LENGTHOF(patterns);
for (i = 0; i < len; i++) {
UnicodeString conflictingPattern;
(void)gen->addPattern(UnicodeString(patterns[i]), TRUE, conflictingPattern, status);
if (U_FAILURE(status)) {
errln("ERROR: addPattern %s fail, status: %s", patterns[i], u_errorName(status));
break;
}
}
if (U_SUCCESS(status)) {
len = UPRV_LENGTHOF(testItems);
for (i = 0; i < len; i++) {
status = U_ZERO_ERROR;
UDateTimePatternMatchOptions options = UDATPG_MATCH_HOUR_FIELD_LENGTH;
UnicodeString result = gen->getBestPattern(UnicodeString(testItems[i][0]), options, status);
if (U_FAILURE(status)) {
errln("ERROR: getBestPattern %s fail, status: %s", testItems[i][0], u_errorName(status));
} else if (result != UnicodeString(testItems[i][1])) {
char charResult[kCharBufMax+1];
result.extract(0, result.length(), charResult, kCharBufMax);
charResult[kCharBufMax] = 0; // ensure termination
errln("ERROR: getBestPattern %s, expected %s, got %s", testItems[i][0], testItems[i][1], charResult);
}
}
}
}
delete gen;
}
#endif /* #if !UCONFIG_NO_FORMATTING */

View File

@ -30,6 +30,7 @@ private:
void testAllFieldPatterns(/* char* par */);
void testStaticGetSkeleton(/* char* par */);
void testC();
void testSkeletonsWithDayPeriods();
};
#endif /* #if !UCONFIG_NO_FORMATTING */

View File

@ -284,7 +284,6 @@ public:
virtual void setProperty(const char* propline);
virtual const char* getProperty(const char* prop);
protected:
/* JUnit-like assertions. Each returns TRUE if it succeeds. */
UBool assertTrue(const char* message, UBool condition, UBool quiet=FALSE, UBool possibleDataError=FALSE, const char *file=NULL, int line=0);
UBool assertFalse(const char* message, UBool condition, UBool quiet=FALSE);

View File

@ -11,7 +11,11 @@
#if !UCONFIG_NO_NORMALIZATION
#include <string>
#include "unicode/bytestream.h"
#include "unicode/edits.h"
#include "unicode/uchar.h"
#include "unicode/normalizer2.h"
#include "unicode/normlzr.h"
#include "unicode/uniset.h"
#include "unicode/putil.h"
@ -19,32 +23,28 @@
#include "cstring.h"
#include "filestrm.h"
#include "normconf.h"
#include "uassert.h"
#include <stdio.h>
#define CASE(id,test,exec) case id: \
name = #test; \
if (exec) { \
logln(#test "---"); \
logln((UnicodeString)""); \
test(); \
} \
break
void NormalizerConformanceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) {
switch (index) {
CASE(0, TestConformance, exec);
#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
CASE(1, TestConformance32, exec);
#endif
// CASE(2, TestCase6);
default: name = ""; break;
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestConformance);
TESTCASE_AUTO(TestConformance32);
TESTCASE_AUTO(TestCase6);
TESTCASE_AUTO_END;
}
#define FIELD_COUNT 5
NormalizerConformanceTest::NormalizerConformanceTest() :
normalizer(UnicodeString(), UNORM_NFC) {}
normalizer(UnicodeString(), UNORM_NFC) {
UErrorCode errorCode = U_ZERO_ERROR;
nfc = Normalizer2::getNFCInstance(errorCode);
nfd = Normalizer2::getNFDInstance(errorCode);
nfkc = Normalizer2::getNFKCInstance(errorCode);
nfkd = Normalizer2::getNFKDInstance(errorCode);
U_ASSERT(U_SUCCESS(errorCode));
}
NormalizerConformanceTest::~NormalizerConformanceTest() {}
@ -300,56 +300,17 @@ UBool NormalizerConformanceTest::checkConformance(const UnicodeString* field,
int32_t options,
UErrorCode &status) {
UBool pass = TRUE, result;
//UErrorCode status = U_ZERO_ERROR;
UnicodeString out, fcd;
int32_t fieldNum;
for (int32_t i=0; i<FIELD_COUNT; ++i) {
fieldNum = i+1;
if (i<3) {
Normalizer::normalize(field[i], UNORM_NFC, options, out, status);
if (U_FAILURE(status)) {
dataerrln("Error running normalize UNORM_NFC: %s", u_errorName(status));
} else {
pass &= assertEqual("C", field[i], out, field[1], "c2!=C(c", fieldNum);
iterativeNorm(field[i], UNORM_NFC, options, out, +1);
pass &= assertEqual("C(+1)", field[i], out, field[1], "c2!=C(c", fieldNum);
iterativeNorm(field[i], UNORM_NFC, options, out, -1);
pass &= assertEqual("C(-1)", field[i], out, field[1], "c2!=C(c", fieldNum);
}
Normalizer::normalize(field[i], UNORM_NFD, options, out, status);
if (U_FAILURE(status)) {
dataerrln("Error running normalize UNORM_NFD: %s", u_errorName(status));
} else {
pass &= assertEqual("D", field[i], out, field[2], "c3!=D(c", fieldNum);
iterativeNorm(field[i], UNORM_NFD, options, out, +1);
pass &= assertEqual("D(+1)", field[i], out, field[2], "c3!=D(c", fieldNum);
iterativeNorm(field[i], UNORM_NFD, options, out, -1);
pass &= assertEqual("D(-1)", field[i], out, field[2], "c3!=D(c", fieldNum);
}
}
Normalizer::normalize(field[i], UNORM_NFKC, options, out, status);
if (U_FAILURE(status)) {
dataerrln("Error running normalize UNORM_NFKC: %s", u_errorName(status));
} else {
pass &= assertEqual("KC", field[i], out, field[3], "c4!=KC(c", fieldNum);
iterativeNorm(field[i], UNORM_NFKC, options, out, +1);
pass &= assertEqual("KC(+1)", field[i], out, field[3], "c4!=KC(c", fieldNum);
iterativeNorm(field[i], UNORM_NFKC, options, out, -1);
pass &= assertEqual("KC(-1)", field[i], out, field[3], "c4!=KC(c", fieldNum);
}
Normalizer::normalize(field[i], UNORM_NFKD, options, out, status);
if (U_FAILURE(status)) {
dataerrln("Error running normalize UNORM_NFKD: %s", u_errorName(status));
} else {
pass &= assertEqual("KD", field[i], out, field[4], "c5!=KD(c", fieldNum);
iterativeNorm(field[i], UNORM_NFKD, options, out, +1);
pass &= assertEqual("KD(+1)", field[i], out, field[4], "c5!=KD(c", fieldNum);
iterativeNorm(field[i], UNORM_NFKD, options, out, -1);
pass &= assertEqual("KD(-1)", field[i], out, field[4], "c5!=KD(c", fieldNum);
pass &= checkNorm(UNORM_NFC, options, nfc, field[i], field[1], fieldNum);
pass &= checkNorm(UNORM_NFD, options, nfd, field[i], field[2], fieldNum);
}
pass &= checkNorm(UNORM_NFKC, options, nfkc, field[i], field[3], fieldNum);
pass &= checkNorm(UNORM_NFKD, options, nfkd, field[i], field[4], fieldNum);
}
compare(field[1],field[2]);
compare(field[0],field[1]);
@ -444,6 +405,81 @@ UBool NormalizerConformanceTest::checkConformance(const UnicodeString* field,
return pass;
}
static const char *const kModeStrings[UNORM_MODE_COUNT] = {
"?", "D", "KD", "C", "KC", "FCD"
};
static const char *const kMessages[UNORM_MODE_COUNT] = {
"?!=?", "c3!=D(c%d)", "c5!=KC(c%d)", "c2!=C(c%d)", "c4!=KC(c%d)", "FCD"
};
UBool NormalizerConformanceTest::checkNorm(UNormalizationMode mode, int32_t options,
const Normalizer2 *norm2,
const UnicodeString &s, const UnicodeString &exp,
int32_t field) {
const char *modeString = kModeStrings[mode];
char msg[20];
snprintf(msg, sizeof(msg), kMessages[mode], field);
UnicodeString out;
UErrorCode errorCode = U_ZERO_ERROR;
Normalizer::normalize(s, mode, options, out, errorCode);
if (U_FAILURE(errorCode)) {
dataerrln("Error running normalize UNORM_NF%s: %s", modeString, u_errorName(errorCode));
return FALSE;
}
if (!assertEqual(modeString, "", s, out, exp, msg)) {
return FALSE;
}
iterativeNorm(s, mode, options, out, +1);
if (!assertEqual(modeString, "(+1)", s, out, exp, msg)) {
return FALSE;
}
iterativeNorm(s, mode, options, out, -1);
if (!assertEqual(modeString, "(-1)", s, out, exp, msg)) {
return FALSE;
}
if (norm2 == nullptr || options != 0) {
return TRUE;
}
std::string s8;
s.toUTF8String(s8);
std::string exp8;
exp.toUTF8String(exp8);
std::string out8;
Edits edits;
Edits *editsPtr = (mode == UNORM_NFC || mode == UNORM_NFKC) ? &edits : nullptr;
StringByteSink<std::string> sink(&out8);
norm2->normalizeUTF8(0, s8, sink, editsPtr, errorCode);
if (U_FAILURE(errorCode)) {
errln("Normalizer2.%s.normalizeUTF8(%s) failed: %s",
modeString, s8.c_str(), u_errorName(errorCode));
return FALSE;
}
if (out8 != exp8) {
errln("Normalizer2.%s.normalizeUTF8(%s)=%s != %s",
modeString, s8.c_str(), out8.c_str(), exp8.c_str());
return FALSE;
}
if (editsPtr == nullptr) {
return TRUE;
}
// Do the Edits cover the entire input & output?
UBool pass = TRUE;
pass &= assertEquals("edits.hasChanges()", (UBool)(s8 != out8), edits.hasChanges());
pass &= assertEquals("edits.lengthDelta()",
(int32_t)(out8.length() - s8.length()), edits.lengthDelta());
Edits::Iterator iter = edits.getCoarseIterator();
while (iter.next(errorCode)) {}
pass &= assertEquals("edits source length", s8.length(), iter.sourceIndex());
pass &= assertEquals("edits destination length", out8.length(), iter.destinationIndex());
return pass;
}
/**
* Do a normalization using the iterative API in the given direction.
* @param dir either +1 or -1
@ -475,21 +511,11 @@ void NormalizerConformanceTest::iterativeNorm(const UnicodeString& str,
}
}
/**
* @param op name of normalization form, e.g., "KC"
* @param s string being normalized
* @param got value received
* @param exp expected value
* @param msg description of this test
* @param return true if got == exp
*/
UBool NormalizerConformanceTest::assertEqual(const char *op,
UBool NormalizerConformanceTest::assertEqual(const char *op, const char *op2,
const UnicodeString& s,
const UnicodeString& got,
const UnicodeString& exp,
const char *msg,
int32_t field)
{
const char *msg) {
if (exp == got)
return TRUE;
@ -509,7 +535,7 @@ UBool NormalizerConformanceTest::assertEqual(const char *op,
expPretty.extract(0, expPretty.length(), expChars, expPretty.length() + 1);
expChars[expPretty.length()] = 0;
errln(" %s%d)%s(%s)=%s, exp. %s", msg, field, op, sChars, gotChars, expChars);
errln(" %s: %s%s(%s)=%s, exp. %s", msg, op, op2, sChars, gotChars, expChars);
delete []sChars;
delete []gotChars;

View File

@ -14,6 +14,7 @@
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/normalizer2.h"
#include "unicode/normlzr.h"
#include "intltest.h"
@ -21,6 +22,7 @@ typedef struct _FileStream FileStream;
class NormalizerConformanceTest : public IntlTest {
Normalizer normalizer;
const Normalizer2 *nfc, *nfd, *nfkc, *nfkd;
public:
NormalizerConformanceTest();
@ -63,6 +65,11 @@ class NormalizerConformanceTest : public IntlTest {
int32_t options,
UErrorCode &status);
UBool checkNorm(UNormalizationMode mode, int32_t options,
const Normalizer2 *norm2,
const UnicodeString &s, const UnicodeString &exp,
int32_t field);
void iterativeNorm(const UnicodeString& str,
UNormalizationMode mode, int32_t options,
UnicodeString& result,
@ -70,18 +77,18 @@ class NormalizerConformanceTest : public IntlTest {
/**
* @param op name of normalization form, e.g., "KC"
* @param op2 name of test case variant, e.g., "(-1)"
* @param s string being normalized
* @param got value received
* @param exp expected value
* @param msg description of this test
* @param return true if got == exp
*/
UBool assertEqual(const char *op,
UBool assertEqual(const char *op, const char *op2,
const UnicodeString& s,
const UnicodeString& got,
const UnicodeString& exp,
const char *msg,
int32_t field);
const char *msg);
/**
* Split a string into pieces based on the given delimiter

View File

@ -19,6 +19,7 @@
*/
#include "unicode/std_string.h"
#include "unicode/brkiter.h"
#include "unicode/casemap.h"
#include "unicode/edits.h"
#include "unicode/uchar.h"
@ -33,11 +34,7 @@
#include "ustrtest.h"
#include "unicode/tstdtmod.h"
#include "cmemory.h"
struct EditChange {
UBool change;
int32_t oldLength, newLength;
};
#include "testutil.h"
class StringCaseTest: public IntlTest {
public:
@ -53,6 +50,7 @@ public:
int32_t whichCase,
void *iter, const char *localeID, uint32_t options);
void TestCasing();
void TestTitleOptions();
void TestFullCaseFoldingIterator();
void TestGreekUpper();
void TestLongUpper();
@ -67,10 +65,6 @@ public:
private:
void assertGreekUpper(const char16_t *s, const char16_t *expected);
void checkEditsIter(
const UnicodeString &name, Edits::Iterator ei1, Edits::Iterator ei2, // two equal iterators
const EditChange expected[], int32_t expLength, UBool withUnchanged,
UErrorCode &errorCode);
Locale GREEK_LOCALE_;
};
@ -92,6 +86,7 @@ StringCaseTest::runIndexedTest(int32_t index, UBool exec, const char *&name, cha
TESTCASE_AUTO(TestCaseConversion);
#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
TESTCASE_AUTO(TestCasing);
TESTCASE_AUTO(TestTitleOptions);
#endif
TESTCASE_AUTO(TestFullCaseFoldingIterator);
TESTCASE_AUTO(TestGreekUpper);
@ -601,6 +596,59 @@ StringCaseTest::TestCasing() {
#endif
}
void
StringCaseTest::TestTitleOptions() {
// New options in ICU 60.
TestCasingImpl(u"ʻcAt! ʻeTc.", u"ʻCat! ʻetc.", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING);
TestCasingImpl(u"a ʻCaT. A ʻdOg! ʻeTc.", u"A ʻCaT. A ʻdOg! ʻETc.", TEST_TITLE,
nullptr, "", U_TITLECASE_SENTENCES|U_TITLECASE_NO_LOWERCASE);
TestCasingImpl(u"49eRs", u"49ers", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING);
TestCasingImpl(u"«丰(aBc)»", u"«丰(abc)»", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING);
TestCasingImpl(u"49eRs", u"49Ers", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING|U_TITLECASE_ADJUST_TO_CASED);
TestCasingImpl(u"«丰(aBc)»", u"«丰(Abc)»", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING|U_TITLECASE_ADJUST_TO_CASED);
TestCasingImpl(u" john. Smith", u" John. Smith", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING|U_TITLECASE_NO_LOWERCASE);
TestCasingImpl(u" john. Smith", u" john. smith", TEST_TITLE,
nullptr, "", U_TITLECASE_WHOLE_STRING|U_TITLECASE_NO_BREAK_ADJUSTMENT);
TestCasingImpl(u"«ijs»", u"«IJs»", TEST_TITLE,
nullptr, "nl-BE", U_TITLECASE_WHOLE_STRING);
TestCasingImpl(u"«ijs»", u"«İjs»", TEST_TITLE,
nullptr, "tr-DE", U_TITLECASE_WHOLE_STRING);
// Test conflicting settings.
// If & when we add more options, then the ORed combinations may become
// indistinguishable from valid values.
IcuTestErrorCode errorCode(*this, "TestTitleOptions");
CaseMap::toTitle("", U_TITLECASE_NO_BREAK_ADJUSTMENT|U_TITLECASE_ADJUST_TO_CASED, nullptr,
u"", 0, nullptr, 0, nullptr, errorCode);
if (errorCode.get() != U_ILLEGAL_ARGUMENT_ERROR) {
errln("CaseMap::toTitle(multiple adjustment options) -> %s not illegal argument",
errorCode.errorName());
}
errorCode.reset();
CaseMap::toTitle("", U_TITLECASE_WHOLE_STRING|U_TITLECASE_SENTENCES, nullptr,
u"", 0, nullptr, 0, nullptr, errorCode);
if (errorCode.get() != U_ILLEGAL_ARGUMENT_ERROR) {
errln("CaseMap::toTitle(multiple iterator options) -> %s not illegal argument",
errorCode.errorName());
}
errorCode.reset();
LocalPointer<BreakIterator> iter(
BreakIterator::createCharacterInstance(Locale::getRoot(), errorCode));
CaseMap::toTitle("", U_TITLECASE_WHOLE_STRING, iter.getAlias(),
u"", 0, nullptr, 0, nullptr, errorCode);
if (errorCode.get() != U_ILLEGAL_ARGUMENT_ERROR) {
errln("CaseMap::toTitle(iterator option + iterator) -> %s not illegal argument",
errorCode.errorName());
}
errorCode.reset();
}
void
StringCaseTest::TestFullCaseFoldingIterator() {
UnicodeString ffi=UNICODE_STRING_SIMPLE("ffi");
@ -855,64 +903,6 @@ void StringCaseTest::TestBufferOverflow() {
errorCode.reset();
}
void StringCaseTest::checkEditsIter(
const UnicodeString &name,
Edits::Iterator ei1, Edits::Iterator ei2, // two equal iterators
const EditChange expected[], int32_t expLength, UBool withUnchanged,
UErrorCode &errorCode) {
assertFalse(name, ei2.findSourceIndex(-1, errorCode));
int32_t expSrcIndex = 0;
int32_t expDestIndex = 0;
int32_t expReplIndex = 0;
for (int32_t expIndex = 0; expIndex < expLength; ++expIndex) {
const EditChange &expect = expected[expIndex];
UnicodeString msg = UnicodeString(name).append(u' ') + expIndex;
if (withUnchanged || expect.change) {
assertTrue(msg, ei1.next(errorCode));
assertEquals(msg, expect.change, ei1.hasChange());
assertEquals(msg, expect.oldLength, ei1.oldLength());
assertEquals(msg, expect.newLength, ei1.newLength());
assertEquals(msg, expSrcIndex, ei1.sourceIndex());
assertEquals(msg, expDestIndex, ei1.destinationIndex());
assertEquals(msg, expReplIndex, ei1.replacementIndex());
}
if (expect.oldLength > 0) {
assertTrue(msg, ei2.findSourceIndex(expSrcIndex, errorCode));
assertEquals(msg, expect.change, ei2.hasChange());
assertEquals(msg, expect.oldLength, ei2.oldLength());
assertEquals(msg, expect.newLength, ei2.newLength());
assertEquals(msg, expSrcIndex, ei2.sourceIndex());
assertEquals(msg, expDestIndex, ei2.destinationIndex());
assertEquals(msg, expReplIndex, ei2.replacementIndex());
if (!withUnchanged) {
// For some iterators, move past the current range
// so that findSourceIndex() has to look before the current index.
ei2.next(errorCode);
ei2.next(errorCode);
}
}
expSrcIndex += expect.oldLength;
expDestIndex += expect.newLength;
if (expect.change) {
expReplIndex += expect.newLength;
}
}
// TODO: remove casts from u"" when merging into trunk
UnicodeString msg = UnicodeString(name).append(u" end");
assertFalse(msg, ei1.next(errorCode));
assertFalse(msg, ei1.hasChange());
assertEquals(msg, 0, ei1.oldLength());
assertEquals(msg, 0, ei1.newLength());
assertEquals(msg, expSrcIndex, ei1.sourceIndex());
assertEquals(msg, expDestIndex, ei1.destinationIndex());
assertEquals(msg, expReplIndex, ei1.replacementIndex());
assertFalse(name, ei2.findSourceIndex(expSrcIndex, errorCode));
}
void StringCaseTest::TestEdits() {
IcuTestErrorCode errorCode(*this, "TestEdits");
Edits edits;
@ -941,10 +931,10 @@ void StringCaseTest::TestEdits() {
{ FALSE, 10003, 10003 },
{ TRUE, 103103, 104013 }
};
checkEditsIter(u"coarse",
TestUtility::checkEditsIter(*this, u"coarse",
edits.getCoarseIterator(), edits.getCoarseIterator(),
coarseExpectedChanges, UPRV_LENGTHOF(coarseExpectedChanges), TRUE, errorCode);
checkEditsIter(u"coarse changes",
TestUtility::checkEditsIter(*this, u"coarse changes",
edits.getCoarseChangesIterator(), edits.getCoarseChangesIterator(),
coarseExpectedChanges, UPRV_LENGTHOF(coarseExpectedChanges), FALSE, errorCode);
@ -958,10 +948,10 @@ void StringCaseTest::TestEdits() {
{ TRUE, 3000, 4000 },
{ TRUE, 100000, 100000 }
};
checkEditsIter(u"fine",
TestUtility::checkEditsIter(*this, u"fine",
edits.getFineIterator(), edits.getFineIterator(),
fineExpectedChanges, UPRV_LENGTHOF(fineExpectedChanges), TRUE, errorCode);
checkEditsIter(u"fine changes",
TestUtility::checkEditsIter(*this, u"fine changes",
edits.getFineChangesIterator(), edits.getFineChangesIterator(),
fineExpectedChanges, UPRV_LENGTHOF(fineExpectedChanges), FALSE, errorCode);
@ -977,7 +967,7 @@ void StringCaseTest::TestCaseMapWithEdits() {
UChar dest[20];
Edits edits;
int32_t length = CaseMap::toLower("tr", UCASEMAP_OMIT_UNCHANGED_TEXT,
int32_t length = CaseMap::toLower("tr", U_OMIT_UNCHANGED_TEXT,
u"IstanBul", 8, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"toLower(IstanBul)", UnicodeString(u"ıb"), UnicodeString(TRUE, dest, length));
static const EditChange lowerExpectedChanges[] = {
@ -986,13 +976,13 @@ void StringCaseTest::TestCaseMapWithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 2, 2 }
};
checkEditsIter(u"toLower(IstanBul)",
TestUtility::checkEditsIter(*this, u"toLower(IstanBul)",
edits.getFineIterator(), edits.getFineIterator(),
lowerExpectedChanges, UPRV_LENGTHOF(lowerExpectedChanges),
TRUE, errorCode);
edits.reset();
length = CaseMap::toUpper("el", UCASEMAP_OMIT_UNCHANGED_TEXT,
length = CaseMap::toUpper("el", U_OMIT_UNCHANGED_TEXT,
u"Πατάτα", 6, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"toUpper(Πατάτα)", UnicodeString(u"ΑΤΑΤΑ"), UnicodeString(TRUE, dest, length));
static const EditChange upperExpectedChanges[] = {
@ -1003,7 +993,7 @@ void StringCaseTest::TestCaseMapWithEdits() {
{ TRUE, 1, 1 },
{ TRUE, 1, 1 }
};
checkEditsIter(u"toUpper(Πατάτα)",
TestUtility::checkEditsIter(*this, u"toUpper(Πατάτα)",
edits.getFineIterator(), edits.getFineIterator(),
upperExpectedChanges, UPRV_LENGTHOF(upperExpectedChanges),
TRUE, errorCode);
@ -1012,7 +1002,7 @@ void StringCaseTest::TestCaseMapWithEdits() {
#if !UCONFIG_NO_BREAK_ITERATION
length = CaseMap::toTitle("nl",
UCASEMAP_OMIT_UNCHANGED_TEXT |
U_OMIT_UNCHANGED_TEXT |
U_TITLECASE_NO_BREAK_ADJUSTMENT |
U_TITLECASE_NO_LOWERCASE,
NULL, u"IjssEL IglOo", 12,
@ -1023,14 +1013,14 @@ void StringCaseTest::TestCaseMapWithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 10, 10 }
};
checkEditsIter(u"toTitle(IjssEL IglOo)",
TestUtility::checkEditsIter(*this, u"toTitle(IjssEL IglOo)",
edits.getFineIterator(), edits.getFineIterator(),
titleExpectedChanges, UPRV_LENGTHOF(titleExpectedChanges),
TRUE, errorCode);
#endif
edits.reset();
length = CaseMap::fold(UCASEMAP_OMIT_UNCHANGED_TEXT | U_FOLD_CASE_EXCLUDE_SPECIAL_I,
length = CaseMap::fold(U_OMIT_UNCHANGED_TEXT | U_FOLD_CASE_EXCLUDE_SPECIAL_I,
u"IßtanBul", 8, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"foldCase(IßtanBul)", UnicodeString(u"ıssb"), UnicodeString(TRUE, dest, length));
static const EditChange foldExpectedChanges[] = {
@ -1040,18 +1030,18 @@ void StringCaseTest::TestCaseMapWithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 2, 2 }
};
checkEditsIter(u"foldCase(IßtanBul)",
TestUtility::checkEditsIter(*this, u"foldCase(IßtanBul)",
edits.getFineIterator(), edits.getFineIterator(),
foldExpectedChanges, UPRV_LENGTHOF(foldExpectedChanges),
TRUE, errorCode);
}
void StringCaseTest::TestCaseMapUTF8WithEdits() {
IcuTestErrorCode errorCode(*this, "TestEdits");
IcuTestErrorCode errorCode(*this, "TestCaseMapUTF8WithEdits");
char dest[50];
Edits edits;
int32_t length = CaseMap::utf8ToLower("tr", UCASEMAP_OMIT_UNCHANGED_TEXT,
int32_t length = CaseMap::utf8ToLower("tr", U_OMIT_UNCHANGED_TEXT,
u8"IstanBul", 8, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"toLower(IstanBul)", UnicodeString(u"ıb"),
UnicodeString::fromUTF8(StringPiece(dest, length)));
@ -1061,13 +1051,13 @@ void StringCaseTest::TestCaseMapUTF8WithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 2, 2 }
};
checkEditsIter(u"toLower(IstanBul)",
TestUtility::checkEditsIter(*this, u"toLower(IstanBul)",
edits.getFineIterator(), edits.getFineIterator(),
lowerExpectedChanges, UPRV_LENGTHOF(lowerExpectedChanges),
TRUE, errorCode);
edits.reset();
length = CaseMap::utf8ToUpper("el", UCASEMAP_OMIT_UNCHANGED_TEXT,
length = CaseMap::utf8ToUpper("el", U_OMIT_UNCHANGED_TEXT,
u8"Πατάτα", 6 * 2, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"toUpper(Πατάτα)", UnicodeString(u"ΑΤΑΤΑ"),
UnicodeString::fromUTF8(StringPiece(dest, length)));
@ -1079,7 +1069,7 @@ void StringCaseTest::TestCaseMapUTF8WithEdits() {
{ TRUE, 2, 2 },
{ TRUE, 2, 2 }
};
checkEditsIter(u"toUpper(Πατάτα)",
TestUtility::checkEditsIter(*this, u"toUpper(Πατάτα)",
edits.getFineIterator(), edits.getFineIterator(),
upperExpectedChanges, UPRV_LENGTHOF(upperExpectedChanges),
TRUE, errorCode);
@ -1087,7 +1077,7 @@ void StringCaseTest::TestCaseMapUTF8WithEdits() {
edits.reset();
#if !UCONFIG_NO_BREAK_ITERATION
length = CaseMap::utf8ToTitle("nl",
UCASEMAP_OMIT_UNCHANGED_TEXT |
U_OMIT_UNCHANGED_TEXT |
U_TITLECASE_NO_BREAK_ADJUSTMENT |
U_TITLECASE_NO_LOWERCASE,
NULL, u8"IjssEL IglOo", 12,
@ -1099,14 +1089,14 @@ void StringCaseTest::TestCaseMapUTF8WithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 10, 10 }
};
checkEditsIter(u"toTitle(IjssEL IglOo)",
TestUtility::checkEditsIter(*this, u"toTitle(IjssEL IglOo)",
edits.getFineIterator(), edits.getFineIterator(),
titleExpectedChanges, UPRV_LENGTHOF(titleExpectedChanges),
TRUE, errorCode);
#endif
edits.reset();
length = CaseMap::utf8Fold(UCASEMAP_OMIT_UNCHANGED_TEXT | U_FOLD_CASE_EXCLUDE_SPECIAL_I,
length = CaseMap::utf8Fold(U_OMIT_UNCHANGED_TEXT | U_FOLD_CASE_EXCLUDE_SPECIAL_I,
u8"IßtanBul", 1 + 2 + 6, dest, UPRV_LENGTHOF(dest), &edits, errorCode);
assertEquals(u"foldCase(IßtanBul)", UnicodeString(u"ıssb"),
UnicodeString::fromUTF8(StringPiece(dest, length)));
@ -1117,7 +1107,7 @@ void StringCaseTest::TestCaseMapUTF8WithEdits() {
{ TRUE, 1, 1 },
{ FALSE, 2, 2 }
};
checkEditsIter(u"foldCase(IßtanBul)",
TestUtility::checkEditsIter(*this, u"foldCase(IßtanBul)",
edits.getFineIterator(), edits.getFineIterator(),
foldExpectedChanges, UPRV_LENGTHOF(foldExpectedChanges),
TRUE, errorCode);

View File

@ -10,10 +10,13 @@
**********************************************************************
*/
#include "unicode/utypes.h"
#include "unicode/edits.h"
#include "unicode/unistr.h"
#include "testutil.h"
#include "intltest.h"
static const UChar HEX[16]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
static const UChar HEX[] = u"0123456789ABCDEF";
UnicodeString &TestUtility::appendHex(UnicodeString &buf, UChar32 ch) {
if (ch >= 0x10000) {
@ -36,7 +39,7 @@ UnicodeString TestUtility::hex(UChar32 ch) {
}
UnicodeString TestUtility::hex(const UnicodeString& s) {
return hex(s, 44 /*,*/);
return hex(s, u',');
}
UnicodeString TestUtility::hex(const UnicodeString& s, UChar sep) {
@ -54,10 +57,68 @@ UnicodeString TestUtility::hex(const UnicodeString& s, UChar sep) {
}
UnicodeString TestUtility::hex(const uint8_t* bytes, int32_t len) {
UnicodeString buf;
for (int32_t i = 0; i < len; ++i) {
buf.append(HEX[0x0F & (bytes[i] >> 4)]);
buf.append(HEX[0x0F & bytes[i]]);
}
return buf;
UnicodeString buf;
for (int32_t i = 0; i < len; ++i) {
buf.append(HEX[0x0F & (bytes[i] >> 4)]);
buf.append(HEX[0x0F & bytes[i]]);
}
return buf;
}
void TestUtility::checkEditsIter(
IntlTest &test,
const UnicodeString &name,
Edits::Iterator ei1, Edits::Iterator ei2, // two equal iterators
const EditChange expected[], int32_t expLength, UBool withUnchanged,
UErrorCode &errorCode) {
test.assertFalse(name, ei2.findSourceIndex(-1, errorCode));
int32_t expSrcIndex = 0;
int32_t expDestIndex = 0;
int32_t expReplIndex = 0;
for (int32_t expIndex = 0; expIndex < expLength; ++expIndex) {
const EditChange &expect = expected[expIndex];
UnicodeString msg = UnicodeString(name).append(u' ') + expIndex;
if (withUnchanged || expect.change) {
test.assertTrue(msg, ei1.next(errorCode));
test.assertEquals(msg, expect.change, ei1.hasChange());
test.assertEquals(msg, expect.oldLength, ei1.oldLength());
test.assertEquals(msg, expect.newLength, ei1.newLength());
test.assertEquals(msg, expSrcIndex, ei1.sourceIndex());
test.assertEquals(msg, expDestIndex, ei1.destinationIndex());
test.assertEquals(msg, expReplIndex, ei1.replacementIndex());
}
if (expect.oldLength > 0) {
test.assertTrue(msg, ei2.findSourceIndex(expSrcIndex, errorCode));
test.assertEquals(msg, expect.change, ei2.hasChange());
test.assertEquals(msg, expect.oldLength, ei2.oldLength());
test.assertEquals(msg, expect.newLength, ei2.newLength());
test.assertEquals(msg, expSrcIndex, ei2.sourceIndex());
test.assertEquals(msg, expDestIndex, ei2.destinationIndex());
test.assertEquals(msg, expReplIndex, ei2.replacementIndex());
if (!withUnchanged) {
// For some iterators, move past the current range
// so that findSourceIndex() has to look before the current index.
ei2.next(errorCode);
ei2.next(errorCode);
}
}
expSrcIndex += expect.oldLength;
expDestIndex += expect.newLength;
if (expect.change) {
expReplIndex += expect.newLength;
}
}
UnicodeString msg = UnicodeString(name).append(u" end");
test.assertFalse(msg, ei1.next(errorCode));
test.assertFalse(msg, ei1.hasChange());
test.assertEquals(msg, 0, ei1.oldLength());
test.assertEquals(msg, 0, ei1.newLength());
test.assertEquals(msg, expSrcIndex, ei1.sourceIndex());
test.assertEquals(msg, expDestIndex, ei1.destinationIndex());
test.assertEquals(msg, expReplIndex, ei1.replacementIndex());
test.assertFalse(name, ei2.findSourceIndex(expSrcIndex, errorCode));
}

View File

@ -12,14 +12,20 @@
#ifndef TESTUTIL_H
#define TESTUTIL_H
#include "unicode/utypes.h"
#include "unicode/edits.h"
#include "unicode/unistr.h"
#include "intltest.h"
struct EditChange {
UBool change;
int32_t oldLength, newLength;
};
/**
* Utility methods. Everything in this class is static -- do not
* attempt to instantiate.
* Utility methods. Everything in this class is static.
*/
class TestUtility {
public:
static UnicodeString &appendHex(UnicodeString &buf, UChar32 ch);
@ -29,11 +35,16 @@ public:
static UnicodeString hex(const UnicodeString& s, UChar sep);
static UnicodeString hex(const uint8_t* bytes, int32_t len);
static UnicodeString hex(const uint8_t* bytes, int32_t len);
static void checkEditsIter(
IntlTest &test, const UnicodeString &name,
Edits::Iterator ei1, Edits::Iterator ei2, // two equal iterators
const EditChange expected[], int32_t expLength, UBool withUnchanged,
UErrorCode &errorCode);
private:
TestUtility() {} // Prevent instantiation
TestUtility() = delete; // Prevent instantiation
};
#endif

View File

@ -13,6 +13,7 @@
#include "unicode/uchar.h"
#include "unicode/errorcode.h"
#include "unicode/normlzr.h"
#include "unicode/stringoptions.h"
#include "unicode/uniset.h"
#include "unicode/usetiter.h"
#include "unicode/schriter.h"
@ -20,48 +21,41 @@
#include "cmemory.h"
#include "cstring.h"
#include "normalizer2impl.h"
#include "testutil.h"
#include "tstnorm.h"
#define ARRAY_LENGTH(array) UPRV_LENGTHOF(array)
#define CASE(id,test) case id: \
name = #test; \
if (exec) { \
logln(#test "---"); \
logln((UnicodeString)""); \
test(); \
} \
break
static UErrorCode status = U_ZERO_ERROR;
void BasicNormalizerTest::runIndexedTest(int32_t index, UBool exec,
const char* &name, char* /*par*/) {
switch (index) {
CASE(0,TestDecomp);
CASE(1,TestCompatDecomp);
CASE(2,TestCanonCompose);
CASE(3,TestCompatCompose);
CASE(4,TestPrevious);
CASE(5,TestHangulDecomp);
CASE(6,TestHangulCompose);
CASE(7,TestTibetan);
CASE(8,TestCompositionExclusion);
CASE(9,TestZeroIndex);
CASE(10,TestVerisign);
CASE(11,TestPreviousNext);
CASE(12,TestNormalizerAPI);
CASE(13,TestConcatenate);
CASE(14,FindFoldFCDExceptions);
CASE(15,TestCompare);
CASE(16,TestSkippable);
#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
CASE(17,TestCustomComp);
CASE(18,TestCustomFCC);
#endif
CASE(19,TestFilteredNormalizer2Coverage);
default: name = ""; break;
if(exec) {
logln("TestSuite BasicNormalizerTest: ");
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestDecomp);
TESTCASE_AUTO(TestCompatDecomp);
TESTCASE_AUTO(TestCanonCompose);
TESTCASE_AUTO(TestCompatCompose);
TESTCASE_AUTO(TestPrevious);
TESTCASE_AUTO(TestHangulDecomp);
TESTCASE_AUTO(TestHangulCompose);
TESTCASE_AUTO(TestTibetan);
TESTCASE_AUTO(TestCompositionExclusion);
TESTCASE_AUTO(TestZeroIndex);
TESTCASE_AUTO(TestVerisign);
TESTCASE_AUTO(TestPreviousNext);
TESTCASE_AUTO(TestNormalizerAPI);
TESTCASE_AUTO(TestConcatenate);
TESTCASE_AUTO(FindFoldFCDExceptions);
TESTCASE_AUTO(TestCompare);
TESTCASE_AUTO(TestSkippable);
#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
TESTCASE_AUTO(TestCustomComp);
TESTCASE_AUTO(TestCustomFCC);
#endif
TESTCASE_AUTO(TestFilteredNormalizer2Coverage);
TESTCASE_AUTO(TestNormalizeUTF8WithEdits);
TESTCASE_AUTO_END;
}
/**
@ -315,6 +309,7 @@ void BasicNormalizerTest::TestCompositionExclusion(void) {
"\\uFB3B\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46"
"\\uFB47\\uFB48\\uFB49\\uFB4A\\uFB4B\\uFB4C\\uFB4D\\uFB4E"
);
UErrorCode status = U_ZERO_ERROR;
for (int32_t i=0; i<EXCLUDED.length(); ++i) {
UnicodeString a(EXCLUDED.charAt(i));
UnicodeString b;
@ -508,6 +503,7 @@ inline static void insert(UnicodeString& dest, int pos, UChar32 ch)
void BasicNormalizerTest::backAndForth(Normalizer* iter, const UnicodeString& input)
{
UChar32 ch;
UErrorCode status = U_ZERO_ERROR;
iter->setText(input, status);
// Run through the iterator forwards and stick it into a StringBuffer
@ -532,6 +528,7 @@ void BasicNormalizerTest::staticTest(UNormalizationMode mode, int options,
UnicodeString tests[][3], int length,
int outCol)
{
UErrorCode status = U_ZERO_ERROR;
for (int i = 0; i < length; i++)
{
UnicodeString& input = tests[i][0];
@ -554,6 +551,7 @@ void BasicNormalizerTest::iterateTest(Normalizer* iter,
UnicodeString tests[][3], int length,
int outCol)
{
UErrorCode status = U_ZERO_ERROR;
for (int i = 0; i < length; i++)
{
UnicodeString& input = tests[i][0];
@ -1489,7 +1487,7 @@ BasicNormalizerTest::TestFilteredNormalizer2Coverage() {
UErrorCode errorCode = U_ZERO_ERROR;
const Normalizer2 *nfcNorm2=Normalizer2::getNFCInstance(errorCode);
if (U_FAILURE(errorCode)) {
dataerrln("Normalizer2::getNFCInstance() call failed - %s", u_errorName(status));
dataerrln("Normalizer2::getNFCInstance() call failed - %s", u_errorName(errorCode));
return;
}
UnicodeSet filter(UNICODE_STRING_SIMPLE("[^\\u00a0-\\u00ff\\u0310-\\u031f]"), errorCode);
@ -1525,4 +1523,51 @@ BasicNormalizerTest::TestFilteredNormalizer2Coverage() {
}
}
void
BasicNormalizerTest::TestNormalizeUTF8WithEdits() {
IcuTestErrorCode errorCode(*this, "TestNormalizeUTF8WithEdits");
const Normalizer2 *nfkc_cf=Normalizer2::getNFKCCasefoldInstance(errorCode);
if(errorCode.logDataIfFailureAndReset("Normalizer2::getNFKCCasefoldInstance() call failed")) {
return;
}
static const char *const src =
u8" AÄA\u0308A\u0308\u0323Ä\u0323,\u1100\u1161\u11A8\u3133 ";
std::string expected = u8" aääạ\u0308\u0308,가각갃 ";
std::string result;
StringByteSink<std::string> sink(&result);
Edits edits;
nfkc_cf->normalizeUTF8(0, src, sink, &edits, errorCode);
assertSuccess("normalizeUTF8 with Edits", errorCode.get());
assertEquals("normalizeUTF8 with Edits", expected.c_str(), result.c_str());
static const EditChange expectedChanges[] = {
{ FALSE, 2, 2 }, // 2 spaces
{ TRUE, 1, 1 }, // A→a
{ TRUE, 2, 2 }, // Ä→ä
{ TRUE, 3, 2 }, // A\u0308→ä
{ TRUE, 5, 5 }, // A\u0308\u0323→ạ\u0308
{ TRUE, 4, 5 }, // Ä\u0323→ ạ\u0308
{ FALSE, 1, 1 }, // comma
{ TRUE, 6, 3 }, // \u1100\u1161→ 가
{ TRUE, 6, 3 }, // 가\u11A8→ 각
{ TRUE, 6, 3 }, // 가\u3133→ 갃
{ FALSE, 2, 2 } // 2 spaces
};
TestUtility::checkEditsIter(*this, u"normalizeUTF8 with Edits",
edits.getFineIterator(), edits.getFineIterator(),
expectedChanges, UPRV_LENGTHOF(expectedChanges),
TRUE, errorCode);
// Omit unchanged text.
expected = u8"aääạ\u0308\u0308가각갃";
result.clear();
edits.reset();
nfkc_cf->normalizeUTF8(U_OMIT_UNCHANGED_TEXT, src, sink, &edits, errorCode);
assertSuccess("normalizeUTF8 omit unchanged", errorCode.get());
assertEquals("normalizeUTF8 omit unchanged", expected.c_str(), result.c_str());
TestUtility::checkEditsIter(*this, u"normalizeUTF8 omit unchanged",
edits.getFineIterator(), edits.getFineIterator(),
expectedChanges, UPRV_LENGTHOF(expectedChanges),
TRUE, errorCode);
}
#endif /* #if !UCONFIG_NO_NORMALIZATION */

View File

@ -47,6 +47,7 @@ public:
void TestCustomComp();
void TestCustomFCC();
void TestFilteredNormalizer2Coverage();
void TestNormalizeUTF8WithEdits();
private:
UnicodeString canonTests[24][3];

View File

@ -26,8 +26,10 @@
#include "unicode/stringpiece.h"
#include "unicode/uidna.h"
#include "unicode/unistr.h"
#include "intltest.h"
#include "charstr.h"
#include "cmemory.h"
#include "intltest.h"
#include "uparse.h"
class UTS46Test : public IntlTest {
public:
@ -38,6 +40,13 @@ public:
void TestAPI();
void TestNotSTD3();
void TestSomeCases();
void IdnaTest();
void checkIdnaTestResult(const char *line, const char *type,
const UnicodeString &expected, const UnicodeString &result,
const IDNAInfo &info);
void idnaTestOneLine(char *fields[][2], UErrorCode &errorCode);
private:
IDNA *trans, *nontrans;
};
@ -74,6 +83,7 @@ void UTS46Test::runIndexedTest(int32_t index, UBool exec, const char *&name, cha
TESTCASE_AUTO(TestAPI);
TESTCASE_AUTO(TestNotSTD3);
TESTCASE_AUTO(TestSomeCases);
TESTCASE_AUTO(IdnaTest);
TESTCASE_AUTO_END;
}
@ -517,8 +527,11 @@ static const TestCase testCases[]={
{ "\\u05D07\\u05EA", "B", "\\u05D07\\u05EA", 0 },
{ "\\u05D0\\u0667\\u05EA", "B", "\\u05D0\\u0667\\u05EA", 0 }, // Arabic 7 in the middle
{ "a7\\u0667z", "B", "a7\\u0667z", UIDNA_ERROR_BIDI }, // AN digit in LTR
{ "a7\\u0667", "B", "a7\\u0667", UIDNA_ERROR_BIDI }, // AN digit in LTR
{ "\\u05D07\\u0667\\u05EA", "B", // mixed EN/AN digits in RTL
"\\u05D07\\u0667\\u05EA", UIDNA_ERROR_BIDI },
{ "\\u05D07\\u0667", "B", // mixed EN/AN digits in RTL
"\\u05D07\\u0667", UIDNA_ERROR_BIDI },
// ZWJ
{ "\\u0BB9\\u0BCD\\u200D", "N", "\\u0BB9\\u0BCD\\u200D", 0 }, // Virama+ZWJ
{ "\\u0BB9\\u200D", "N", "\\u0BB9\\u200D", UIDNA_ERROR_CONTEXTJ }, // no Virama
@ -881,4 +894,117 @@ void UTS46Test::TestSomeCases() {
}
}
namespace {
const int32_t kNumFields = 4; // Will need 5 when we read NV8 from the optional fifth column.
void U_CALLCONV
idnaTestLineFn(void *context,
char *fields[][2], int32_t /* fieldCount */,
UErrorCode *pErrorCode) {
reinterpret_cast<UTS46Test *>(context)->idnaTestOneLine(fields, *pErrorCode);
}
} // namespace
void UTS46Test::checkIdnaTestResult(const char *line, const char *type,
const UnicodeString &expected, const UnicodeString &result,
const IDNAInfo &info) {
// An error in toUnicode or toASCII is indicated by a value in square brackets,
// such as "[B5 B6]".
UBool expectedHasErrors = !expected.isEmpty() && expected[0] == u'[';
if (expectedHasErrors != info.hasErrors()) {
errln("%s expected errors %d != %d = actual has errors: %04lx\n %s",
type, expectedHasErrors, info.hasErrors(), (long)info.getErrors(), line);
}
if (!expectedHasErrors && expected != result) {
errln("%s expected != actual\n %s", type, line);
errln(UnicodeString(u" ") + expected);
errln(UnicodeString(u" ") + result);
}
}
void UTS46Test::idnaTestOneLine(char *fields[][2], UErrorCode &errorCode) {
// Column 1: type - T for transitional, N for nontransitional, B for both
const char *typePtr = u_skipWhitespace(fields[0][0]);
const char *limit;
char typeChar;
if (typePtr == fields[0][1] ||
((typeChar = *typePtr) != 'B' && typeChar != 'N' && typeChar != 'T') ||
(limit = u_skipWhitespace(typePtr + 1)) != fields[0][1]) {
errln("empty or unknown type field: %s", fields[0][0]);
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
// Column 2: source - the source string to be tested
int32_t length = (int32_t)(fields[1][1] - fields[1][0]);
UnicodeString source16 = UnicodeString::fromUTF8(StringPiece(fields[1][0], length)).
trim().unescape();
// Column 3: toUnicode - the result of applying toUnicode to the source.
// A blank value means the same as the source value.
length = (int32_t)(fields[2][1] - fields[2][0]);
UnicodeString unicode16 = UnicodeString::fromUTF8(StringPiece(fields[2][0], length)).
trim().unescape();
if (unicode16.isEmpty()) {
unicode16 = source16;
}
// Column 4: toASCII - the result of applying toASCII to the source, using the specified type.
// A blank value means the same as the toUnicode value.
length = (int32_t)(fields[3][1] - fields[3][0]);
UnicodeString ascii16 = UnicodeString::fromUTF8(StringPiece(fields[3][0], length)).
trim().unescape();
if (ascii16.isEmpty()) {
ascii16 = unicode16;
}
// Column 5: NV8 - present if the toUnicode value would not be a valid domain name under IDNA2008. Not a normative field.
// Ignored as long as we do not implement and test vanilla IDNA2008.
// ToASCII/ToUnicode, transitional/nontransitional
UnicodeString uN, aN, aT;
IDNAInfo uNInfo, aNInfo, aTInfo;
nontrans->nameToUnicode(source16, uN, uNInfo, errorCode);
checkIdnaTestResult(fields[0][0], "toUnicodeNontrans", unicode16, uN, uNInfo);
if (typeChar == 'T' || typeChar == 'B') {
trans->nameToASCII(source16, aT, aTInfo, errorCode);
checkIdnaTestResult(fields[0][0], "toASCIITrans", ascii16, aT, aTInfo);
}
if (typeChar == 'N' || typeChar == 'B') {
nontrans->nameToASCII(source16, aN, aNInfo, errorCode);
checkIdnaTestResult(fields[0][0], "toASCIINontrans", ascii16, aN, aNInfo);
}
}
// TODO: de-duplicate
U_DEFINE_LOCAL_OPEN_POINTER(LocalStdioFilePointer, FILE, fclose);
// http://www.unicode.org/Public/idna/latest/IdnaTest.txt
void UTS46Test::IdnaTest() {
IcuTestErrorCode errorCode(*this, "IdnaTest");
const char *sourceTestDataPath = getSourceTestData(errorCode);
if (errorCode.logIfFailureAndReset("unable to find the source/test/testdata "
"folder (getSourceTestData())")) {
return;
}
CharString path(sourceTestDataPath, errorCode);
path.appendPathPart("IdnaTest.txt", errorCode);
LocalStdioFilePointer idnaTestFile(fopen(path.data(), "r"));
if (idnaTestFile.isNull()) {
errln("unable to open %s", path.data());
return;
}
// Columns (c1, c2,...) are separated by semicolons.
// Leading and trailing spaces and tabs in each column are ignored.
// Comments are indicated with hash marks.
char *fields[kNumFields][2];
u_parseDelimitedFile(path.data(), ';', fields, kNumFields, idnaTestLineFn, this, errorCode);
if (errorCode.logIfFailureAndReset("error parsing IdnaTest.txt")) {
return;
}
}
#endif // UCONFIG_NO_IDNA

View File

@ -1,5 +1,5 @@
# CollationTest_CLDR_NON_IGNORABLE_SHORT.txt
# Date: 2017-05-03, 21:57:17 GMT
# Date: 2017-06-05, 23:16:59 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
@ -600,8 +600,11 @@ FE2F 0334
1DD1 0334
0334 1DF5
1DF5 0334
0334 1DF6
1DF6 0334
0334 1DF7
1DF7 0334
0334 1DF8
1DF8 0334
0334 1DFB
1DFB 0334
@ -711,6 +714,7 @@ A67D 0334
1DCF 0334
0334 1DD0
1DD0 0334
0334 1DF9
1DF9 0334
0334 1DFC
1DFC 0334
@ -1067,6 +1071,7 @@ A9B3 0334
115C0 0334
0334 116B7
116B7 0334
0334 11D42
11D42 0334
0334 11100
11100 0334
@ -86041,7 +86046,9 @@ A8FB 0062
0D57 0062
0334 0D4D
0D4D 0334
0334 0D3B
0D3B 0334
0334 0D3C
0D3C 0334
0D4D 0021
0D3B 0021
@ -91395,12 +91402,14 @@ A8C4 0062
11D3F 0061
11D3F 0041
11D3F 0062
0334 11D44
11D44 0334
11D44 0021
11D44 003F
11D44 0061
11D44 0041
11D44 0062
0334 11D45
11D45 0334
11D45 0021
11D45 003F
@ -99549,12 +99558,14 @@ AADC 0062
11A0A 0061
11A0A 0041
11A0A 0062
0334 11A34
11A34 0334
11A34 0021
11A34 003F
11A34 0061
11A34 0041
11A34 0062
0334 11A47
11A47 0334
11A47 0021
11A47 003F
@ -99901,6 +99912,7 @@ AADC 0062
11A82 0061
11A82 0041
11A82 0062
0334 11A99
11A99 0334
11A99 0021
11A99 003F

View File

@ -1,5 +1,5 @@
# CollationTest_CLDR_SHIFTED_SHORT.txt
# Date: 2017-05-03, 21:57:19 GMT
# Date: 2017-06-05, 23:17:01 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
@ -4882,8 +4882,11 @@ E01EF 0334
1DD1 0334
0334 1DF5
1DF5 0334
0334 1DF6
1DF6 0334
0334 1DF7
1DF7 0334
0334 1DF8
1DF8 0334
0334 1DFB
1DFB 0334
@ -4993,6 +4996,7 @@ A67D 0334
1DCF 0334
0334 1DD0
1DD0 0334
0334 1DF9
1DF9 0334
0334 1DFC
1DFC 0334
@ -5349,6 +5353,7 @@ A9B3 0334
115C0 0334
0334 116B7
116B7 0334
0334 11D42
11D42 0334
0334 11100
11100 0334
@ -91413,7 +91418,9 @@ A8FB 0062
0D3C 003F
0334 0D4D
0D4D 0334
0334 0D3B
0D3B 0334
0334 0D3C
0D3C 0334
0D4D 0061
0D4D 0041
@ -97548,12 +97555,14 @@ A8C4 0062
11D3F 0062
11D44 0021
11D44 003F
0334 11D44
11D44 0334
11D44 0061
11D44 0041
11D44 0062
11D45 0021
11D45 003F
0334 11D45
11D45 0334
11D45 0061
11D45 0041
@ -105925,12 +105934,14 @@ AADC 0062
11A0A 0062
11A34 0021
11A34 003F
0334 11A34
11A34 0334
11A34 0061
11A34 0041
11A34 0062
11A47 0021
11A47 003F
0334 11A47
11A47 0334
11A47 0061
11A47 0041
@ -106345,6 +106356,7 @@ AADC 0062
11A82 0062
11A99 0021
11A99 003F
0334 11A99
11A99 0334
11A99 0061
11A99 0041

View File

@ -1,4 +1,4 @@
# GraphemeBreakTest-10.0.0.txt
# GraphemeBreakTest-10.0.0.txt
# Date: 2017-04-14, 05:40:29 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.

7848
icu4c/source/test/testdata/IdnaTest.txt vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
# LineBreakTest-10.0.0.txt
# LineBreakTest-10.0.0.txt
# Date: 2017-04-14, 05:40:30 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.

View File

@ -1,4 +1,4 @@
# SentenceBreakTest-10.0.0.txt
# SentenceBreakTest-10.0.0.txt
# Date: 2017-04-14, 05:40:43 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.

View File

@ -1,4 +1,4 @@
# WordBreakTest-10.0.0.txt
# WordBreakTest-10.0.0.txt
# Date: 2017-04-14, 05:40:44 GMT
# © 2017 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.

View File

@ -113,7 +113,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin\icutest59.dll</OutputFile>
<OutputFile>..\..\..\bin\icutest60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\..\lib\icutest.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -157,7 +157,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin\icutest59d.dll</OutputFile>
<OutputFile>..\..\..\bin\icutest60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\..\lib\icutestd.pdb</ProgramDatabaseFile>
@ -198,7 +198,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin64\icutest59.dll</OutputFile>
<OutputFile>..\..\..\bin64\icutest60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<ProgramDatabaseFile>.\..\..\..\lib64\icutest.pdb</ProgramDatabaseFile>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -240,7 +240,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin64\icutest59d.dll</OutputFile>
<OutputFile>..\..\..\bin64\icutest60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\..\..\..\lib64\icutestd.pdb</ProgramDatabaseFile>

View File

@ -27,7 +27,7 @@ TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/common -I$(srcdir)/../toolutil
LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
OBJECTS = gennorm2.o n2builder.o
OBJECTS = gennorm2.o n2builder.o extradata.o norms.o
DEPS = $(OBJECTS:.o=.d)

View File

@ -0,0 +1,229 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// extradata.cpp
// created: 2017jun04 Markus W. Scherer
// (pulled out of n2builder.cpp)
#include "unicode/utypes.h"
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/errorcode.h"
#include "unicode/unistr.h"
#include "unicode/utf16.h"
#include "extradata.h"
#include "normalizer2impl.h"
#include "norms.h"
#include "toolutil.h"
#include "utrie2.h"
#include "uvectr32.h"
U_NAMESPACE_BEGIN
ExtraData::ExtraData(Norms &n, UBool fast) :
Norms::Enumerator(n),
yesYesCompositions(1000, (UChar32)0xffff, 2), // 0=inert, 1=Jamo L, 2=start of compositions
yesNoMappingsAndCompositions(1000, (UChar32)0, 1), // 0=Hangul, 1=start of normal data
optimizeFast(fast) {}
int32_t ExtraData::writeMapping(UChar32 c, const Norm &norm, UnicodeString &dataString) {
UnicodeString &m=*norm.mapping;
int32_t length=m.length();
if(length>Normalizer2Impl::MAPPING_LENGTH_MASK) {
fprintf(stderr,
"gennorm2 error: "
"mapping for U+%04lX longer than maximum of %d\n",
(long)c, Normalizer2Impl::MAPPING_LENGTH_MASK);
exit(U_INVALID_FORMAT_ERROR);
}
// Write the mapping & raw mapping extraData.
int32_t firstUnit=length|(norm.trailCC<<8);
int32_t preMappingLength=0;
if(norm.rawMapping!=NULL) {
UnicodeString &rm=*norm.rawMapping;
int32_t rmLength=rm.length();
if(rmLength>Normalizer2Impl::MAPPING_LENGTH_MASK) {
fprintf(stderr,
"gennorm2 error: "
"raw mapping for U+%04lX longer than maximum of %d\n",
(long)c, Normalizer2Impl::MAPPING_LENGTH_MASK);
exit(U_INVALID_FORMAT_ERROR);
}
UChar rm0=rm.charAt(0);
if( rmLength==length-1 &&
// 99: overlong substring lengths get pinned to remainder lengths anyway
0==rm.compare(1, 99, m, 2, 99) &&
rm0>Normalizer2Impl::MAPPING_LENGTH_MASK
) {
// Compression:
// rawMapping=rm0+mapping.substring(2) -> store only rm0
//
// The raw mapping is the same as the final mapping after replacing
// the final mapping's first two code units with the raw mapping's first one.
// In this case, we store only that first unit, rm0.
// This helps with a few hundred mappings.
dataString.append(rm0);
preMappingLength=1;
} else {
// Store the raw mapping with its length.
dataString.append(rm);
dataString.append((UChar)rmLength);
preMappingLength=rmLength+1;
}
firstUnit|=Normalizer2Impl::MAPPING_HAS_RAW_MAPPING;
}
int32_t cccLccc=norm.cc|(norm.leadCC<<8);
if(cccLccc!=0) {
dataString.append((UChar)cccLccc);
++preMappingLength;
firstUnit|=Normalizer2Impl::MAPPING_HAS_CCC_LCCC_WORD;
}
if(norm.hasNoCompBoundaryAfter) {
firstUnit|=Normalizer2Impl::MAPPING_NO_COMP_BOUNDARY_AFTER;
}
dataString.append((UChar)firstUnit);
dataString.append(m);
return preMappingLength;
}
int32_t ExtraData::writeNoNoMapping(UChar32 c, const Norm &norm,
UnicodeString &dataString,
Hashtable &previousMappings) {
UnicodeString newMapping;
int32_t offset=writeMapping(c, norm, newMapping);
int32_t previousOffset=previousMappings.geti(newMapping);
if(previousOffset!=0) {
// Duplicate, point to the identical mapping that has already been stored.
offset=previousOffset-1;
} else {
// Append this new mapping and
// enter it into the hashtable, avoiding value 0 which is "not found".
offset=dataString.length()+offset;
dataString.append(newMapping);
IcuToolErrorCode errorCode("gennorm2/writeExtraData()/Hashtable.puti()");
previousMappings.puti(newMapping, offset+1, errorCode);
}
return offset;
}
void ExtraData::writeCompositions(UChar32 c, const Norm &norm, UnicodeString &dataString) {
if(norm.cc!=0) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX combines-forward and has ccc!=0, not possible in Unicode normalization\n",
(long)c);
exit(U_INVALID_FORMAT_ERROR);
}
int32_t length;
const CompositionPair *pairs=norm.getCompositionPairs(length);
for(int32_t i=0; i<length; ++i) {
const CompositionPair &pair=pairs[i];
// 22 bits for the composite character and whether it combines forward.
UChar32 compositeAndFwd=pair.composite<<1;
if(norms.getNormRef(pair.composite).compositions!=NULL) {
compositeAndFwd|=1; // The composite character also combines-forward.
}
// Encode most pairs in two units and some in three.
int32_t firstUnit, secondUnit, thirdUnit;
if(pair.trail<Normalizer2Impl::COMP_1_TRAIL_LIMIT) {
if(compositeAndFwd<=0xffff) {
firstUnit=pair.trail<<1;
secondUnit=compositeAndFwd;
thirdUnit=-1;
} else {
firstUnit=(pair.trail<<1)|Normalizer2Impl::COMP_1_TRIPLE;
secondUnit=compositeAndFwd>>16;
thirdUnit=compositeAndFwd;
}
} else {
firstUnit=(Normalizer2Impl::COMP_1_TRAIL_LIMIT+
(pair.trail>>Normalizer2Impl::COMP_1_TRAIL_SHIFT))|
Normalizer2Impl::COMP_1_TRIPLE;
secondUnit=(pair.trail<<Normalizer2Impl::COMP_2_TRAIL_SHIFT)|
(compositeAndFwd>>16);
thirdUnit=compositeAndFwd;
}
// Set the high bit of the first unit if this is the last composition pair.
if(i==(length-1)) {
firstUnit|=Normalizer2Impl::COMP_1_LAST_TUPLE;
}
dataString.append((UChar)firstUnit).append((UChar)secondUnit);
if(thirdUnit>=0) {
dataString.append((UChar)thirdUnit);
}
}
}
void ExtraData::rangeHandler(UChar32 start, UChar32 end, Norm &norm) {
if(start!=end) {
fprintf(stderr,
"gennorm2 error: unexpected shared data for "
"multiple code points U+%04lX..U+%04lX\n",
(long)start, (long)end);
exit(U_INTERNAL_PROGRAM_ERROR);
}
if(norm.error!=nullptr) {
fprintf(stderr, "gennorm2 error: U+%04lX %s\n", (long)start, norm.error);
exit(U_INVALID_FORMAT_ERROR);
}
writeExtraData(start, norm);
}
void ExtraData::writeExtraData(UChar32 c, Norm &norm) {
switch(norm.type) {
case Norm::INERT:
break; // no extra data
case Norm::YES_YES_COMBINES_FWD:
norm.offset=yesYesCompositions.length();
writeCompositions(c, norm, yesYesCompositions);
break;
case Norm::YES_NO_COMBINES_FWD:
norm.offset=yesNoMappingsAndCompositions.length()+
writeMapping(c, norm, yesNoMappingsAndCompositions);
writeCompositions(c, norm, yesNoMappingsAndCompositions);
break;
case Norm::YES_NO_MAPPING_ONLY:
norm.offset=yesNoMappingsOnly.length()+
writeMapping(c, norm, yesNoMappingsOnly);
break;
case Norm::NO_NO:
if(norm.cc==0 && !optimizeFast) {
// Try a compact, algorithmic encoding.
// Only for ccc=0, because we can't store additional information
// and we do not recursively follow an algorithmic encoding for access to the ccc.
//
// Also, if hasNoCompBoundaryAfter is set, we can only use the algorithmic encoding
// if the mappingCP decomposes further, to ensure that there is a place to store it.
// We want to see that the final mapping does not have exactly 1 code point,
// or else we would have to recursively ensure that the final mapping is stored
// in normal extraData.
if(norm.mappingCP>=0 &&
(!norm.hasNoCompBoundaryAfter || 1!=norm.mapping->countChar32())) {
int32_t delta=norm.mappingCP-c;
if(-Normalizer2Impl::MAX_DELTA<=delta && delta<=Normalizer2Impl::MAX_DELTA) {
norm.type=Norm::NO_NO_DELTA;
norm.offset=delta;
break;
}
}
}
// TODO: minMappingNotCompYes, minMappingNoCompBoundaryBefore
norm.offset=writeNoNoMapping(c, norm, noNoMappings, previousNoNoMappings);
break;
case Norm::MAYBE_YES_COMBINES_FWD:
norm.offset=maybeYesCompositions.length();
writeCompositions(c, norm, maybeYesCompositions);
break;
case Norm::MAYBE_YES_SIMPLE:
break; // no extra data
case Norm::YES_YES_WITH_CC:
break; // no extra data
default: // Should not occur.
exit(U_INTERNAL_PROGRAM_ERROR);
}
}
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_NORMALIZATION

View File

@ -0,0 +1,63 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// extradata.h
// created: 2017jun04 Markus W. Scherer
// (pulled out of n2builder.cpp)
// Write mappings and compositions in compact form for Normalizer2 "extra data",
// the data that does not fit into the trie itself.
#ifndef __EXTRADATA_H__
#define __EXTRADATA_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/errorcode.h"
#include "unicode/unistr.h"
#include "unicode/utf16.h"
#include "hash.h"
#include "norms.h"
#include "toolutil.h"
#include "utrie2.h"
#include "uvectr32.h"
U_NAMESPACE_BEGIN
class ExtraData : public Norms::Enumerator {
public:
ExtraData(Norms &n, UBool fast);
void rangeHandler(UChar32 start, UChar32 end, Norm &norm) override;
UnicodeString maybeYesCompositions;
UnicodeString yesYesCompositions;
UnicodeString yesNoMappingsAndCompositions;
UnicodeString yesNoMappingsOnly;
UnicodeString noNoMappings;
private:
/**
* Requires norm.hasMapping().
* Returns the offset of the "first unit" from the beginning of the extraData for c.
* That is the same as the length of the optional data
* for the raw mapping and the ccc/lccc word.
*/
int32_t writeMapping(UChar32 c, const Norm &norm, UnicodeString &dataString);
int32_t writeNoNoMapping(UChar32 c, const Norm &norm,
UnicodeString &dataString, Hashtable &previousMappings);
/** Requires norm.compositions!=nullptr. */
void writeCompositions(UChar32 c, const Norm &norm, UnicodeString &dataString);
void writeExtraData(UChar32 c, Norm &norm);
UBool optimizeFast;
Hashtable previousNoNoMappings; // If constructed in runtime code, pass in UErrorCode.
};
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_NORMALIZATION
#endif // __EXTRADATA_H__

View File

@ -249,11 +249,15 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="extradata.cpp" />
<ClCompile Include="gennorm2.cpp" />
<ClCompile Include="n2builder.cpp" />
<ClCompile Include="norms.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="extradata.h" />
<ClInclude Include="n2builder.h" />
<ClInclude Include="norms.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\common\common.vcxproj">

File diff suppressed because it is too large Load Diff

View File

@ -28,16 +28,12 @@
#include "normalizer2impl.h" // for IX_COUNT
#include "toolutil.h"
#include "utrie2.h"
#include "norms.h"
U_NAMESPACE_BEGIN
extern UBool beVerbose, haveCopyright;
struct Norm;
class BuilderReorderingBuffer;
class ExtraDataWriter;
class Normalizer2DataBuilder {
public:
Normalizer2DataBuilder(UErrorCode &errorCode);
@ -69,42 +65,36 @@ public:
void writeCSourceFile(const char *filename);
private:
friend class CompositionBuilder;
friend class Decomposer;
friend class ExtraDataWriter;
friend class Norm16Writer;
// No copy constructor nor assignment operator.
Normalizer2DataBuilder(const Normalizer2DataBuilder &other);
Normalizer2DataBuilder &operator=(const Normalizer2DataBuilder &other);
Normalizer2DataBuilder(const Normalizer2DataBuilder &other) = delete;
Normalizer2DataBuilder &operator=(const Normalizer2DataBuilder &other) = delete;
Norm *allocNorm();
Norm *getNorm(UChar32 c);
Norm *createNorm(UChar32 c);
Norm *checkNormForMapping(Norm *p, UChar32 c); // check for permitted overrides
const Norm &getNormRef(UChar32 c) const;
uint8_t getCC(UChar32 c) const;
UBool combinesWithCCBetween(const Norm &norm, uint8_t lowCC, uint8_t highCC) const;
UChar32 combine(const Norm &norm, UChar32 trail) const;
/**
* Computes the MAPPING_NO_COMP_BOUNDARY_AFTER flag for a character's mapping
* (especially for a "YesNo" which has a round-trip mapping).
* This flag is used in Normalizer2Impl::hasCompBoundaryAfter().
*
* A starter character with a mapping does not have a composition boundary after it
* if the character itself combines-forward (which is tested by the caller of this function),
* or it is deleted (mapped to the empty string),
* or its mapping contains no starter,
* or the last starter combines-forward.
*/
UBool hasNoCompBoundaryAfter(const BuilderReorderingBuffer &buffer);
void postProcess(Norm &norm);
void addComposition(UChar32 start, UChar32 end, uint32_t value);
UBool decompose(UChar32 start, UChar32 end, uint32_t value);
void reorder(Norm *p, BuilderReorderingBuffer &buffer);
UBool hasNoCompBoundaryAfter(BuilderReorderingBuffer &buffer);
void setHangulData();
int32_t writeMapping(UChar32 c, const Norm *p, UnicodeString &dataString);
void writeCompositions(UChar32 c, const Norm *p, UnicodeString &dataString);
void writeExtraData(UChar32 c, uint32_t value, ExtraDataWriter &writer);
void setSmallFCD(UChar32 c);
int32_t getCenterNoNoDelta() {
return indexes[Normalizer2Impl::IX_MIN_MAYBE_YES]-Normalizer2Impl::MAX_DELTA-1;
}
void writeNorm16(UChar32 start, UChar32 end, uint32_t value);
void writeNorm16(UChar32 start, UChar32 end, Norm &norm);
void setHangulData();
void processData();
UTrie2 *normTrie;
UToolMemory *normMem;
Norm *norms;
Norms norms;
int32_t phase;
OverrideHandling overrideHandling;

View File

@ -0,0 +1,324 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// norms.cpp
// created: 2017jun04 Markus W. Scherer
// (pulled out of n2builder.cpp)
#include "unicode/utypes.h"
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/errorcode.h"
#include "unicode/unistr.h"
#include "unicode/utf16.h"
#include "normalizer2impl.h"
#include "norms.h"
#include "toolutil.h"
#include "utrie2.h"
#include "uvectr32.h"
U_NAMESPACE_BEGIN
void BuilderReorderingBuffer::append(UChar32 c, uint8_t cc) {
if(cc==0 || fLength==0 || ccAt(fLength-1)<=cc) {
if(cc==0) {
fLastStarterIndex=fLength;
}
fArray[fLength++]=(c<<8)|cc;
return;
}
// Let this character bubble back to its canonical order.
int32_t i=fLength-1;
while(i>fLastStarterIndex && ccAt(i)>cc) {
--i;
}
++i; // after the last starter or prevCC<=cc
// Move this and the following characters forward one to make space.
for(int32_t j=fLength; i<j; --j) {
fArray[j]=fArray[j-1];
}
fArray[i]=(c<<8)|cc;
++fLength;
fDidReorder=TRUE;
}
void BuilderReorderingBuffer::toString(UnicodeString &dest) const {
dest.remove();
for(int32_t i=0; i<fLength; ++i) {
dest.append(charAt(i));
}
}
UChar32 Norm::combine(UChar32 trail) const {
int32_t length;
const CompositionPair *pairs=getCompositionPairs(length);
for(int32_t i=0; i<length; ++i) {
if(trail==pairs[i].trail) {
return pairs[i].composite;
}
if(trail<pairs[i].trail) {
break;
}
}
return U_SENTINEL;
}
Norms::Norms(UErrorCode &errorCode) {
normTrie=utrie2_open(0, 0, &errorCode);
normMem=utm_open("gennorm2 normalization structs", 10000, 0x110100, sizeof(Norm));
// Default "inert" Norm struct at index 0. Practically immutable.
norms=allocNorm();
norms->type=Norm::INERT;
}
Norms::~Norms() {
utrie2_close(normTrie);
int32_t normsLength=utm_countItems(normMem);
for(int32_t i=1; i<normsLength; ++i) {
delete norms[i].mapping;
delete norms[i].rawMapping;
delete norms[i].compositions;
}
utm_close(normMem);
}
Norm *Norms::allocNorm() {
Norm *p=(Norm *)utm_alloc(normMem);
norms=(Norm *)utm_getStart(normMem); // in case it got reallocated
return p;
}
Norm *Norms::getNorm(UChar32 c) {
uint32_t i=utrie2_get32(normTrie, c);
if(i==0) {
return nullptr;
}
return norms+i;
}
const Norm &Norms::getNormRef(UChar32 c) const {
return norms[utrie2_get32(normTrie, c)];
}
Norm *Norms::createNorm(UChar32 c) {
uint32_t i=utrie2_get32(normTrie, c);
if(i!=0) {
return norms+i;
} else {
/* allocate Norm */
Norm *p=allocNorm();
IcuToolErrorCode errorCode("gennorm2/createNorm()");
utrie2_set32(normTrie, c, (uint32_t)(p-norms), errorCode);
return p;
}
}
void Norms::reorder(UnicodeString &mapping, BuilderReorderingBuffer &buffer) const {
int32_t length=mapping.length();
if(length>Normalizer2Impl::MAPPING_LENGTH_MASK) {
return; // writeMapping() will complain about it and print the code point.
}
const char16_t *s=mapping.getBuffer();
int32_t i=0;
UChar32 c;
while(i<length) {
U16_NEXT(s, i, length, c);
buffer.append(c, getCC(c));
}
if(buffer.didReorder()) {
buffer.toString(mapping);
}
}
UBool Norms::combinesWithCCBetween(const Norm &norm, uint8_t lowCC, int32_t highCC) const {
if((highCC-lowCC)>=2) {
int32_t length;
const CompositionPair *pairs=norm.getCompositionPairs(length);
for(int32_t i=0; i<length; ++i) {
uint8_t trailCC=getCC(pairs[i].trail);
if(lowCC<trailCC && trailCC<highCC) {
return TRUE;
}
}
}
return FALSE;
}
U_CDECL_BEGIN
static UBool U_CALLCONV
enumRangeHandler(const void *context, UChar32 start, UChar32 end, uint32_t value) {
return ((Norms::Enumerator *)context)->rangeHandler(start, end, value);
}
U_CDECL_END
void Norms::enumRanges(Enumerator &e) {
utrie2_enum(normTrie, nullptr, enumRangeHandler, &e);
}
Norms::Enumerator::~Enumerator() {}
UBool Norms::Enumerator::rangeHandler(UChar32 start, UChar32 end, uint32_t value) {
if(value!=0) {
rangeHandler(start, end, norms.getNormRefByIndex(value));
}
return TRUE;
}
void CompositionBuilder::rangeHandler(UChar32 start, UChar32 end, Norm &norm) {
if(norm.mappingType!=Norm::ROUND_TRIP) { return; }
if(start!=end) {
fprintf(stderr,
"gennorm2 error: same round-trip mapping for "
"more than 1 code point U+%04lX..U+%04lX\n",
(long)start, (long)end);
exit(U_INVALID_FORMAT_ERROR);
}
if(norm.cc!=0) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX has a round-trip mapping and ccc!=0, "
"not possible in Unicode normalization\n",
(long)start);
exit(U_INVALID_FORMAT_ERROR);
}
// setRoundTripMapping() ensured that there are exactly two code points.
const UnicodeString &m=*norm.mapping;
UChar32 lead=m.char32At(0);
UChar32 trail=m.char32At(m.length()-1);
if(norms.getCC(lead)!=0) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX's round-trip mapping's starter U+%04lX has ccc!=0, "
"not possible in Unicode normalization\n",
(long)start, (long)lead);
exit(U_INVALID_FORMAT_ERROR);
}
// Flag for trailing character.
norms.createNorm(trail)->combinesBack=TRUE;
// Insert (trail, composite) pair into compositions list for the lead character.
IcuToolErrorCode errorCode("gennorm2/addComposition()");
Norm *leadNorm=norms.createNorm(lead);
UVector32 *compositions=leadNorm->compositions;
int32_t i;
if(compositions==nullptr) {
compositions=leadNorm->compositions=new UVector32(errorCode);
i=0; // "insert" the first pair at index 0
} else {
// Insertion sort, and check for duplicate trail characters.
int32_t length;
const CompositionPair *pairs=leadNorm->getCompositionPairs(length);
for(i=0; i<length; ++i) {
if(trail==pairs[i].trail) {
fprintf(stderr,
"gennorm2 error: same round-trip mapping for "
"more than 1 code point (e.g., U+%04lX) to U+%04lX + U+%04lX\n",
(long)start, (long)lead, (long)trail);
exit(U_INVALID_FORMAT_ERROR);
}
if(trail<pairs[i].trail) {
break;
}
}
}
compositions->insertElementAt(trail, 2*i, errorCode);
compositions->insertElementAt(start, 2*i+1, errorCode);
}
void Decomposer::rangeHandler(UChar32 start, UChar32 end, Norm &norm) {
if(!norm.hasMapping()) { return; }
const UnicodeString &m=*norm.mapping;
UnicodeString *decomposed=nullptr;
const UChar *s=toUCharPtr(m.getBuffer());
int32_t length=m.length();
int32_t prev, i=0;
UChar32 c;
while(i<length) {
prev=i;
U16_NEXT(s, i, length, c);
if(start<=c && c<=end) {
fprintf(stderr,
"gennorm2 error: U+%04lX maps to itself directly or indirectly\n",
(long)c);
exit(U_INVALID_FORMAT_ERROR);
}
const Norm &cNorm=norms.getNormRef(c);
if(cNorm.hasMapping()) {
if(norm.mappingType==Norm::ROUND_TRIP) {
if(prev==0) {
if(cNorm.mappingType!=Norm::ROUND_TRIP) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX's round-trip mapping's starter "
"U+%04lX one-way-decomposes, "
"not possible in Unicode normalization\n",
(long)start, (long)c);
exit(U_INVALID_FORMAT_ERROR);
}
uint8_t myTrailCC=norms.getCC(m.char32At(i));
UChar32 cTrailChar=cNorm.mapping->char32At(cNorm.mapping->length()-1);
uint8_t cTrailCC=norms.getCC(cTrailChar);
if(cTrailCC>myTrailCC) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX's round-trip mapping's starter "
"U+%04lX decomposes and the "
"inner/earlier tccc=%hu > outer/following tccc=%hu, "
"not possible in Unicode normalization\n",
(long)start, (long)c,
(short)cTrailCC, (short)myTrailCC);
exit(U_INVALID_FORMAT_ERROR);
}
} else {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX's round-trip mapping's non-starter "
"U+%04lX decomposes, "
"not possible in Unicode normalization\n",
(long)start, (long)c);
exit(U_INVALID_FORMAT_ERROR);
}
}
if(decomposed==nullptr) {
decomposed=new UnicodeString(m, 0, prev);
}
decomposed->append(*cNorm.mapping);
} else if(Hangul::isHangul(c)) {
UChar buffer[3];
int32_t hangulLength=Hangul::decompose(c, buffer);
if(norm.mappingType==Norm::ROUND_TRIP && prev!=0) {
fprintf(stderr,
"gennorm2 error: "
"U+%04lX's round-trip mapping's non-starter "
"U+%04lX decomposes, "
"not possible in Unicode normalization\n",
(long)start, (long)c);
exit(U_INVALID_FORMAT_ERROR);
}
if(decomposed==nullptr) {
decomposed=new UnicodeString(m, 0, prev);
}
decomposed->append(buffer, hangulLength);
} else if(decomposed!=nullptr) {
decomposed->append(m, prev, i-prev);
}
}
if(decomposed!=nullptr) {
if(norm.rawMapping==nullptr) {
// Remember the original mapping when decomposing recursively.
norm.rawMapping=norm.mapping;
} else {
delete norm.mapping;
}
norm.mapping=decomposed;
// Not norm.setMappingCP(); because the original mapping
// is most likely to be encodable as a delta.
didDecompose|=TRUE;
}
}
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_NORMALIZATION

View File

@ -0,0 +1,205 @@
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// norms.h
// created: 2017jun04 Markus W. Scherer
// (pulled out of n2builder.cpp)
// Storing & manipulating Normalizer2 builder data.
#ifndef __NORMS_H__
#define __NORMS_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/errorcode.h"
#include "unicode/unistr.h"
#include "unicode/utf16.h"
#include "normalizer2impl.h"
#include "toolutil.h"
#include "utrie2.h"
#include "uvectr32.h"
U_NAMESPACE_BEGIN
class BuilderReorderingBuffer {
public:
BuilderReorderingBuffer() : fLength(0), fLastStarterIndex(-1), fDidReorder(FALSE) {}
void reset() {
fLength=0;
fLastStarterIndex=-1;
fDidReorder=FALSE;
}
int32_t length() const { return fLength; }
UBool isEmpty() const { return fLength==0; }
int32_t lastStarterIndex() const { return fLastStarterIndex; }
UChar32 charAt(int32_t i) const { return fArray[i]>>8; }
uint8_t ccAt(int32_t i) const { return (uint8_t)fArray[i]; }
UBool didReorder() const { return fDidReorder; }
void append(UChar32 c, uint8_t cc);
void toString(UnicodeString &dest) const;
private:
int32_t fArray[Normalizer2Impl::MAPPING_LENGTH_MASK];
int32_t fLength;
int32_t fLastStarterIndex;
UBool fDidReorder;
};
struct CompositionPair {
CompositionPair(UChar32 t, UChar32 c) : trail(t), composite(c) {}
UChar32 trail, composite;
};
struct Norm {
enum MappingType { NONE, REMOVED, ROUND_TRIP, ONE_WAY };
UBool hasMapping() const { return mappingType>REMOVED; }
// Requires hasMapping() and well-formed mapping.
void setMappingCP() {
UChar32 c;
if(!mapping->isEmpty() && mapping->length()==U16_LENGTH(c=mapping->char32At(0))) {
mappingCP=c;
} else {
mappingCP=U_SENTINEL;
}
}
const CompositionPair *getCompositionPairs(int32_t &length) const {
if(compositions==nullptr) {
length=0;
return nullptr;
} else {
length=compositions->size()/2;
return reinterpret_cast<const CompositionPair *>(compositions->getBuffer());
}
}
UChar32 combine(UChar32 trail) const;
UnicodeString *mapping;
UnicodeString *rawMapping; // non-nullptr if the mapping is further decomposed
UChar32 mappingCP; // >=0 if mapping to 1 code point
int32_t mappingPhase;
MappingType mappingType;
UVector32 *compositions; // (trail, composite) pairs
uint8_t cc, leadCC, trailCC;
UBool combinesBack;
UBool hasNoCompBoundaryAfter;
/**
* Overall type of normalization properties.
* Set after most processing is done.
*
* Corresponds to the rows in the chart on
* http://site.icu-project.org/design/normalization/custom
* in numerical (but reverse visual) order.
*
* YES_NO means composition quick check=yes, decomposition QC=no -- etc.
*/
enum Type {
/** Initial value until most processing is done. */
UNKNOWN,
/** No mapping, does not combine, ccc=0. */
INERT,
/** Starter, no mapping, has compositions. */
YES_YES_COMBINES_FWD,
/** Starter with a round-trip mapping and compositions. */
YES_NO_COMBINES_FWD,
/** Starter with a round-trip mapping but no compositions. */
YES_NO_MAPPING_ONLY,
// TODO: minMappingNotCompYes, minMappingNoCompBoundaryBefore
/** Has a one-way mapping. */
NO_NO,
/** Has an algorithmic one-way mapping to a single code point. */
NO_NO_DELTA,
/**
* Combines both backward and forward, has compositions.
* Allowed, but not normally used.
*/
MAYBE_YES_COMBINES_FWD,
/** Combines only backward. */
MAYBE_YES_SIMPLE,
/** Non-zero ccc but does not combine backward. */
YES_YES_WITH_CC
} type;
/** Offset into the type's part of the extra data, or the algorithmic-mapping delta. */
int32_t offset;
/**
* Error string set by processing functions that do not have access
* to the code point, deferred for readable reporting.
*/
const char *error;
};
class Norms {
public:
Norms(UErrorCode &errorCode);
~Norms();
int32_t length() const { return utm_countItems(normMem); }
const Norm &getNormRefByIndex(int32_t i) const { return norms[i]; }
Norm &getNormRefByIndex(int32_t i) { return norms[i]; }
Norm *allocNorm();
/** Returns an existing Norm unit, or nullptr if c has no data. */
Norm *getNorm(UChar32 c);
/** Returns a Norm unit, creating a new one if necessary. */
Norm *createNorm(UChar32 c);
/** Returns an existing Norm unit, or an immutable empty object if c has no data. */
const Norm &getNormRef(UChar32 c) const;
uint8_t getCC(UChar32 c) const { return getNormRef(c).cc; }
void reorder(UnicodeString &mapping, BuilderReorderingBuffer &buffer) const;
// int32_t highCC not uint8_t so that we can pass in 256 as the upper limit.
UBool combinesWithCCBetween(const Norm &norm, uint8_t lowCC, int32_t highCC) const;
class Enumerator {
public:
Enumerator(Norms &n) : norms(n) {}
virtual ~Enumerator();
/** Called for enumerated value!=0. */
virtual void rangeHandler(UChar32 start, UChar32 end, Norm &norm) = 0;
/** @internal Public only for C callback. */
UBool rangeHandler(UChar32 start, UChar32 end, uint32_t value);
protected:
Norms &norms;
};
void enumRanges(Enumerator &e);
private:
Norms(const Norms &other) = delete;
Norms &operator=(const Norms &other) = delete;
UTrie2 *normTrie;
UToolMemory *normMem;
Norm *norms;
};
class CompositionBuilder : public Norms::Enumerator {
public:
CompositionBuilder(Norms &n) : Norms::Enumerator(n) {}
/** Adds a composition mapping for the first character in a round-trip mapping. */
void rangeHandler(UChar32 start, UChar32 end, Norm &norm) override;
};
class Decomposer : public Norms::Enumerator {
public:
Decomposer(Norms &n) : Norms::Enumerator(n), didDecompose(FALSE) {}
/** Decomposes each character of the current mapping. Sets didDecompose if any. */
void rangeHandler(UChar32 start, UChar32 end, Norm &norm) override;
UBool didDecompose;
};
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_NORMALIZATION
#endif // __NORMS_H__

View File

@ -113,7 +113,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin\icutu59.dll</OutputFile>
<OutputFile>..\..\..\bin\icutu60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\..\..\..\lib\icutu.pdb</ProgramDatabaseFile>
@ -158,7 +158,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin\icutu59d.dll</OutputFile>
<OutputFile>..\..\..\bin\icutu60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@ -201,7 +201,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin64\icutu59.dll</OutputFile>
<OutputFile>..\..\..\bin64\icutu60.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ProgramDatabaseFile>.\..\..\..\lib64\icutu.pdb</ProgramDatabaseFile>
@ -244,7 +244,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<OutputFile>..\..\..\bin64\icutu59d.dll</OutputFile>
<OutputFile>..\..\..\bin64\icutu60d.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>

View File

@ -77,7 +77,7 @@ u_parseDelimitedFile(const char *filename, char delimiter,
UParseLineFn *lineFn, void *context,
UErrorCode *pErrorCode) {
FileStream *file;
char line[300];
char line[10000];
char *start, *limit;
int32_t i, length;
@ -163,7 +163,7 @@ u_parseDelimitedFile(const char *filename, char delimiter,
}
}
/* error in a field function? */
/* too few fields? */
if(U_FAILURE(*pErrorCode)) {
break;
}

View File

@ -4,8 +4,8 @@
#* Copyright (C) 2009-2016, International Business Machines Corporation and *
#* others. All Rights Reserved. *
#*******************************************************************************
api.report.version = 59
api.report.prev.version = 58
release.file.ver = 59_1
api.doc.version = 59.1
api.report.version = 60
api.report.prev.version = 59
release.file.ver = 60m1
api.doc.version = 60 Milestone 1

View File

@ -34,6 +34,8 @@ com/ibm/icu/impl/CacheValue$Strength#values:()[Lcom/ibm/icu/impl/CacheValue$Stre
com/ibm/icu/impl/CalendarUtil#<init>:()V
com/ibm/icu/impl/CaseMap#<init>:()V
com/ibm/icu/impl/CaseMap$GreekUpper#<init>:()V
com/ibm/icu/impl/CaseMapImpl#<init>:()V
com/ibm/icu/impl/CaseMapImpl$GreekUpper#<init>:()V
com/ibm/icu/impl/CharacterIteration#<init>:()V
com/ibm/icu/impl/CharTrie#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/CharTrie#getBMPValue:(C)C
@ -117,11 +119,6 @@ com/ibm/icu/impl/DateNumberFormat#getMinimumIntegerDigits:()I
com/ibm/icu/impl/DateNumberFormat#getZeroDigit:()C
com/ibm/icu/impl/DateNumberFormat#hashCode:()I
com/ibm/icu/impl/DateNumberFormat#setZeroDigit:(C)V
com/ibm/icu/impl/DayPeriodRules#getEndHourForDayPeriod:(Lcom/ibm/icu/impl/DayPeriodRules$DayPeriod;)I
com/ibm/icu/impl/DayPeriodRules#getMidPointForDayPeriod:(Lcom/ibm/icu/impl/DayPeriodRules$DayPeriod;)D
com/ibm/icu/impl/DayPeriodRules#getStartHourForDayPeriod:(Lcom/ibm/icu/impl/DayPeriodRules$DayPeriod;)I
com/ibm/icu/impl/DayPeriodRules#hasMidnight:()Z
com/ibm/icu/impl/DayPeriodRules#hasNoon:()Z
com/ibm/icu/impl/DayPeriodRules$CutoffType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/DayPeriodRules$CutoffType;
com/ibm/icu/impl/DayPeriodRules$CutoffType#values:()[Lcom/ibm/icu/impl/DayPeriodRules$CutoffType;
com/ibm/icu/impl/DayPeriodRules$DayPeriod#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/DayPeriodRules$DayPeriod;
@ -289,6 +286,87 @@ com/ibm/icu/impl/locale/LocaleValidityChecker$SpecialCase#valueOf:(Ljava/lang/St
com/ibm/icu/impl/locale/ParseStatus#getParseLength:()I
com/ibm/icu/impl/locale/StringTokenIterator#first:()Ljava/lang/String;
com/ibm/icu/impl/locale/StringTokenIterator#setText:(Ljava/lang/String;)Lcom/ibm/icu/impl/locale/StringTokenIterator;
com/ibm/icu/impl/locale/XCldrStub#<init>:()V
com/ibm/icu/impl/locale/XCldrStub#join:([Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/impl/locale/XCldrStub$CollectionUtilities#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$CollectionUtilities#join:(Ljava/lang/Iterable;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/impl/locale/XCldrStub$FileUtilities#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$FileUtilities#getRelativeFileName:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/impl/locale/XCldrStub$ImmutableMap#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$ImmutableMultimap#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$ImmutableSet#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$Joiner#join:([Ljava/lang/Object;)Ljava/lang/String;
com/ibm/icu/impl/locale/XCldrStub$Multimap#hashCode:()I
com/ibm/icu/impl/locale/XCldrStub$Multimap#keySet:()Ljava/util/Set;
com/ibm/icu/impl/locale/XCldrStub$Multimap#putAll:(Ljava/util/Collection;Ljava/lang/Object;)V
com/ibm/icu/impl/locale/XCldrStub$MultimapIterator#remove:()V
com/ibm/icu/impl/locale/XCldrStub$Multimaps#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$Multimaps#forMap:(Ljava/util/Map;)Ljava/util/Map;
com/ibm/icu/impl/locale/XCldrStub$Multimaps#invertFrom:(Lcom/ibm/icu/impl/locale/XCldrStub$Multimap;Lcom/ibm/icu/impl/locale/XCldrStub$Multimap;)Lcom/ibm/icu/impl/locale/XCldrStub$Multimap;
com/ibm/icu/impl/locale/XCldrStub$RegexUtilities#<init>:()V
com/ibm/icu/impl/locale/XCldrStub$RegexUtilities#findMismatch:(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)I
com/ibm/icu/impl/locale/XCldrStub$RegexUtilities#showMismatch:(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)Ljava/lang/String;
com/ibm/icu/impl/locale/XCldrStub$ReusableEntry#setValue:(Ljava/lang/Object;)Ljava/lang/Object;
com/ibm/icu/impl/locale/XLikelySubtags#getDefault:()Lcom/ibm/icu/impl/locale/XLikelySubtags;
com/ibm/icu/impl/locale/XLikelySubtags#maximize:(Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags#maximize:(Lcom/ibm/icu/util/ULocale;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags#maximize:(Ljava/lang/String;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags#minimizeSubtags:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/ibm/icu/util/ULocale$Minimize;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags#show:(Ljava/util/Map;Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
com/ibm/icu/impl/locale/XLikelySubtags#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLikelySubtags$LSR#from:(Lcom/ibm/icu/util/ULocale;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags$LSR#from:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/ibm/icu/impl/locale/XLikelySubtags$LSR;
com/ibm/icu/impl/locale/XLikelySubtags$LSR#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLikelySubtags$Maker$1#make:()Ljava/util/Map;
com/ibm/icu/impl/locale/XLocaleDistance#fixedName:(Ljava/util/List;)Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance#getContainingMacrosFor:(Ljava/util/Collection;Ljava/util/Set;)Ljava/util/Set;
com/ibm/icu/impl/locale/XLocaleDistance#getDefaultLanguageDistance:()I
com/ibm/icu/impl/locale/XLocaleDistance#invertMap:(Ljava/util/Map;)Lcom/ibm/icu/impl/locale/XCldrStub$Multimap;
com/ibm/icu/impl/locale/XLocaleDistance#main:([Ljava/lang/String;)V
com/ibm/icu/impl/locale/XLocaleDistance#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance#toString:(Z)Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance#xGetMatchVariables:()Ljava/util/Map;
com/ibm/icu/impl/locale/XLocaleDistance#xGetParadigmLocales:()Ljava/util/Set;
com/ibm/icu/impl/locale/XLocaleDistance$DistanceNode#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/locale/XLocaleDistance$DistanceNode#hashCode:()I
com/ibm/icu/impl/locale/XLocaleDistance$DistanceNode#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$DistanceTable#compact:()Lcom/ibm/icu/impl/locale/XLocaleDistance$DistanceTable;
com/ibm/icu/impl/locale/XLocaleDistance$DistanceTable#getInternalMatches:()Ljava/util/Map;
com/ibm/icu/impl/locale/XLocaleDistance$DistanceTable#getInternalNode:(Ljava/lang/String;Ljava/lang/String;)Lcom/ibm/icu/impl/locale/XLocaleDistance$DistanceNode;
com/ibm/icu/impl/locale/XLocaleDistance$DistanceTable#isEmpty:()Z
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#<init>:(Ljava/lang/String;Ljava/lang/Object;)V
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#fromId:(I)Ljava/lang/Object;
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#getOldAndAdd:(Ljava/lang/Object;)Ljava/lang/Integer;
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#hashCode:()I
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#intern:(Ljava/lang/Object;)Ljava/lang/Object;
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#size:()I
com/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$RegionMapper#regions:()Ljava/util/Set;
com/ibm/icu/impl/locale/XLocaleDistance$RegionMapper#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$RegionMapper#variables:()Ljava/util/Set;
com/ibm/icu/impl/locale/XLocaleDistance$RegionSet$Operation#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
com/ibm/icu/impl/locale/XLocaleDistance$RegionSet$Operation#values:()[Lcom/ibm/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceNode#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceNode#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#getCloser:(I)Ljava/util/Set;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#getInternalDistance:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Integer;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#toString:(Z)Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleDistance$StringDistanceTable#toString:(ZLjava/lang/String;Lcom/ibm/icu/impl/locale/XLocaleDistance$IdMakerFull;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
com/ibm/icu/impl/locale/XLocaleMatcher#<init>:(Ljava/util/Set;)V
com/ibm/icu/impl/locale/XLocaleMatcher#canonicalize:(Lcom/ibm/icu/util/ULocale;)Lcom/ibm/icu/util/ULocale;
com/ibm/icu/impl/locale/XLocaleMatcher#distance:(Ljava/lang/String;Ljava/lang/String;)I
com/ibm/icu/impl/locale/XLocaleMatcher#getBestMatch:(Ljava/util/Set;)Lcom/ibm/icu/util/ULocale;
com/ibm/icu/impl/locale/XLocaleMatcher#getBestMatch:([Lcom/ibm/icu/util/ULocale;)Lcom/ibm/icu/util/ULocale;
com/ibm/icu/impl/locale/XLocaleMatcher#getThresholdDistance:()I
com/ibm/icu/impl/locale/XLocaleMatcher#match:(Lcom/ibm/icu/util/ULocale;Lcom/ibm/icu/util/ULocale;)D
com/ibm/icu/impl/locale/XLocaleMatcher#match:(Lcom/ibm/icu/util/ULocale;Lcom/ibm/icu/util/ULocale;Lcom/ibm/icu/util/ULocale;Lcom/ibm/icu/util/ULocale;)D
com/ibm/icu/impl/locale/XLocaleMatcher#toString:()Ljava/lang/String;
com/ibm/icu/impl/locale/XLocaleMatcher$Builder#setDemotionPerAdditionalDesiredLocale:(I)Lcom/ibm/icu/impl/locale/XLocaleMatcher$Builder;
com/ibm/icu/impl/locale/XLocaleMatcher$Builder#setLocaleDistance:(Lcom/ibm/icu/impl/locale/XLocaleDistance;)Lcom/ibm/icu/impl/locale/XLocaleMatcher$Builder;
com/ibm/icu/impl/locale/XLocaleMatcher$Builder#setSupportedLocales:(Ljava/util/Set;)Lcom/ibm/icu/impl/locale/XLocaleMatcher$Builder;
com/ibm/icu/impl/LocaleDisplayNamesImpl#getLocale:()Lcom/ibm/icu/util/ULocale;
com/ibm/icu/impl/LocaleDisplayNamesImpl#haveData:(Lcom/ibm/icu/impl/LocaleDisplayNamesImpl$DataTableType;)Z
com/ibm/icu/impl/LocaleDisplayNamesImpl#localeDisplayName:(Ljava/util/Locale;)Ljava/lang/String;
@ -311,6 +389,108 @@ com/ibm/icu/impl/Norm2AllModes$NFKCSingleton#<init>:()V
com/ibm/icu/impl/Normalizer2Impl$Hangul#<init>:()V
com/ibm/icu/impl/Normalizer2Impl$ReorderingBuffer#append:(Ljava/lang/CharSequence;)Lcom/ibm/icu/impl/Normalizer2Impl$ReorderingBuffer;
com/ibm/icu/impl/Normalizer2Impl$UTF16Plus#<init>:()V
com/ibm/icu/impl/number/AffixPatternUtils#<init>:()V
com/ibm/icu/impl/number/Endpoint#<init>:()V
com/ibm/icu/impl/number/Endpoint#fromBTA:(Lcom/ibm/icu/impl/number/Properties;Ljava/util/Locale;)Lcom/ibm/icu/impl/number/Format$SingularFormat;
com/ibm/icu/impl/number/Endpoint#fromBTA:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Format$SingularFormat;
com/ibm/icu/impl/number/Endpoint#fromBTA:(Ljava/lang/String;Lcom/ibm/icu/text/DecimalFormatSymbols;)Lcom/ibm/icu/impl/number/Format$SingularFormat;
com/ibm/icu/impl/number/Endpoint#fromBTA:(Ljava/lang/String;Lcom/ibm/icu/util/ULocale;)Lcom/ibm/icu/impl/number/Format$SingularFormat;
com/ibm/icu/impl/number/Endpoint#fromBTA:(Ljava/lang/String;Ljava/util/Locale;)Lcom/ibm/icu/impl/number/Format$SingularFormat;
com/ibm/icu/impl/number/Endpoint#getProperties:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Properties;
com/ibm/icu/impl/number/Endpoint#getSymbols:(Ljava/util/Locale;)Lcom/ibm/icu/text/DecimalFormatSymbols;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/Properties;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/Properties;Lcom/ibm/icu/text/DecimalFormatSymbols;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/Properties;Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/Properties;Ljava/util/Locale;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/lang/String;Lcom/ibm/icu/text/DecimalFormatSymbols;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/lang/String;Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint#staticFormat:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
com/ibm/icu/impl/number/Endpoint$2#initialValue:()Ljava/util/Map;
com/ibm/icu/impl/number/Format$SingularFormat#format:(Lcom/ibm/icu/impl/number/FormatQuantity;)Ljava/lang/String;
com/ibm/icu/impl/number/Format$SingularFormat#format:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/lang/StringBuffer;)V
com/ibm/icu/impl/number/Format$SingularFormat#format:(Lcom/ibm/icu/impl/number/FormatQuantity;Ljava/text/FieldPosition;)Ljava/lang/String;
com/ibm/icu/impl/number/FormatQuantity1#<init>:(DZ)V
com/ibm/icu/impl/number/FormatQuantity1#<init>:(J)V
com/ibm/icu/impl/number/FormatQuantity1#divideBy:(Ljava/math/BigDecimal;ILjava/math/MathContext;)V
com/ibm/icu/impl/number/FormatQuantity1#getPluralOperand:(Lcom/ibm/icu/text/PluralRules$Operand;)D
com/ibm/icu/impl/number/FormatQuantity1#hasNextInteger:()Z
com/ibm/icu/impl/number/FormatQuantity1#maxRepresentableDigits:()I
com/ibm/icu/impl/number/FormatQuantity2#<init>:(I)V
com/ibm/icu/impl/number/FormatQuantity2#<init>:(J)V
com/ibm/icu/impl/number/FormatQuantity2#<init>:(Ljava/math/BigInteger;)V
com/ibm/icu/impl/number/FormatQuantity2#maxRepresentableDigits:()I
com/ibm/icu/impl/number/FormatQuantity2#readBigIntegerToBcd:(Ljava/math/BigInteger;)V
com/ibm/icu/impl/number/FormatQuantity2#shiftLeft:(I)V
com/ibm/icu/impl/number/FormatQuantity3#<init>:(I)V
com/ibm/icu/impl/number/FormatQuantity3#<init>:(J)V
com/ibm/icu/impl/number/FormatQuantity3#<init>:(Ljava/math/BigInteger;)V
com/ibm/icu/impl/number/FormatQuantity3#maxRepresentableDigits:()I
com/ibm/icu/impl/number/FormatQuantity3#shiftLeft:(I)V
com/ibm/icu/impl/number/FormatQuantity4#maxRepresentableDigits:()I
com/ibm/icu/impl/number/FormatQuantityBCD#fractionCountWithoutTrailingZeros:()I
com/ibm/icu/impl/number/FormatQuantitySelector#<init>:()V
com/ibm/icu/impl/number/FormatQuantitySelector#from:(D)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/FormatQuantitySelector#from:(J)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/FormatQuantitySelector#from:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/FormatQuantitySelector#from:(Ljava/lang/Number;)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/FormatQuantitySelector#from:(Ljava/math/BigDecimal;)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/FormatQuantitySelector#from:(Ljava/math/BigInteger;)Lcom/ibm/icu/impl/number/FormatQuantityBCD;
com/ibm/icu/impl/number/Modifier$BaseModifier#before:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/ModifierHolder;)V
com/ibm/icu/impl/number/Modifier$BaseModifier#getModifier:(Z)Lcom/ibm/icu/impl/number/Modifier;
com/ibm/icu/impl/number/ModifierHolder#peekLast:()Lcom/ibm/icu/impl/number/Modifier;
com/ibm/icu/impl/number/ModifierHolder#removeLast:()Lcom/ibm/icu/impl/number/Modifier;
com/ibm/icu/impl/number/NumberStringBuilder#toDebugString:()Ljava/lang/String;
com/ibm/icu/impl/number/Parse#<init>:()V
com/ibm/icu/impl/number/Parse#parse:(Ljava/lang/String;Lcom/ibm/icu/impl/number/Parse$IProperties;Lcom/ibm/icu/text/DecimalFormatSymbols;)Ljava/lang/Number;
com/ibm/icu/impl/number/Parse#parseCurrency:(Ljava/lang/String;Lcom/ibm/icu/impl/number/Parse$IProperties;Lcom/ibm/icu/text/DecimalFormatSymbols;)Lcom/ibm/icu/util/CurrencyAmount;
com/ibm/icu/impl/number/Parse$AffixHolder#toString:()Ljava/lang/String;
com/ibm/icu/impl/number/Parse$DigitType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Parse$DigitType;
com/ibm/icu/impl/number/Parse$DigitType#values:()[Lcom/ibm/icu/impl/number/Parse$DigitType;
com/ibm/icu/impl/number/Parse$GroupingMode#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Parse$GroupingMode;
com/ibm/icu/impl/number/Parse$ParseMode#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Parse$ParseMode;
com/ibm/icu/impl/number/Parse$SeparatorType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Parse$SeparatorType;
com/ibm/icu/impl/number/Parse$SeparatorType#values:()[Lcom/ibm/icu/impl/number/Parse$SeparatorType;
com/ibm/icu/impl/number/Parse$StateItem#toString:()Ljava/lang/String;
com/ibm/icu/impl/number/Parse$StateName#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/Parse$StateName;
com/ibm/icu/impl/number/PatternString#<init>:()V
com/ibm/icu/impl/number/PatternString$LdmlDecimalPatternParser#<init>:()V
com/ibm/icu/impl/number/RoundingUtils#<init>:()V
com/ibm/icu/impl/number/formatters/CompactDecimalFormat#apply:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/ModifierHolder;Lcom/ibm/icu/text/PluralRules;Lcom/ibm/icu/text/DecimalFormatSymbols;Lcom/ibm/icu/impl/number/formatters/CompactDecimalFormat$IProperties;)V
com/ibm/icu/impl/number/formatters/CompactDecimalFormat#before:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/ModifierHolder;)V
com/ibm/icu/impl/number/formatters/CompactDecimalFormat$CompactType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/formatters/CompactDecimalFormat$CompactType;
com/ibm/icu/impl/number/formatters/CompactDecimalFormat$CompactType#values:()[Lcom/ibm/icu/impl/number/formatters/CompactDecimalFormat$CompactType;
com/ibm/icu/impl/number/formatters/CurrencyFormat#<init>:()V
com/ibm/icu/impl/number/formatters/CurrencyFormat$CurrencyStyle#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/formatters/CurrencyFormat$CurrencyStyle;
com/ibm/icu/impl/number/formatters/MeasureFormat#<init>:()V
com/ibm/icu/impl/number/formatters/MeasureFormat#getInstance:(Lcom/ibm/icu/text/DecimalFormatSymbols;Lcom/ibm/icu/impl/number/formatters/MeasureFormat$IProperties;)Lcom/ibm/icu/impl/number/modifiers/GeneralPluralModifier;
com/ibm/icu/impl/number/formatters/PaddingFormat$PadPosition#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/impl/number/formatters/PaddingFormat$PadPosition;
com/ibm/icu/impl/number/formatters/PositiveNegativeAffixFormat#<init>:()V
com/ibm/icu/impl/number/formatters/PositiveNegativeAffixFormat#apply:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/ModifierHolder;Lcom/ibm/icu/text/DecimalFormatSymbols;Lcom/ibm/icu/impl/number/formatters/PositiveNegativeAffixFormat$IProperties;)V
com/ibm/icu/impl/number/formatters/RangeFormat#<init>:(Lcom/ibm/icu/impl/number/Format;Lcom/ibm/icu/impl/number/Format;Ljava/lang/String;)V
com/ibm/icu/impl/number/formatters/RangeFormat#process:(Ljava/util/Deque;Lcom/ibm/icu/impl/number/ModifierHolder;Lcom/ibm/icu/impl/number/NumberStringBuilder;I)I
com/ibm/icu/impl/number/formatters/RoundingFormat#<init>:()V
com/ibm/icu/impl/number/formatters/ScientificFormat#getInstance:(Lcom/ibm/icu/text/DecimalFormatSymbols;Lcom/ibm/icu/impl/number/formatters/ScientificFormat$IProperties;Lcom/ibm/icu/impl/number/Rounder;)Lcom/ibm/icu/impl/number/formatters/ScientificFormat;
com/ibm/icu/impl/number/formatters/StrongAffixFormat#<init>:(Lcom/ibm/icu/impl/number/Format;)V
com/ibm/icu/impl/number/formatters/StrongAffixFormat#after:(Lcom/ibm/icu/impl/number/ModifierHolder;Lcom/ibm/icu/impl/number/NumberStringBuilder;II)I
com/ibm/icu/impl/number/formatters/StrongAffixFormat#export:(Lcom/ibm/icu/impl/number/Properties;)V
com/ibm/icu/impl/number/formatters/StrongAffixFormat#process:(Ljava/util/Deque;Lcom/ibm/icu/impl/number/ModifierHolder;Lcom/ibm/icu/impl/number/NumberStringBuilder;I)I
com/ibm/icu/impl/number/modifiers/ConstantAffixModifier#contentEquals:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
com/ibm/icu/impl/number/modifiers/ConstantAffixModifier#export:(Lcom/ibm/icu/impl/number/Properties;)V
com/ibm/icu/impl/number/modifiers/ConstantAffixModifier#toString:()Ljava/lang/String;
com/ibm/icu/impl/number/modifiers/ConstantMultiFieldModifier#export:(Lcom/ibm/icu/impl/number/Properties;)V
com/ibm/icu/impl/number/modifiers/ConstantMultiFieldModifier#toString:()Ljava/lang/String;
com/ibm/icu/impl/number/modifiers/GeneralPluralModifier#before:(Lcom/ibm/icu/impl/number/FormatQuantity;Lcom/ibm/icu/impl/number/ModifierHolder;)V
com/ibm/icu/impl/number/modifiers/GeneralPluralModifier#put:(Lcom/ibm/icu/impl/StandardPlural;Lcom/ibm/icu/impl/number/Modifier;)V
com/ibm/icu/impl/number/modifiers/SimpleModifier#<init>:(Ljava/lang/String;Lcom/ibm/icu/text/NumberFormat$Field;Z)V
com/ibm/icu/impl/number/modifiers/SimpleModifier#apply:(Lcom/ibm/icu/impl/number/NumberStringBuilder;II)I
com/ibm/icu/impl/number/modifiers/SimpleModifier#export:(Lcom/ibm/icu/impl/number/Properties;)V
com/ibm/icu/impl/number/modifiers/SimpleModifier#formatAsPrefixSuffix:(Ljava/lang/String;Lcom/ibm/icu/impl/number/NumberStringBuilder;IILcom/ibm/icu/text/NumberFormat$Field;)I
com/ibm/icu/impl/number/modifiers/SimpleModifier#getPrefix:()Ljava/lang/String;
com/ibm/icu/impl/number/modifiers/SimpleModifier#getSuffix:()Ljava/lang/String;
com/ibm/icu/impl/number/modifiers/SimpleModifier#isStrong:()Z
com/ibm/icu/impl/number/modifiers/SimpleModifier#length:()I
com/ibm/icu/impl/number/modifiers/SimpleModifier#testFormatAsPrefixSuffix:()V
com/ibm/icu/impl/OlsonTimeZone#constructEmpty:()V
com/ibm/icu/impl/PatternProps#<init>:()V
com/ibm/icu/impl/PatternProps#isIdentifier:(Ljava/lang/CharSequence;II)Z
@ -377,7 +557,6 @@ com/ibm/icu/impl/ResourceBundleWrapper#getLocaleID:()Ljava/lang/String;
com/ibm/icu/impl/Row#clone:()Ljava/lang/Object;
com/ibm/icu/impl/Row#cloneAsThawed:()Lcom/ibm/icu/impl/Row;
com/ibm/icu/impl/Row#equals:(Ljava/lang/Object;)Z
com/ibm/icu/impl/Row#get3:()Ljava/lang/Object;
com/ibm/icu/impl/Row#get4:()Ljava/lang/Object;
com/ibm/icu/impl/Row#isFrozen:()Z
com/ibm/icu/impl/Row#of:(Ljava/lang/Object;Ljava/lang/Object;)Lcom/ibm/icu/impl/Row$R2;
@ -479,8 +658,6 @@ com/ibm/icu/impl/UnicodeSetStringSpan#<init>:(Lcom/ibm/icu/impl/UnicodeSetString
com/ibm/icu/impl/UResource#<init>:()V
com/ibm/icu/impl/UResource$Key#<init>:([BII)V
com/ibm/icu/impl/UResource$Key#<init>:(Ljava/lang/String;)V
com/ibm/icu/impl/UResource$Key#compareTo:(Lcom/ibm/icu/impl/UResource$Key;)I
com/ibm/icu/impl/UResource$Key#compareTo:(Ljava/lang/CharSequence;)I
com/ibm/icu/impl/UResource$Key#subSequence:(II)Lcom/ibm/icu/impl/UResource$Key;
com/ibm/icu/impl/UResource$Key#substring:(I)Ljava/lang/String;
com/ibm/icu/impl/UResource$TableSink#getOrCreateTableSink:(Lcom/ibm/icu/impl/UResource$Key;)Lcom/ibm/icu/impl/UResource$TableSink;
@ -508,6 +685,7 @@ com/ibm/icu/impl/Utility#RLEStringToIntArray:(Ljava/lang/String;)[I
com/ibm/icu/impl/Utility#RLEStringToShortArray:(Ljava/lang/String;)[S
com/ibm/icu/impl/Utility#splitString:(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
com/ibm/icu/impl/Utility#splitWhitespace:(Ljava/lang/String;)[Ljava/lang/String;
com/ibm/icu/impl/Utility#toString:(Ljava/lang/Object;)Ljava/lang/String;
com/ibm/icu/impl/Utility#unescapeLeniently:(Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/impl/UtilityExtensions#<init>:()V
com/ibm/icu/impl/UtilityExtensions#appendToRule:(Ljava/lang/StringBuffer;Lcom/ibm/icu/text/UnicodeMatcher;ZLjava/lang/StringBuffer;)V
@ -539,53 +717,8 @@ com/ibm/icu/lang/UCharacterEnums#<init>:()V
com/ibm/icu/lang/UScript#<init>:()V
com/ibm/icu/lang/UScript$ScriptMetadata#<init>:()V
com/ibm/icu/lang/UScript$ScriptUsage#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/lang/UScript$ScriptUsage;
com/ibm/icu/math/BigDecimal#<init>:([C)V
com/ibm/icu/math/BigDecimal#abs:()Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#abs:(Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#bad:([C)V
com/ibm/icu/math/BigDecimal#badarg:(Ljava/lang/String;ILjava/lang/String;)V
com/ibm/icu/math/BigDecimal#byteValueExact:()B
com/ibm/icu/math/BigDecimal#checkdigits:(Lcom/ibm/icu/math/BigDecimal;I)V
com/ibm/icu/math/BigDecimal#divideInteger:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#divideInteger:(Lcom/ibm/icu/math/BigDecimal;Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#floatValue:()F
com/ibm/icu/math/BigDecimal#format:(II)Ljava/lang/String;
com/ibm/icu/math/BigDecimal#format:(IIIIII)Ljava/lang/String;
com/ibm/icu/math/BigDecimal#hashCode:()I
com/ibm/icu/math/BigDecimal#intcheck:(II)I
com/ibm/icu/math/BigDecimal#intValue:()I
com/ibm/icu/math/BigDecimal#intValueExact:()I
com/ibm/icu/math/BigDecimal#longValueExact:()J
com/ibm/icu/math/BigDecimal#max:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#max:(Lcom/ibm/icu/math/BigDecimal;Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#min:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#min:(Lcom/ibm/icu/math/BigDecimal;Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#plus:()Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#plus:(Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#pow:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#pow:(Lcom/ibm/icu/math/BigDecimal;Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#remainder:(Lcom/ibm/icu/math/BigDecimal;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#remainder:(Lcom/ibm/icu/math/BigDecimal;Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#round:(Lcom/ibm/icu/math/MathContext;)Lcom/ibm/icu/math/BigDecimal;
com/ibm/icu/math/BigDecimal#shortValueExact:()S
com/ibm/icu/math/BigDecimal#toBigIntegerExact:()Ljava/math/BigInteger;
com/ibm/icu/math/BigDecimal#toCharArray:()[C
com/ibm/icu/math/MathContext#<init>:(I)V
com/ibm/icu/math/MathContext#<init>:(IIZ)V
com/ibm/icu/text/AlphabeticIndex$Bucket$LabelType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/AlphabeticIndex$Bucket$LabelType;
com/ibm/icu/text/AlphabeticIndex$Record#toString:()Ljava/lang/String;
com/ibm/icu/text/Bidi#<init>:([CI[BIII)V
com/ibm/icu/text/Bidi#<init>:(Ljava/lang/String;I)V
com/ibm/icu/text/Bidi#<init>:(Ljava/text/AttributedCharacterIterator;)V
com/ibm/icu/text/Bidi#baseIsLeftToRight:()Z
com/ibm/icu/text/Bidi#getRunCount:()I
com/ibm/icu/text/Bidi#getRunLevel:(I)I
com/ibm/icu/text/Bidi#isLeftToRight:()Z
com/ibm/icu/text/Bidi#isMixed:()Z
com/ibm/icu/text/Bidi#isRightToLeft:()Z
com/ibm/icu/text/Bidi#reorderVisually:([BI[Ljava/lang/Object;II)V
com/ibm/icu/text/Bidi#requiresBidi:([CII)Z
com/ibm/icu/text/Bidi#setPara:(Ljava/text/AttributedCharacterIterator;)V
com/ibm/icu/text/BidiLine#<init>:()V
com/ibm/icu/text/BidiTransform$Mirroring#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/BidiTransform$Mirroring;
com/ibm/icu/text/BidiTransform$Mirroring#values:()[Lcom/ibm/icu/text/BidiTransform$Mirroring;
@ -626,12 +759,12 @@ com/ibm/icu/text/CompactDecimalDataCache$FormatsTableKey#values:()[Lcom/ibm/icu/
com/ibm/icu/text/CompactDecimalDataCache$PatternsTableKey#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/CompactDecimalDataCache$PatternsTableKey;
com/ibm/icu/text/CompactDecimalDataCache$PatternsTableKey#values:()[Lcom/ibm/icu/text/CompactDecimalDataCache$PatternsTableKey;
com/ibm/icu/text/CompactDecimalFormat#format:(Lcom/ibm/icu/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
com/ibm/icu/text/CompactDecimalFormat#parseCurrency:(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Lcom/ibm/icu/util/CurrencyAmount;
com/ibm/icu/text/CompactDecimalFormat$CompactStyle#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/CompactDecimalFormat$CompactStyle;
com/ibm/icu/text/ComposedCharIter#<init>:()V
com/ibm/icu/text/CurrencyDisplayNames#getInstance:(Ljava/util/Locale;)Lcom/ibm/icu/text/CurrencyDisplayNames;
com/ibm/icu/text/CurrencyFormat#clone:()Ljava/lang/Object;
com/ibm/icu/text/CurrencyFormat#readResolve:()Ljava/lang/Object;
com/ibm/icu/text/CurrencyPluralInfo#hashCode:()I
com/ibm/icu/text/CurrencyPluralInfo#select:(D)Ljava/lang/String;
com/ibm/icu/text/DateFormat#hashCode:()I
com/ibm/icu/text/DateFormat$BooleanAttribute#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/DateFormat$BooleanAttribute;
@ -649,22 +782,33 @@ com/ibm/icu/text/DateTimePatternGenerator$DateTimeMatcher#extractFrom:(Lcom/ibm/
com/ibm/icu/text/DateTimePatternGenerator$DateTimeMatcher#hashCode:()I
com/ibm/icu/text/DateTimePatternGenerator$DTPGflags#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/DateTimePatternGenerator$DTPGflags;
com/ibm/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag#toString:()Ljava/lang/String;
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#clearField:(I)V
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#appendTo:(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#copyFieldFrom:(Lcom/ibm/icu/text/DateTimePatternGenerator$SkeletonFields;I)V
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#hashCode:()I
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#toCanonicalString:()Ljava/lang/String;
com/ibm/icu/text/DateTimePatternGenerator$SkeletonFields#toString:()Ljava/lang/String;
com/ibm/icu/text/DateTimePatternGenerator$VariableField#getCanonicalCode:(I)Ljava/lang/String;
com/ibm/icu/text/DecimalFormat#equals:(Ljava/lang/String;Ljava/lang/String;)Z
com/ibm/icu/text/DecimalFormat#getMaximumSignificantDigits:()I
com/ibm/icu/text/DecimalFormat#getMinimumSignificantDigits:()I
com/ibm/icu/text/DecimalFormat#getParseMaxDigits:()I
com/ibm/icu/text/DecimalFormat#isDecimalPatternMatchRequired:()Z
com/ibm/icu/text/DecimalFormat#isParseStrict:()Z
com/ibm/icu/text/DecimalFormat#setParseMaxDigits:(I)V
com/ibm/icu/text/DecimalFormat#unquote:(Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/text/DecimalFormat$SignificantDigitsMode#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/DecimalFormat$SignificantDigitsMode;
com/ibm/icu/text/DecimalFormat$Unit#equals:(Ljava/lang/Object;)Z
com/ibm/icu/text/DecimalFormat$Unit#toString:()Ljava/lang/String;
com/ibm/icu/text/DictionaryBreakEngine$DequeI#grow:()V
com/ibm/icu/text/DictionaryData#<init>:()V
com/ibm/icu/text/DisplayContext#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/DisplayContext;
com/ibm/icu/text/DisplayContext$Type#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/DisplayContext$Type;
com/ibm/icu/text/Edits#growArray:()Z
com/ibm/icu/text/FractionalPartSubstitution#transformNumber:(J)J
com/ibm/icu/text/IdentifierInfo#getIdentifierProfile:()Lcom/ibm/icu/text/UnicodeSet;
com/ibm/icu/text/IdentifierInfo#toString:()Ljava/lang/String;
com/ibm/icu/text/IDNA$Error#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/IDNA$Error;
com/ibm/icu/text/IntegralPartSubstitution#transformNumber:(J)J
com/ibm/icu/text/KhmerBreakEngine#equals:(Ljava/lang/Object;)Z
com/ibm/icu/text/KhmerBreakEngine#hashCode:()I
com/ibm/icu/text/LaoBreakEngine#equals:(Ljava/lang/Object;)Z
@ -695,17 +839,9 @@ com/ibm/icu/text/LocaleDisplayNames$UiListItem#hashCode:()I
com/ibm/icu/text/MeasureFormat#getPerFormatter:(Lcom/ibm/icu/text/MeasureFormat$FormatWidth;)Ljava/lang/String;
com/ibm/icu/text/MeasureFormat$PatternData#<init>:(Ljava/lang/String;)V
com/ibm/icu/text/MeasureFormat$PatternData#toString:()Ljava/lang/String;
com/ibm/icu/text/MessageFormat#matchStringUntilLimitPart:(Lcom/ibm/icu/text/MessagePattern;IILjava/lang/String;I)I
com/ibm/icu/text/MessageFormat#parseChoiceArgument:(Lcom/ibm/icu/text/MessagePattern;ILjava/lang/String;Ljava/text/ParsePosition;)D
com/ibm/icu/text/MessageFormat$PluralSelectorContext#toString:()Ljava/lang/String;
com/ibm/icu/text/MessagePattern#autoQuoteApostropheDeep:()Ljava/lang/String;
com/ibm/icu/text/MessagePattern#freeze:()Lcom/ibm/icu/text/MessagePattern;
com/ibm/icu/text/MessagePattern#hashCode:()I
com/ibm/icu/text/MessagePattern#hasNumberedArguments:()Z
com/ibm/icu/text/MessagePattern#parseChoiceStyle:(Ljava/lang/String;)Lcom/ibm/icu/text/MessagePattern;
com/ibm/icu/text/MessagePattern#prefix:(Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/text/MessagePattern$ArgType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/MessagePattern$ArgType;
com/ibm/icu/text/MessagePattern$Part#getLength:()I
com/ibm/icu/text/MessagePattern$Part#hashCode:()I
com/ibm/icu/text/MessagePattern$Part#toString:()Ljava/lang/String;
com/ibm/icu/text/MessagePattern$Part$Type#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/MessagePattern$Part$Type;
@ -730,11 +866,11 @@ com/ibm/icu/text/Normalizer$NFKD32ModeImpl#<init>:()V
com/ibm/icu/text/Normalizer$NFKDModeImpl#<init>:()V
com/ibm/icu/text/Normalizer$Unicode32#<init>:()V
com/ibm/icu/text/Normalizer2$Mode#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/Normalizer2$Mode;
com/ibm/icu/text/NumberFormat#format:(Lcom/ibm/icu/util/CurrencyAmount;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
com/ibm/icu/text/NumberFormat#getEffectiveCurrency:()Lcom/ibm/icu/util/Currency;
com/ibm/icu/text/NumberFormat#hashCode:()I
com/ibm/icu/text/NumberFormat#parseCurrency:(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Lcom/ibm/icu/util/CurrencyAmount;
com/ibm/icu/text/NumeratorSubstitution#transformNumber:(J)J
com/ibm/icu/text/PluralFormat#equals:(Lcom/ibm/icu/text/PluralFormat;)Z
com/ibm/icu/text/PluralFormat#equals:(Ljava/lang/Object;)Z
com/ibm/icu/text/PluralFormat#hashCode:()I
com/ibm/icu/text/PluralRanges#cloneAsThawed:()Lcom/ibm/icu/text/PluralRanges;
com/ibm/icu/text/PluralRanges#compareTo:(Lcom/ibm/icu/text/PluralRanges;)I
@ -754,7 +890,6 @@ com/ibm/icu/text/PluralRanges$Matrix#startSame:(Lcom/ibm/icu/impl/StandardPlural
com/ibm/icu/text/PluralRanges$Matrix#toString:()Ljava/lang/String;
com/ibm/icu/text/PluralRules#addConditional:(Ljava/util/Set;Ljava/util/Set;D)Z
com/ibm/icu/text/PluralRules#compareTo:(Lcom/ibm/icu/text/PluralRules;)I
com/ibm/icu/text/PluralRules#hashCode:()I
com/ibm/icu/text/PluralRules#isLimited:(Ljava/lang/String;)Ljava/lang/Boolean;
com/ibm/icu/text/PluralRules#matches:(Lcom/ibm/icu/text/PluralRules$FixedDecimal;Ljava/lang/String;)Z
com/ibm/icu/text/PluralRules#readObject:(Ljava/io/ObjectInputStream;)V
@ -782,6 +917,7 @@ com/ibm/icu/text/PluralRules$Rule#and:(Lcom/ibm/icu/text/PluralRules$Constraint;
com/ibm/icu/text/PluralRules$Rule#hashCode:()I
com/ibm/icu/text/PluralRules$Rule#or:(Lcom/ibm/icu/text/PluralRules$Constraint;)Lcom/ibm/icu/text/PluralRules$Rule;
com/ibm/icu/text/PluralRules$RuleList#select:(Lcom/ibm/icu/text/PluralRules$FixedDecimal;Ljava/lang/String;)Z
com/ibm/icu/text/PluralRules$RuleList#select:(Lcom/ibm/icu/text/PluralRules$IFixedDecimal;Ljava/lang/String;)Z
com/ibm/icu/text/PluralRules$SampleType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/PluralRules$SampleType;
com/ibm/icu/text/PluralRules$SimpleTokenizer#<init>:()V
com/ibm/icu/text/PluralSamples#<init>:(Lcom/ibm/icu/text/PluralRules;)V
@ -812,7 +948,6 @@ com/ibm/icu/text/RBBINode#printNode:(Lcom/ibm/icu/text/RBBINode;)V
com/ibm/icu/text/RBBINode#printString:(Ljava/lang/String;I)V
com/ibm/icu/text/RBBINode#printTree:(Z)V
com/ibm/icu/text/RBBIRuleParseTable#<init>:()V
com/ibm/icu/text/RBBIRuleScanner#error:(I)V
com/ibm/icu/text/RBBIRuleScanner#printNodeStack:(Ljava/lang/String;)V
com/ibm/icu/text/RBBISetBuilder#getFirstChar:(I)I
com/ibm/icu/text/RBBISetBuilder#printRangeGroups:()V
@ -838,13 +973,8 @@ com/ibm/icu/text/SearchIterator#reset:()V
com/ibm/icu/text/SearchIterator$ElementComparisonType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/SearchIterator$ElementComparisonType;
com/ibm/icu/text/SearchIterator$ElementComparisonType#values:()[Lcom/ibm/icu/text/SearchIterator$ElementComparisonType;
com/ibm/icu/text/SimpleDateFormat#diffCalFieldValue:(Lcom/ibm/icu/util/Calendar;Lcom/ibm/icu/util/Calendar;[Ljava/lang/Object;I)Z
com/ibm/icu/text/SimpleDateFormat#getSymbols:()Lcom/ibm/icu/text/DateFormatSymbols;
com/ibm/icu/text/SimpleDateFormat#intervalFormatByAlgorithm:(Lcom/ibm/icu/util/Calendar;Lcom/ibm/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
com/ibm/icu/text/SimpleDateFormat#lowerLevel:([Ljava/lang/Object;II)Z
com/ibm/icu/text/SimpleDateFormat#matchDayPeriodString:(Ljava/lang/String;I[Ljava/lang/String;ILcom/ibm/icu/util/Output;)I
com/ibm/icu/text/SimpleDateFormat#matchString:(Ljava/lang/String;II[Ljava/lang/String;Lcom/ibm/icu/util/Calendar;)I
com/ibm/icu/text/SimpleDateFormat#subFormat:(CIILjava/text/FieldPosition;Lcom/ibm/icu/text/DateFormatSymbols;Lcom/ibm/icu/util/Calendar;)Ljava/lang/String;
com/ibm/icu/text/SimpleDateFormat#subParse:(Ljava/lang/String;ICIZZ[ZLcom/ibm/icu/util/Calendar;)I
com/ibm/icu/text/SimpleDateFormat$ContextValue#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/SimpleDateFormat$ContextValue;
com/ibm/icu/text/SimpleDateFormat$ContextValue#values:()[Lcom/ibm/icu/text/SimpleDateFormat$ContextValue;
com/ibm/icu/text/SpoofChecker$Builder#<init>:(Lcom/ibm/icu/text/SpoofChecker;)Vcom/ibm/icu/text/SpoofChecker$ConfusableDataUtils#<init>:()V
@ -863,11 +993,7 @@ com/ibm/icu/text/ThaiBreakEngine#hashCode:()I
com/ibm/icu/text/TimeUnitFormat#<init>:(Lcom/ibm/icu/util/ULocale;ILcom/ibm/icu/text/NumberFormat;)V
com/ibm/icu/text/TimeUnitFormat#readResolve:()Ljava/lang/Object;
com/ibm/icu/text/TimeUnitFormat#searchInTree:(Ljava/lang/String;ILcom/ibm/icu/util/TimeUnit;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
com/ibm/icu/text/TimeZoneFormat#format:(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
com/ibm/icu/text/TimeZoneFormat#formatToCharacterIterator:(Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;
com/ibm/icu/text/TimeZoneFormat#parse:(Ljava/lang/String;)Lcom/ibm/icu/util/TimeZone;
com/ibm/icu/text/TimeZoneFormat#parse:(Ljava/lang/String;Ljava/text/ParsePosition;)Lcom/ibm/icu/util/TimeZone;
com/ibm/icu/text/TimeZoneFormat#parseObject:(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Object;
com/ibm/icu/text/TimeZoneFormat$GMTOffsetField#getWidth:()I
com/ibm/icu/text/TimeZoneFormat$GMTOffsetPatternType#defaultPattern:()Ljava/lang/String;
com/ibm/icu/text/TimeZoneFormat$GMTOffsetPatternType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/text/TimeZoneFormat$GMTOffsetPatternType;
@ -922,15 +1048,10 @@ com/ibm/icu/util/BytesTrie$Result#values:()[Lcom/ibm/icu/util/BytesTrie$Result;
com/ibm/icu/util/BytesTrieBuilder$BytesAsCharSequence#subSequence:(II)Ljava/lang/CharSequence;
com/ibm/icu/util/Calendar#findPreviousZoneTransitionTime:(Lcom/ibm/icu/util/TimeZone;IJJ)Ljava/lang/Long;
com/ibm/icu/util/Calendar#getPreviousZoneTransitionTime:(Lcom/ibm/icu/util/TimeZone;JJ)Ljava/lang/Long;
com/ibm/icu/util/Calendar#getWeekData:()Lcom/ibm/icu/util/Calendar$WeekData;
com/ibm/icu/util/Calendar#getWeekDataForRegion:(Ljava/lang/String;)Lcom/ibm/icu/util/Calendar$WeekData;
com/ibm/icu/util/Calendar$CalType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/util/Calendar$CalType;
com/ibm/icu/util/Calendar$WeekData#equals:(Ljava/lang/Object;)Z
com/ibm/icu/util/Calendar$WeekData#hashCode:()I
com/ibm/icu/util/Calendar$WeekData#toString:()Ljava/lang/String;
com/ibm/icu/util/CharsTrie#clone:()Ljava/lang/Object;
com/ibm/icu/util/CharsTrie$Iterator#remove:()V
com/ibm/icu/util/Currency#readResolve:()Ljava/lang/Object;
com/ibm/icu/util/Currency$CurrencyStringInfo#getCurrencyString:()Ljava/lang/String;
com/ibm/icu/util/Currency$CurrencyUsage#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/util/Currency$CurrencyUsage;
com/ibm/icu/util/GenderInfo#getInstance:(Ljava/util/Locale;)Lcom/ibm/icu/util/GenderInfo;
@ -949,7 +1070,6 @@ com/ibm/icu/util/LocalePriorityList#hashCode:()I
com/ibm/icu/util/Output#toString:()Ljava/lang/String;
com/ibm/icu/util/OutputInt#<init>:(I)V
com/ibm/icu/util/OutputInt#toString:()Ljava/lang/String;
com/ibm/icu/util/PersianCalendar#<init>:()V
com/ibm/icu/util/PersianCalendar#<init>:(III)V
com/ibm/icu/util/PersianCalendar#<init>:(IIIIII)V
com/ibm/icu/util/PersianCalendar#<init>:(Lcom/ibm/icu/util/TimeZone;)V
@ -958,7 +1078,6 @@ com/ibm/icu/util/PersianCalendar#<init>:(Lcom/ibm/icu/util/ULocale;)V
com/ibm/icu/util/PersianCalendar#<init>:(Ljava/util/Date;)V
com/ibm/icu/util/PersianCalendar#<init>:(Ljava/util/Locale;)V
com/ibm/icu/util/RuleBasedTimeZone#setRawOffset:(I)V
com/ibm/icu/util/SimpleTimeZone#hasSameRules:(Lcom/ibm/icu/util/TimeZone;)Z
com/ibm/icu/util/StringTrieBuilder$Node#add:(Lcom/ibm/icu/util/StringTrieBuilder;Ljava/lang/CharSequence;II)Lcom/ibm/icu/util/StringTrieBuilder$Node;
com/ibm/icu/util/StringTrieBuilder$Option#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/util/StringTrieBuilder$Option;
com/ibm/icu/util/StringTrieBuilder$Option#values:()[Lcom/ibm/icu/util/StringTrieBuilder$Option;
@ -969,16 +1088,6 @@ com/ibm/icu/util/TimeUnitAmount#getTimeUnit:()Lcom/ibm/icu/util/TimeUnit;
com/ibm/icu/util/TimeZone#freeze:()Lcom/ibm/icu/util/TimeZone;
com/ibm/icu/util/TimeZone#setDefaultTimeZoneType:(I)V
com/ibm/icu/util/TimeZone$SystemTimeZoneType#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/util/TimeZone$SystemTimeZoneType;
com/ibm/icu/util/ULocale#getDisplayLanguageWithDialect:()Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayLanguageWithDialect:(Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayLanguageWithDialect:(Ljava/lang/String;Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayLanguageWithDialect:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayNameWithDialect:()Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayNameWithDialect:(Ljava/lang/String;Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayNameWithDialect:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayScript:()Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayScript:(Lcom/ibm/icu/util/ULocale;)Ljava/lang/String;
com/ibm/icu/util/ULocale#getDisplayScript:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
com/ibm/icu/util/ULocale$Category#valueOf:(Ljava/lang/String;)Lcom/ibm/icu/util/ULocale$Category;
com/ibm/icu/util/ULocale$JDKLocaleHelper#<init>:()V
com/ibm/icu/util/ULocale$JDKLocaleHelper#getSystemProperty:(Ljava/lang/String;)Ljava/lang/String;

View File

@ -4,6 +4,6 @@
#* Copyright (C) 2010-2016, International Business Machines Corporation and *
#* others. All Rights Reserved. *
#*******************************************************************************
icu4j.plugin.impl.version.string=59.1.0
icu4j.plugin.impl.version.string=60.0.1
copyright.eclipse=(C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html#License
icu4j.data.version.number=59
icu4j.data.version.number=60

View File

@ -3,11 +3,15 @@
package com.ibm.icu.impl;
import java.io.IOException;
import java.text.CharacterIterator;
import java.util.Locale;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UCharacterCategory;
import com.ibm.icu.text.BreakIterator;
import com.ibm.icu.text.Edits;
import com.ibm.icu.util.ICUUncheckedIOException;
import com.ibm.icu.util.ULocale;
public final class CaseMapImpl {
/**
@ -134,11 +138,192 @@ public final class CaseMapImpl {
protected int dir; // 0=initial state >0=forward <0=backward
}
public static final int TITLECASE_WHOLE_STRING = 0x20;
public static final int TITLECASE_SENTENCES = 0x40;
/**
* Bit mask for the titlecasing iterator options bit field.
* Currently only 3 out of 8 values are used:
* 0 (words), TITLECASE_WHOLE_STRING, TITLECASE_SENTENCES.
* See stringoptions.h.
* @internal
*/
private static final int TITLECASE_ITERATOR_MASK = 0xe0;
public static final int TITLECASE_ADJUST_TO_CASED = 0x400;
/**
* Bit mask for the titlecasing index adjustment options bit set.
* Currently two bits are defined:
* TITLECASE_NO_BREAK_ADJUSTMENT, TITLECASE_ADJUST_TO_CASED.
* See stringoptions.h.
* @internal
*/
private static final int TITLECASE_ADJUSTMENT_MASK = 0x600;
public static int addTitleAdjustmentOption(int options, int newOption) {
int adjOptions = options & TITLECASE_ADJUSTMENT_MASK;
if (adjOptions !=0 && adjOptions != newOption) {
throw new IllegalArgumentException("multiple titlecasing index adjustment options");
}
return options | newOption;
}
private static final int LNS =
(1 << UCharacterCategory.UPPERCASE_LETTER) |
(1 << UCharacterCategory.LOWERCASE_LETTER) |
(1 << UCharacterCategory.TITLECASE_LETTER) |
// Not MODIFIER_LETTER: We count only cased modifier letters.
(1 << UCharacterCategory.OTHER_LETTER) |
(1 << UCharacterCategory.DECIMAL_DIGIT_NUMBER) |
(1 << UCharacterCategory.LETTER_NUMBER) |
(1 << UCharacterCategory.OTHER_NUMBER) |
(1 << UCharacterCategory.MATH_SYMBOL) |
(1 << UCharacterCategory.CURRENCY_SYMBOL) |
(1 << UCharacterCategory.MODIFIER_SYMBOL) |
(1 << UCharacterCategory.OTHER_SYMBOL) |
(1 << UCharacterCategory.PRIVATE_USE);
private static boolean isLNS(int c) {
// Letter, number, symbol,
// or a private use code point because those are typically used as letters or numbers.
// Consider modifier letters only if they are cased.
int gc = UCharacterProperty.INSTANCE.getType(c);
return ((1 << gc) & LNS) != 0 ||
(gc == UCharacterCategory.MODIFIER_LETTER &&
UCaseProps.INSTANCE.getType(c) != UCaseProps.NONE);
}
public static int addTitleIteratorOption(int options, int newOption) {
int iterOptions = options & TITLECASE_ITERATOR_MASK;
if (iterOptions !=0 && iterOptions != newOption) {
throw new IllegalArgumentException("multiple titlecasing iterator options");
}
return options | newOption;
}
public static BreakIterator getTitleBreakIterator(
Locale locale, int options, BreakIterator iter) {
options &= TITLECASE_ITERATOR_MASK;
if (options != 0 && iter != null) {
throw new IllegalArgumentException(
"titlecasing iterator option together with an explicit iterator");
}
if (iter == null) {
switch (options) {
case 0:
iter = BreakIterator.getWordInstance(locale);
break;
case TITLECASE_WHOLE_STRING:
iter = new WholeStringBreakIterator();
break;
case TITLECASE_SENTENCES:
iter = BreakIterator.getSentenceInstance(locale);
break;
default:
throw new IllegalArgumentException("unknown titlecasing iterator option");
}
}
return iter;
}
public static BreakIterator getTitleBreakIterator(
ULocale locale, int options, BreakIterator iter) {
options &= TITLECASE_ITERATOR_MASK;
if (options != 0 && iter != null) {
throw new IllegalArgumentException(
"titlecasing iterator option together with an explicit iterator");
}
if (iter == null) {
switch (options) {
case 0:
iter = BreakIterator.getWordInstance(locale);
break;
case TITLECASE_WHOLE_STRING:
iter = new WholeStringBreakIterator();
break;
case TITLECASE_SENTENCES:
iter = BreakIterator.getSentenceInstance(locale);
break;
default:
throw new IllegalArgumentException("unknown titlecasing iterator option");
}
}
return iter;
}
/**
* Omit unchanged text when case-mapping with Edits.
*/
public static final int OMIT_UNCHANGED_TEXT = 0x4000;
private static final class WholeStringBreakIterator extends BreakIterator {
private int length;
private static void notImplemented() {
throw new UnsupportedOperationException("should not occur");
}
@Override
public int first() {
return 0;
}
@Override
public int last() {
notImplemented();
return 0;
}
@Override
public int next(int n) {
notImplemented();
return 0;
}
@Override
public int next() {
return length;
}
@Override
public int previous() {
notImplemented();
return 0;
}
@Override
public int following(int offset) {
notImplemented();
return 0;
}
@Override
public int current() {
notImplemented();
return 0;
}
@Override
public CharacterIterator getText() {
notImplemented();
return null;
}
@Override
public void setText(CharacterIterator newText) {
length = newText.getEndIndex();
}
@Override
public void setText(String newText) {
length = newText.length();
}
}
private static int appendCodePoint(Appendable a, int c) throws IOException {
if (c <= Character.MAX_VALUE) {
a.append((char)c);
@ -266,32 +451,33 @@ public final class CaseMapImpl {
}
/*
* Unicode 4 & 5 section 3.13 Default Case Operations:
*
* R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
* #29, "Text Boundaries." Between each pair of word boundaries, find the first
* cased character F. If F exists, map F to default_title(F); then map each
* subsequent character C to default_lower(C).
*
* In this implementation, segment [prev..index[ into 3 parts:
* a) uncased characters (copy as-is) [prev..titleStart[
* b) first case letter (titlecase) [titleStart..titleLimit[
* Segment [prev..index[ into 3 parts:
* a) skipped characters (copy as-is) [prev..titleStart[
* b) first letter (titlecase) [titleStart..titleLimit[
* c) subsequent characters (lowercase) [titleLimit..index[
*/
if(prev<index) {
// find and copy uncased characters [prev..titleStart[
// Find and copy skipped characters [prev..titleStart[
int titleStart=prev;
iter.setLimit(index);
int c=iter.nextCaseMapCP();
if((options&UCharacter.TITLECASE_NO_BREAK_ADJUSTMENT)==0
&& UCaseProps.NONE==UCaseProps.INSTANCE.getType(c)) {
// Adjust the titlecasing index (titleStart) to the next cased character.
while((c=iter.nextCaseMapCP())>=0
&& UCaseProps.NONE==UCaseProps.INSTANCE.getType(c)) {}
if ((options&UCharacter.TITLECASE_NO_BREAK_ADJUSTMENT)==0) {
// Adjust the titlecasing index to the next cased character,
// or to the next letter/number/symbol/private use.
// Stop with titleStart<titleLimit<=index
// if there is a character to be titlecased,
// or else stop with titleStart==titleLimit==index.
boolean toCased = (options&CaseMapImpl.TITLECASE_ADJUST_TO_CASED) != 0;
while ((toCased ?
UCaseProps.NONE==UCaseProps.INSTANCE.getType(c) :
!CaseMapImpl.isLNS(c)) &&
(c=iter.nextCaseMapCP())>=0) {}
// If c<0 then we have only uncased characters in [prev..index[
// and stopped with titleStart==titleLimit==index.
titleStart=iter.getCPStart();
appendUnchanged(src, prev, titleStart-prev, dest, options, edits);
if (prev < titleStart) {
appendUnchanged(src, prev, titleStart-prev, dest, options, edits);
}
}
if(titleStart<index) {

View File

@ -26,6 +26,7 @@ import com.ibm.icu.impl.locale.AsciiUtil;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UScript;
import com.ibm.icu.text.BreakIterator;
import com.ibm.icu.text.CaseMap;
import com.ibm.icu.text.DisplayContext;
import com.ibm.icu.text.DisplayContext.Type;
import com.ibm.icu.text.LocaleDisplayNames;
@ -86,6 +87,13 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
*/
private transient BreakIterator capitalizationBrkIter = null;
private static final CaseMap.Title TO_TITLE_WHOLE_STRING_NO_LOWERCASE =
CaseMap.toTitle().wholeString().noLowercase();
private static String toTitleWholeStringNoLowercase(ULocale locale, String s) {
return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(
locale.toLocale(), null, s, new StringBuilder(), null).toString();
}
public static LocaleDisplayNames getInstance(ULocale locale, DialectHandling dialectHandling) {
synchronized (cache) {
@ -602,9 +610,12 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
ULocale minimized = ULocale.minimizeSubtags(modified, ULocale.Minimize.FAVOR_SCRIPT);
String tempName = modified.getDisplayName(locale);
boolean titlecase = capContext == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU;
String nameInDisplayLocale = titlecase ? UCharacter.toTitleFirst(locale, tempName) : tempName;
String nameInDisplayLocale =
titlecase ? toTitleWholeStringNoLowercase(locale, tempName) : tempName;
tempName = modified.getDisplayName(modified);
String nameInSelf = capContext == DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU ? UCharacter.toTitleFirst(modified, tempName) : tempName;
String nameInSelf = capContext ==
DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU ?
toTitleWholeStringNoLowercase(modified, tempName) : tempName;
return new UiListItem(minimized, modified, nameInDisplayLocale, nameInSelf);
}

View File

@ -428,7 +428,7 @@ public final class Normalizer2Impl {
try {
dataVersion=ICUBinary.readHeaderAndDataVersion(bytes, DATA_FORMAT, IS_ACCEPTABLE);
int indexesLength=bytes.getInt()/4; // inIndexes[IX_NORM_TRIE_OFFSET]/4
if(indexesLength<=IX_MIN_MAYBE_YES) {
if(indexesLength<=IX_MIN_YES_NO_MAPPINGS_ONLY) {
throw new ICUUncheckedIOException("Normalizer2 data: not enough indexes");
}
int[] inIndexes=new int[indexesLength];

View File

@ -1124,9 +1124,15 @@ public final class UCaseProps {
/**
* Bit mask for getting just the options from a string compare options word
* that are relevant for case folding (of a single string or code point).
*
* Currently only bit 0 for FOLD_CASE_EXCLUDE_SPECIAL_I.
* It is conceivable that at some point we might use one more bit for using uppercase sharp s.
* It is conceivable that at some point we might want the option to use only simple case foldings
* when operating on strings.
*
* @internal
*/
private static final int FOLD_CASE_OPTIONS_MASK = 0xff;
private static final int FOLD_CASE_OPTIONS_MASK = 7;
/* return the simple case folding mapping for c */
public final int fold(int c, int options) {

View File

@ -586,8 +586,8 @@ public final class UTS46 extends IDNA {
) {
setNotOkBiDi(info);
}
// Get the directionalities of the intervening characters.
int mask=0;
// Add the directionalities of the intervening characters.
int mask=firstMask|lastMask;
while(i<labelLimit) {
c=Character.codePointAt(label, i);
i+=Character.charCount(c);
@ -617,7 +617,7 @@ public final class UTS46 extends IDNA {
// label. [...]
// The following rule, consisting of six conditions, applies to labels
// in BIDI domain names.
if(((firstMask|mask|lastMask)&R_AL_AN_MASK)!=0) {
if((mask&R_AL_AN_MASK)!=0) {
setBiDi(info);
}
}

View File

@ -45,6 +45,14 @@ public class Endpoint {
// return format;
// }
public static interface IProperties {
static PluralRules DEFAULT_PLURAL_RULES = null;
public PluralRules getPluralRules();
public IProperties setPluralRules(PluralRules pluralRules);
}
public static Format fromBTA(Properties properties) {
return fromBTA(properties, getSymbols());
}
@ -102,8 +110,8 @@ public class Endpoint {
if (CompactDecimalFormat.useCompactDecimalFormat(properties)) {
format.addBeforeFormat(CompactDecimalFormat.getInstance(symbols, properties));
} else if (ScientificFormat.useScientificNotation(properties)) {
// TODO: Should the currency rounder or scientific rounder be used in this case?
// For now, default to using the scientific rounder.
// TODO: Should the currency rounder or scientific rounder be used in this case?
// For now, default to using the scientific rounder.
format.addBeforeFormat(PositiveNegativeAffixFormat.getInstance(symbols, properties));
format.addBeforeFormat(ScientificFormat.getInstance(symbols, properties));
} else {
@ -270,6 +278,10 @@ public class Endpoint {
};
private static PluralRules getPluralRules(ULocale uLocale, Properties properties) {
if (properties.getPluralRules() != null) {
return properties.getPluralRules();
}
// Backwards compatibility: CurrencyPluralInfo wraps its own copy of PluralRules
if (properties.getCurrencyPluralInfo() != null) {
return properties.getCurrencyPluralInfo().getPluralRules();

View File

@ -34,6 +34,7 @@ import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
import com.ibm.icu.text.CurrencyPluralInfo;
import com.ibm.icu.text.DecimalFormat.SignificantDigitsMode;
import com.ibm.icu.text.MeasureFormat.FormatWidth;
import com.ibm.icu.text.PluralRules;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.Currency.CurrencyUsage;
import com.ibm.icu.util.MeasureUnit;
@ -53,7 +54,8 @@ public class Properties
Parse.IProperties,
IncrementRounder.IProperties,
MagnitudeRounder.IProperties,
SignificantDigitsRounder.IProperties {
SignificantDigitsRounder.IProperties,
Endpoint.IProperties {
private static final Properties DEFAULT = new Properties();
@ -110,6 +112,7 @@ public class Properties
private transient ParseMode parseMode;
private transient boolean parseNoExponent;
private transient boolean parseToBigDecimal;
private transient PluralRules pluralRules;
private transient String positivePrefix;
private transient String positivePrefixPattern;
private transient String positiveSuffix;
@ -170,6 +173,7 @@ public class Properties
parseMode = DEFAULT_PARSE_MODE;
parseNoExponent = DEFAULT_PARSE_NO_EXPONENT;
parseToBigDecimal = DEFAULT_PARSE_TO_BIG_DECIMAL;
pluralRules = DEFAULT_PLURAL_RULES;
positivePrefix = DEFAULT_POSITIVE_PREFIX;
positivePrefixPattern = DEFAULT_POSITIVE_PREFIX_PATTERN;
positiveSuffix = DEFAULT_POSITIVE_SUFFIX;
@ -219,6 +223,7 @@ public class Properties
parseMode = other.parseMode;
parseNoExponent = other.parseNoExponent;
parseToBigDecimal = other.parseToBigDecimal;
pluralRules = other.pluralRules;
positivePrefix = other.positivePrefix;
positivePrefixPattern = other.positivePrefixPattern;
positiveSuffix = other.positiveSuffix;
@ -269,6 +274,7 @@ public class Properties
eq = eq && _equalsHelper(parseMode, other.parseMode);
eq = eq && _equalsHelper(parseNoExponent, other.parseNoExponent);
eq = eq && _equalsHelper(parseToBigDecimal, other.parseToBigDecimal);
eq = eq && _equalsHelper(pluralRules, other.pluralRules);
eq = eq && _equalsHelper(positivePrefix, other.positivePrefix);
eq = eq && _equalsHelper(positivePrefixPattern, other.positivePrefixPattern);
eq = eq && _equalsHelper(positiveSuffix, other.positiveSuffix);
@ -333,6 +339,7 @@ public class Properties
hashCode ^= _hashCodeHelper(parseMode);
hashCode ^= _hashCodeHelper(parseNoExponent);
hashCode ^= _hashCodeHelper(parseToBigDecimal);
hashCode ^= _hashCodeHelper(pluralRules);
hashCode ^= _hashCodeHelper(positivePrefix);
hashCode ^= _hashCodeHelper(positivePrefixPattern);
hashCode ^= _hashCodeHelper(positiveSuffix);
@ -575,6 +582,11 @@ public class Properties
return parseToBigDecimal;
}
@Override
public PluralRules getPluralRules() {
return pluralRules;
}
@Override
public String getPositivePrefix() {
return positivePrefix;
@ -673,6 +685,7 @@ public class Properties
@Override
public Properties setCompactCustomData(Map<String, Map<String, String>> compactCustomData) {
// TODO: compactCustomData is not immutable.
this.compactCustomData = compactCustomData;
return this;
}
@ -893,6 +906,12 @@ public class Properties
return this;
}
@Override
public Properties setPluralRules(PluralRules pluralRules) {
this.pluralRules = pluralRules;
return this;
}
@Override
public Properties setPositivePrefix(String positivePrefix) {
this.positivePrefix = positivePrefix;

View File

@ -90,121 +90,167 @@ public class PositiveDecimalFormat implements Format.TargetFormat {
|| properties.getMaximumFractionDigits() != 0;
}
// Properties
private final boolean alwaysShowDecimal;
private final int primaryGroupingSize;
private final int secondaryGroupingSize;
private final int minimumGroupingDigits;
private static class ParameterStruct {
// Symbols
private final String infinityString;
private final String nanString;
private final String groupingSeparator;
private final String decimalSeparator;
private final String[] digitStrings;
private final int codePointZero;
// Properties
boolean alwaysShowDecimal;
int primaryGroupingSize;
int secondaryGroupingSize;
int minimumGroupingDigits;
public PositiveDecimalFormat(DecimalFormatSymbols symbols, IProperties properties) {
int _primary = properties.getGroupingSize();
int _secondary = properties.getSecondaryGroupingSize();
primaryGroupingSize = _primary > 0 ? _primary : _secondary > 0 ? _secondary : 0;
secondaryGroupingSize = _secondary > 0 ? _secondary : primaryGroupingSize;
// Symbols
String infinityString;
String nanString;
String groupingSeparator;
String decimalSeparator;
String[] digitStrings;
int codePointZero;
minimumGroupingDigits = properties.getMinimumGroupingDigits();
alwaysShowDecimal = properties.getDecimalSeparatorAlwaysShown();
infinityString = symbols.getInfinity();
nanString = symbols.getNaN();
void setProperties(DecimalFormatSymbols symbols, IProperties properties) {
int _primary = properties.getGroupingSize();
int _secondary = properties.getSecondaryGroupingSize();
primaryGroupingSize = _primary > 0 ? _primary : _secondary > 0 ? _secondary : 0;
secondaryGroupingSize = _secondary > 0 ? _secondary : primaryGroupingSize;
if (CurrencyFormat.useCurrency(properties)) {
groupingSeparator = symbols.getMonetaryGroupingSeparatorString();
decimalSeparator = symbols.getMonetaryDecimalSeparatorString();
} else {
groupingSeparator = symbols.getGroupingSeparatorString();
decimalSeparator = symbols.getDecimalSeparatorString();
}
minimumGroupingDigits = properties.getMinimumGroupingDigits();
alwaysShowDecimal = properties.getDecimalSeparatorAlwaysShown();
infinityString = symbols.getInfinity();
nanString = symbols.getNaN();
// Check to see if we can use code points instead of strings
int _codePointZero = symbols.getCodePointZero();
if (_codePointZero != -1) {
// Fast Path (~9% faster than slow path when formatting long strings)
digitStrings = null;
codePointZero = _codePointZero;
} else {
// Slow Path
digitStrings = symbols.getDigitStrings(); // makes a copy
codePointZero = -1;
if (CurrencyFormat.useCurrency(properties)) {
groupingSeparator = symbols.getMonetaryGroupingSeparatorString();
decimalSeparator = symbols.getMonetaryDecimalSeparatorString();
} else {
groupingSeparator = symbols.getGroupingSeparatorString();
decimalSeparator = symbols.getDecimalSeparatorString();
}
// Check to see if we can use code points instead of strings
int _codePointZero = symbols.getCodePointZero();
if (_codePointZero != -1) {
// Fast Path (9-25% faster than slow path when formatting long strings)
digitStrings = null;
codePointZero = _codePointZero;
} else {
// Slow Path
digitStrings = symbols.getDigitStrings(); // makes a copy
codePointZero = -1;
}
}
}
private static class TransientStruct {
FormatQuantity input;
NumberStringBuilder string;
int index;
ParameterStruct params;
}
private final ParameterStruct params;
public PositiveDecimalFormat(DecimalFormatSymbols symbols, IProperties properties) {
params = new ParameterStruct();
params.setProperties(symbols, properties);
}
// private static void apply(
// FormatQuantity input,
// NumberStringBuilder string,
// int startIndex,
// DecimalFormatSymbols symbols,
// IProperties properties) {
//
// }
private static final ThreadLocal<TransientStruct> threadLocalTransientStruct =
new ThreadLocal<TransientStruct>() {
@Override
protected TransientStruct initialValue() {
return new TransientStruct();
}
};
private static final TransientStruct staticTransientStruct = new TransientStruct();
@Override
public int target(FormatQuantity input, NumberStringBuilder string, int startIndex) {
int length = 0;
// TransientStruct trans = staticTransientStruct;
TransientStruct trans = threadLocalTransientStruct.get();
trans.input = input;
trans.string = string;
trans.index = startIndex;
trans.params = params;
target(trans);
return trans.index - startIndex;
}
if (input.isInfinite()) {
length += string.insert(startIndex, infinityString, NumberFormat.Field.INTEGER);
private static void target(TransientStruct trans) {
if (trans.input.isInfinite()) {
trans.index +=
trans.string.insert(trans.index, trans.params.infinityString, NumberFormat.Field.INTEGER);
} else if (input.isNaN()) {
length += string.insert(startIndex, nanString, NumberFormat.Field.INTEGER);
} else if (trans.input.isNaN()) {
trans.index +=
trans.string.insert(trans.index, trans.params.nanString, NumberFormat.Field.INTEGER);
} else {
// Add the integer digits
length += addIntegerDigits(input, string, startIndex);
trans.index += addIntegerDigits(trans);
// Add the decimal point
if (input.getLowerDisplayMagnitude() < 0 || alwaysShowDecimal) {
length +=
string.insert(
startIndex + length, decimalSeparator, NumberFormat.Field.DECIMAL_SEPARATOR);
if (trans.input.getLowerDisplayMagnitude() < 0 || trans.params.alwaysShowDecimal) {
trans.index +=
trans.string.insert(
trans.index, trans.params.decimalSeparator, NumberFormat.Field.DECIMAL_SEPARATOR);
}
// Add the fraction digits
length += addFractionDigits(input, string, startIndex + length);
trans.index += addFractionDigits(trans);
}
return length;
}
private int addIntegerDigits(FormatQuantity input, NumberStringBuilder string, int startIndex) {
private static int addIntegerDigits(TransientStruct trans) {
int length = 0;
int integerCount = input.getUpperDisplayMagnitude() + 1;
int integerCount = trans.input.getUpperDisplayMagnitude() + 1;
for (int i = 0; i < integerCount; i++) {
// Add grouping separator
if (primaryGroupingSize > 0
&& i == primaryGroupingSize
&& integerCount - i >= minimumGroupingDigits) {
if (trans.params.primaryGroupingSize > 0
&& i == trans.params.primaryGroupingSize
&& integerCount - i >= trans.params.minimumGroupingDigits) {
length +=
string.insert(startIndex, groupingSeparator, NumberFormat.Field.GROUPING_SEPARATOR);
} else if (secondaryGroupingSize > 0
&& i > primaryGroupingSize
&& (i - primaryGroupingSize) % secondaryGroupingSize == 0) {
trans.string.insert(
trans.index, trans.params.groupingSeparator, NumberFormat.Field.GROUPING_SEPARATOR);
} else if (trans.params.secondaryGroupingSize > 0
&& i > trans.params.primaryGroupingSize
&& (i - trans.params.primaryGroupingSize) % trans.params.secondaryGroupingSize == 0) {
length +=
string.insert(startIndex, groupingSeparator, NumberFormat.Field.GROUPING_SEPARATOR);
trans.string.insert(
trans.index, trans.params.groupingSeparator, NumberFormat.Field.GROUPING_SEPARATOR);
}
// Get and append the next digit value
byte nextDigit = input.getDigit(i);
length += addDigit(nextDigit, string, startIndex, NumberFormat.Field.INTEGER);
byte nextDigit = trans.input.getDigit(i);
length += addDigit(nextDigit, trans.index, NumberFormat.Field.INTEGER, trans);
}
return length;
}
private int addFractionDigits(FormatQuantity input, NumberStringBuilder string, int index) {
private static int addFractionDigits(TransientStruct trans) {
int length = 0;
int fractionCount = -input.getLowerDisplayMagnitude();
int fractionCount = -trans.input.getLowerDisplayMagnitude();
for (int i = 0; i < fractionCount; i++) {
// Get and append the next digit value
byte nextDigit = input.getDigit(-i - 1);
length += addDigit(nextDigit, string, index + length, NumberFormat.Field.FRACTION);
byte nextDigit = trans.input.getDigit(-i - 1);
length += addDigit(nextDigit, trans.index + length, NumberFormat.Field.FRACTION, trans);
}
return length;
}
private int addDigit(byte digit, NumberStringBuilder outputString, int index, Field field) {
if (codePointZero != -1) {
return outputString.insertCodePoint(index, codePointZero + digit, field);
private static int addDigit(byte digit, int index, Field field, TransientStruct trans) {
if (trans.params.codePointZero != -1) {
return trans.string.insertCodePoint(index, trans.params.codePointZero + digit, field);
} else {
return outputString.insert(index, digitStrings[digit], field);
return trans.string.insert(index, trans.params.digitStrings[digit], field);
}
}
@ -212,11 +258,13 @@ public class PositiveDecimalFormat implements Format.TargetFormat {
public void export(Properties properties) {
// For backwards compatibility, export 0 as secondary grouping if primary and secondary are the same
int effectiveSecondaryGroupingSize =
secondaryGroupingSize == primaryGroupingSize ? 0 : secondaryGroupingSize;
params.secondaryGroupingSize == params.primaryGroupingSize
? 0
: params.secondaryGroupingSize;
properties.setDecimalSeparatorAlwaysShown(alwaysShowDecimal);
properties.setGroupingSize(primaryGroupingSize);
properties.setDecimalSeparatorAlwaysShown(params.alwaysShowDecimal);
properties.setGroupingSize(params.primaryGroupingSize);
properties.setSecondaryGroupingSize(effectiveSecondaryGroupingSize);
properties.setMinimumGroupingDigits(minimumGroupingDigits);
properties.setMinimumGroupingDigits(params.minimumGroupingDigits);
}
}

View File

@ -5185,22 +5185,14 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection
*/
public static String toTitleCase(ULocale locale, String str,
BreakIterator titleIter, int options) {
if(titleIter == null) {
if (locale == null) {
locale = ULocale.getDefault();
}
titleIter = BreakIterator.getWordInstance(locale);
if (titleIter == null && locale == null) {
locale = ULocale.getDefault();
}
titleIter = CaseMapImpl.getTitleBreakIterator(locale, options, titleIter);
titleIter.setText(str);
return toTitleCase(getCaseLocale(locale), options, titleIter, str);
}
private static final int BREAK_MASK =
(1<<UCharacterCategory.DECIMAL_DIGIT_NUMBER)
| (1<<UCharacterCategory.OTHER_LETTER)
| (1<<UCharacterCategory.MODIFIER_LETTER);
/**
* Return a string with just the first word titlecased, for menus and UI, etc. This does not affect most of the string,
* and sometimes has no effect at all; the original string is returned whenever casing
@ -5225,49 +5217,14 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection
*/
@Deprecated
public static String toTitleFirst(ULocale locale, String str) {
int c = 0;
for (int i = 0; i < str.length(); i += UCharacter.charCount(c)) {
c = UCharacter.codePointAt(str, i);
int propertyMask = UCharacter.getIntPropertyValue(c, UProperty.GENERAL_CATEGORY_MASK);
if ((propertyMask & BREAK_MASK) != 0) { // handle "49ers", initial CJK
break;
}
if (UCaseProps.INSTANCE.getType(c) == UCaseProps.NONE) {
continue;
}
// we now have the first cased character
// What we really want is something like:
// String titled = UCharacter.toTitleCase(locale, str, i, outputCharsTaken);
// That is, just give us the titlecased string, for the locale, at i and following,
// and tell us how many characters are replaced.
// The following won't work completely: it needs some more substantial changes to UCaseProps
String substring = str.substring(i, i+UCharacter.charCount(c));
String titled = UCharacter.toTitleCase(locale, substring, BreakIterator.getSentenceInstance(locale), 0);
// skip if no change
if (titled.codePointAt(0) == c) {
// Using 0 is safe, since any change in titling will not have first initial character
break;
}
StringBuilder result = new StringBuilder(str.length()).append(str, 0, i);
int startOfSuffix;
// handle dutch, but check first for 'i', since that's faster. Should be built into UCaseProps.
if (c == 'i' && locale.getLanguage().equals("nl") && i < str.length() && str.charAt(i+1) == 'j') {
result.append("IJ");
startOfSuffix = 2;
} else {
result.append(titled);
startOfSuffix = i + UCharacter.charCount(c);
}
// add the remainder, and return
return result.append(str, startOfSuffix, str.length()).toString();
}
return str; // no change
return toTitleCase(locale, str, null,
CaseMapImpl.TITLECASE_WHOLE_STRING|TITLECASE_NO_LOWERCASE);
// TODO: Remove this function.
// Move something like the following helper function into CLDR.
// private static final CaseMap.Title TO_TITLE_WHOLE_STRING_NO_LOWERCASE =
// CaseMap.toTitle().wholeString().noLowercase();
// return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(
// locale.toLocale(), null, str, new StringBuilder(), null).toString();
}
/**
@ -5295,9 +5252,10 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection
public static String toTitleCase(Locale locale, String str,
BreakIterator titleIter,
int options) {
if(titleIter == null) {
titleIter = BreakIterator.getWordInstance(locale);
if (titleIter == null && locale == null) {
locale = Locale.getDefault();
}
titleIter = CaseMapImpl.getTitleBreakIterator(locale, options, titleIter);
titleIter.setText(str);
return toTitleCase(getCaseLocale(locale), options, titleIter, str);
}

View File

@ -174,6 +174,42 @@ public abstract class CaseMap {
private static final Title OMIT_UNCHANGED = new Title(CaseMapImpl.OMIT_UNCHANGED_TEXT);
private Title(int opt) { super(opt); }
/**
* Returns an instance that behaves like this one but
* titlecases the string as a whole rather than each word.
* (Titlecases only the character at index 0, possibly adjusted.)
*
* <p>It is an error to specify multiple titlecasing iterator options together,
* including both an option and an explicit BreakIterator.
*
* @return an options object with this option.
* @see #adjustToCased()
* @draft ICU 60
* @provisional This API might change or be removed in a future release.
*/
public Title wholeString() {
return new Title(CaseMapImpl.addTitleIteratorOption(
internalOptions, CaseMapImpl.TITLECASE_WHOLE_STRING));
}
/**
* Returns an instance that behaves like this one but
* titlecases sentences rather than words.
* (Titlecases only the first character of each sentence, possibly adjusted.)
*
* <p>It is an error to specify multiple titlecasing iterator options together,
* including both an option and an explicit BreakIterator.
*
* @return an options object with this option.
* @see #adjustToCased()
* @draft ICU 60
* @provisional This API might change or be removed in a future release.
*/
public Title sentences() {
return new Title(CaseMapImpl.addTitleIteratorOption(
internalOptions, CaseMapImpl.TITLECASE_SENTENCES));
}
/**
* {@inheritDoc}
* @draft ICU 59
@ -191,12 +227,14 @@ public abstract class CaseMap {
* Returns an instance that behaves like this one but
* does not lowercase non-initial parts of words when titlecasing.
*
* <p>By default, titlecasing will titlecase the first cased character
* of a word and lowercase all other characters.
* <p>By default, titlecasing will titlecase the character at each
* (possibly adjusted) BreakIterator index and
* lowercase all other characters up to the next iterator index.
* With this option, the other characters will not be modified.
*
* @return an options object with this option.
* @see UCharacter#TITLECASE_NO_LOWERCASE
* @see #adjustToCased()
* @draft ICU 59
* @provisional This API might change or be removed in a future release.
*/
@ -204,22 +242,16 @@ public abstract class CaseMap {
return new Title(internalOptions | UCharacter.TITLECASE_NO_LOWERCASE);
}
// TODO: update references to the Unicode Standard for recent version
/**
* Returns an instance that behaves like this one but
* does not adjust the titlecasing indexes from BreakIterator::next() indexes;
* does not adjust the titlecasing BreakIterator indexes;
* titlecases exactly the characters at breaks from the iterator.
*
* <p>By default, titlecasing will take each break iterator index,
* adjust it by looking for the next cased character, and titlecase that one.
* Other characters are lowercased.
* adjust it to the next relevant character (see {@link #adjustToCased()}),
* and titlecase that one.
*
* <p>This follows Unicode 4 &amp; 5 section 3.13 Default Case Operations:
*
* R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex
* #29, "Text Boundaries." Between each pair of word boundaries, find the first
* cased character F. If F exists, map F to default_title(F); then map each
* subsequent character C to default_lower(C).
* <p>Other characters are lowercased.
*
* @return an options object with this option.
* @see UCharacter#TITLECASE_NO_BREAK_ADJUSTMENT
@ -227,7 +259,33 @@ public abstract class CaseMap {
* @provisional This API might change or be removed in a future release.
*/
public Title noBreakAdjustment() {
return new Title(internalOptions | UCharacter.TITLECASE_NO_BREAK_ADJUSTMENT);
return new Title(CaseMapImpl.addTitleAdjustmentOption(
internalOptions, UCharacter.TITLECASE_NO_BREAK_ADJUSTMENT));
}
/**
* Returns an instance that behaves like this one but
* adjusts each titlecasing BreakIterator index to the next cased character.
* (See the Unicode Standard, chapter 3, Default Case Conversion, R3 toTitlecase(X).)
*
* <p>This used to be the default index adjustment in ICU.
* Since ICU 60, the default index adjustment is to the next character that is
* a letter, number, symbol, or private use code point.
* (Uncased modifier letters are skipped.)
* The difference in behavior is small for word titlecasing,
* but the new adjustment is much better for whole-string and sentence titlecasing:
* It yields "49ers" and "«丰(abc)»" instead of "49Ers" and "«丰(Abc)»".
*
* <p>It is an error to specify multiple titlecasing adjustment options together.
*
* @return an options object with this option.
* @see #noBreakAdjustment()
* @draft ICU 60
* @provisional This API might change or be removed in a future release.
*/
public Title adjustToCased() {
return new Title(CaseMapImpl.addTitleAdjustmentOption(
internalOptions, CaseMapImpl.TITLECASE_ADJUST_TO_CASED));
}
/**
@ -259,9 +317,10 @@ public abstract class CaseMap {
*/
public <A extends Appendable> A apply(
Locale locale, BreakIterator iter, CharSequence src, A dest, Edits edits) {
if (iter == null) {
iter = BreakIterator.getWordInstance(locale);
if (iter == null && locale == null) {
locale = Locale.getDefault();
}
iter = CaseMapImpl.getTitleBreakIterator(locale, internalOptions, iter);
iter.setText(src.toString());
return CaseMapImpl.toTitle(
getCaseLocale(locale), internalOptions, iter, src, dest, edits);

View File

@ -1960,7 +1960,7 @@ public abstract class DateFormat extends UFormat {
static final public DateFormat getDateTimeInstance(Calendar cal, int dateStyle,
int timeStyle, Locale locale)
{
return getDateTimeInstance(dateStyle, timeStyle, ULocale.forLocale(locale));
return getDateTimeInstance(cal, dateStyle, timeStyle, ULocale.forLocale(locale));
}
/**

View File

@ -549,34 +549,10 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
private String getBestPattern(String skeleton, DateTimeMatcher skipMatcher, int options) {
EnumSet<DTPGflags> flags = EnumSet.noneOf(DTPGflags.class);
// Replace hour metacharacters 'j', 'C', and 'J', set flags as necessary
StringBuilder skeletonCopy = new StringBuilder(skeleton);
boolean inQuoted = false;
for (int patPos = 0; patPos < skeleton.length(); patPos++) {
char patChr = skeleton.charAt(patPos);
if (patChr == '\'') {
inQuoted = !inQuoted;
} else if (!inQuoted) {
if (patChr == 'j') {
skeletonCopy.setCharAt(patPos, defaultHourFormatChar);
} else if (patChr == 'C') {
String preferred = allowedHourFormats[0];
skeletonCopy.setCharAt(patPos, preferred.charAt(0));
final DTPGflags alt = DTPGflags.getFlag(preferred);
if (alt != null) {
flags.add(alt);
}
} else if (patChr == 'J') {
// Get pattern for skeleton with H, then (in adjustFieldTypes)
// replace H or k with defaultHourFormatChar
skeletonCopy.setCharAt(patPos, 'H');
flags.add(DTPGflags.SKELETON_USES_CAP_J);
}
}
}
String skeletonMapped = mapSkeletonMetacharacters(skeleton, flags);
String datePattern, timePattern;
synchronized(this) {
current.set(skeletonCopy.toString(), fp, false);
current.set(skeletonMapped, fp, false);
PatternWithMatcher bestWithMatcher = getBestRaw(current, -1, _distanceInfo, skipMatcher);
if (_distanceInfo.missingFieldMask == 0 && _distanceInfo.extraFieldMask == 0) {
// we have a good item. Adjust the field types
@ -595,6 +571,70 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
getDateTimeFormat(), 2, 2, timePattern, datePattern);
}
/*
* Map a skeleton that may have metacharacters jJC to one without, by replacing
* the metacharacters with locale-appropriate fields of of h/H/k/K and of a/b/B
* (depends on defaultHourFormatChar and allowedHourFormats being set, which in
* turn depends on initData having been run). This method also updates the flags
* as necessary. Returns the updated skeleton.
*/
private String mapSkeletonMetacharacters(String skeleton, EnumSet<DTPGflags> flags) {
StringBuilder skeletonCopy = new StringBuilder();
boolean inQuoted = false;
for (int patPos = 0; patPos < skeleton.length(); patPos++) {
char patChr = skeleton.charAt(patPos);
if (patChr == '\'') {
inQuoted = !inQuoted;
} else if (!inQuoted) {
// Handle special mappings for 'j' and 'C' in which fields lengths
// 1,3,5 => hour field length 1
// 2,4,6 => hour field length 2
// 1,2 => abbreviated dayPeriod (field length 1..3)
// 3,4 => long dayPeriod (field length 4)
// 5,6 => narrow dayPeriod (field length 5)
if (patChr == 'j' || patChr == 'C') {
int extraLen = 0; // 1 less than total field length
while (patPos+1 < skeleton.length() && skeleton.charAt(patPos+1) == patChr) {
extraLen++;
patPos++;
}
int hourLen = 1 + (extraLen & 1);
int dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1);
char hourChar = 'h';
char dayPeriodChar = 'a';
if (patChr == 'j') {
hourChar = defaultHourFormatChar;
} else { // patChr == 'C'
String preferred = allowedHourFormats[0];
hourChar = preferred.charAt(0);
// in #13183 just add b/B to skeleton, no longer need to set special flags
char last = preferred.charAt(preferred.length()-1);
if (last=='b' || last=='B') {
dayPeriodChar = last;
}
}
if (hourChar=='H' || hourChar=='k') {
dayPeriodLen = 0;
}
while (dayPeriodLen-- > 0) {
skeletonCopy.append(dayPeriodChar);
}
while (hourLen-- > 0) {
skeletonCopy.append(hourChar);
}
} else if (patChr == 'J') {
// Get pattern for skeleton with H, then (in adjustFieldTypes)
// replace H or k with defaultHourFormatChar
skeletonCopy.append('H');
flags.add(DTPGflags.SKELETON_USES_CAP_J);
} else {
skeletonCopy.append(patChr);
}
}
}
return skeletonCopy.toString();
}
/**
* PatternInfo supplies output parameters for addPattern(...). It is used because
* Java doesn't have real output parameters. It is treated like a struct (eg
@ -1892,18 +1932,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
private enum DTPGflags {
FIX_FRACTIONAL_SECONDS,
SKELETON_USES_CAP_J,
SKELETON_USES_b,
SKELETON_USES_B,
// with #13183, no longer need flags for b, B
;
public static DTPGflags getFlag(String preferred) {
char last = preferred.charAt(preferred.length()-1);
switch (last) {
case 'b' : return SKELETON_USES_b;
case 'B' : return SKELETON_USES_B;
default: return null;
}
}
};
private String adjustFieldTypes(PatternWithMatcher patternWithMatcher, DateTimeMatcher inputRequest, EnumSet<DTPGflags> flags, int options) {
@ -1923,18 +1953,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
// int type = types[canonicalIndex][1];
int type = variableField.getType();
// handle special day periods
if (type == DAYPERIOD
&& !flags.isEmpty()) {
char c = flags.contains(DTPGflags.SKELETON_USES_b) ? 'b' : flags.contains(DTPGflags.SKELETON_USES_B) ? 'B' : '0';
if (c != '0') {
int len = fieldBuilder.length();
fieldBuilder.setLength(0);
for (int i = len; i > 0; --i) {
fieldBuilder.append(c);
}
}
}
// handle day periods - with #13183, no longer need special handling here, integrated with normal types
if (flags.contains(DTPGflags.FIX_FRACTIONAL_SECONDS) && type == SECOND) {
fieldBuilder.append(decimal);
@ -2054,8 +2073,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
};
private static final String[] CLDR_FIELD_NAME = {
"era", "year", "*", "month", "week", "*", "weekday",
"day", "*", "*", "dayperiod",
"era", "year", "quarter", "month", "week", "weekOfMonth", "weekday",
"day", "dayOfYear", "weekdayOfMonth", "dayperiod",
"hour", "minute", "second", "*", "zone"
};
@ -2068,10 +2087,30 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
private static final String[] CANONICAL_ITEMS = {
"G", "y", "Q", "M", "w", "W", "E",
"d", "D", "F",
"d", "D", "F", "a",
"H", "m", "s", "S", "v"
};
// canon DateTimePatternGen CLDR fields
// char field bundle key
// ---- -------------------- ----------------
// 'G', // 0 ERA "era"
// 'y', // 1 YEAR "year"
// 'Q', // 2 QUARTER "quarter"
// 'M', // 3 MONTH "month"
// 'w', // 4 WEEK_OF_YEAR, "week"
// 'W', // 5 WEEK_OF_MONTH "weekOfMonth"
// 'E', // 6 WEEKDAY "weekday"
// 'd', // 7 DAY "day"
// 'D', // 8 DAY_OF_YEAR "dayOfYear"
// 'F', // 9 DAY_OF_WEEK_IN_MONTH "weekdayOfMonth"
// 'a', // 10 DAYPERIOD "dayperiod"
// 'H', // 11 HOUR "hour"
// 'm', // 12 MINUTE "minute"
// 's', // 13 SECOND "second"
// 'S', // 14 FRACTIONAL_SECOND
// 'v', // 15 ZONE "zone"
private static final Set<String> CANONICAL_SET = new HashSet<String>(Arrays.asList(CANONICAL_ITEMS));
private Set<String> cldrAvailableFormatKeys = new HashSet<String>(20);
@ -2084,8 +2123,9 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
NUMERIC = 0x100,
NONE = 0,
NARROW = -0x101,
SHORT = -0x102,
LONG = -0x103,
SHORTER = -0x102,
SHORT = -0x103,
LONG = -0x104,
EXTRA_FIELD = 0x10000,
MISSING_FIELD = 0x1000;
@ -2156,6 +2196,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
// pattern character, main type, weight, min length, weight
{'G', ERA, SHORT, 1, 3},
{'G', ERA, LONG, 4},
{'G', ERA, NARROW, 5},
{'y', YEAR, NUMERIC, 1, 20},
{'Y', YEAR, NUMERIC + DELTA, 1, 20},
@ -2168,10 +2209,11 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
{'Q', QUARTER, NUMERIC, 1, 2},
{'Q', QUARTER, SHORT, 3},
{'Q', QUARTER, LONG, 4},
{'Q', QUARTER, NARROW, 5},
{'q', QUARTER, NUMERIC + DELTA, 1, 2},
{'q', QUARTER, SHORT + DELTA, 3},
{'q', QUARTER, LONG + DELTA, 4},
{'q', QUARTER, SHORT - DELTA, 3},
{'q', QUARTER, LONG - DELTA, 4},
{'q', QUARTER, NARROW - DELTA, 5},
{'M', MONTH, NUMERIC, 1, 2},
{'M', MONTH, SHORT, 3},
@ -2181,30 +2223,44 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
{'L', MONTH, SHORT - DELTA, 3},
{'L', MONTH, LONG - DELTA, 4},
{'L', MONTH, NARROW - DELTA, 5},
{'l', MONTH, NUMERIC + DELTA, 1, 1},
{'w', WEEK_OF_YEAR, NUMERIC, 1, 2},
{'W', WEEK_OF_MONTH, NUMERIC + DELTA, 1},
{'W', WEEK_OF_MONTH, NUMERIC, 1},
{'E', WEEKDAY, SHORT, 1, 3},
{'E', WEEKDAY, LONG, 4},
{'E', WEEKDAY, NARROW, 5},
{'E', WEEKDAY, SHORTER, 6},
{'c', WEEKDAY, NUMERIC + 2*DELTA, 1, 2},
{'c', WEEKDAY, SHORT - 2*DELTA, 3},
{'c', WEEKDAY, LONG - 2*DELTA, 4},
{'c', WEEKDAY, NARROW - 2*DELTA, 5},
{'c', WEEKDAY, SHORTER - 2*DELTA, 6},
{'e', WEEKDAY, NUMERIC + DELTA, 1, 2}, // 'e' is currently not used in CLDR data, should not be canonical
{'e', WEEKDAY, SHORT - DELTA, 3},
{'e', WEEKDAY, LONG - DELTA, 4},
{'e', WEEKDAY, NARROW - DELTA, 5},
{'e', WEEKDAY, SHORTER - DELTA, 6},
{'d', DAY, NUMERIC, 1, 2},
{'D', DAY_OF_YEAR, NUMERIC + DELTA, 1, 3},
{'F', DAY_OF_WEEK_IN_MONTH, NUMERIC + 2*DELTA, 1},
{'g', DAY, NUMERIC + 3*DELTA, 1, 20}, // really internal use, so we don't care
{'g', DAY, NUMERIC + DELTA, 1, 20}, // really internal use, so we don't care
{'a', DAYPERIOD, SHORT, 1},
{'D', DAY_OF_YEAR, NUMERIC, 1, 3},
{'F', DAY_OF_WEEK_IN_MONTH, NUMERIC, 1},
{'a', DAYPERIOD, SHORT, 1, 3},
{'a', DAYPERIOD, LONG, 4},
{'a', DAYPERIOD, NARROW, 5},
{'b', DAYPERIOD, SHORT - DELTA, 1, 3},
{'b', DAYPERIOD, LONG - DELTA, 4},
{'b', DAYPERIOD, NARROW - DELTA, 5},
// b needs to be closer to a than to B, so we make this 3*DELTA
{'B', DAYPERIOD, SHORT - 3*DELTA, 1, 3},
{'B', DAYPERIOD, LONG - 3*DELTA, 4},
{'B', DAYPERIOD, NARROW - 3*DELTA, 5},
{'H', HOUR, NUMERIC + 10*DELTA, 1, 2}, // 24 hour
{'k', HOUR, NUMERIC + 11*DELTA, 1, 2},
@ -2214,8 +2270,9 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
{'m', MINUTE, NUMERIC, 1, 2},
{'s', SECOND, NUMERIC, 1, 2},
{'S', FRACTIONAL_SECOND, NUMERIC + DELTA, 1, 1000},
{'A', SECOND, NUMERIC + 2*DELTA, 1, 1000},
{'A', SECOND, NUMERIC + DELTA, 1, 1000},
{'S', FRACTIONAL_SECOND, NUMERIC, 1, 1000},
{'v', ZONE, SHORT - 2*DELTA, 1},
{'v', ZONE, LONG - 2*DELTA, 4},
@ -2228,6 +2285,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
{'O', ZONE, LONG - DELTA, 4},
{'V', ZONE, SHORT - DELTA, 1},
{'V', ZONE, LONG - DELTA, 2},
{'V', ZONE, LONG-1 - DELTA, 3},
{'V', ZONE, LONG-2 - DELTA, 4},
{'X', ZONE, NARROW - DELTA, 1},
{'X', ZONE, SHORT - DELTA, 2},
{'X', ZONE, LONG - DELTA, 4},
@ -2294,19 +2353,30 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
@Override
public String toString() {
return appendTo(new StringBuilder()).toString();
return appendTo(new StringBuilder(), false, false).toString();
}
public String toString(boolean skipDayPeriod) {
return appendTo(new StringBuilder(), false, skipDayPeriod).toString();
}
public String toCanonicalString() {
return appendTo(new StringBuilder(), true).toString();
return appendTo(new StringBuilder(), true, false).toString();
}
public String toCanonicalString(boolean skipDayPeriod) {
return appendTo(new StringBuilder(), true, skipDayPeriod).toString();
}
public StringBuilder appendTo(StringBuilder sb) {
return appendTo(sb, false);
return appendTo(sb, false, false);
}
private StringBuilder appendTo(StringBuilder sb, boolean canonical) {
private StringBuilder appendTo(StringBuilder sb, boolean canonical, boolean skipDayPeriod) {
for (int i=0; i<TYPE_LIMIT; ++i) {
if (skipDayPeriod && i == DAYPERIOD) {
continue;
}
appendFieldTo(i, sb, canonical);
}
return sb;
@ -2362,6 +2432,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
private int[] type = new int[TYPE_LIMIT];
private SkeletonFields original = new SkeletonFields();
private SkeletonFields baseOriginal = new SkeletonFields();
private boolean addedDefaultDayPeriod = false;
// just for testing; fix to make multi-threaded later
// private static FormatParser fp = new FormatParser();
@ -2372,18 +2443,27 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
@Override
public String toString() {
return original.toString();
// for backward compatibility: addedDefaultDayPeriod true => DateTimeMatcher.set
// added a single 'a' that was not in the provided skeleton, and it will be
// removed when generating the skeleton to return.
return original.toString(addedDefaultDayPeriod);
}
// returns a string like toString but using the canonical character for most types,
// e.g. M for M or L, E for E or c, y for y or U, etc. The hour field is canonicalized
// to 'H' (for 24-hour types) or 'h' (for 12-hour types)
public String toCanonicalString() {
return original.toCanonicalString();
// for backward compatibility: addedDefaultDayPeriod true => DateTimeMatcher.set
// added a single 'a' that was not in the provided skeleton, and it will be
// removed when generating the skeleton to return.
return original.toCanonicalString(addedDefaultDayPeriod);
}
String getBasePattern() {
return baseOriginal.toString();
// for backward compatibility: addedDefaultDayPeriod true => DateTimeMatcher.set
// added a single 'a' that was not in the provided skeleton, and it will be
// removed when generating the skeleton to return.
return baseOriginal.toString(addedDefaultDayPeriod);
}
DateTimeMatcher set(String pattern, FormatParser fp, boolean allowDuplicateFields) {
@ -2391,6 +2471,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
Arrays.fill(type, NONE);
original.clear();
baseOriginal.clear();
addedDefaultDayPeriod = false;
fp.set(pattern);
for (Object obj : fp.getItems()) {
@ -2399,7 +2480,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
}
VariableField item = (VariableField)obj;
String value = item.toString();
if (value.charAt(0) == 'a') continue; // skip day period, special case
// don't skip 'a' anymore, dayPeriod handled specially below
int canonicalIndex = item.getCanonicalIndex();
// if (canonicalIndex < 0) {
// throw new IllegalArgumentException("Illegal field:\t"
@ -2421,13 +2502,37 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
original.populate(field, value);
char repeatChar = (char)row[0];
int repeatCount = row[3];
// #7930 removes hack to cap repeatCount at 3
if ("GEzvQ".indexOf(repeatChar) >= 0) repeatCount = 1;
baseOriginal.populate(field, repeatChar, repeatCount);
int subField = row[2];
if (subField > 0) subField += value.length();
type[field] = subField;
}
// #13183, handle special behavior for day period characters (a, b, B)
if (!original.isFieldEmpty(HOUR)) {
if (original.getFieldChar(HOUR)=='h' || original.getFieldChar(HOUR)=='K') {
// We have a skeleton with 12-hour-cycle format
if (original.isFieldEmpty(DAYPERIOD)) {
// But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a")
for (int i = 0; i < types.length; ++i) {
int[] row = types[i];
if (row[1] == DAYPERIOD) {
// first entry for DAYPERIOD
original.populate(DAYPERIOD, (char)row[0], row[3]);
baseOriginal.populate(DAYPERIOD, (char)row[0], row[3]);
type[DAYPERIOD] = row[2];
addedDefaultDayPeriod = true;
break;
}
}
}
} else if (!original.isFieldEmpty(DAYPERIOD)) {
// Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it)
original.clearField(DAYPERIOD);
baseOriginal.clearField(DAYPERIOD);
type[DAYPERIOD] = NONE;
}
}
return this;
}

View File

@ -802,7 +802,7 @@ public class DecimalFormat extends NumberFormat {
Number result = Parse.parse(text, parsePosition, pprops, symbols);
// Backwards compatibility: return com.ibm.icu.math.BigDecimal
if (result instanceof java.math.BigDecimal) {
result = new com.ibm.icu.math.BigDecimal((java.math.BigDecimal) result);
result = safeConvertBigDecimal((java.math.BigDecimal) result);
}
return result;
}
@ -821,7 +821,7 @@ public class DecimalFormat extends NumberFormat {
Number number = result.getNumber();
// Backwards compatibility: return com.ibm.icu.math.BigDecimal
if (number instanceof java.math.BigDecimal) {
number = new com.ibm.icu.math.BigDecimal((java.math.BigDecimal) number);
number = safeConvertBigDecimal((java.math.BigDecimal) number);
result = new CurrencyAmount(number, result.getCurrency());
}
return result;
@ -2439,6 +2439,29 @@ public class DecimalFormat extends NumberFormat {
formatter.export(exportedProperties);
}
/**
* Converts a java.math.BigDecimal to a com.ibm.icu.math.BigDecimal with fallback for numbers
* outside of the range supported by com.ibm.icu.math.BigDecimal.
*
* @param number
* @return
*/
private Number safeConvertBigDecimal(java.math.BigDecimal number) {
try {
return new com.ibm.icu.math.BigDecimal(number);
} catch (NumberFormatException e) {
if (number.signum() > 0 && number.scale() < 0) {
return Double.POSITIVE_INFINITY;
} else if (number.scale() < 0) {
return Double.NEGATIVE_INFINITY;
} else if (number.signum() < 0) {
return -0.0;
} else {
return 0.0;
}
}
}
/**
* Updates the property bag with settings from the given pattern.
*

View File

@ -1590,7 +1590,7 @@ public final class Normalizer implements Cloneable {
* <tt>String</tt> over which this <tt>Normalizer</tt> is iterating
* @deprecated ICU 2.2. Use startIndex() instead.
* @return The codepoint as an int
* @see #startIndex
* @see #index
*/
@Deprecated
public int getBeginIndex() {

View File

@ -188,7 +188,7 @@ public final class VersionInfo implements Comparable<VersionInfo>
* @deprecated This API is ICU internal only.
*/
@Deprecated
public static final String ICU_DATA_VERSION_PATH = "59b";
public static final String ICU_DATA_VERSION_PATH = "60b";
/**
* Data version in ICU4J.
@ -567,8 +567,8 @@ public final class VersionInfo implements Comparable<VersionInfo>
UNICODE_9_0 = getInstance(9, 0, 0, 0);
UNICODE_10_0 = getInstance(10, 0, 0, 0);
ICU_VERSION = getInstance(59, 1, 0, 0);
ICU_DATA_VERSION = getInstance(59, 1, 0, 0);
ICU_VERSION = getInstance(60, 0, 1, 0);
ICU_DATA_VERSION = getInstance(60, 0, 1, 0);
UNICODE_VERSION = UNICODE_10_0;
UCOL_RUNTIME_VERSION = getInstance(9);

View File

@ -6,9 +6,9 @@
#*******************************************************************************
# Version numbers, etc.
icu4j.spec.version = 59
icu4j.impl.version = 59.1
icu4j.data.version = 59
icu4j.spec.version = 60
icu4j.impl.version = 60.0.1
icu4j.data.version = 60
default.exec.env = JavaSE-1.6
copyright = \u00A9 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html#License

Some files were not shown because too many files have changed in this diff Show More