mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
deps: update icu to 78.2
PR-URL: https://github.com/nodejs/node/pull/60523 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Steven R Loomis <srl295@gmail.com>
This commit is contained in:
1 parent
6b8da344c4
commit
1bd7f62d13
241 files changed
+18027
-11626
No files matched your search
Vendored
+26
@@ -540,3 +540,29 @@ publicity pertaining to distribution of the software without specific,
|
||||
written prior permission. M.I.T. makes no representations about the
|
||||
suitability of this software for any purpose. It is provided "as is"
|
||||
without express or implied warranty.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
File: sorttable.js (only for ICU4J)
|
||||
|
||||
The MIT Licence, for code from kryogenix.org
|
||||
|
||||
Code downloaded from the Browser Experiments section of kryogenix.org is
|
||||
licenced under the so-called MIT licence. The licence is below.
|
||||
|
||||
Copyright (c) 1997-date Stuart Langridge
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Vendored
+2
-2
@@ -1,8 +1,8 @@
|
||||
ICU sources - auto generated by shrink-icu-src.py
|
||||
|
||||
This directory contains the ICU subset used by --with-intl=full-icu
|
||||
It is a strict subset of ICU 77 source files with the following exception(s):
|
||||
* deps/icu-small/source/data/in/icudt77l.dat.bz2 : compressed data file
|
||||
It is a strict subset of ICU 78 source files with the following exception(s):
|
||||
* deps/icu-small/source/data/in/icudt78l.dat.bz2 : compressed data file
|
||||
|
||||
|
||||
To rebuild this directory, see ../../tools/icu/README.md
|
||||
|
||||
+1
@@ -64,6 +64,7 @@ cc_library(
|
||||
"umutex.cpp",
|
||||
"sharedobject.cpp",
|
||||
"utrace.cpp",
|
||||
"fixedstring.cpp",
|
||||
],
|
||||
deps = [
|
||||
":headers",
|
||||
|
||||
+18
-29
@@ -121,11 +121,9 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
|
||||
|
||||
// If there is a result, set the valid locale and actual locale, and the kind
|
||||
if (U_SUCCESS(status) && result != nullptr) {
|
||||
U_LOCALE_BASED(locBased, *(BreakIterator*)result);
|
||||
|
||||
locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status),
|
||||
actual.data(), status);
|
||||
LocaleBased::setLocaleID(loc.getName(), result->requestLocale, status);
|
||||
result->actualLocale = Locale(actual.data());
|
||||
result->validLocale = Locale(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status));
|
||||
result->requestLocale = loc;
|
||||
}
|
||||
|
||||
ures_close(b);
|
||||
@@ -204,33 +202,28 @@ BreakIterator::getAvailableLocales(int32_t& count)
|
||||
//-------------------------------------------
|
||||
|
||||
BreakIterator::BreakIterator()
|
||||
: actualLocale(Locale::getRoot()), validLocale(Locale::getRoot()), requestLocale(Locale::getRoot())
|
||||
{
|
||||
}
|
||||
|
||||
BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
locBased.setLocaleIDs(other.validLocale, other.actualLocale, status);
|
||||
LocaleBased::setLocaleID(other.requestLocale, requestLocale, status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
BreakIterator::BreakIterator(const BreakIterator &other)
|
||||
: UObject(other),
|
||||
actualLocale(other.actualLocale),
|
||||
validLocale(other.validLocale),
|
||||
requestLocale(other.requestLocale) {
|
||||
}
|
||||
|
||||
BreakIterator &BreakIterator::operator =(const BreakIterator &other) {
|
||||
if (this != &other) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
locBased.setLocaleIDs(other.validLocale, other.actualLocale, status);
|
||||
LocaleBased::setLocaleID(other.requestLocale, requestLocale, status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
actualLocale = other.actualLocale;
|
||||
validLocale = other.validLocale;
|
||||
requestLocale = other.requestLocale;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
BreakIterator::~BreakIterator()
|
||||
{
|
||||
delete validLocale;
|
||||
delete actualLocale;
|
||||
delete requestLocale;
|
||||
}
|
||||
|
||||
// ------------------------------------------
|
||||
@@ -398,8 +391,8 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu
|
||||
// THIS LONG is a sign of bad code -- so the action item is to
|
||||
// revisit this in ICU 3.0 and clean it up/fix it/remove it.
|
||||
if (U_SUCCESS(status) && (result != nullptr) && *actualLoc.getName() != 0) {
|
||||
U_LOCALE_BASED(locBased, *result);
|
||||
locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName(), status);
|
||||
result->actualLocale = actualLoc;
|
||||
result->validLocale = actualLoc;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -506,8 +499,7 @@ BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
return Locale::getRoot();
|
||||
}
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return requestLocale == nullptr ?
|
||||
Locale::getRoot() : Locale(requestLocale->data());
|
||||
return requestLocale;
|
||||
}
|
||||
return LocaleBased::getLocale(validLocale, actualLocale, type, status);
|
||||
}
|
||||
@@ -518,7 +510,7 @@ BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
return nullptr;
|
||||
}
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return requestLocale == nullptr ? "" : requestLocale->data();
|
||||
return requestLocale.getName();
|
||||
}
|
||||
return LocaleBased::getLocaleID(validLocale, actualLocale, type, status);
|
||||
}
|
||||
@@ -546,11 +538,8 @@ int32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UE
|
||||
return 1;
|
||||
}
|
||||
|
||||
BreakIterator::BreakIterator (const Locale& valid, const Locale& actual) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, (*this));
|
||||
locBased.setLocaleIDs(valid.getName(), actual.getName(), status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
BreakIterator::BreakIterator(const Locale& valid, const Locale& actual)
|
||||
: actualLocale(actual), validLocale(valid), requestLocale(Locale::getRoot()) {
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
+41
-45
@@ -21,12 +21,6 @@
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
// Windows needs us to DLL-export the MaybeStackArray template specialization,
|
||||
// but MacOS X cannot handle it. Same as in digitlst.h.
|
||||
#if !U_PLATFORM_IS_DARWIN_BASED
|
||||
template class U_COMMON_API MaybeStackArray<char, 40>;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ICU-internal char * string class.
|
||||
* This class does not assume or enforce any particular character encoding.
|
||||
@@ -38,34 +32,34 @@ template class U_COMMON_API MaybeStackArray<char, 40>;
|
||||
* For example:
|
||||
* cs.data()[5]='a'; // no need for setCharAt(5, 'a')
|
||||
*/
|
||||
class U_COMMON_API CharString : public UMemory {
|
||||
class U_COMMON_API_CLASS CharString : public UMemory {
|
||||
public:
|
||||
CharString() : len(0) { buffer[0]=0; }
|
||||
CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
|
||||
U_COMMON_API CharString() : len(0) { buffer[0]=0; }
|
||||
U_COMMON_API CharString(StringPiece s, UErrorCode &errorCode) : len(0) {
|
||||
buffer[0]=0;
|
||||
append(s, errorCode);
|
||||
}
|
||||
CharString(const CharString &s, UErrorCode &errorCode) : len(0) {
|
||||
U_COMMON_API CharString(const CharString &s, UErrorCode &errorCode) : len(0) {
|
||||
buffer[0]=0;
|
||||
append(s, errorCode);
|
||||
}
|
||||
CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
|
||||
U_COMMON_API CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) {
|
||||
buffer[0]=0;
|
||||
append(s, sLength, errorCode);
|
||||
}
|
||||
~CharString() {}
|
||||
U_COMMON_API ~CharString() {}
|
||||
|
||||
/**
|
||||
* Move constructor; might leave src in an undefined state.
|
||||
* This string will have the same contents and state that the source string had.
|
||||
*/
|
||||
CharString(CharString &&src) noexcept;
|
||||
U_COMMON_API CharString(CharString &&src) noexcept;
|
||||
/**
|
||||
* Move assignment operator; might leave src in an undefined state.
|
||||
* This string will have the same contents and state that the source string had.
|
||||
* The behavior is undefined if *this and src are the same object.
|
||||
*/
|
||||
CharString &operator=(CharString &&src) noexcept;
|
||||
U_COMMON_API CharString &operator=(CharString &&src) noexcept;
|
||||
|
||||
/**
|
||||
* Replaces this string's contents with the other string's contents.
|
||||
@@ -73,21 +67,21 @@ public:
|
||||
* the assignment operator, to make copies explicit and to
|
||||
* use a UErrorCode where memory allocations might be needed.
|
||||
*/
|
||||
CharString ©From(const CharString &other, UErrorCode &errorCode);
|
||||
CharString ©From(StringPiece s, UErrorCode &errorCode);
|
||||
U_COMMON_API CharString ©From(const CharString &other, UErrorCode &errorCode);
|
||||
U_COMMON_API CharString ©From(StringPiece s, UErrorCode &errorCode);
|
||||
|
||||
UBool isEmpty() const { return len==0; }
|
||||
int32_t length() const { return len; }
|
||||
char operator[](int32_t index) const { return buffer[index]; }
|
||||
StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); }
|
||||
U_COMMON_API UBool isEmpty() const { return len==0; }
|
||||
U_COMMON_API int32_t length() const { return len; }
|
||||
U_COMMON_API char operator[](int32_t index) const { return buffer[index]; }
|
||||
U_COMMON_API StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); }
|
||||
|
||||
const char *data() const { return buffer.getAlias(); }
|
||||
char *data() { return buffer.getAlias(); }
|
||||
U_COMMON_API const char *data() const { return buffer.getAlias(); }
|
||||
U_COMMON_API char *data() { return buffer.getAlias(); }
|
||||
/**
|
||||
* Allocates length()+1 chars and copies the NUL-terminated data().
|
||||
* The caller must uprv_free() the result.
|
||||
*/
|
||||
char *cloneData(UErrorCode &errorCode) const;
|
||||
U_COMMON_API char *cloneData(UErrorCode &errorCode) const;
|
||||
/**
|
||||
* Copies the contents of the string into dest.
|
||||
* Checks if there is enough space in dest, extracts the entire string if possible,
|
||||
@@ -103,40 +97,40 @@ public:
|
||||
* @param errorCode ICU error code.
|
||||
* @return length()
|
||||
*/
|
||||
int32_t extract(char *dest, int32_t capacity, UErrorCode &errorCode) const;
|
||||
U_COMMON_API int32_t extract(char *dest, int32_t capacity, UErrorCode &errorCode) const;
|
||||
|
||||
bool operator==(const CharString& other) const {
|
||||
U_COMMON_API bool operator==(const CharString& other) const {
|
||||
return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
|
||||
}
|
||||
bool operator!=(const CharString& other) const {
|
||||
U_COMMON_API bool operator!=(const CharString& other) const {
|
||||
return !operator==(other);
|
||||
}
|
||||
|
||||
bool operator==(StringPiece other) const {
|
||||
U_COMMON_API bool operator==(StringPiece other) const {
|
||||
return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0);
|
||||
}
|
||||
bool operator!=(StringPiece other) const {
|
||||
U_COMMON_API bool operator!=(StringPiece other) const {
|
||||
return !operator==(other);
|
||||
}
|
||||
|
||||
/** @return last index of c, or -1 if c is not in this string */
|
||||
int32_t lastIndexOf(char c) const;
|
||||
U_COMMON_API int32_t lastIndexOf(char c) const;
|
||||
|
||||
bool contains(StringPiece s) const;
|
||||
U_COMMON_API bool contains(StringPiece s) const;
|
||||
|
||||
CharString &clear() { len=0; buffer[0]=0; return *this; }
|
||||
CharString &truncate(int32_t newLength);
|
||||
U_COMMON_API CharString &clear() { len=0; buffer[0]=0; return *this; }
|
||||
U_COMMON_API CharString &truncate(int32_t newLength);
|
||||
|
||||
CharString &append(char c, UErrorCode &errorCode);
|
||||
CharString &append(StringPiece s, UErrorCode &errorCode) {
|
||||
U_COMMON_API CharString &append(char c, UErrorCode &errorCode);
|
||||
U_COMMON_API CharString &append(StringPiece s, UErrorCode &errorCode) {
|
||||
return append(s.data(), s.length(), errorCode);
|
||||
}
|
||||
CharString &append(const CharString &s, UErrorCode &errorCode) {
|
||||
U_COMMON_API CharString &append(const CharString &s, UErrorCode &errorCode) {
|
||||
return append(s.data(), s.length(), errorCode);
|
||||
}
|
||||
CharString &append(const char *s, int32_t sLength, UErrorCode &status);
|
||||
U_COMMON_API CharString &append(const char *s, int32_t sLength, UErrorCode &status);
|
||||
|
||||
CharString &appendNumber(int64_t number, UErrorCode &status);
|
||||
U_COMMON_API CharString &appendNumber(int64_t number, UErrorCode &status);
|
||||
|
||||
/**
|
||||
* Returns a writable buffer for appending and writes the buffer's capacity to
|
||||
@@ -158,26 +152,28 @@ public:
|
||||
* @param errorCode in/out error code
|
||||
* @return a buffer with resultCapacity>=min_capacity
|
||||
*/
|
||||
char *getAppendBuffer(int32_t minCapacity,
|
||||
int32_t desiredCapacityHint,
|
||||
int32_t &resultCapacity,
|
||||
UErrorCode &errorCode);
|
||||
U_COMMON_API char *getAppendBuffer(int32_t minCapacity,
|
||||
int32_t desiredCapacityHint,
|
||||
int32_t &resultCapacity,
|
||||
UErrorCode &errorCode);
|
||||
|
||||
CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode);
|
||||
CharString &appendInvariantChars(const char16_t* uchars, int32_t ucharsLen, UErrorCode& errorCode);
|
||||
U_COMMON_API CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode);
|
||||
U_COMMON_API CharString &appendInvariantChars(const char16_t* uchars,
|
||||
int32_t ucharsLen,
|
||||
UErrorCode& errorCode);
|
||||
|
||||
/**
|
||||
* Appends a filename/path part, e.g., a directory name.
|
||||
* First appends a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR if necessary.
|
||||
* Does nothing if s is empty.
|
||||
*/
|
||||
CharString &appendPathPart(StringPiece s, UErrorCode &errorCode);
|
||||
U_COMMON_API CharString &appendPathPart(StringPiece s, UErrorCode &errorCode);
|
||||
|
||||
/**
|
||||
* Appends a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR if this string is not empty
|
||||
* and does not already end with a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR.
|
||||
*/
|
||||
CharString &ensureEndsWithFileSeparator(UErrorCode &errorCode);
|
||||
U_COMMON_API CharString &ensureEndsWithFileSeparator(UErrorCode &errorCode);
|
||||
|
||||
private:
|
||||
MaybeStackArray<char, 40> buffer;
|
||||
|
||||
-4
@@ -334,9 +334,7 @@ public:
|
||||
// No heap allocation. Use only on the stack.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
#if U_HAVE_PLACEMENT_NEW
|
||||
static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Default constructor initializes with internal T[stackCapacity] buffer.
|
||||
@@ -570,9 +568,7 @@ public:
|
||||
// No heap allocation. Use only on the stack.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
#if U_HAVE_PLACEMENT_NEW
|
||||
static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Default constructor initializes with internal H+T[stackCapacity] buffer.
|
||||
|
||||
Vendored
+4
-4
@@ -43,11 +43,11 @@
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class U_COMMON_API CStr : public UMemory {
|
||||
class U_COMMON_API_CLASS CStr : public UMemory {
|
||||
public:
|
||||
CStr(const UnicodeString &in);
|
||||
~CStr();
|
||||
const char * operator ()() const;
|
||||
U_COMMON_API CStr(const UnicodeString &in);
|
||||
U_COMMON_API ~CStr();
|
||||
U_COMMON_API const char * operator ()() const;
|
||||
|
||||
private:
|
||||
CharString s;
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// © 2025 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: https://www.unicode.org/copyright.html
|
||||
|
||||
#include "fixedstring.h"
|
||||
|
||||
#include "unicode/unistr.h"
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
U_EXPORT void copyInvariantChars(const UnicodeString& src, FixedString& dst, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (src.isEmpty()) {
|
||||
dst.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t length = src.length();
|
||||
if (!dst.reserve(length + 1)) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
src.extract(0, length, dst.getAlias(), length + 1, US_INV);
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
// © 2025 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: https://www.unicode.org/copyright.html
|
||||
|
||||
#ifndef FIXEDSTRING_H
|
||||
#define FIXEDSTRING_H
|
||||
|
||||
#include <string_view>
|
||||
#include <utility>
|
||||
|
||||
#include "unicode/uobject.h"
|
||||
#include "unicode/utypes.h"
|
||||
#include "cmemory.h"
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class UnicodeString;
|
||||
|
||||
/**
|
||||
* ICU-internal fixed-length char* string class.
|
||||
* This is a complement to CharString to store fixed-length strings efficiently
|
||||
* (not allocating any unnecessary storage for future additions to the string).
|
||||
*
|
||||
* A terminating NUL is always stored, but the length of the string isn't.
|
||||
* An empty string is stored as nullptr, allocating no storage at all.
|
||||
*
|
||||
* This class wants to be convenient but is also deliberately minimalist.
|
||||
* Please do not add methods if they only add minor convenience.
|
||||
*/
|
||||
class FixedString : public UMemory {
|
||||
public:
|
||||
FixedString() = default;
|
||||
~FixedString() { operator delete[](ptr); }
|
||||
|
||||
FixedString(const FixedString& other) : FixedString(other.data()) {}
|
||||
|
||||
FixedString(std::string_view init) {
|
||||
size_t size = init.size();
|
||||
if (size > 0 && reserve(size + 1)) {
|
||||
uprv_memcpy(ptr, init.data(), size);
|
||||
ptr[size] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
FixedString& operator=(const FixedString& other) {
|
||||
*this = other.data();
|
||||
return *this;
|
||||
}
|
||||
|
||||
FixedString& operator=(std::string_view init) {
|
||||
if (init.empty()) {
|
||||
operator delete[](ptr);
|
||||
ptr = nullptr;
|
||||
} else {
|
||||
size_t size = init.size();
|
||||
if (reserve(size + 1)) {
|
||||
uprv_memcpy(ptr, init.data(), size);
|
||||
ptr[size] = '\0';
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
FixedString(FixedString&& other) noexcept : ptr(std::exchange(other.ptr, nullptr)) {}
|
||||
|
||||
FixedString& operator=(FixedString&& other) noexcept {
|
||||
operator delete[](ptr);
|
||||
ptr = other.ptr;
|
||||
other.ptr = nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void clear() {
|
||||
operator delete[](ptr);
|
||||
ptr = nullptr;
|
||||
}
|
||||
|
||||
const char* data() const {
|
||||
return isEmpty() ? "" : ptr;
|
||||
}
|
||||
|
||||
char* getAlias() {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
bool isEmpty() const {
|
||||
return ptr == nullptr;
|
||||
}
|
||||
|
||||
/** Allocate storage for a new string, without initializing it. */
|
||||
bool reserve(size_t size) {
|
||||
operator delete[](ptr);
|
||||
ptr = static_cast<char*>(operator new[](size));
|
||||
return ptr != nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
char* ptr = nullptr;
|
||||
};
|
||||
|
||||
U_COMMON_API void copyInvariantChars(const UnicodeString& src, FixedString& dst, UErrorCode& status);
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
#endif
|
||||
+5
-5
@@ -8,6 +8,7 @@
|
||||
#include "bytesinkutil.h" // StringByteSink<CharString>
|
||||
#include "charstr.h"
|
||||
#include "cstring.h"
|
||||
#include "fixedstring.h"
|
||||
#include "ulocimp.h"
|
||||
#include "unicode/localebuilder.h"
|
||||
#include "unicode/locid.h"
|
||||
@@ -131,14 +132,13 @@ LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant)
|
||||
variant_ = nullptr;
|
||||
return *this;
|
||||
}
|
||||
CharString* new_variant = new CharString(variant, status_);
|
||||
if (U_FAILURE(status_)) { return *this; }
|
||||
if (new_variant == nullptr) {
|
||||
FixedString* new_variant = new FixedString(variant);
|
||||
if (new_variant == nullptr || new_variant->isEmpty()) {
|
||||
status_ = U_MEMORY_ALLOCATION_ERROR;
|
||||
return *this;
|
||||
}
|
||||
transform(new_variant->data(), new_variant->length());
|
||||
if (!ultag_isVariantSubtags(new_variant->data(), new_variant->length())) {
|
||||
transform(new_variant->getAlias(), variant.length());
|
||||
if (!ultag_isVariantSubtags(new_variant->data(), variant.length())) {
|
||||
delete new_variant;
|
||||
status_ = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return *this;
|
||||
|
||||
+1351
-1322
File diff suppressed because it is too large.
Load diff
+15
-64
@@ -11,85 +11,36 @@
|
||||
**********************************************************************
|
||||
*/
|
||||
#include "locbased.h"
|
||||
#include "cstring.h"
|
||||
#include "charstr.h"
|
||||
#include "uresimp.h"
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
Locale LocaleBased::getLocale(const CharString* valid, const CharString* actual,
|
||||
ULocDataLocaleType type, UErrorCode& status) {
|
||||
const char* id = getLocaleID(valid, actual, type, status);
|
||||
return Locale(id != nullptr ? id : "");
|
||||
}
|
||||
|
||||
const char* LocaleBased::getLocaleID(const CharString* valid, const CharString* actual,
|
||||
const Locale& LocaleBased::getLocale(const Locale& valid, const Locale& actual,
|
||||
ULocDataLocaleType type, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
return Locale::getRoot();
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case ULOC_VALID_LOCALE:
|
||||
return valid == nullptr ? "" : valid->data();
|
||||
return valid;
|
||||
case ULOC_ACTUAL_LOCALE:
|
||||
return actual == nullptr ? "" : actual->data();
|
||||
return actual;
|
||||
default:
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return Locale::getRoot();
|
||||
}
|
||||
}
|
||||
|
||||
const char* LocaleBased::getLocaleID(const Locale& valid, const Locale& actual,
|
||||
ULocDataLocaleType type, UErrorCode& status) {
|
||||
const Locale& locale = getLocale(valid, actual, type, status);
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleIDs(const CharString* validID, const CharString* actualID, UErrorCode& status) {
|
||||
setValidLocaleID(validID, status);
|
||||
setActualLocaleID(actualID,status);
|
||||
}
|
||||
void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) {
|
||||
setValidLocaleID(validID, status);
|
||||
setActualLocaleID(actualID,status);
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (id == nullptr || *id == 0) {
|
||||
delete dest;
|
||||
dest = nullptr;
|
||||
} else {
|
||||
if (dest == nullptr) {
|
||||
dest = new CharString(id, status);
|
||||
if (dest == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dest->copyFrom(id, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (id == nullptr || id->isEmpty()) {
|
||||
delete dest;
|
||||
dest = nullptr;
|
||||
} else {
|
||||
if (dest == nullptr) {
|
||||
dest = new CharString(*id, status);
|
||||
if (dest == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dest->copyFrom(*id, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LocaleBased::equalIDs(const CharString* left, const CharString* right) {
|
||||
// true if both are nullptr
|
||||
if (left == nullptr && right == nullptr) return true;
|
||||
// false if only one is nullptr
|
||||
if (left == nullptr || right == nullptr) return false;
|
||||
return *left == *right;
|
||||
return locale == Locale::getRoot() ? kRootLocaleName : locale.getName();
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
+3
-58
@@ -16,17 +16,8 @@
|
||||
#include "unicode/locid.h"
|
||||
#include "unicode/uobject.h"
|
||||
|
||||
/**
|
||||
* Macro to declare a locale LocaleBased wrapper object for the given
|
||||
* object, which must have two members named `validLocale' and
|
||||
* `actualLocale' of which are pointers to the internal icu::CharString.
|
||||
*/
|
||||
#define U_LOCALE_BASED(varname, objname) \
|
||||
LocaleBased varname((objname).validLocale, (objname).actualLocale)
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class CharString;
|
||||
/**
|
||||
* A utility class that unifies the implementation of getLocale() by
|
||||
* various ICU services. This class is likely to be removed in the
|
||||
@@ -38,12 +29,6 @@ class U_COMMON_API LocaleBased : public UMemory {
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Construct a LocaleBased wrapper around the two pointers. These
|
||||
* will be aliased for the lifetime of this object.
|
||||
*/
|
||||
inline LocaleBased(CharString*& validAlias, CharString*& actualAlias);
|
||||
|
||||
/**
|
||||
* Return locale meta-data for the service object wrapped by this
|
||||
* object. Either the valid or the actual locale may be
|
||||
@@ -54,8 +39,8 @@ class U_COMMON_API LocaleBased : public UMemory {
|
||||
* @param status input-output error code
|
||||
* @return the indicated locale
|
||||
*/
|
||||
static Locale getLocale(
|
||||
const CharString* valid, const CharString* actual,
|
||||
static const Locale& getLocale(
|
||||
const Locale& valid, const Locale& actual,
|
||||
ULocDataLocaleType type, UErrorCode& status);
|
||||
|
||||
/**
|
||||
@@ -69,51 +54,11 @@ class U_COMMON_API LocaleBased : public UMemory {
|
||||
* @return the indicated locale ID
|
||||
*/
|
||||
static const char* getLocaleID(
|
||||
const CharString* valid, const CharString* actual,
|
||||
const Locale& valid, const Locale& actual,
|
||||
ULocDataLocaleType type, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Set the locale meta-data for the service object wrapped by this
|
||||
* object. If either parameter is zero, it is ignored.
|
||||
* @param valid the ID of the valid locale
|
||||
* @param actual the ID of the actual locale
|
||||
*/
|
||||
void setLocaleIDs(const char* valid, const char* actual, UErrorCode& status);
|
||||
void setLocaleIDs(const CharString* valid, const CharString* actual, UErrorCode& status);
|
||||
|
||||
static void setLocaleID(const char* id, CharString*& dest, UErrorCode& status);
|
||||
static void setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status);
|
||||
|
||||
static bool equalIDs(const CharString* left, const CharString* right);
|
||||
|
||||
private:
|
||||
|
||||
void setValidLocaleID(const CharString* id, UErrorCode& status);
|
||||
void setActualLocaleID(const CharString* id, UErrorCode& status);
|
||||
void setValidLocaleID(const char* id, UErrorCode& status);
|
||||
void setActualLocaleID(const char* id, UErrorCode& status);
|
||||
|
||||
CharString*& valid;
|
||||
CharString*& actual;
|
||||
};
|
||||
|
||||
inline LocaleBased::LocaleBased(CharString*& validAlias, CharString*& actualAlias) :
|
||||
valid(validAlias), actual(actualAlias) {
|
||||
}
|
||||
|
||||
inline void LocaleBased::setValidLocaleID(const CharString* id, UErrorCode& status) {
|
||||
setLocaleID(id, valid, status);
|
||||
}
|
||||
inline void LocaleBased::setActualLocaleID(const CharString* id, UErrorCode& status) {
|
||||
setLocaleID(id, actual, status);
|
||||
}
|
||||
inline void LocaleBased::setValidLocaleID(const char* id, UErrorCode& status) {
|
||||
setLocaleID(id, valid, status);
|
||||
}
|
||||
inline void LocaleBased::setActualLocaleID(const char* id, UErrorCode& status) {
|
||||
setLocaleID(id, actual, status);
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
#endif
|
||||
+10
-10
@@ -66,7 +66,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
|
||||
length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayLanguage(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -78,7 +78,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
errorCode=U_ZERO_ERROR;
|
||||
length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayLanguage(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -106,7 +106,7 @@ Locale::getDisplayScript(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
|
||||
length=uloc_getDisplayScript(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayScript(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -118,7 +118,7 @@ Locale::getDisplayScript(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
errorCode=U_ZERO_ERROR;
|
||||
length=uloc_getDisplayScript(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayScript(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -146,7 +146,7 @@ Locale::getDisplayCountry(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
|
||||
length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayCountry(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -158,7 +158,7 @@ Locale::getDisplayCountry(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
errorCode=U_ZERO_ERROR;
|
||||
length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayCountry(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -186,7 +186,7 @@ Locale::getDisplayVariant(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
|
||||
length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayVariant(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -198,7 +198,7 @@ Locale::getDisplayVariant(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
errorCode=U_ZERO_ERROR;
|
||||
length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayVariant(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -226,7 +226,7 @@ Locale::getDisplayName(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
|
||||
length=uloc_getDisplayName(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayName(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
@@ -238,7 +238,7 @@ Locale::getDisplayName(const Locale &displayLocale,
|
||||
return result;
|
||||
}
|
||||
errorCode=U_ZERO_ERROR;
|
||||
length=uloc_getDisplayName(fullName, displayLocale.fullName,
|
||||
length=uloc_getDisplayName(getName(), displayLocale.getName(),
|
||||
buffer, result.getCapacity(),
|
||||
&errorCode);
|
||||
result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
|
||||
|
||||
+411
-243
@@ -31,13 +31,16 @@
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <cstddef>
|
||||
#include <optional>
|
||||
#include <string_view>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#include "unicode/bytestream.h"
|
||||
#include "unicode/locid.h"
|
||||
#include "unicode/localebuilder.h"
|
||||
#include "unicode/localpointer.h"
|
||||
#include "unicode/strenum.h"
|
||||
#include "unicode/stringpiece.h"
|
||||
#include "unicode/uloc.h"
|
||||
@@ -48,6 +51,7 @@
|
||||
#include "charstrmap.h"
|
||||
#include "cmemory.h"
|
||||
#include "cstring.h"
|
||||
#include "fixedstring.h"
|
||||
#include "mutex.h"
|
||||
#include "putilimp.h"
|
||||
#include "uassert.h"
|
||||
@@ -232,9 +236,214 @@ locale_get_default()
|
||||
return Locale::getDefault().getName();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
template <auto FIELD, typename T>
|
||||
void copyToArray(std::string_view sv, T* that) {
|
||||
auto& field = that->*FIELD;
|
||||
constexpr size_t capacity = std::extent_v<std::remove_reference_t<decltype(field)>>;
|
||||
static_assert(capacity > 0);
|
||||
if (!sv.empty()) {
|
||||
U_ASSERT(sv.size() < capacity);
|
||||
uprv_memcpy(field, sv.data(), sv.size());
|
||||
}
|
||||
field[sv.size()] = '\0';
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
void Locale::Nest::init(std::string_view language,
|
||||
std::string_view script,
|
||||
std::string_view region,
|
||||
uint8_t variantBegin) {
|
||||
copyToArray<&Nest::language>(language, this);
|
||||
copyToArray<&Nest::script>(script, this);
|
||||
copyToArray<&Nest::region>(region, this);
|
||||
this->variantBegin = variantBegin;
|
||||
}
|
||||
|
||||
Locale::Nest::Nest(Heap&& heap, uint8_t variantBegin) {
|
||||
// When moving from Heap to Nest the language field can be left untouched
|
||||
// (as it has the same offset in both) and only the script and region fields
|
||||
// need to be copied to their new locations, which is safe to do because the
|
||||
// new locations come before the old locations in memory and don't overlap.
|
||||
static_assert(offsetof(Nest, region) <= offsetof(Heap, script));
|
||||
static_assert(offsetof(Nest, variantBegin) <= offsetof(Heap, region));
|
||||
U_ASSERT(this == reinterpret_cast<Nest*>(&heap));
|
||||
copyToArray<&Nest::script>(heap.script, this);
|
||||
copyToArray<&Nest::region>(heap.region, this);
|
||||
this->variantBegin = variantBegin;
|
||||
*this->baseName = '\0';
|
||||
}
|
||||
|
||||
struct Locale::Heap::Alloc : public UMemory {
|
||||
FixedString fullName;
|
||||
FixedString baseName;
|
||||
int32_t variantBegin;
|
||||
|
||||
const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; }
|
||||
const char* getFullName() const { return fullName.data(); }
|
||||
const char* getBaseName() const {
|
||||
if (baseName.isEmpty()) {
|
||||
if (const char* name = fullName.data(); *name != '@') {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
return baseName.data();
|
||||
}
|
||||
|
||||
Alloc(int32_t variantBegin) : fullName(), baseName(), variantBegin(variantBegin) {}
|
||||
|
||||
Alloc(const Alloc& other, UErrorCode& status)
|
||||
: fullName(), baseName(), variantBegin(other.variantBegin) {
|
||||
if (U_SUCCESS(status)) {
|
||||
if (!other.fullName.isEmpty()) {
|
||||
fullName = other.fullName;
|
||||
if (fullName.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
} else {
|
||||
if (!other.baseName.isEmpty()) {
|
||||
baseName = other.baseName;
|
||||
if (baseName.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Move should be done on the owner of the pointer to this object.
|
||||
Alloc(Alloc&&) noexcept = delete;
|
||||
|
||||
~Alloc() = default;
|
||||
};
|
||||
|
||||
const char* Locale::Heap::getVariant() const { return ptr->getVariant(); }
|
||||
const char* Locale::Heap::getFullName() const { return ptr->getFullName(); }
|
||||
const char* Locale::Heap::getBaseName() const { return ptr->getBaseName(); }
|
||||
|
||||
Locale::Heap::Heap(std::string_view language,
|
||||
std::string_view script,
|
||||
std::string_view region,
|
||||
int32_t variantBegin) {
|
||||
ptr = new Alloc(variantBegin);
|
||||
if (ptr == nullptr) {
|
||||
type = eBOGUS;
|
||||
} else {
|
||||
type = eHEAP;
|
||||
copyToArray<&Heap::language>(language, this);
|
||||
copyToArray<&Heap::script>(script, this);
|
||||
copyToArray<&Heap::region>(region, this);
|
||||
}
|
||||
}
|
||||
|
||||
Locale::Heap::~Heap() {
|
||||
U_ASSERT(type == eHEAP);
|
||||
delete ptr;
|
||||
}
|
||||
|
||||
Locale::Heap& Locale::Heap::operator=(const Heap& other) {
|
||||
U_ASSERT(type == eBOGUS);
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
ptr = new Alloc(*other.ptr, status);
|
||||
if (ptr == nullptr || U_FAILURE(status)) {
|
||||
delete ptr;
|
||||
} else {
|
||||
type = eHEAP;
|
||||
uprv_memcpy(language, other.language, sizeof language);
|
||||
uprv_memcpy(script, other.script, sizeof script);
|
||||
uprv_memcpy(region, other.region, sizeof region);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Locale::Heap& Locale::Heap::operator=(Heap&& other) noexcept {
|
||||
U_ASSERT(type == eBOGUS);
|
||||
ptr = other.ptr;
|
||||
type = eHEAP;
|
||||
other.type = eBOGUS;
|
||||
uprv_memcpy(language, other.language, sizeof language);
|
||||
uprv_memcpy(script, other.script, sizeof script);
|
||||
uprv_memcpy(region, other.region, sizeof region);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename BogusFn, typename NestFn, typename HeapFn, typename... Args>
|
||||
auto Locale::Payload::visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const {
|
||||
switch (type) {
|
||||
case eBOGUS:
|
||||
return bogusFn(args...);
|
||||
case eNEST:
|
||||
return nestFn(nest, args...);
|
||||
case eHEAP:
|
||||
return heapFn(heap, args...);
|
||||
default:
|
||||
UPRV_UNREACHABLE_EXIT;
|
||||
};
|
||||
}
|
||||
|
||||
void Locale::Payload::copy(const Payload& other) {
|
||||
other.visit([](Payload*) {},
|
||||
[](const Nest& nest, Payload* dst) { dst->nest = nest; },
|
||||
[](const Heap& heap, Payload* dst) { dst->heap = heap; },
|
||||
this);
|
||||
}
|
||||
|
||||
void Locale::Payload::move(Payload&& other) noexcept {
|
||||
other.visit(
|
||||
[](Payload*) {},
|
||||
[](const Nest& nest, Payload* dst) { dst->nest = nest; },
|
||||
[](const Heap& heap, Payload* dst) { dst->heap = std::move(const_cast<Heap&>(heap)); },
|
||||
this);
|
||||
}
|
||||
|
||||
Locale::Payload::~Payload() {
|
||||
if (type == eHEAP) { heap.~Heap(); }
|
||||
}
|
||||
|
||||
Locale::Payload::Payload(const Payload& other) : type{eBOGUS} { copy(other); }
|
||||
Locale::Payload::Payload(Payload&& other) noexcept : type{eBOGUS} { move(std::move(other)); }
|
||||
|
||||
Locale::Payload& Locale::Payload::operator=(const Payload& other) {
|
||||
if (this != &other) {
|
||||
setToBogus();
|
||||
copy(other);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Locale::Payload& Locale::Payload::operator=(Payload&& other) noexcept {
|
||||
if (this != &other) {
|
||||
setToBogus();
|
||||
move(std::move(other));
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Locale::Payload::setToBogus() {
|
||||
this->~Payload();
|
||||
type = eBOGUS;
|
||||
}
|
||||
|
||||
template <typename T, typename... Args> T& Locale::Payload::emplace(Args&&... args) {
|
||||
if constexpr (std::is_same_v<T, Nest>) {
|
||||
this->~Payload();
|
||||
::new (&nest) Nest(std::forward<Args>(args)...);
|
||||
return nest;
|
||||
}
|
||||
if constexpr (std::is_same_v<T, Heap>) {
|
||||
U_ASSERT(type != eHEAP);
|
||||
::new (&heap) Heap(std::forward<Args>(args)...);
|
||||
return heap;
|
||||
}
|
||||
}
|
||||
|
||||
template <> Locale::Nest* Locale::Payload::get() { return type == eNEST ? &nest : nullptr; }
|
||||
template <> Locale::Heap* Locale::Payload::get() { return type == eHEAP ? &heap : nullptr; }
|
||||
|
||||
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale)
|
||||
|
||||
/*Character separating the posix id fields*/
|
||||
@@ -243,22 +452,10 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale)
|
||||
#define SEP_CHAR '_'
|
||||
#define NULL_CHAR '\0'
|
||||
|
||||
Locale::~Locale()
|
||||
{
|
||||
if ((baseName != fullName) && (baseName != fullNameBuffer)) {
|
||||
uprv_free(baseName);
|
||||
}
|
||||
baseName = nullptr;
|
||||
/*if fullName is on the heap, we free it*/
|
||||
if (fullName != fullNameBuffer)
|
||||
{
|
||||
uprv_free(fullName);
|
||||
fullName = nullptr;
|
||||
}
|
||||
}
|
||||
Locale::~Locale() = default;
|
||||
|
||||
Locale::Locale()
|
||||
: UObject(), fullName(fullNameBuffer), baseName(nullptr)
|
||||
: UObject(), payload()
|
||||
{
|
||||
init(nullptr, false);
|
||||
}
|
||||
@@ -269,9 +466,8 @@ Locale::Locale()
|
||||
* the default locale.)
|
||||
*/
|
||||
Locale::Locale(Locale::ELocaleType)
|
||||
: UObject(), fullName(fullNameBuffer), baseName(nullptr)
|
||||
: UObject(), payload()
|
||||
{
|
||||
setToBogus();
|
||||
}
|
||||
|
||||
|
||||
@@ -279,7 +475,7 @@ Locale::Locale( const char * newLanguage,
|
||||
const char * newCountry,
|
||||
const char * newVariant,
|
||||
const char * newKeywords)
|
||||
: UObject(), fullName(fullNameBuffer), baseName(nullptr)
|
||||
: UObject(), payload()
|
||||
{
|
||||
if( (newLanguage==nullptr) && (newCountry == nullptr) && (newVariant == nullptr) )
|
||||
{
|
||||
@@ -300,7 +496,6 @@ Locale::Locale( const char * newLanguage,
|
||||
{
|
||||
lsize = static_cast<int32_t>(uprv_strlen(newLanguage));
|
||||
if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -312,7 +507,6 @@ Locale::Locale( const char * newLanguage,
|
||||
{
|
||||
csize = static_cast<int32_t>(uprv_strlen(newCountry));
|
||||
if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -329,7 +523,6 @@ Locale::Locale( const char * newLanguage,
|
||||
// remove trailing _'s
|
||||
vsize = static_cast<int32_t>(uprv_strlen(newVariant));
|
||||
if ( vsize < 0 || vsize > ULOC_STRING_LIMIT ) { // int32 wrap
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) )
|
||||
@@ -342,7 +535,6 @@ Locale::Locale( const char * newLanguage,
|
||||
{
|
||||
ksize = static_cast<int32_t>(uprv_strlen(newKeywords));
|
||||
if ( ksize < 0 || ksize > ULOC_STRING_LIMIT ) {
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -383,7 +575,6 @@ Locale::Locale( const char * newLanguage,
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
// Something went wrong with appending, etc.
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
// Parse it, because for example 'language' might really be a complete
|
||||
@@ -392,82 +583,11 @@ Locale::Locale( const char * newLanguage,
|
||||
}
|
||||
}
|
||||
|
||||
Locale::Locale(const Locale &other)
|
||||
: UObject(other), fullName(fullNameBuffer), baseName(nullptr)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
Locale::Locale(const Locale&) = default;
|
||||
Locale::Locale(Locale&&) noexcept = default;
|
||||
|
||||
Locale::Locale(Locale&& other) noexcept
|
||||
: UObject(other), fullName(fullNameBuffer), baseName(fullName) {
|
||||
*this = std::move(other);
|
||||
}
|
||||
|
||||
Locale& Locale::operator=(const Locale& other) {
|
||||
if (this == &other) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
setToBogus();
|
||||
|
||||
if (other.fullName == other.fullNameBuffer) {
|
||||
uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
|
||||
} else if (other.fullName == nullptr) {
|
||||
fullName = nullptr;
|
||||
} else {
|
||||
fullName = uprv_strdup(other.fullName);
|
||||
if (fullName == nullptr) return *this;
|
||||
}
|
||||
|
||||
if (other.baseName == other.fullName) {
|
||||
baseName = fullName;
|
||||
} else if (other.baseName != nullptr) {
|
||||
baseName = uprv_strdup(other.baseName);
|
||||
if (baseName == nullptr) return *this;
|
||||
}
|
||||
|
||||
uprv_strcpy(language, other.language);
|
||||
uprv_strcpy(script, other.script);
|
||||
uprv_strcpy(country, other.country);
|
||||
|
||||
variantBegin = other.variantBegin;
|
||||
fIsBogus = other.fIsBogus;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Locale& Locale::operator=(Locale&& other) noexcept {
|
||||
if ((baseName != fullName) && (baseName != fullNameBuffer)) uprv_free(baseName);
|
||||
if (fullName != fullNameBuffer) uprv_free(fullName);
|
||||
|
||||
if (other.fullName == other.fullNameBuffer || other.baseName == other.fullNameBuffer) {
|
||||
uprv_strcpy(fullNameBuffer, other.fullNameBuffer);
|
||||
}
|
||||
if (other.fullName == other.fullNameBuffer) {
|
||||
fullName = fullNameBuffer;
|
||||
} else {
|
||||
fullName = other.fullName;
|
||||
}
|
||||
|
||||
if (other.baseName == other.fullNameBuffer) {
|
||||
baseName = fullNameBuffer;
|
||||
} else if (other.baseName == other.fullName) {
|
||||
baseName = fullName;
|
||||
} else {
|
||||
baseName = other.baseName;
|
||||
}
|
||||
|
||||
uprv_strcpy(language, other.language);
|
||||
uprv_strcpy(script, other.script);
|
||||
uprv_strcpy(country, other.country);
|
||||
|
||||
variantBegin = other.variantBegin;
|
||||
fIsBogus = other.fIsBogus;
|
||||
|
||||
other.baseName = other.fullName = other.fullNameBuffer;
|
||||
|
||||
return *this;
|
||||
}
|
||||
Locale& Locale::operator=(const Locale&) = default;
|
||||
Locale& Locale::operator=(Locale&&) noexcept = default;
|
||||
|
||||
Locale *
|
||||
Locale::clone() const {
|
||||
@@ -477,7 +597,7 @@ Locale::clone() const {
|
||||
bool
|
||||
Locale::operator==( const Locale& other) const
|
||||
{
|
||||
return (uprv_strcmp(other.fullName, fullName) == 0);
|
||||
return uprv_strcmp(other.getName(), getName()) == 0;
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -1073,7 +1193,7 @@ public:
|
||||
}
|
||||
|
||||
// Check the fields inside locale, if need to replace fields,
|
||||
// place the the replaced locale ID in out and return true.
|
||||
// place the replaced locale ID in out and return true.
|
||||
// Otherwise return false for no replacement or error.
|
||||
bool replace(
|
||||
const Locale& locale, CharString& out, UErrorCode& status);
|
||||
@@ -1836,16 +1956,8 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
|
||||
/*This function initializes a Locale from a C locale ID*/
|
||||
Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
{
|
||||
fIsBogus = false;
|
||||
/* Free our current storage */
|
||||
if ((baseName != fullName) && (baseName != fullNameBuffer)) {
|
||||
uprv_free(baseName);
|
||||
}
|
||||
baseName = nullptr;
|
||||
if(fullName != fullNameBuffer) {
|
||||
uprv_free(fullName);
|
||||
fullName = fullNameBuffer;
|
||||
}
|
||||
Nest& nest = payload.emplace<Nest>();
|
||||
|
||||
// not a loop:
|
||||
// just an easy way to have a common error-exit
|
||||
@@ -1859,9 +1971,6 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
int32_t length;
|
||||
UErrorCode err;
|
||||
|
||||
/* preset all fields to empty */
|
||||
language[0] = script[0] = country[0] = 0;
|
||||
|
||||
const auto parse = [canonicalize](std::string_view localeID,
|
||||
char* name,
|
||||
int32_t nameCapacity,
|
||||
@@ -1879,17 +1988,17 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
};
|
||||
|
||||
// "canonicalize" the locale ID to ICU/Java format
|
||||
char* fullName = nest.baseName;
|
||||
err = U_ZERO_ERROR;
|
||||
length = parse(localeID, fullName, sizeof fullNameBuffer, err);
|
||||
length = parse(localeID, fullName, sizeof Nest::baseName, err);
|
||||
|
||||
if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof(fullNameBuffer))) {
|
||||
U_ASSERT(baseName == nullptr);
|
||||
FixedString fullNameBuffer;
|
||||
if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof Nest::baseName)) {
|
||||
/*Go to heap for the fullName if necessary*/
|
||||
char* newFullName = static_cast<char*>(uprv_malloc(sizeof(char) * (length + 1)));
|
||||
if (newFullName == nullptr) {
|
||||
if (!fullNameBuffer.reserve(length + 1)) {
|
||||
break; // error: out of memory
|
||||
}
|
||||
fullName = newFullName;
|
||||
fullName = fullNameBuffer.getAlias();
|
||||
err = U_ZERO_ERROR;
|
||||
length = parse(localeID, fullName, length + 1, err);
|
||||
}
|
||||
@@ -1898,7 +2007,10 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
break;
|
||||
}
|
||||
|
||||
variantBegin = length;
|
||||
std::string_view language;
|
||||
std::string_view script;
|
||||
std::string_view region;
|
||||
int32_t variantBegin = length;
|
||||
|
||||
/* after uloc_getName/canonicalize() we know that only '_' are separators */
|
||||
/* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */
|
||||
@@ -1923,8 +2035,9 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
} else {
|
||||
fieldLen[fieldIdx - 1] = length - static_cast<int32_t>(field[fieldIdx - 1] - fullName);
|
||||
}
|
||||
bool hasKeywords = at != nullptr && uprv_strchr(at + 1, '=') != nullptr;
|
||||
|
||||
if (fieldLen[0] >= static_cast<int32_t>(sizeof(language)))
|
||||
if (fieldLen[0] >= ULOC_LANG_CAPACITY)
|
||||
{
|
||||
break; // error: the language field is too long
|
||||
}
|
||||
@@ -1932,22 +2045,19 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
variantField = 1; /* Usually the 2nd one, except when a script or country is also used. */
|
||||
if (fieldLen[0] > 0) {
|
||||
/* We have a language */
|
||||
uprv_memcpy(language, fullName, fieldLen[0]);
|
||||
language[fieldLen[0]] = 0;
|
||||
language = {fullName, static_cast<std::string_view::size_type>(fieldLen[0])};
|
||||
}
|
||||
if (fieldLen[1] == 4 && uprv_isASCIILetter(field[1][0]) &&
|
||||
uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) &&
|
||||
uprv_isASCIILetter(field[1][3])) {
|
||||
/* We have at least a script */
|
||||
uprv_memcpy(script, field[1], fieldLen[1]);
|
||||
script[fieldLen[1]] = 0;
|
||||
script = {field[1], static_cast<std::string_view::size_type>(fieldLen[1])};
|
||||
variantField++;
|
||||
}
|
||||
|
||||
if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) {
|
||||
/* We have a country */
|
||||
uprv_memcpy(country, field[variantField], fieldLen[variantField]);
|
||||
country[fieldLen[variantField]] = 0;
|
||||
region = {field[variantField], static_cast<std::string_view::size_type>(fieldLen[variantField])};
|
||||
variantField++;
|
||||
} else if (fieldLen[variantField] == 0) {
|
||||
variantField++; /* script or country empty but variant in next field (i.e. en__POSIX) */
|
||||
@@ -1956,16 +2066,52 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
if (fieldLen[variantField] > 0) {
|
||||
/* We have a variant */
|
||||
variantBegin = static_cast<int32_t>(field[variantField] - fullName);
|
||||
} else if (hasKeywords) {
|
||||
// The original computation of variantBegin leaves it equal to the length
|
||||
// of fullName if there is no variant. It should instead be
|
||||
// the length of the baseName.
|
||||
variantBegin = static_cast<int32_t>(at - fullName);
|
||||
}
|
||||
|
||||
err = U_ZERO_ERROR;
|
||||
initBaseName(err);
|
||||
if (U_FAILURE(err)) {
|
||||
break;
|
||||
if (!hasKeywords && Nest::fits(length, language, script, region)) {
|
||||
U_ASSERT(fullName == nest.baseName);
|
||||
U_ASSERT(fullNameBuffer.isEmpty());
|
||||
nest.init(language, script, region, variantBegin);
|
||||
} else {
|
||||
if (fullName == nest.baseName) {
|
||||
U_ASSERT(fullNameBuffer.isEmpty());
|
||||
fullNameBuffer = {fullName, static_cast<std::string_view::size_type>(length)};
|
||||
if (fullNameBuffer.isEmpty()) {
|
||||
break; // error: out of memory
|
||||
}
|
||||
if (!language.empty()) {
|
||||
language = {fullNameBuffer.data(), language.size()};
|
||||
}
|
||||
if (!script.empty()) {
|
||||
script = {fullNameBuffer.data() + (script.data() - fullName), script.size()};
|
||||
}
|
||||
if (!region.empty()) {
|
||||
region = {fullNameBuffer.data() + (region.data() - fullName), region.size()};
|
||||
}
|
||||
}
|
||||
Heap& heap = payload.emplace<Heap>(language, script, region, variantBegin);
|
||||
if (isBogus()) {
|
||||
break; // error: out of memory
|
||||
}
|
||||
U_ASSERT(!fullNameBuffer.isEmpty());
|
||||
heap.ptr->fullName = std::move(fullNameBuffer);
|
||||
if (hasKeywords) {
|
||||
if (std::string_view::size_type baseNameLength = at - fullName; baseNameLength > 0) {
|
||||
heap.ptr->baseName = {heap.ptr->fullName.data(), baseNameLength};
|
||||
if (heap.ptr->baseName.isEmpty()) {
|
||||
break; // error: out of memory
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (canonicalize) {
|
||||
if (!isKnownCanonicalizedLocale(fullName, err)) {
|
||||
if (!isKnownCanonicalizedLocale(getName(), err)) {
|
||||
CharString replaced;
|
||||
// Not sure it is already canonicalized
|
||||
if (canonicalizeLocale(*this, replaced, err)) {
|
||||
@@ -1989,67 +2135,16 @@ Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the base name.
|
||||
* If there are no key words, it's exactly the full name.
|
||||
* If key words exist, it's the full name truncated at the '@' character.
|
||||
* Need to set up both at init() and after setting a keyword.
|
||||
*/
|
||||
void
|
||||
Locale::initBaseName(UErrorCode &status) {
|
||||
if (U_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
U_ASSERT(baseName==nullptr || baseName==fullName);
|
||||
const char *atPtr = uprv_strchr(fullName, '@');
|
||||
const char *eqPtr = uprv_strchr(fullName, '=');
|
||||
if (atPtr && eqPtr && atPtr < eqPtr) {
|
||||
// Key words exist.
|
||||
int32_t baseNameLength = static_cast<int32_t>(atPtr - fullName);
|
||||
char* newBaseName = static_cast<char*>(uprv_malloc(baseNameLength + 1));
|
||||
if (newBaseName == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
baseName = newBaseName;
|
||||
uprv_strncpy(baseName, fullName, baseNameLength);
|
||||
baseName[baseNameLength] = 0;
|
||||
|
||||
// The original computation of variantBegin leaves it equal to the length
|
||||
// of fullName if there is no variant. It should instead be
|
||||
// the length of the baseName.
|
||||
if (variantBegin > baseNameLength) {
|
||||
variantBegin = baseNameLength;
|
||||
}
|
||||
} else {
|
||||
baseName = fullName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int32_t
|
||||
Locale::hashCode() const
|
||||
{
|
||||
return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName)));
|
||||
return ustr_hashCharsN(getName(), static_cast<int32_t>(uprv_strlen(getName())));
|
||||
}
|
||||
|
||||
void
|
||||
Locale::setToBogus() {
|
||||
/* Free our current storage */
|
||||
if((baseName != fullName) && (baseName != fullNameBuffer)) {
|
||||
uprv_free(baseName);
|
||||
}
|
||||
baseName = nullptr;
|
||||
if(fullName != fullNameBuffer) {
|
||||
uprv_free(fullName);
|
||||
fullName = fullNameBuffer;
|
||||
}
|
||||
*fullNameBuffer = 0;
|
||||
*language = 0;
|
||||
*script = 0;
|
||||
*country = 0;
|
||||
fIsBogus = true;
|
||||
variantBegin = 0;
|
||||
payload.setToBogus();
|
||||
}
|
||||
|
||||
const Locale& U_EXPORT2
|
||||
@@ -2088,9 +2183,12 @@ Locale::addLikelySubtags(UErrorCode& status) {
|
||||
return;
|
||||
}
|
||||
|
||||
CharString maximizedLocaleID = ulocimp_addLikelySubtags(fullName, status);
|
||||
CharString maximizedLocaleID = ulocimp_addLikelySubtags(getName(), status);
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
if (status == U_MEMORY_ALLOCATION_ERROR) {
|
||||
setToBogus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2110,9 +2208,12 @@ Locale::minimizeSubtags(bool favorScript, UErrorCode& status) {
|
||||
return;
|
||||
}
|
||||
|
||||
CharString minimizedLocaleID = ulocimp_minimizeSubtags(fullName, favorScript, status);
|
||||
CharString minimizedLocaleID = ulocimp_minimizeSubtags(getName(), favorScript, status);
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
if (status == U_MEMORY_ALLOCATION_ERROR) {
|
||||
setToBogus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2131,8 +2232,11 @@ Locale::canonicalize(UErrorCode& status) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
CharString uncanonicalized(fullName, status);
|
||||
CharString uncanonicalized(getName(), status);
|
||||
if (U_FAILURE(status)) {
|
||||
if (status == U_MEMORY_ALLOCATION_ERROR) {
|
||||
setToBogus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
init(uncanonicalized.data(), /*canonicalize=*/true);
|
||||
@@ -2191,12 +2295,12 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const
|
||||
return;
|
||||
}
|
||||
|
||||
if (fIsBogus) {
|
||||
if (isBogus()) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
ulocimp_toLanguageTag(fullName, sink, /*strict=*/false, status);
|
||||
ulocimp_toLanguageTag(getName(), sink, /*strict=*/false, status);
|
||||
}
|
||||
|
||||
Locale U_EXPORT2
|
||||
@@ -2229,14 +2333,14 @@ Locale::createCanonical(const char* name) {
|
||||
const char *
|
||||
Locale::getISO3Language() const
|
||||
{
|
||||
return uloc_getISO3Language(fullName);
|
||||
return uloc_getISO3Language(getName());
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
Locale::getISO3Country() const
|
||||
{
|
||||
return uloc_getISO3Country(fullName);
|
||||
return uloc_getISO3Country(getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2249,7 +2353,7 @@ Locale::getISO3Country() const
|
||||
uint32_t
|
||||
Locale::getLCID() const
|
||||
{
|
||||
return uloc_getLCID(fullName);
|
||||
return uloc_getLCID(getName());
|
||||
}
|
||||
|
||||
const char* const* U_EXPORT2 Locale::getISOCountries()
|
||||
@@ -2428,8 +2532,9 @@ Locale::getLocaleCache()
|
||||
|
||||
class KeywordEnumeration : public StringEnumeration {
|
||||
protected:
|
||||
CharString keywords;
|
||||
FixedString keywords;
|
||||
private:
|
||||
int32_t length;
|
||||
const char *current;
|
||||
static const char fgClassID;
|
||||
|
||||
@@ -2438,13 +2543,17 @@ public:
|
||||
virtual UClassID getDynamicClassID() const override { return getStaticClassID(); }
|
||||
public:
|
||||
KeywordEnumeration(const char *keys, int32_t keywordLen, int32_t currentIndex, UErrorCode &status)
|
||||
: keywords(), current(keywords.data()) {
|
||||
: keywords(), length(keywordLen), current(nullptr) {
|
||||
if(U_SUCCESS(status) && keywordLen != 0) {
|
||||
if(keys == nullptr || keywordLen < 0) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
} else {
|
||||
keywords.append(keys, keywordLen, status);
|
||||
current = keywords.data() + currentIndex;
|
||||
keywords = {keys, static_cast<std::string_view::size_type>(length)};
|
||||
if (keywords.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
} else {
|
||||
current = keywords.data() + currentIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2455,7 +2564,7 @@ public:
|
||||
{
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
return new KeywordEnumeration(
|
||||
keywords.data(), keywords.length(),
|
||||
keywords.data(), length,
|
||||
static_cast<int32_t>(current - keywords.data()), status);
|
||||
}
|
||||
|
||||
@@ -2556,8 +2665,8 @@ Locale::createKeywords(UErrorCode &status) const
|
||||
return result;
|
||||
}
|
||||
|
||||
const char* variantStart = uprv_strchr(fullName, '@');
|
||||
const char* assignment = uprv_strchr(fullName, '=');
|
||||
const char* variantStart = uprv_strchr(getName(), '@');
|
||||
const char* assignment = uprv_strchr(getName(), '=');
|
||||
if(variantStart) {
|
||||
if(assignment > variantStart) {
|
||||
CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status);
|
||||
@@ -2583,8 +2692,8 @@ Locale::createUnicodeKeywords(UErrorCode &status) const
|
||||
return result;
|
||||
}
|
||||
|
||||
const char* variantStart = uprv_strchr(fullName, '@');
|
||||
const char* assignment = uprv_strchr(fullName, '=');
|
||||
const char* variantStart = uprv_strchr(getName(), '@');
|
||||
const char* assignment = uprv_strchr(getName(), '=');
|
||||
if(variantStart) {
|
||||
if(assignment > variantStart) {
|
||||
CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status);
|
||||
@@ -2604,7 +2713,7 @@ Locale::createUnicodeKeywords(UErrorCode &status) const
|
||||
int32_t
|
||||
Locale::getKeywordValue(const char* keywordName, char *buffer, int32_t bufLen, UErrorCode &status) const
|
||||
{
|
||||
return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status);
|
||||
return uloc_getKeywordValue(getName(), keywordName, buffer, bufLen, &status);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2613,12 +2722,12 @@ Locale::getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& sta
|
||||
return;
|
||||
}
|
||||
|
||||
if (fIsBogus) {
|
||||
if (isBogus()) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
ulocimp_getKeywordValue(fullName, keywordName, sink, status);
|
||||
ulocimp_getKeywordValue(getName(), keywordName, sink, status);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2664,51 +2773,77 @@ Locale::setKeywordValue(StringPiece keywordName,
|
||||
status = U_ZERO_ERROR;
|
||||
}
|
||||
|
||||
int32_t length = static_cast<int32_t>(uprv_strlen(fullName));
|
||||
int32_t capacity = fullName == fullNameBuffer ? ULOC_FULLNAME_CAPACITY : length + 1;
|
||||
CharString localeID(getName(), -1, status);
|
||||
ulocimp_setKeywordValue(keywordName, keywordValue, localeID, status);
|
||||
if (U_FAILURE(status)) {
|
||||
if (status == U_MEMORY_ALLOCATION_ERROR) {
|
||||
setToBogus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const char* start = locale_getKeywordsStart(fullName);
|
||||
int32_t offset = start == nullptr ? length : start - fullName;
|
||||
const char* at = locale_getKeywordsStart(localeID.toStringPiece());
|
||||
bool hasKeywords = at != nullptr && uprv_strchr(at + 1, '=') != nullptr;
|
||||
|
||||
for (;;) {
|
||||
// Remove -1 from the capacity so that this function can guarantee NUL termination.
|
||||
CheckedArrayByteSink sink(fullName + offset, capacity - offset - 1);
|
||||
|
||||
int32_t reslen = ulocimp_setKeywordValue(
|
||||
{fullName + offset, static_cast<std::string_view::size_type>(length - offset)},
|
||||
keywordName,
|
||||
keywordValue,
|
||||
sink,
|
||||
status);
|
||||
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
capacity = reslen + offset + 1;
|
||||
char* newFullName = static_cast<char*>(uprv_malloc(capacity));
|
||||
if (newFullName == nullptr) {
|
||||
Nest* nest = payload.get<Nest>();
|
||||
if (!hasKeywords) {
|
||||
if (nest == nullptr) {
|
||||
// There are no longer any keywords left, so it might now be
|
||||
// possible to move the payload from Heap to Nest.
|
||||
Heap* heap = payload.get<Heap>();
|
||||
U_ASSERT(heap != nullptr);
|
||||
if (Nest::fits(localeID.length(), heap->language, heap->script, heap->region)) {
|
||||
int32_t variantBegin = heap->ptr->variantBegin;
|
||||
U_ASSERT(variantBegin >= 0);
|
||||
U_ASSERT(static_cast<size_t>(variantBegin) < sizeof Nest::baseName);
|
||||
nest = &payload.emplace<Nest>(std::move(*heap), static_cast<uint8_t>(variantBegin));
|
||||
localeID.extract(nest->baseName, sizeof Nest::baseName, status);
|
||||
} else {
|
||||
heap->ptr->baseName.clear();
|
||||
heap->ptr->fullName = localeID.toStringPiece();
|
||||
if (heap->ptr->fullName.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Heap* heap = nullptr;
|
||||
if (nest != nullptr) {
|
||||
// A keyword has been added, so the payload now needs to be moved
|
||||
// from Nest to Heap so that it can get a baseName.
|
||||
Nest copy(*nest);
|
||||
heap = &payload.emplace<Heap>(copy.language,
|
||||
copy.script,
|
||||
copy.region,
|
||||
copy.variantBegin);
|
||||
if (isBogus()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
uprv_memcpy(newFullName, fullName, length + 1);
|
||||
if (fullName != fullNameBuffer) {
|
||||
if (baseName == fullName) {
|
||||
baseName = newFullName; // baseName should not point to freed memory.
|
||||
}
|
||||
// if fullName is already on the heap, need to free it.
|
||||
uprv_free(fullName);
|
||||
}
|
||||
fullName = newFullName;
|
||||
status = U_ZERO_ERROR;
|
||||
continue;
|
||||
} else {
|
||||
heap = payload.get<Heap>();
|
||||
}
|
||||
U_ASSERT(heap != nullptr);
|
||||
heap->ptr->fullName = localeID.toStringPiece();
|
||||
if (heap->ptr->fullName.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
|
||||
if (U_FAILURE(status)) { return; }
|
||||
u_terminateChars(fullName, capacity, reslen + offset, &status);
|
||||
break;
|
||||
}
|
||||
|
||||
if (baseName == fullName) {
|
||||
// May have added the first keyword, meaning that the fullName is no longer also the baseName.
|
||||
initBaseName(status);
|
||||
if (heap->ptr->baseName.isEmpty()) {
|
||||
// Has added the first keyword, meaning that the fullName is no longer also the baseName.
|
||||
if (std::string_view::size_type baseNameLength = at - localeID.data(); baseNameLength > 0) {
|
||||
heap->ptr->baseName = {heap->ptr->fullName.data(), baseNameLength};
|
||||
if (heap->ptr->baseName.isEmpty()) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2741,9 +2876,42 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName,
|
||||
setKeywordValue(*legacy_key, value, status);
|
||||
}
|
||||
|
||||
const char *
|
||||
const char*
|
||||
Locale::getCountry() const {
|
||||
return getField<&Nest::getRegion, &Heap::getRegion>();
|
||||
}
|
||||
|
||||
const char*
|
||||
Locale::getLanguage() const {
|
||||
return getField<&Nest::getLanguage, &Heap::getLanguage>();
|
||||
}
|
||||
|
||||
const char*
|
||||
Locale::getScript() const {
|
||||
return getField<&Nest::getScript, &Heap::getScript>();
|
||||
}
|
||||
|
||||
const char*
|
||||
Locale::getVariant() const {
|
||||
return getField<&Nest::getVariant, &Heap::getVariant>();
|
||||
}
|
||||
|
||||
const char*
|
||||
Locale::getName() const {
|
||||
return getField<&Nest::getBaseName, &Heap::getFullName>();
|
||||
}
|
||||
|
||||
const char*
|
||||
Locale::getBaseName() const {
|
||||
return baseName;
|
||||
return getField<&Nest::getBaseName, &Heap::getBaseName>();
|
||||
}
|
||||
|
||||
template <const char* (Locale::Nest::*const NEST)() const,
|
||||
const char* (Locale::Heap::*const HEAP)() const>
|
||||
const char* Locale::getField() const {
|
||||
return payload.visit([] { return ""; },
|
||||
[](const Nest& nest) { return (nest.*NEST)(); },
|
||||
[](const Heap& heap) { return (heap.*HEAP)(); });
|
||||
}
|
||||
|
||||
Locale::Iterator::~Iterator() = default;
|
||||
|
||||
+1
-1
@@ -495,7 +495,7 @@ bool RegionValidateMap::equals(const RegionValidateMap& that) const {
|
||||
// The code transform two letter a-z to a integer valued between -1, 26x26.
|
||||
// -1 indicate the region is outside the range of two letter a-z
|
||||
// the rest of value is between 0 and 676 (= 26x26) and used as an index
|
||||
// the the bigmap in map. The map is an array of 22 int32_t.
|
||||
// the bigmap in map. The map is an array of 22 int32_t.
|
||||
// since 32x21 < 676/32 < 32x22 we store this 676 bits bitmap into 22 int32_t.
|
||||
int32_t RegionValidateMap::value(const char* region) const {
|
||||
if (uprv_isASCIILetter(region[0]) && uprv_isASCIILetter(region[1]) &&
|
||||
|
||||
+27
-6
@@ -715,13 +715,29 @@ LSR LikelySubtags::maximize(StringPiece language, StringPiece script, StringPiec
|
||||
} else {
|
||||
iter.resetToState64(state);
|
||||
value = trieNext(iter, "", 0);
|
||||
U_ASSERT(value > 0);
|
||||
U_ASSERT(value != 0);
|
||||
// For the case of und_Latn
|
||||
if (value < 0) {
|
||||
retainLanguage = !language.empty();
|
||||
retainScript = !script.empty();
|
||||
retainRegion = !region.empty();
|
||||
// Fallback to und_$region =>
|
||||
iter.resetToState64(trieUndState); // "und" ("*")
|
||||
value = trieNext(iter, "", 0);
|
||||
U_ASSERT(value == 0);
|
||||
int64_t trieUndEmptyState = iter.getState64();
|
||||
value = trieNext(iter, region, 0);
|
||||
// Fallback to und =>
|
||||
if (value < 0) {
|
||||
iter.resetToState64(trieUndEmptyState);
|
||||
value = trieNext(iter, "", 0);
|
||||
U_ASSERT(value > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
U_ASSERT(value < lsrsLength);
|
||||
const LSR &matched = lsrs[value];
|
||||
|
||||
if (returnInputIfUnmatch &&
|
||||
(!(matchLanguage || matchScript || (matchRegion && language.empty())))) {
|
||||
return LSR("", "", "", LSR::EXPLICIT_LSR, errorCode); // no matching.
|
||||
@@ -731,18 +747,23 @@ LSR LikelySubtags::maximize(StringPiece language, StringPiece script, StringPiec
|
||||
}
|
||||
|
||||
if (!(retainLanguage || retainScript || retainRegion)) {
|
||||
U_ASSERT(value >= 0);
|
||||
// Quickly return a copy of the lookup-result LSR
|
||||
// without new allocation of the subtags.
|
||||
const LSR &matched = lsrs[value];
|
||||
return LSR(matched.language, matched.script, matched.region, matched.flags);
|
||||
}
|
||||
if (!retainLanguage) {
|
||||
language = matched.language;
|
||||
U_ASSERT(value >= 0);
|
||||
language = lsrs[value].language;
|
||||
}
|
||||
if (!retainScript) {
|
||||
script = matched.script;
|
||||
U_ASSERT(value >= 0);
|
||||
script = lsrs[value].script;
|
||||
}
|
||||
if (!retainRegion) {
|
||||
region = matched.region;
|
||||
U_ASSERT(value >= 0);
|
||||
region = lsrs[value].region;
|
||||
}
|
||||
int32_t retainMask = (retainLanguage ? 4 : 0) + (retainScript ? 2 : 0) + (retainRegion ? 1 : 0);
|
||||
// retainOldMask flags = LSR explicit-subtag flags
|
||||
|
||||
+9
-1
@@ -809,7 +809,15 @@ U_CAPI const LSTMData* U_EXPORT2 CreateLSTMDataForScript(UScriptCode script, UEr
|
||||
|
||||
U_CAPI const LSTMData* U_EXPORT2 CreateLSTMData(UResourceBundle* rb, UErrorCode& status)
|
||||
{
|
||||
return new LSTMData(rb, status);
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
}
|
||||
const LSTMData* result = new LSTMData(rb, status);
|
||||
if (U_FAILURE(status)) {
|
||||
delete result;
|
||||
return nullptr;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U_CAPI const LanguageBreakEngine* U_EXPORT2
|
||||
|
||||
+2
-1
@@ -914,8 +914,9 @@ MessagePattern::parseArgNumber(const UnicodeString &s, int32_t start, int32_t li
|
||||
if(0x30<=c && c<=0x39) {
|
||||
if(number>=INT32_MAX/10) {
|
||||
badNumber=true; // overflow
|
||||
} else {
|
||||
number=number*10+(c-0x30);
|
||||
}
|
||||
number=number*10+(c-0x30);
|
||||
} else {
|
||||
return UMSGPAT_ARG_NAME_NOT_NUMBER;
|
||||
}
|
||||
|
||||
+45
-42
@@ -10,14 +10,14 @@
|
||||
#ifdef INCLUDED_FROM_NORMALIZER2_CPP
|
||||
|
||||
static const UVersionInfo norm2_nfc_data_formatVersion={5,0,0,0};
|
||||
static const UVersionInfo norm2_nfc_data_dataVersion={0x10,0,0,0};
|
||||
static const UVersionInfo norm2_nfc_data_dataVersion={0x11,0,0,0};
|
||||
|
||||
static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={
|
||||
0x58,0x4e84,0x8c60,0x8d60,0x8d60,0x8d60,0x8d60,0x8d60,0xc0,0x300,0xb0c,0x2a6a,0x3cf0,0xfbc4,0x12c2,0x3c26,
|
||||
0x58,0x4eec,0x8cc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0xc0,0x300,0xb0c,0x2a6a,0x3cf0,0xfbc4,0x12c2,0x3c26,
|
||||
0x3cbe,0x3cf0,0x300,0,0xfb10,0xfb9e
|
||||
};
|
||||
|
||||
static const uint16_t norm2_nfc_data_trieIndex[1869]={
|
||||
static const uint16_t norm2_nfc_data_trieIndex[1888]={
|
||||
0,0x40,0x7b,0xbb,0xfb,0x13a,0x17a,0x1b2,0x1f2,0x226,0x254,0x226,0x294,0x2d4,0x313,0x353,
|
||||
0x393,0x3d2,0x40f,0x44e,0x226,0x226,0x488,0x4c8,0x4f8,0x530,0x226,0x570,0x59f,0x5de,0x226,0x5f3,
|
||||
0x631,0x65f,0x688,0x6be,0x6fe,0x73b,0x75b,0x79a,0x7d9,0x816,0x835,0x872,0x75b,0x8ab,0x8d9,0x918,
|
||||
@@ -82,7 +82,7 @@ static const uint16_t norm2_nfc_data_trieIndex[1869]={
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x1881,0x18c1,0x1901,0x1941,0x1981,0x19c1,0x1a01,0x1a41,0x1a64,0x1aa4,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac4,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x6cf,0x6df,0x6f7,0x716,0x72b,0x72b,0x72b,0x72f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x6e2,0x6f2,0x70a,0x729,0x73e,0x73e,0x73e,0x742,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc0c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c,
|
||||
@@ -91,53 +91,54 @@ static const uint16_t norm2_nfc_data_trieIndex[1869]={
|
||||
0x1b1a,0x226,0x226,0x1b2a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xdf8,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x1b3a,0x226,0x226,0x226,0x1b42,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x1608,0x226,0x226,0x226,0x226,0x66b,0x226,0x226,0x226,0x226,0x1b50,0x54f,0x226,0x226,0x1b60,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x81d,0x226,0x226,0x1b70,0x226,0x1b80,0x1b8d,0x1b99,0x226,0x226,
|
||||
0x226,0x226,0x414,0x226,0x1ba4,0x1bb4,0x226,0x226,0x226,0x812,0x226,0x226,0x226,0x226,0x1bc4,0x226,
|
||||
0x226,0x226,0x1bcf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bd6,0x226,0x226,
|
||||
0x226,0x226,0x1be1,0x1bf0,0x928,0x1bfe,0x412,0x1c0c,0x1c1c,0x226,0x1c24,0x1c32,0x87f,0x226,0x226,0x226,
|
||||
0x226,0x1c42,0x7ca,0x226,0x226,0x226,0x226,0x226,0x1c52,0x1c61,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x908,0x1c69,0x1c79,0x226,0x226,0x226,0x9ec,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x1c83,0x226,0x226,0x226,0x226,0x226,0x226,0x818,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c80,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c93,0x812,0x226,0x226,0x226,0x226,
|
||||
0x1608,0x226,0x226,0x226,0x226,0x1b50,0x226,0x226,0x226,0x226,0x1b60,0x54f,0x226,0x226,0x1b70,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x81d,0x226,0x226,0x1b80,0x226,0x1b90,0x1b9d,0x1ba9,0x226,0x226,
|
||||
0x226,0x226,0x414,0x226,0x1bb4,0x1bc4,0x226,0x226,0x226,0x812,0x226,0x226,0x226,0x226,0x1bd4,0x226,
|
||||
0x226,0x226,0x1bdf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1be6,0x226,0x226,
|
||||
0x226,0x226,0x1bf1,0x1c00,0x928,0x1c0e,0x412,0x1c1c,0x1c2c,0x226,0x1c34,0x1c42,0x87f,0x226,0x226,0x226,
|
||||
0x226,0x1c52,0x7ca,0x226,0x226,0x226,0x226,0x226,0x1c62,0x1c71,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x908,0x1c79,0x1c89,0x226,0x226,0x226,0x9ec,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x1c93,0x226,0x226,0x226,0x226,0x226,0x226,0x818,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c90,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ca3,0x812,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x87f,0x226,0x226,0x226,0x81f,0x81c,0x226,0x226,0x226,0x226,0x81a,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x9ec,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc06,0x226,0x226,0x226,0x226,0x81c,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0xc09,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x1ca2,0x1cb1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x1cc1,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cce,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x1cb2,0x1cc1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x1cd1,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cde,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ce0,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x1cef,0x1cff,0x1d0d,0x1d1a,0x226,0x1d26,0x1d34,0x1d44,0x226,0x226,0x226,0x226,0xd1c,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cee,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cf0,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d54,0x1d5c,0x1d6a,0x226,0x226,0x226,0x226,0x226,
|
||||
0x1cff,0x1d0f,0x1d1d,0x1d2a,0x226,0x1d36,0x1d44,0x1d54,0x226,0x226,0x226,0x226,0xd1c,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d64,0x1d6c,0x1d7a,0x226,0x226,0x226,0x226,0x226,
|
||||
0x4f9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ca,0x226,0x226,0x226,0x4fc,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d75,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d85,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x5c1,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d85,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x1d91,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1da1,
|
||||
0x1db1,0x1dc1,0x1dd1,0x1de1,0x1df1,0x1e01,0x1e11,0x1e21,0x1e31,0x1e41,0x1e51,0x1e61,0x1e71,0x1e81,0x1e91,0x1ea1,
|
||||
0x1eb1,0x1ec1,0x1ed1,0x1ee1,0x1ef1,0x1f01,0x1f11,0x1f21,0x1f31,0x1f41,0x1f51,0x1f61,0x1f71,0x1f81,0x1f91,0x1fa1,
|
||||
0x1fb1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x408,
|
||||
0x428,0x440,0xc4,0xc4,0x460,0x46f,0x486,0x4a2,0x4bf,0x4dd,0x4fa,0x517,0x536,0x553,0x56d,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x582,
|
||||
0xc4,0xc4,0xc4,0xc4,0x595,0x5a9,0x5c0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d95,0x7d3,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1da5,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x1db1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x1dc1,0x1dd1,0x1de1,0x1df1,0x1e01,0x1e11,0x1e21,0x1e31,0x1e41,0x1e51,0x1e61,0x1e71,0x1e81,0x1e91,
|
||||
0x1ea1,0x1eb1,0x1ec1,0x1ed1,0x1ee1,0x1ef1,0x1f01,0x1f11,0x1f21,0x1f31,0x1f41,0x1f51,0x1f61,0x1f71,0x1f81,0x1f91,
|
||||
0x1fa1,0x1fb1,0x1fc1,0x1fd1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,
|
||||
0x226,0x226,0x408,0x428,0x440,0xc4,0xc4,0x460,0x46f,0x486,0x4a2,0x4bf,0x4dd,0x4fa,0x517,0x536,
|
||||
0x553,0x56d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0xc4,0x582,0xc4,0xc4,0xc4,0xc4,0x595,0x5a9,0x5c0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0x5e0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5eb,0x608,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x628,0x63e,0x650,0xc4,0x66f,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5e0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0x5eb,0x608,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x628,0x63e,0x650,0x66f,0x682,0xc4,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x68f,0x6af
|
||||
0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x6a2,0x6c2
|
||||
};
|
||||
|
||||
static const uint16_t norm2_nfc_data_trieData[8129]={
|
||||
static const uint16_t norm2_nfc_data_trieData[8162]={
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
@@ -371,9 +372,9 @@ static const uint16_t norm2_nfc_data_trieData[8129]={
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,
|
||||
0xffb8,0xffcc,0xffcc,0xffb8,1,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,
|
||||
0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
|
||||
0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,
|
||||
0xffd4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,0x8c4,0x1a65,0x8c8,0x1a6b,0x8cc,0x1a71,0x8d0,0x1a77,0x8d4,0x1a7d,1,
|
||||
1,0x8d8,0x1a83,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
@@ -575,6 +576,7 @@ static const uint16_t norm2_nfc_data_trieData[8129]={
|
||||
1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1,1,1,1,
|
||||
1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,1,0xffcc,0xffcc,
|
||||
0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,
|
||||
1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,0xffb8,0xffb8,0xffb8,
|
||||
1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,
|
||||
1,1,0xffcc,0xffb8,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,
|
||||
0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,
|
||||
@@ -610,7 +612,8 @@ static const uint16_t norm2_nfc_data_trieData[8129]={
|
||||
1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,
|
||||
0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,
|
||||
0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,0xffd0,0xffd0,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,
|
||||
1,0xffd0,0xffd0,0xffb8,0xffcc,1,1,1,0xffcc,1,1,0xffcc,1,1,1,1,
|
||||
1,1,1,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,
|
||||
1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,
|
||||
1,0x33e5,0x33e9,0x33ed,0x33f1,0x33f7,0x2fd7,0x33fb,0x33ff,0x3403,0x3407,0x2fdb,0x340b,0x340f,0x3413,0x2fdf,
|
||||
0x3419,0x341d,0x3421,0x3425,0x342b,0x342f,0x3433,0x3437,0x343d,0x3441,0x3445,0x3449,0x30c9,0x344d,0x3453,0x3457,
|
||||
@@ -646,13 +649,13 @@ static const uint16_t norm2_nfc_data_trieData[8129]={
|
||||
0x3b5f,0x3b63,0x3b67,0x3b6d,0x3b71,0x3b75,0x3b79,0x3b7d,0x3b83,0x3b89,0x3b8d,0x3b91,0x3b95,0x3b9b,0x3b9f,0x31d1,
|
||||
0x31d1,0x3ba5,0x3ba9,0x3baf,0x3bb3,0x3bb7,0x3bbb,0x3bbf,0x3bc3,0x3bc7,0x3bcb,0x31d5,0x3bd1,0x3bd5,0x3bd9,0x3bdd,
|
||||
0x3be1,0x3be5,0x3beb,0x3bef,0x3bf5,0x3bfb,0x3c01,0x3c05,0x3c09,0x3c0d,0x3c11,0x3c15,0x3c19,0x3c1d,0x3c21,1,
|
||||
1
|
||||
1,1
|
||||
};
|
||||
|
||||
static const UCPTrie norm2_nfc_data_trie={
|
||||
norm2_nfc_data_trieIndex,
|
||||
{ norm2_nfc_data_trieData },
|
||||
1869, 8129,
|
||||
1888, 8162,
|
||||
0x2fc00, 0x30,
|
||||
0, 0,
|
||||
0, 0,
|
||||
@@ -1160,7 +1163,7 @@ static const uint16_t norm2_nfc_data_extraData[7918]={
|
||||
|
||||
static const uint8_t norm2_nfc_data_smallFCD[256]={
|
||||
0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xd7,0xe6,0x66,0x46,0x66,0x46,0x66,0x5b,
|
||||
0x12,0,0,4,0,0,0,0x43,0x20,2,0x69,0xae,0xc2,0xc0,0xff,0xff,
|
||||
0x12,0,0,4,0,0,0,0x43,0x20,2,0xe9,0xae,0xc2,0xc0,0xff,0xff,
|
||||
0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0,
|
||||
0xfe,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,0,
|
||||
|
||||
+113
-81
@@ -243,32 +243,36 @@ private:
|
||||
* this normalizer2impl.h and in the design doc at
|
||||
* https://unicode-org.github.io/icu/design/normalization/custom.html
|
||||
*/
|
||||
class U_COMMON_API Normalizer2Impl : public UObject {
|
||||
class U_COMMON_API_CLASS Normalizer2Impl : public UObject {
|
||||
public:
|
||||
Normalizer2Impl() : normTrie(nullptr), fCanonIterData(nullptr) {}
|
||||
virtual ~Normalizer2Impl();
|
||||
U_COMMON_API Normalizer2Impl() : normTrie(nullptr), fCanonIterData(nullptr) {}
|
||||
U_COMMON_API virtual ~Normalizer2Impl();
|
||||
|
||||
void init(const int32_t *inIndexes, const UCPTrie *inTrie,
|
||||
const uint16_t *inExtraData, const uint8_t *inSmallFCD);
|
||||
U_COMMON_API void init(const int32_t* inIndexes,
|
||||
const UCPTrie* inTrie,
|
||||
const uint16_t* inExtraData,
|
||||
const uint8_t* inSmallFCD);
|
||||
|
||||
void addLcccChars(UnicodeSet &set) const;
|
||||
void addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const;
|
||||
void addCanonIterPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const;
|
||||
U_COMMON_API void addLcccChars(UnicodeSet& set) const;
|
||||
U_COMMON_API void addPropertyStarts(const USetAdder* sa, UErrorCode& errorCode) const;
|
||||
U_COMMON_API void addCanonIterPropertyStarts(const USetAdder* sa, UErrorCode& errorCode) const;
|
||||
|
||||
// low-level properties ------------------------------------------------ ***
|
||||
|
||||
UBool ensureCanonIterData(UErrorCode &errorCode) const;
|
||||
U_COMMON_API UBool ensureCanonIterData(UErrorCode& errorCode) const;
|
||||
|
||||
// The trie stores values for lead surrogate code *units*.
|
||||
// Surrogate code *points* are inert.
|
||||
uint16_t getNorm16(UChar32 c) const {
|
||||
U_COMMON_API uint16_t getNorm16(UChar32 c) const {
|
||||
return U_IS_LEAD(c) ?
|
||||
static_cast<uint16_t>(INERT) :
|
||||
UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
|
||||
}
|
||||
uint16_t getRawNorm16(UChar32 c) const { return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); }
|
||||
U_COMMON_API uint16_t getRawNorm16(UChar32 c) const {
|
||||
return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c);
|
||||
}
|
||||
|
||||
UNormalizationCheckResult getCompQuickCheck(uint16_t norm16) const {
|
||||
U_COMMON_API UNormalizationCheckResult getCompQuickCheck(uint16_t norm16) const {
|
||||
if(norm16<minNoNo || MIN_YES_YES_WITH_CC<=norm16) {
|
||||
return UNORM_YES;
|
||||
} else if(minMaybeNo<=norm16) {
|
||||
@@ -277,11 +281,17 @@ public:
|
||||
return UNORM_NO;
|
||||
}
|
||||
}
|
||||
UBool isAlgorithmicNoNo(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeNo; }
|
||||
UBool isCompNo(uint16_t norm16) const { return minNoNo<=norm16 && norm16<minMaybeNo; }
|
||||
UBool isDecompYes(uint16_t norm16) const { return norm16<minYesNo || minMaybeYes<=norm16; }
|
||||
U_COMMON_API UBool isAlgorithmicNoNo(uint16_t norm16) const {
|
||||
return limitNoNo <= norm16 && norm16 < minMaybeNo;
|
||||
}
|
||||
U_COMMON_API UBool isCompNo(uint16_t norm16) const {
|
||||
return minNoNo <= norm16 && norm16 < minMaybeNo;
|
||||
}
|
||||
U_COMMON_API UBool isDecompYes(uint16_t norm16) const {
|
||||
return norm16 < minYesNo || minMaybeYes <= norm16;
|
||||
}
|
||||
|
||||
uint8_t getCC(uint16_t norm16) const {
|
||||
U_COMMON_API uint8_t getCC(uint16_t norm16) const {
|
||||
if(norm16>=MIN_NORMAL_MAYBE_YES) {
|
||||
return getCCFromNormalYesOrMaybe(norm16);
|
||||
}
|
||||
@@ -290,13 +300,13 @@ public:
|
||||
}
|
||||
return getCCFromNoNo(norm16);
|
||||
}
|
||||
static uint8_t getCCFromNormalYesOrMaybe(uint16_t norm16) {
|
||||
U_COMMON_API static uint8_t getCCFromNormalYesOrMaybe(uint16_t norm16) {
|
||||
return static_cast<uint8_t>(norm16 >> OFFSET_SHIFT);
|
||||
}
|
||||
static uint8_t getCCFromYesOrMaybeYes(uint16_t norm16) {
|
||||
U_COMMON_API static uint8_t getCCFromYesOrMaybeYes(uint16_t norm16) {
|
||||
return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0;
|
||||
}
|
||||
uint8_t getCCFromYesOrMaybeYesCP(UChar32 c) const {
|
||||
U_COMMON_API uint8_t getCCFromYesOrMaybeYesCP(UChar32 c) const {
|
||||
if (c < minCompNoMaybeCP) { return 0; }
|
||||
return getCCFromYesOrMaybeYes(getNorm16(c));
|
||||
}
|
||||
@@ -306,7 +316,7 @@ public:
|
||||
* @param c A Unicode code point.
|
||||
* @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0.
|
||||
*/
|
||||
uint16_t getFCD16(UChar32 c) const {
|
||||
U_COMMON_API uint16_t getFCD16(UChar32 c) const {
|
||||
if(c<minDecompNoCP) {
|
||||
return 0;
|
||||
} else if(c<=0xffff) {
|
||||
@@ -322,7 +332,7 @@ public:
|
||||
* @param limit The end of the string, or NULL.
|
||||
* @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0.
|
||||
*/
|
||||
uint16_t nextFCD16(const char16_t *&s, const char16_t *limit) const {
|
||||
U_COMMON_API uint16_t nextFCD16(const char16_t*& s, const char16_t* limit) const {
|
||||
UChar32 c=*s++;
|
||||
if(c<minDecompNoCP || !singleLeadMightHaveNonZeroFCD16(c)) {
|
||||
return 0;
|
||||
@@ -340,7 +350,7 @@ public:
|
||||
* @param s A valid pointer into a string. Requires start<s.
|
||||
* @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0.
|
||||
*/
|
||||
uint16_t previousFCD16(const char16_t *start, const char16_t *&s) const {
|
||||
U_COMMON_API uint16_t previousFCD16(const char16_t* start, const char16_t*& s) const {
|
||||
UChar32 c=*--s;
|
||||
if(c<minDecompNoCP) {
|
||||
return 0;
|
||||
@@ -360,16 +370,16 @@ public:
|
||||
}
|
||||
|
||||
/** Returns true if the single-or-lead code unit c might have non-zero FCD data. */
|
||||
UBool singleLeadMightHaveNonZeroFCD16(UChar32 lead) const {
|
||||
U_COMMON_API UBool singleLeadMightHaveNonZeroFCD16(UChar32 lead) const {
|
||||
// 0<=lead<=0xffff
|
||||
uint8_t bits=smallFCD[lead>>8];
|
||||
if(bits==0) { return false; }
|
||||
return (bits >> ((lead >> 5) & 7)) & 1;
|
||||
}
|
||||
/** Returns the FCD value from the regular normalization data. */
|
||||
uint16_t getFCD16FromNormData(UChar32 c) const;
|
||||
U_COMMON_API uint16_t getFCD16FromNormData(UChar32 c) const;
|
||||
|
||||
uint16_t getFCD16FromMaybeOrNonZeroCC(uint16_t norm16) const;
|
||||
U_COMMON_API uint16_t getFCD16FromMaybeOrNonZeroCC(uint16_t norm16) const;
|
||||
|
||||
/**
|
||||
* Gets the decomposition for one code point.
|
||||
@@ -378,7 +388,7 @@ public:
|
||||
* @param length out-only, takes the length of the decomposition, if any
|
||||
* @return pointer to the decomposition, or NULL if none
|
||||
*/
|
||||
const char16_t *getDecomposition(UChar32 c, char16_t buffer[4], int32_t &length) const;
|
||||
U_COMMON_API const char16_t* getDecomposition(UChar32 c, char16_t buffer[4], int32_t& length) const;
|
||||
|
||||
/**
|
||||
* Gets the raw decomposition for one code point.
|
||||
@@ -387,12 +397,14 @@ public:
|
||||
* @param length out-only, takes the length of the decomposition, if any
|
||||
* @return pointer to the decomposition, or NULL if none
|
||||
*/
|
||||
const char16_t *getRawDecomposition(UChar32 c, char16_t buffer[30], int32_t &length) const;
|
||||
U_COMMON_API const char16_t* getRawDecomposition(UChar32 c,
|
||||
char16_t buffer[30],
|
||||
int32_t& length) const;
|
||||
|
||||
UChar32 composePair(UChar32 a, UChar32 b) const;
|
||||
U_COMMON_API UChar32 composePair(UChar32 a, UChar32 b) const;
|
||||
|
||||
UBool isCanonSegmentStarter(UChar32 c) const;
|
||||
UBool getCanonStartSet(UChar32 c, UnicodeSet &set) const;
|
||||
U_COMMON_API UBool isCanonSegmentStarter(UChar32 c) const;
|
||||
U_COMMON_API UBool getCanonStartSet(UChar32 c, UnicodeSet& set) const;
|
||||
|
||||
enum {
|
||||
// Fixed norm16 values.
|
||||
@@ -481,71 +493,90 @@ public:
|
||||
// higher-level functionality ------------------------------------------ ***
|
||||
|
||||
// NFD without an NFD Normalizer2 instance.
|
||||
UnicodeString &decompose(const UnicodeString &src, UnicodeString &dest,
|
||||
UErrorCode &errorCode) const;
|
||||
U_COMMON_API UnicodeString& decompose(const UnicodeString& src,
|
||||
UnicodeString& dest,
|
||||
UErrorCode& errorCode) const;
|
||||
/**
|
||||
* Decomposes [src, limit[ and writes the result to dest.
|
||||
* limit can be NULL if src is NUL-terminated.
|
||||
* destLengthEstimate is the initial dest buffer capacity and can be -1.
|
||||
*/
|
||||
void decompose(const char16_t *src, const char16_t *limit,
|
||||
UnicodeString &dest, int32_t destLengthEstimate,
|
||||
UErrorCode &errorCode) const;
|
||||
U_COMMON_API void decompose(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UnicodeString& dest,
|
||||
int32_t destLengthEstimate,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
const char16_t *decompose(const char16_t *src, const char16_t *limit,
|
||||
ReorderingBuffer *buffer, UErrorCode &errorCode) const;
|
||||
void decomposeAndAppend(const char16_t *src, const char16_t *limit,
|
||||
UBool doDecompose,
|
||||
UnicodeString &safeMiddle,
|
||||
ReorderingBuffer &buffer,
|
||||
UErrorCode &errorCode) const;
|
||||
U_COMMON_API const char16_t* decompose(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
ReorderingBuffer* buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
U_COMMON_API void decomposeAndAppend(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UBool doDecompose,
|
||||
UnicodeString& safeMiddle,
|
||||
ReorderingBuffer& buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
/** sink==nullptr: isNormalized()/spanQuickCheckYes() */
|
||||
const uint8_t *decomposeUTF8(uint32_t options,
|
||||
const uint8_t *src, const uint8_t *limit,
|
||||
ByteSink *sink, Edits *edits, UErrorCode &errorCode) const;
|
||||
U_COMMON_API const uint8_t* decomposeUTF8(uint32_t options,
|
||||
const uint8_t* src,
|
||||
const uint8_t* limit,
|
||||
ByteSink* sink,
|
||||
Edits* edits,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
UBool compose(const char16_t *src, const char16_t *limit,
|
||||
UBool onlyContiguous,
|
||||
UBool doCompose,
|
||||
ReorderingBuffer &buffer,
|
||||
UErrorCode &errorCode) const;
|
||||
const char16_t *composeQuickCheck(const char16_t *src, const char16_t *limit,
|
||||
UBool onlyContiguous,
|
||||
UNormalizationCheckResult *pQCResult) const;
|
||||
void composeAndAppend(const char16_t *src, const char16_t *limit,
|
||||
UBool doCompose,
|
||||
UBool onlyContiguous,
|
||||
UnicodeString &safeMiddle,
|
||||
ReorderingBuffer &buffer,
|
||||
UErrorCode &errorCode) const;
|
||||
U_COMMON_API UBool compose(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UBool onlyContiguous,
|
||||
UBool doCompose,
|
||||
ReorderingBuffer& buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
U_COMMON_API const char16_t* composeQuickCheck(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UBool onlyContiguous,
|
||||
UNormalizationCheckResult* pQCResult) const;
|
||||
U_COMMON_API void composeAndAppend(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UBool doCompose,
|
||||
UBool onlyContiguous,
|
||||
UnicodeString& safeMiddle,
|
||||
ReorderingBuffer& buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
/** sink==nullptr: isNormalized() */
|
||||
UBool composeUTF8(uint32_t options, UBool onlyContiguous,
|
||||
const uint8_t *src, const uint8_t *limit,
|
||||
ByteSink *sink, icu::Edits *edits, UErrorCode &errorCode) const;
|
||||
U_COMMON_API UBool composeUTF8(uint32_t options,
|
||||
UBool onlyContiguous,
|
||||
const uint8_t* src,
|
||||
const uint8_t* limit,
|
||||
ByteSink* sink,
|
||||
icu::Edits* edits,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
const char16_t *makeFCD(const char16_t *src, const char16_t *limit,
|
||||
ReorderingBuffer *buffer, UErrorCode &errorCode) const;
|
||||
void makeFCDAndAppend(const char16_t *src, const char16_t *limit,
|
||||
UBool doMakeFCD,
|
||||
UnicodeString &safeMiddle,
|
||||
ReorderingBuffer &buffer,
|
||||
UErrorCode &errorCode) const;
|
||||
U_COMMON_API const char16_t* makeFCD(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
ReorderingBuffer* buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
U_COMMON_API void makeFCDAndAppend(const char16_t* src,
|
||||
const char16_t* limit,
|
||||
UBool doMakeFCD,
|
||||
UnicodeString& safeMiddle,
|
||||
ReorderingBuffer& buffer,
|
||||
UErrorCode& errorCode) const;
|
||||
|
||||
UBool hasDecompBoundaryBefore(UChar32 c) const;
|
||||
UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const;
|
||||
UBool hasDecompBoundaryAfter(UChar32 c) const;
|
||||
UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const;
|
||||
UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); }
|
||||
U_COMMON_API UBool hasDecompBoundaryBefore(UChar32 c) const;
|
||||
U_COMMON_API UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const;
|
||||
U_COMMON_API UBool hasDecompBoundaryAfter(UChar32 c) const;
|
||||
U_COMMON_API UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const;
|
||||
U_COMMON_API UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); }
|
||||
|
||||
UBool hasCompBoundaryBefore(UChar32 c) const {
|
||||
U_COMMON_API UBool hasCompBoundaryBefore(UChar32 c) const {
|
||||
return c<minCompNoMaybeCP || norm16HasCompBoundaryBefore(getNorm16(c));
|
||||
}
|
||||
UBool hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous) const {
|
||||
U_COMMON_API UBool hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous) const {
|
||||
return norm16HasCompBoundaryAfter(getNorm16(c), onlyContiguous);
|
||||
}
|
||||
UBool isCompInert(UChar32 c, UBool onlyContiguous) const {
|
||||
U_COMMON_API UBool isCompInert(UChar32 c, UBool onlyContiguous) const {
|
||||
uint16_t norm16=getNorm16(c);
|
||||
return isCompYesAndZeroCC(norm16) &&
|
||||
(norm16 & HAS_COMP_BOUNDARY_AFTER) != 0 &&
|
||||
@@ -553,10 +584,11 @@ public:
|
||||
// The last check fetches the mapping's first unit and checks tccc<=1.
|
||||
}
|
||||
|
||||
UBool hasFCDBoundaryBefore(UChar32 c) const { return hasDecompBoundaryBefore(c); }
|
||||
UBool hasFCDBoundaryAfter(UChar32 c) const { return hasDecompBoundaryAfter(c); }
|
||||
UBool isFCDInert(UChar32 c) const { return getFCD16(c)<=1; }
|
||||
private:
|
||||
U_COMMON_API UBool hasFCDBoundaryBefore(UChar32 c) const { return hasDecompBoundaryBefore(c); }
|
||||
U_COMMON_API UBool hasFCDBoundaryAfter(UChar32 c) const { return hasDecompBoundaryAfter(c); }
|
||||
U_COMMON_API UBool isFCDInert(UChar32 c) const { return getFCD16(c) <= 1; }
|
||||
|
||||
private:
|
||||
friend class InitCanonIterData;
|
||||
friend class LcccContext;
|
||||
|
||||
|
||||
+879
-852
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -135,7 +135,7 @@ struct RBBIStateTable {
|
||||
uint32_t fNumStates; // Number of states.
|
||||
uint32_t fRowLen; // Length of a state table row, in bytes.
|
||||
uint32_t fDictCategoriesStart; // Char category number of the first dictionary
|
||||
// char class, or the the largest category number + 1
|
||||
// char class, or the largest category number + 1
|
||||
// if there are no dictionary categories.
|
||||
uint32_t fLookAheadResultsSize; // Size of run-time array required for holding
|
||||
// look-ahead results. Indexed by row.fLookAhead.
|
||||
|
||||
+1
-1
@@ -1020,7 +1020,7 @@ void RBBIRuleScanner::parse() {
|
||||
// Main loop for the rule parsing state machine.
|
||||
// Runs once per state transition.
|
||||
// Each time through optionally performs, depending on the state table,
|
||||
// - an advance to the the next input char
|
||||
// - an advance to the next input char
|
||||
// - an action to be performed.
|
||||
// - pushing or popping a state to/from the local state return stack.
|
||||
//
|
||||
|
||||
+4
-3
@@ -328,9 +328,10 @@ int32_t RBBISetBuilder::getTrieSize() {
|
||||
UCPTRIE_TYPE_FAST,
|
||||
use8Bits ? UCPTRIE_VALUE_BITS_8 : UCPTRIE_VALUE_BITS_16,
|
||||
fStatus);
|
||||
fTrieSize = ucptrie_toBinary(fTrie, nullptr, 0, fStatus);
|
||||
if (*fStatus == U_BUFFER_OVERFLOW_ERROR) {
|
||||
*fStatus = U_ZERO_ERROR;
|
||||
UErrorCode bufferStatus = *fStatus;
|
||||
fTrieSize = ucptrie_toBinary(fTrie, nullptr, 0, &bufferStatus);
|
||||
if (bufferStatus != U_BUFFER_OVERFLOW_ERROR && U_FAILURE(bufferStatus)) {
|
||||
*fStatus = bufferStatus;
|
||||
}
|
||||
}
|
||||
return fTrieSize;
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ public:
|
||||
int32_t fNum {0}; // runtime-mapped input value for this range.
|
||||
bool fIncludesDict {false}; // True if the range includes $dictionary.
|
||||
bool fFirstInGroup {false}; // True if first range in a group with the same fNum.
|
||||
UVector *fIncludesSets {nullptr}; // vector of the the original
|
||||
UVector *fIncludesSets {nullptr}; // vector of the original
|
||||
// Unicode sets that include this range.
|
||||
// (Contains ptrs to uset nodes)
|
||||
RangeDescriptor *fNext {nullptr}; // Next RangeDescriptor in the linked list.
|
||||
|
||||
+1
-1
@@ -1442,7 +1442,7 @@ void RBBITableBuilder::buildSafeReverseTable(UErrorCode &status) {
|
||||
// 1. Identify pairs of character classes that are "safe." Safe means that boundaries
|
||||
// following the pair do not depend on context or state before the pair. To test
|
||||
// whether a pair is safe, run it through the main forward state table, starting
|
||||
// from each state. If the the final state is the same, no matter what the starting state,
|
||||
// from each state. If the final state is the same, no matter what the starting state,
|
||||
// the pair is safe.
|
||||
//
|
||||
// 2. Build a state table that recognizes the safe pairs. It's similar to their
|
||||
|
||||
+16
-16
@@ -422,7 +422,7 @@ public:
|
||||
******************************************************************
|
||||
*/
|
||||
|
||||
class U_COMMON_API ICULocaleService : public ICUService
|
||||
class U_COMMON_API_CLASS ICULocaleService : public ICUService
|
||||
{
|
||||
private:
|
||||
Locale fallbackLocale;
|
||||
@@ -432,17 +432,17 @@ class U_COMMON_API ICULocaleService : public ICUService
|
||||
/**
|
||||
* Construct an ICULocaleService.
|
||||
*/
|
||||
ICULocaleService();
|
||||
U_COMMON_API ICULocaleService();
|
||||
|
||||
/**
|
||||
* Construct an ICULocaleService with a name (useful for debugging).
|
||||
*/
|
||||
ICULocaleService(const UnicodeString& name);
|
||||
U_COMMON_API ICULocaleService(const UnicodeString& name);
|
||||
|
||||
/**
|
||||
* Destructor.
|
||||
*/
|
||||
virtual ~ICULocaleService();
|
||||
U_COMMON_API virtual ~ICULocaleService();
|
||||
|
||||
#if 0
|
||||
// redeclare because of overload resolution rules?
|
||||
@@ -462,19 +462,19 @@ class U_COMMON_API ICULocaleService : public ICUService
|
||||
* get(Locale, int, Locale[]) with KIND_ANY for kind and null for
|
||||
* actualReturn.
|
||||
*/
|
||||
UObject* get(const Locale& locale, UErrorCode& status) const;
|
||||
U_COMMON_API UObject* get(const Locale& locale, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Convenience override for callers using locales. This calls
|
||||
* get(Locale, int, Locale[]) with a null actualReturn.
|
||||
*/
|
||||
UObject* get(const Locale& locale, int32_t kind, UErrorCode& status) const;
|
||||
U_COMMON_API UObject* get(const Locale& locale, int32_t kind, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Convenience override for callers using locales. This calls
|
||||
* get(Locale, String, Locale[]) with a null kind.
|
||||
*/
|
||||
UObject* get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const;
|
||||
U_COMMON_API UObject* get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Convenience override for callers using locales. This uses
|
||||
@@ -482,27 +482,27 @@ class U_COMMON_API ICULocaleService : public ICUService
|
||||
* if actualReturn is not null, returns the actualResult from
|
||||
* getKey (stripping any prefix) into a Locale.
|
||||
*/
|
||||
UObject* get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const;
|
||||
U_COMMON_API UObject* get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Convenience override for callers using locales. This calls
|
||||
* registerObject(Object, Locale, int32_t kind, int coverage)
|
||||
* passing KIND_ANY for the kind, and VISIBLE for the coverage.
|
||||
*/
|
||||
virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status);
|
||||
U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Convenience function for callers using locales. This calls
|
||||
* registerObject(Object, Locale, int kind, int coverage)
|
||||
* passing VISIBLE for the coverage.
|
||||
*/
|
||||
virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status);
|
||||
U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Convenience function for callers using locales. This instantiates
|
||||
* a SimpleLocaleKeyFactory, and registers the factory.
|
||||
*/
|
||||
virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status);
|
||||
U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status);
|
||||
|
||||
|
||||
/**
|
||||
@@ -512,13 +512,13 @@ class U_COMMON_API ICULocaleService : public ICUService
|
||||
* We really need a flag that is understood by all compilers that will suppress the warning about
|
||||
* hidden overrides.
|
||||
*/
|
||||
virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status) override;
|
||||
U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status) override;
|
||||
|
||||
/**
|
||||
* Convenience method for callers using locales. This returns the standard
|
||||
* service ID enumeration.
|
||||
*/
|
||||
virtual StringEnumeration* getAvailableLocales() const;
|
||||
U_COMMON_API virtual StringEnumeration* getAvailableLocales() const;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -526,17 +526,17 @@ class U_COMMON_API ICULocaleService : public ICUService
|
||||
* Return the name of the current fallback locale. If it has changed since this was
|
||||
* last accessed, the service cache is cleared.
|
||||
*/
|
||||
const UnicodeString& validateFallbackLocale() const;
|
||||
U_COMMON_API const UnicodeString& validateFallbackLocale() const;
|
||||
|
||||
/**
|
||||
* Override superclass createKey method.
|
||||
*/
|
||||
virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const override;
|
||||
U_COMMON_API virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const override;
|
||||
|
||||
/**
|
||||
* Additional createKey that takes a kind.
|
||||
*/
|
||||
virtual ICUServiceKey* createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const;
|
||||
U_COMMON_API virtual ICUServiceKey* createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const;
|
||||
|
||||
friend class ServiceEnumeration;
|
||||
};
|
||||
|
||||
+10
-10
@@ -51,28 +51,28 @@ private:
|
||||
* Either stack-allocate, use LocalPointer, or use addRef()/removeRef().
|
||||
* Sharing requires reference-counting.
|
||||
*/
|
||||
class U_COMMON_API SharedObject : public UObject {
|
||||
class U_COMMON_API_CLASS SharedObject : public UObject {
|
||||
public:
|
||||
/** Initializes totalRefCount, softRefCount to 0. */
|
||||
SharedObject() :
|
||||
U_COMMON_API SharedObject() :
|
||||
softRefCount(0),
|
||||
hardRefCount(0),
|
||||
cachePtr(nullptr) {}
|
||||
|
||||
/** Initializes totalRefCount, softRefCount to 0. */
|
||||
SharedObject(const SharedObject &other) :
|
||||
U_COMMON_API SharedObject(const SharedObject &other) :
|
||||
UObject(other),
|
||||
softRefCount(0),
|
||||
hardRefCount(0),
|
||||
cachePtr(nullptr) {}
|
||||
|
||||
virtual ~SharedObject();
|
||||
U_COMMON_API virtual ~SharedObject();
|
||||
|
||||
/**
|
||||
* Increments the number of hard references to this object. Thread-safe.
|
||||
* Not for use from within the Unified Cache implementation.
|
||||
*/
|
||||
void addRef() const;
|
||||
U_COMMON_API void addRef() const;
|
||||
|
||||
/**
|
||||
* Decrements the number of hard references to this object, and
|
||||
@@ -81,32 +81,32 @@ public:
|
||||
*
|
||||
* Not for use from within the UnifiedCache implementation.
|
||||
*/
|
||||
void removeRef() const;
|
||||
U_COMMON_API void removeRef() const;
|
||||
|
||||
/**
|
||||
* Returns the number of hard references for this object.
|
||||
* Uses a memory barrier.
|
||||
*/
|
||||
int32_t getRefCount() const;
|
||||
U_COMMON_API int32_t getRefCount() const;
|
||||
|
||||
/**
|
||||
* If noHardReferences() == true then this object has no hard references.
|
||||
* Must be called only from within the internals of UnifiedCache.
|
||||
*/
|
||||
inline UBool noHardReferences() const { return getRefCount() == 0; }
|
||||
U_COMMON_API inline UBool noHardReferences() const { return getRefCount() == 0; }
|
||||
|
||||
/**
|
||||
* If hasHardReferences() == true then this object has hard references.
|
||||
* Must be called only from within the internals of UnifiedCache.
|
||||
*/
|
||||
inline UBool hasHardReferences() const { return getRefCount() != 0; }
|
||||
U_COMMON_API inline UBool hasHardReferences() const { return getRefCount() != 0; }
|
||||
|
||||
/**
|
||||
* Deletes this object if it has no references.
|
||||
* Available for non-cached SharedObjects only. Ownership of cached objects
|
||||
* is with the UnifiedCache, which is solely responsible for eviction and deletion.
|
||||
*/
|
||||
void deleteIfZeroRefCount() const;
|
||||
U_COMMON_API void deleteIfZeroRefCount() const;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -187,7 +187,13 @@ void U_CALLCONV initNumberParseUniSets(UErrorCode& status) {
|
||||
U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr);
|
||||
U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr);
|
||||
|
||||
// The following don't currently have parseLenients in data.
|
||||
U_ASSERT(gUnicodeSets[INFINITY_SIGN] == nullptr);
|
||||
gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status);
|
||||
U_ASSERT(gUnicodeSets[APPROXIMATELY_SIGN] == nullptr);
|
||||
// This set of characters was manually curated from the
|
||||
// values of the approximatelySign element of CLDR common/main/*.xml files.
|
||||
gUnicodeSets[APPROXIMATELY_SIGN] = new UnicodeSet(u"[∼~≈≃約]", status);
|
||||
if (U_FAILURE(status)) { return; }
|
||||
|
||||
U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr);
|
||||
|
||||
@@ -56,6 +56,7 @@ enum Key {
|
||||
PERCENT_SIGN,
|
||||
PERMILLE_SIGN,
|
||||
INFINITY_SIGN,
|
||||
APPROXIMATELY_SIGN,
|
||||
|
||||
// Currency Symbols
|
||||
DOLLAR_SIGN,
|
||||
|
||||
+461
-452
File diff suppressed because it is too large.
Load diff
+170
-159
@@ -9,11 +9,11 @@
|
||||
|
||||
#ifdef INCLUDED_FROM_UCASE_CPP
|
||||
|
||||
static const UVersionInfo ucase_props_dataVersion={0x10,0,0,0};
|
||||
static const UVersionInfo ucase_props_dataVersion={0x11,0,0,0};
|
||||
|
||||
static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x78bc,0x6888,0x688,0x172,0,0,0,0,0,0,0,0,0,0,3};
|
||||
static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x7a14,0x69e0,0x688,0x172,0,0,0,0,0,0,0,0,0,0,3};
|
||||
|
||||
static const uint16_t ucase_props_trieIndex[13372]={
|
||||
static const uint16_t ucase_props_trieIndex[13544]={
|
||||
0x363,0x36b,0x373,0x37b,0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,
|
||||
0x3e6,0x3ee,0x3f6,0x3fe,0x406,0x40e,0x416,0x41e,0x426,0x42e,0x436,0x43e,0x446,0x44e,0x456,0x45e,
|
||||
0x466,0x46e,0x476,0x47e,0x486,0x48e,0x496,0x49e,0x49a,0x4a2,0x4a7,0x4af,0x4b6,0x4be,0x4c6,0x4ce,
|
||||
@@ -27,18 +27,18 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x693,0x699,0x581,0x581,0x382,0x69f,0x6a7,0x382,
|
||||
0x6af,0x382,0x6b7,0x382,0x6be,0x6c4,0x382,0x382,0x382,0x6cc,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x6d3,0x382,0x6da,0x6e2,0x382,0x6ea,0x6f2,0x382,0x5b1,0x6f6,0x6fe,0x704,0x5f3,0x70c,0x382,0x713,
|
||||
0x382,0x718,0x382,0x71e,0x726,0x72a,0x732,0x73a,0x742,0x747,0x74a,0x752,0x762,0x75a,0x772,0x76a,
|
||||
0x3a9,0x77a,0x3a9,0x782,0x785,0x3a9,0x78d,0x3a9,0x795,0x79d,0x7a5,0x7ad,0x7b5,0x7bd,0x7c5,0x7cd,
|
||||
0x7d5,0x7dc,0x382,0x7e4,0x7ec,0x382,0x7f4,0x7fc,0x804,0x80c,0x814,0x81c,0x824,0x382,0x382,0x382,
|
||||
0x6d3,0x382,0x6da,0x6e2,0x382,0x6ea,0x6fa,0x6f2,0x5b1,0x702,0x70a,0x710,0x5f3,0x718,0x382,0x71f,
|
||||
0x382,0x724,0x382,0x72a,0x732,0x736,0x73e,0x746,0x74e,0x753,0x756,0x75e,0x76e,0x766,0x77e,0x776,
|
||||
0x3a9,0x786,0x3a9,0x78e,0x791,0x3a9,0x799,0x3a9,0x7a1,0x7a9,0x7b1,0x7b9,0x7c1,0x7c9,0x7d1,0x7d9,
|
||||
0x7e1,0x7e8,0x382,0x7f0,0x7f8,0x382,0x800,0x808,0x810,0x818,0x820,0x828,0x830,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x827,0x82d,0x833,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x833,0x839,0x83f,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x83b,0x83f,0x843,0x84b,0x3a9,0x3a9,0x3a9,0x853,0x85b,0x862,0x382,0x867,0x382,0x382,0x382,0x86f,
|
||||
0x847,0x84b,0x84f,0x857,0x3a9,0x3a9,0x3a9,0x85f,0x867,0x86e,0x382,0x873,0x382,0x382,0x382,0x87b,
|
||||
0x382,0x6b4,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x573,0x877,0x382,0x382,0x87e,0x382,0x382,0x886,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x573,0x883,0x382,0x382,0x88a,0x382,0x382,0x892,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
@@ -94,12 +94,12 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x88e,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x89a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x71e,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x894,0x382,0x89c,0x8a1,0x8a9,0x382,0x382,0x8b1,0x8b9,0x8c1,0x3a9,0x8c6,0x8ce,0x8d4,0x8db,0x8e3,
|
||||
0x8eb,0x8f2,0x382,0x382,0x382,0x382,0x8f9,0x901,0x382,0x909,0x910,0x382,0x55e,0x915,0x91d,0x6be,
|
||||
0x382,0x923,0x92b,0x92f,0x382,0x937,0x93f,0x947,0x382,0x94d,0x951,0x959,0x969,0x961,0x382,0x971,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x72a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x8a0,0x382,0x8a8,0x8ad,0x8b5,0x382,0x382,0x8bd,0x8c5,0x8cd,0x3a9,0x8d2,0x8da,0x8e0,0x8e7,0x8ef,
|
||||
0x8f7,0x8fe,0x382,0x382,0x382,0x382,0x905,0x90d,0x382,0x915,0x91c,0x382,0x55e,0x921,0x929,0x6be,
|
||||
0x382,0x92f,0x937,0x93b,0x382,0x943,0x94b,0x953,0x382,0x959,0x95d,0x965,0x975,0x96d,0x382,0x97d,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
@@ -139,9 +139,9 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x979,0x382,0x382,0x382,0x382,0x981,0x55e,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x985,0x382,0x382,0x382,0x382,0x98d,0x55e,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x986,0x98e,0x992,0x382,0x382,0x382,0x382,0x365,0x36b,0x99a,0x9a2,0x9a9,0x519,0x382,0x382,0x9b1,
|
||||
0x992,0x99a,0x99e,0x382,0x382,0x382,0x382,0x365,0x36b,0x9a6,0x9ae,0x9b5,0x519,0x382,0x382,0x9bd,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0xe0c,0xe0c,0xe24,0xe64,0xea4,0xee0,0xf20,0xf60,0xf98,0xfd8,0x1018,0x1058,0x1098,0x10d8,0x1118,0x1158,
|
||||
@@ -173,61 +173,61 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
|
||||
0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,
|
||||
0xd4b,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x9b8,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x9c0,0x382,0x382,0x382,0x9c3,0x382,0x382,0x382,
|
||||
0x382,0x9cb,0x9d1,0x9d5,0x382,0x382,0x9d9,0x9dd,0x9e3,0x382,0x382,0x382,0x9ea,0x9ee,0x9f6,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa06,0x9fe,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa0e,
|
||||
0xa12,0x382,0x382,0x382,0x382,0x382,0xa1a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0xa22,0xa26,0xa2e,0xa32,0x382,0xa39,0xa3e,0xa45,0xa4c,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0xa52,0x382,0xa56,0x382,0x382,0xa5e,0x382,0xa66,0x382,0x382,0x382,0x574,
|
||||
0xa68,0xa6f,0xa73,0x5f3,0xa7b,0xa83,0x382,0xa8b,0xa92,0x382,0xa98,0x5f3,0xa9d,0xaa5,0x382,0x382,
|
||||
0xaaa,0x574,0x382,0x382,0x382,0x365,0xab2,0x5f3,0x5f5,0xaba,0xac1,0x382,0xa8d,0xac9,0x58d,0x382,
|
||||
0xa68,0xad1,0x382,0x382,0xad9,0xae1,0x382,0x382,0x382,0x382,0x382,0x382,0xae5,0xaed,0x382,0x382,
|
||||
0xaf5,0x4dd,0x382,0x382,0xafd,0x382,0x382,0xb03,0xb0b,0x382,0x382,0x382,0x382,0x382,0x382,0xb10,
|
||||
0x382,0x382,0x382,0xb18,0xb20,0x382,0x382,0xb28,0xb30,0x382,0x382,0x382,0xb33,0x9c0,0xb3b,0xb3f,
|
||||
0xb47,0x382,0xb4e,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xb55,
|
||||
0x382,0x382,0x981,0xb5d,0x382,0x382,0x382,0xb63,0xb6b,0x382,0xb6f,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0xb75,0x5f3,0xb7b,0xb83,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x9c4,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x9cc,0x382,0x382,0x382,0x9cf,0x382,0x382,0x382,
|
||||
0x382,0x9d7,0x9dd,0x9e1,0x382,0x382,0x9e5,0x9e9,0x9ef,0x382,0x382,0x382,0x9f6,0x9fa,0xa02,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa12,0xa0a,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa1a,
|
||||
0xa1e,0x382,0x382,0x382,0x382,0x382,0xa26,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0xa2e,0xa32,0xa3a,0xa3e,0x382,0xa45,0xa4a,0xa51,0xa58,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0xa5e,0x573,0xa62,0x382,0x382,0xa6a,0x382,0xa72,0x382,0x382,0x382,0x574,
|
||||
0xa74,0xa7b,0xa7f,0x5f3,0xa87,0xa8f,0x382,0xa97,0xa9e,0x382,0xaa4,0x5f3,0xaa9,0xab1,0x382,0x382,
|
||||
0xab6,0x574,0x382,0x382,0x382,0x365,0xabe,0x5f3,0x5f5,0xac6,0xacd,0x382,0xa99,0xad5,0x58d,0x382,
|
||||
0xa74,0xadd,0x382,0x382,0xae5,0xaed,0x382,0x382,0x382,0x382,0x382,0x382,0xaf1,0xaf9,0x382,0x382,
|
||||
0xb01,0x4dd,0x382,0x382,0xb09,0x382,0x382,0xb0f,0xb17,0x382,0x382,0x382,0x382,0x382,0x382,0xb1c,
|
||||
0x382,0x382,0x382,0xb24,0xb2c,0x382,0x382,0xb34,0xb3c,0x382,0x382,0x382,0xb3f,0x9cc,0xb47,0xb4b,
|
||||
0xb53,0x382,0xb5a,0x382,0x382,0x382,0x382,0x382,0x382,0xb62,0x382,0x382,0x382,0x382,0x382,0xb66,
|
||||
0x382,0x382,0x98d,0xb6e,0x382,0x382,0x382,0xb74,0xb7c,0x382,0xb80,0x382,0x94c,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0xb86,0x5f3,0xb8c,0xb94,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xb8a,0xb92,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xb9b,0xba3,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x519,0xb9a,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x519,0xbab,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0xb9e,0x382,0xba4,0x5b1,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x55e,0xb77,0x382,0x382,0x382,0x382,0x382,0x382,0xb18,0xb20,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x6b4,0x382,0xbaa,0x382,0x382,0xbb2,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0xbaf,0x382,0xbb5,0x5b1,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x55e,0xb88,0x382,0x382,0x382,0x382,0x382,0x382,0xb24,0xb2c,0x382,0xbbd,
|
||||
0xbc4,0x382,0x382,0x382,0x6b4,0x382,0xbc9,0x382,0x382,0xbd1,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbb7,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbd6,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbbf,0x5b1,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbde,0x5b1,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8b9,0xbc7,0xbce,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0xbd5,0xbdd,0xbe3,0x382,0x382,0x382,0x382,0xbeb,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbf3,0xbfb,0xc00,0xc06,0xc0e,
|
||||
0xc16,0xc1e,0xbf7,0xc26,0xc2e,0xc36,0xc3d,0xbf8,0xbf3,0xbfb,0xbf6,0xc06,0xbf9,0xbf4,0xc45,0xbf7,
|
||||
0xc4d,0xc55,0xc5d,0xc64,0xc50,0xc58,0xc60,0xc67,0xc53,0xc6f,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8b9,0xc77,0x8b9,0xc7e,0xc85,0xc8d,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xbe6,0xbed,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0xbf4,0xbfc,0xc02,0x382,0x382,0x382,0x382,0xc0a,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xc12,0xc1a,0xc1f,0xc25,0xc2d,
|
||||
0xc35,0xc3d,0xc16,0xc45,0xc4d,0xc55,0xc5c,0xc17,0xc12,0xc1a,0xc15,0xc25,0xc18,0xc13,0xc64,0xc16,
|
||||
0xc6c,0xc74,0xc7c,0xc83,0xc6f,0xc77,0xc7f,0xc86,0xc72,0xc8e,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xc96,0x8c5,0xc9d,0xca4,0xcac,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0xc9d,0xca5,0x382,0x382,0x382,0x382,0x382,0x382,0xc95,0xcad,0xcc0,0xcb3,0xcb8,0x382,
|
||||
0x382,0x382,0x382,0xcc8,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xad5,
|
||||
0x382,0xa37,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0xcd0,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xcd5,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xcd9,0x382,0xce1,0xce9,0xcf0,0x382,
|
||||
0x382,0x382,0xcbc,0xcc4,0x382,0x382,0x382,0x382,0x382,0x382,0xcb4,0xccc,0xcdf,0xcd2,0xcd7,0x382,
|
||||
0x382,0x382,0x382,0xce7,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xae1,
|
||||
0x382,0xa43,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0xcef,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xcf4,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0xcfc,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xd04,0x382,0xd0c,0xd14,0xd1b,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0xbef,0xcf8,0xcf8,0xcfe,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa8d,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0xc0e,0xd23,0xd23,0xd29,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa99,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x574,0x8b9,0x8b9,0x8b9,0x382,
|
||||
0x382,0x382,0x382,0x8b9,0x8b9,0x8b9,0x8b9,0x8b9,0x8b9,0x8b9,0xd06,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x574,0x8c5,0x8c5,0x8c5,0x382,
|
||||
0x382,0x382,0x382,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0xd31,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,
|
||||
0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x362,0,0,0,0,
|
||||
@@ -272,7 +272,7 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
1,0x9b11,1,0x9a91,0x869,1,1,1,0x9991,0x889,1,0x9891,0x8a9,0x8c9,0x8e9,1,
|
||||
0x97b1,0x9691,0x8e9,0x909,0x929,1,1,0x9691,1,0x949,0x9591,1,1,0x9511,1,1,
|
||||
1,1,1,1,1,0x969,1,1,0x9311,1,0x989,0x9311,1,1,1,0x9a9,
|
||||
0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1,0,1,1,1,
|
||||
0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1,0,0,1,1,
|
||||
1,1,1,1,1,0x9c9,0x9e9,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,5,5,0x25,5,5,5,5,5,
|
||||
5,4,4,4,0x14,4,0x14,4,5,5,4,4,4,4,4,4,
|
||||
@@ -458,8 +458,11 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
4,4,4,4,4,0,0,0,0,0,0,4,4,0x44,0x44,0x44,
|
||||
0x44,0x44,0x44,0x44,0x44,0,0,0x64,0,0,0,0,0,0,0,4,
|
||||
0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,
|
||||
0x64,0x64,0x64,0x44,0x44,0x64,4,0x64,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,
|
||||
0x44,0x44,0x64,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,
|
||||
0x64,0x64,0x64,0x44,0x44,0x64,4,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,
|
||||
0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,
|
||||
0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
|
||||
0x44,0x44,0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,
|
||||
4,4,4,0,4,0,0,0,0,0,4,0,0x60,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
@@ -581,9 +584,9 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
4,4,4,0x92,0xff91,0x513a,1,0,0x92,0xff91,0x92,0xff91,0x1811,1,0x92,0xff91,
|
||||
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x515a,0x517a,0x519a,0x51ba,0x515a,1,
|
||||
0x51da,0x51fa,0x521a,0x523a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
|
||||
0xe812,0x525a,0x527a,0x92,0xff91,0x92,0xff91,0x529a,0x92,0xff91,0,0,0x92,0xff91,0,1,
|
||||
0,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x52ba,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,
|
||||
0xe812,0x525a,0x527a,0x92,0xff91,0x92,0xff91,0x529a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,
|
||||
0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x52ba,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,
|
||||
5,0x92,0xff91,0,5,5,1,0,0,0,0,0,0,0,4,0,
|
||||
0,0,0x64,0,0,0,0,4,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,
|
||||
@@ -677,7 +680,7 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0x44,0x44,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,0,4,0x64,0x64,0x64,0,0,0,0,0,0,0x64,0x64,
|
||||
0,0,0x64,0x64,4,0x64,0x64,0x64,0,0,0,0,0,0,0x64,0x64,
|
||||
0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x64,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
@@ -739,117 +742,125 @@ static const uint16_t ucase_props_trieIndex[13372]={
|
||||
0,0,0,0x64,0,0,0,0,0,0,0,0,0,4,4,4,
|
||||
4,4,4,0,0,4,4,4,0,0,0,0,0,0,0,0,
|
||||
0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,
|
||||
4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,4,4,4,4,4,4,4,0,4,4,4,4,
|
||||
4,4,0,0x64,4,4,4,4,4,4,4,4,0,0,4,4,
|
||||
4,4,4,4,4,0,4,4,0,4,4,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
|
||||
4,4,4,0,0,0,4,0,4,4,0,4,4,4,0x64,4,
|
||||
0x64,0x64,0,4,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,
|
||||
0,4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,
|
||||
4,0x64,0,0,0,0,0,0,4,0,4,4,4,0,4,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,4,4,4,4,4,0,0,0,0,0,4,0x60,0x64,0,
|
||||
0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0,
|
||||
4,4,4,4,4,4,0,0x64,4,4,4,4,4,4,4,4,
|
||||
0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,4,
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,
|
||||
0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
|
||||
4,4,0,0,0,4,4,0x64,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0,
|
||||
0,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4,
|
||||
4,4,0x64,4,0x64,0x64,0,4,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,0,4,4,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0x60,0x60,0,0,0,0,0,0,
|
||||
4,4,0,0,0,4,0,0x64,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,4,4,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,4,4,4,4,4,0,0,0,0,0,
|
||||
4,0x60,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
|
||||
0,4,4,4,4,4,4,4,0,4,4,0,0,0,0,0,
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,
|
||||
0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
|
||||
4,4,4,4,4,4,0,0,0,4,4,0x64,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,
|
||||
0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,
|
||||
0,0,0,0,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,
|
||||
0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0,0,0xf291,
|
||||
0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,
|
||||
0xf291,0xf291,0xf291,0xf291,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,0,4,4,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0x60,0x60,4,4,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,4,4,4,4,0,4,4,4,
|
||||
4,4,4,4,0,4,4,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,0,0,0,0,4,0x64,0,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,
|
||||
0,0,0,0,0,4,0x64,0,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,4,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,0x60,0x60,0x64,0x64,0x64,0,0,
|
||||
0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,
|
||||
0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,
|
||||
0,0,0,0,0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60,
|
||||
0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64,
|
||||
0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,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,0x44,0x44,0x44,0x44,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,
|
||||
0x44,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,2,2,2,2,
|
||||
0,0,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,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,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,
|
||||
1,0,0x21,0x21,1,1,1,1,1,1,1,1,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x21,0x21,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,
|
||||
1,1,1,1,1,0,0x21,0x21,1,1,1,1,1,1,1,1,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,
|
||||
1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,2,0,2,2,0,0,2,0,0,2,2,0,
|
||||
0,2,2,2,2,0,2,2,2,2,2,2,2,2,1,1,
|
||||
1,1,0,1,0,1,0x21,0x21,1,1,1,1,0,1,1,1,
|
||||
1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,1,1,1,1,2,2,0,2,
|
||||
2,2,2,0,0,2,2,2,2,2,2,2,2,0,2,2,
|
||||
2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x21,0x21,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
2,2,0,2,2,2,2,0,2,2,2,2,2,0,2,0,
|
||||
0,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1,
|
||||
1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
2,0,2,2,0,0,2,0,0,2,2,0,0,2,2,2,
|
||||
2,0,2,2,2,2,2,2,2,2,1,1,1,1,0,1,
|
||||
0,1,0x21,0x21,1,1,1,1,0,1,1,1,1,1,1,1,
|
||||
1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,1,1,1,1,1,1,0,0,2,2,2,2,
|
||||
2,2,2,2,1,1,1,1,2,2,0,2,2,2,2,0,
|
||||
0,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,
|
||||
2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,2,
|
||||
2,2,2,0,2,2,2,2,2,0,2,0,0,0,2,2,
|
||||
2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x21,0x21,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
|
||||
1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,
|
||||
1,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,0,0,0,0,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,0,0,0,0,0,0,0,0,4,0,0,
|
||||
0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
|
||||
4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,
|
||||
0x44,0x44,0x44,0x44,1,1,1,1,1,1,1,1,1,1,0,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x21,1,
|
||||
1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,
|
||||
0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
5,5,5,5,0x25,5,5,5,5,5,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,0x25,0x25,5,5,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,4,4,4,4,4,4,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,4,0x64,0x64,0x64,0x44,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,
|
||||
0,0,0,0,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
|
||||
0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
|
||||
0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
|
||||
0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
|
||||
0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,0x44,0x44,0x64,4,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,
|
||||
1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1,
|
||||
1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,
|
||||
0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
|
||||
0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,
|
||||
0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44,
|
||||
1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,0x21,1,1,1,1,0,
|
||||
0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
0x25,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0x44,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,
|
||||
5,5,5,5,5,5,5,5,0x25,0x25,5,5,5,5,5,5,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,
|
||||
0x44,0x44,0x44,4,4,4,4,4,4,4,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,4,0x64,0x64,0x64,0x44,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0x44,0,0,0x44,0,0,0,0,0,0,0,0x44,0x44,
|
||||
0,0,0,0,0,0x44,0,0,0,0,0,0,0,0,0,4,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,
|
||||
0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
|
||||
0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,
|
||||
0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
|
||||
0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,
|
||||
0x44,0x44,0x44,0x44,0x44,0x44,0x64,4,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,
|
||||
2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
static const uint16_t ucase_props_exceptions[1672]={
|
||||
@@ -997,13 +1008,13 @@ static const UCaseProps ucase_props_singleton={
|
||||
ucase_props_trieIndex+3468,
|
||||
nullptr,
|
||||
3468,
|
||||
9904,
|
||||
10076,
|
||||
0x188,
|
||||
0xe08,
|
||||
0x0,
|
||||
0x0,
|
||||
0xe0800,
|
||||
0x3438,
|
||||
0x34e4,
|
||||
nullptr, 0, false, false, 0, nullptr
|
||||
},
|
||||
{ 4,0,0,0 }
|
||||
|
||||
+8
-5
@@ -102,13 +102,16 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) {
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode);
|
||||
if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || length==sizeof(csm->locale)) {
|
||||
*pErrorCode=U_ZERO_ERROR;
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus);
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR || (U_SUCCESS(bufferStatus) && length==sizeof(csm->locale))) {
|
||||
bufferStatus = U_ZERO_ERROR;
|
||||
/* we only really need the language code for case mappings */
|
||||
length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode);
|
||||
length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus);
|
||||
}
|
||||
if(length==sizeof(csm->locale)) {
|
||||
if(U_FAILURE(bufferStatus)) {
|
||||
*pErrorCode=bufferStatus;
|
||||
} else if(length==sizeof(csm->locale)) {
|
||||
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
|
||||
}
|
||||
if(U_SUCCESS(*pErrorCode)) {
|
||||
|
||||
+27
@@ -616,6 +616,33 @@ uscript_getScriptExtensions(UChar32 c,
|
||||
return length;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
UBool U_CALLCONV
|
||||
_scxRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
|
||||
// From u_getUnicodeProperties(start, 0).
|
||||
uint32_t vecWord = propsVectors[value]; // vecIndex=value, column 0
|
||||
uint32_t scriptX = vecWord & UPROPS_SCRIPT_X_MASK;
|
||||
if (scriptX >= UPROPS_SCRIPT_X_WITH_COMMON) {
|
||||
// Code points start..end have Script_Extensions.
|
||||
const USetAdder* sa = static_cast<const USetAdder*>(context);
|
||||
sa->addRange(sa->set, start, end);
|
||||
}
|
||||
(void) value;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// for icuexportdata
|
||||
U_CAPI void U_EXPORT2
|
||||
uprv_addScriptExtensionsCodePoints(const USetAdder *sa, UErrorCode *pErrorCode) {
|
||||
if(U_FAILURE(*pErrorCode)) {
|
||||
return;
|
||||
}
|
||||
utrie2_enum(&propsVectorsTrie, nullptr, _scxRange, sa);
|
||||
}
|
||||
|
||||
U_CAPI UBlockCode U_EXPORT2
|
||||
ublock_getCode(UChar32 c) {
|
||||
// We store Block values indexed by the code point shifted right 4 bits
|
||||
|
||||
+4172
-3447
File diff suppressed because it is too large.
Load diff
+18
-10
@@ -1752,20 +1752,24 @@ ucnv_fromUChars(UConverter *cnv,
|
||||
destLimit=dest+destCapacity;
|
||||
|
||||
/* perform the conversion */
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
destLength=(int32_t)(dest-originalDest);
|
||||
|
||||
/* if an overflow occurs, then get the preflighting length */
|
||||
if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) {
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR) {
|
||||
char buffer[1024];
|
||||
|
||||
destLimit=buffer+sizeof(buffer);
|
||||
do {
|
||||
dest=buffer;
|
||||
*pErrorCode=U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode);
|
||||
bufferStatus=U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
destLength+=(int32_t)(dest-buffer);
|
||||
} while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR);
|
||||
} while(bufferStatus==U_BUFFER_OVERFLOW_ERROR);
|
||||
}
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*pErrorCode = bufferStatus;
|
||||
}
|
||||
} else {
|
||||
destLength=0;
|
||||
@@ -1808,22 +1812,26 @@ ucnv_toUChars(UConverter *cnv,
|
||||
destLimit=dest+destCapacity;
|
||||
|
||||
/* perform the conversion */
|
||||
ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
destLength=(int32_t)(dest-originalDest);
|
||||
|
||||
/* if an overflow occurs, then get the preflighting length */
|
||||
if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR)
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR)
|
||||
{
|
||||
char16_t buffer[1024];
|
||||
|
||||
destLimit=buffer+UPRV_LENGTHOF(buffer);
|
||||
do {
|
||||
dest=buffer;
|
||||
*pErrorCode=U_ZERO_ERROR;
|
||||
ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode);
|
||||
bufferStatus=U_ZERO_ERROR;
|
||||
ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
destLength+=(int32_t)(dest-buffer);
|
||||
}
|
||||
while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR);
|
||||
while(bufferStatus==U_BUFFER_OVERFLOW_ERROR);
|
||||
}
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*pErrorCode = bufferStatus;
|
||||
}
|
||||
} else {
|
||||
destLength=0;
|
||||
|
||||
+1
-1
@@ -597,7 +597,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){
|
||||
/* open the required converters and cache them */
|
||||
myConverterData->myConverterArray[GB2312_1] =
|
||||
ucnv_loadSharedData("ibm-5478", &stackPieces, &stackArgs, errorCode);
|
||||
if(version==1) {
|
||||
if(version>=1) {
|
||||
myConverterData->myConverterArray[ISO_IR_165] =
|
||||
ucnv_loadSharedData("iso-ir-165", &stackPieces, &stackArgs, errorCode);
|
||||
}
|
||||
|
||||
+32
-9
@@ -40,6 +40,7 @@
|
||||
#include "uarrsort.h"
|
||||
#include "uassert.h"
|
||||
#include "udataswp.h"
|
||||
#include "udatamem.h"
|
||||
#include "cstring.h"
|
||||
#include "cmemory.h"
|
||||
#include "ucnv_io.h"
|
||||
@@ -235,23 +236,29 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) {
|
||||
const uint32_t *sectionSizes;
|
||||
uint32_t tableStart;
|
||||
uint32_t currOffset;
|
||||
int32_t sizeOfData;
|
||||
int32_t sizeOfTOC;
|
||||
|
||||
ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup);
|
||||
|
||||
U_ASSERT(gAliasData == nullptr);
|
||||
data = udata_openChoice(nullptr, DATA_TYPE, DATA_NAME, isAcceptable, nullptr, &errCode);
|
||||
if(U_FAILURE(errCode)) {
|
||||
if (U_FAILURE(errCode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
sectionSizes = static_cast<const uint32_t*>(udata_getMemory(data));
|
||||
int32_t dataLength = udata_getLength(data); // This is the length minus the UDataInfo size
|
||||
if (dataLength <= int32_t(sizeof(sectionSizes[0]))) {
|
||||
// We don't even have a TOC!
|
||||
goto invalidFormat;
|
||||
}
|
||||
table = reinterpret_cast<const uint16_t*>(sectionSizes);
|
||||
|
||||
tableStart = sectionSizes[0];
|
||||
if (tableStart < minTocLength) {
|
||||
errCode = U_INVALID_FORMAT_ERROR;
|
||||
udata_close(data);
|
||||
return;
|
||||
tableStart = sectionSizes[0];
|
||||
sizeOfTOC = int32_t((tableStart + 1) * sizeof(sectionSizes[0]));
|
||||
if (tableStart < minTocLength || dataLength <= sizeOfTOC) {
|
||||
// We don't have a whole TOC!
|
||||
goto invalidFormat;
|
||||
}
|
||||
gAliasData = data;
|
||||
|
||||
@@ -264,11 +271,21 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) {
|
||||
gMainTable.optionTableSize = sectionSizes[7];
|
||||
gMainTable.stringTableSize = sectionSizes[8];
|
||||
|
||||
if (tableStart > 8) {
|
||||
if (tableStart > minTocLength) {
|
||||
gMainTable.normalizedStringTableSize = sectionSizes[9];
|
||||
}
|
||||
|
||||
currOffset = tableStart * (sizeof(uint32_t)/sizeof(uint16_t)) + (sizeof(uint32_t)/sizeof(uint16_t));
|
||||
sizeOfData = sizeOfTOC;
|
||||
for (uint32_t section = 1; section <= tableStart; section++) {
|
||||
sizeOfData += sectionSizes[section] * sizeof(table[0]);
|
||||
}
|
||||
if (dataLength < sizeOfData) {
|
||||
// Truncated file!
|
||||
goto invalidFormat;
|
||||
}
|
||||
// There may be some extra padding at the end, or this is a new file format with extra data that we can't read yet.
|
||||
|
||||
currOffset = (tableStart + 1) * (sizeof(uint32_t)/sizeof(uint16_t));
|
||||
gMainTable.converterList = table + currOffset;
|
||||
|
||||
currOffset += gMainTable.converterListSize;
|
||||
@@ -306,6 +323,12 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) {
|
||||
currOffset += gMainTable.stringTableSize;
|
||||
gMainTable.normalizedStringTable = ((gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED)
|
||||
? gMainTable.stringTable : (table + currOffset));
|
||||
|
||||
return;
|
||||
|
||||
invalidFormat:
|
||||
errCode = U_INVALID_FORMAT_ERROR;
|
||||
udata_close(data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
@@ -1004,6 +1004,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName,
|
||||
* and return it. */
|
||||
pEntryData->mapAddr = dataMemory.mapAddr;
|
||||
pEntryData->map = dataMemory.map;
|
||||
pEntryData->length = dataMemory.length;
|
||||
|
||||
#ifdef UDATA_DEBUG
|
||||
fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
|
||||
|
||||
+63
-52
@@ -248,9 +248,10 @@ _internal_toASCII(const char16_t* src, int32_t srcLength,
|
||||
if(srcIsASCII == false){
|
||||
|
||||
// step 2
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, &bufferStatus);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
// we do not have enough room so grow the buffer
|
||||
if(b1 != b1Stack){
|
||||
@@ -262,9 +263,12 @@ _internal_toASCII(const char16_t* src, int32_t srcLength,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, &bufferStatus);
|
||||
}
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*status = bufferStatus;
|
||||
}
|
||||
}
|
||||
// error bail out
|
||||
@@ -333,9 +337,10 @@ _internal_toASCII(const char16_t* src, int32_t srcLength,
|
||||
// caseFlags = (UBool*) uprv_malloc(b1Len * sizeof(UBool));
|
||||
// uprv_memset(caseFlags,true,b1Len);
|
||||
|
||||
b2Len = u_strToPunycode(b1,b1Len,b2,b2Capacity,caseFlags, status);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
b2Len = u_strToPunycode(b1,b1Len,b2,b2Capacity,caseFlags,&bufferStatus);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
/* we do not have enough room so grow the buffer*/
|
||||
b2 = static_cast<char16_t*>(uprv_malloc(b2Len * U_SIZEOF_UCHAR));
|
||||
@@ -344,12 +349,13 @@ _internal_toASCII(const char16_t* src, int32_t srcLength,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
b2Len = u_strToPunycode(b1,b1Len,b2,b2Len,caseFlags, status);
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b2Len = u_strToPunycode(b1,b1Len,b2,b2Len,caseFlags,&bufferStatus);
|
||||
}
|
||||
//error bail out
|
||||
if(U_FAILURE(*status)){
|
||||
if(U_FAILURE(bufferStatus)){
|
||||
*status = bufferStatus;
|
||||
goto CLEANUP;
|
||||
}
|
||||
// TODO : Reconsider while implementing the case preserve RFE
|
||||
@@ -454,8 +460,9 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength,
|
||||
|
||||
if(srcIsASCII == false){
|
||||
// step 2: process the string
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status);
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, &bufferStatus);
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
/* we do not have enough room so grow the buffer*/
|
||||
b1 = static_cast<char16_t*>(uprv_malloc(b1Len * U_SIZEOF_UCHAR));
|
||||
@@ -464,12 +471,13 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, &bufferStatus);
|
||||
}
|
||||
//bail out on error
|
||||
if(U_FAILURE(*status)){
|
||||
if(U_FAILURE(bufferStatus)){
|
||||
*status = bufferStatus;
|
||||
goto CLEANUP;
|
||||
}
|
||||
}else{
|
||||
@@ -493,9 +501,10 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength,
|
||||
b1PrimeLen = b1Len - ACE_PREFIX_LENGTH;
|
||||
|
||||
//step 5: Decode using punycode
|
||||
b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Capacity, caseFlags,status);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Capacity, caseFlags, &bufferStatus);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
/* we do not have enough room so grow the buffer*/
|
||||
b2 = static_cast<char16_t*>(uprv_malloc(b2Len * U_SIZEOF_UCHAR));
|
||||
@@ -504,16 +513,16 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Len, caseFlags, status);
|
||||
b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Len, caseFlags, &bufferStatus);
|
||||
}
|
||||
|
||||
|
||||
//step 6:Apply toASCII
|
||||
b3Len = uidna_toASCII(b2, b2Len, b3, b3Capacity, options, parseError, status);
|
||||
b3Len = uidna_toASCII(b2, b2Len, b3, b3Capacity, options, parseError, &bufferStatus);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
/* we do not have enough room so grow the buffer*/
|
||||
b3 = static_cast<char16_t*>(uprv_malloc(b3Len * U_SIZEOF_UCHAR));
|
||||
@@ -522,13 +531,14 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b3Len = uidna_toASCII(b2,b2Len,b3,b3Len,options,parseError, status);
|
||||
b3Len = uidna_toASCII(b2,b2Len,b3,b3Len,options,parseError,&bufferStatus);
|
||||
|
||||
}
|
||||
//bail out on error
|
||||
if(U_FAILURE(*status)){
|
||||
if(U_FAILURE(bufferStatus)){
|
||||
*status = bufferStatus;
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
@@ -706,24 +716,21 @@ uidna_IDNToASCII( const char16_t *src, int32_t srcLength,
|
||||
labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done);
|
||||
labelReqLength = 0;
|
||||
if(!(labelLen==0 && done)){// make sure this is not a root label separator.
|
||||
|
||||
labelReqLength = _internal_toASCII( labelStart, labelLen,
|
||||
currentDest, remainingDestCapacity,
|
||||
options, nameprep,
|
||||
parseError, status);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
labelReqLength = _internal_toASCII( labelStart, labelLen,
|
||||
currentDest, remainingDestCapacity,
|
||||
options, nameprep,
|
||||
parseError, &bufferStatus);
|
||||
|
||||
if (bufferStatus == U_BUFFER_OVERFLOW_ERROR) {
|
||||
remainingDestCapacity = 0;
|
||||
} else if (U_FAILURE(bufferStatus)) {
|
||||
*status = bufferStatus;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(U_FAILURE(*status)){
|
||||
break;
|
||||
}
|
||||
|
||||
reqLength +=labelReqLength;
|
||||
// adjust the destination pointer
|
||||
if(labelReqLength < remainingDestCapacity){
|
||||
@@ -877,8 +884,9 @@ uidna_compare( const char16_t *s1, int32_t length1,
|
||||
|
||||
UParseError parseError;
|
||||
|
||||
b1Len = uidna_IDNToASCII(s1, length1, b1, b1Capacity, options, &parseError, status);
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
b1Len = uidna_IDNToASCII(s1, length1, b1, b1Capacity, options, &parseError, &bufferStatus);
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
b1 = (char16_t*) uprv_malloc(b1Len * U_SIZEOF_UCHAR);
|
||||
if(b1==nullptr){
|
||||
@@ -886,14 +894,13 @@ uidna_compare( const char16_t *s1, int32_t length1,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = uidna_IDNToASCII(s1,length1,b1,b1Len, options, &parseError, status);
|
||||
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b1Len = uidna_IDNToASCII(s1,length1,b1,b1Len, options, &parseError, &bufferStatus);
|
||||
}
|
||||
|
||||
b2Len = uidna_IDNToASCII(s2,length2, b2,b2Capacity, options, &parseError, status);
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
b2Len = uidna_IDNToASCII(s2,length2, b2,b2Capacity, options, &parseError, &bufferStatus);
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
b2 = (char16_t*) uprv_malloc(b2Len * U_SIZEOF_UCHAR);
|
||||
if(b2==nullptr){
|
||||
@@ -901,11 +908,15 @@ uidna_compare( const char16_t *s1, int32_t length1,
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
|
||||
b2Len = uidna_IDNToASCII(s2, length2, b2, b2Len, options, &parseError, status);
|
||||
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
|
||||
b2Len = uidna_IDNToASCII(s2, length2, b2, b2Len, options, &parseError, &bufferStatus);
|
||||
}
|
||||
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*status = bufferStatus;
|
||||
}
|
||||
|
||||
// when toASCII is applied all label separators are replaced with FULL_STOP
|
||||
result = compareCaseInsensitiveASCII(b1,b1Len,b2,b2Len);
|
||||
|
||||
|
||||
+16
-2
@@ -627,7 +627,7 @@ ulocimp_getKeywords(std::string_view localeID,
|
||||
do {
|
||||
bool duplicate = false;
|
||||
/* skip leading spaces */
|
||||
while (localeID.front() == ' ') {
|
||||
while (!localeID.empty() && localeID.front() == ' ') {
|
||||
localeID.remove_prefix(1);
|
||||
}
|
||||
if (localeID.empty()) { /* handle trailing "; " */
|
||||
@@ -1102,7 +1102,21 @@ ulocimp_setKeywordValue(std::string_view keywords,
|
||||
/* if input key/value specified removal of a keyword not present in locale, or
|
||||
* there was an error in CharString.append, leave original locale alone. */
|
||||
U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING);
|
||||
return static_cast<int32_t>(keywords.size());
|
||||
// The sink is expected to be a buffer which already contains the full
|
||||
// locale string, so when it isn't going to be modified there's no need
|
||||
// to actually write any data to it, as the data is already there. Only
|
||||
// the first character needs to be overwritten (changing '\0' to '@').
|
||||
needLen = static_cast<int32_t>(keywords.size());
|
||||
int32_t capacity = 0;
|
||||
char* buffer = sink.GetAppendBuffer(
|
||||
needLen, needLen, nullptr, needLen, &capacity);
|
||||
if (capacity < needLen || buffer == nullptr) {
|
||||
status = U_BUFFER_OVERFLOW_ERROR;
|
||||
} else {
|
||||
*buffer = '@';
|
||||
sink.Append(buffer, needLen);
|
||||
}
|
||||
return needLen;
|
||||
}
|
||||
|
||||
needLen = updatedKeysAndValues.length();
|
||||
|
||||
+20
-24
@@ -14,9 +14,9 @@
|
||||
#include "unicode/unistr.h"
|
||||
#include "unicode/uobject.h"
|
||||
|
||||
#include "charstr.h"
|
||||
#include "cmemory.h"
|
||||
#include "cstring.h"
|
||||
#include "fixedstring.h"
|
||||
#include "uassert.h"
|
||||
#include "ucln_cmn.h"
|
||||
#include "uhash.h"
|
||||
@@ -53,7 +53,7 @@ struct TypeAlias : public icu::UMemory {
|
||||
std::string_view from;
|
||||
};
|
||||
|
||||
static icu::MemoryPool<icu::CharString>* gKeyTypeStringPool = nullptr;
|
||||
static icu::MemoryPool<icu::FixedString>* gKeyTypeStringPool = nullptr;
|
||||
static icu::MemoryPool<LocExtKeyData>* gLocExtKeyDataEntries = nullptr;
|
||||
static icu::MemoryPool<LocExtType>* gLocExtTypeEntries = nullptr;
|
||||
static icu::MemoryPool<TypeAlias>* gTypeAliasEntries = nullptr;
|
||||
@@ -108,7 +108,7 @@ initFromResourceBundle(UErrorCode& sts) {
|
||||
LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", nullptr, &tmpSts));
|
||||
|
||||
// initialize pools storing dynamically allocated objects
|
||||
gKeyTypeStringPool = new icu::MemoryPool<icu::CharString>;
|
||||
gKeyTypeStringPool = new icu::MemoryPool<icu::FixedString>;
|
||||
if (gKeyTypeStringPool == nullptr) {
|
||||
sts = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
@@ -146,12 +146,12 @@ initFromResourceBundle(UErrorCode& sts) {
|
||||
// empty value indicates that BCP key is same with the legacy key.
|
||||
const char* bcpKeyId = legacyKeyId;
|
||||
if (!uBcpKeyId.isEmpty()) {
|
||||
icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create();
|
||||
icu::FixedString* bcpKeyIdBuf = gKeyTypeStringPool->create();
|
||||
if (bcpKeyIdBuf == nullptr) {
|
||||
sts = U_MEMORY_ALLOCATION_ERROR;
|
||||
break;
|
||||
}
|
||||
bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts);
|
||||
copyInvariantChars(uBcpKeyId, *bcpKeyIdBuf, sts);
|
||||
if (U_FAILURE(sts)) {
|
||||
break;
|
||||
}
|
||||
@@ -220,18 +220,16 @@ initFromResourceBundle(UErrorCode& sts) {
|
||||
// a timezone key uses a colon instead of a slash in the resource.
|
||||
// e.g. America:Los_Angeles
|
||||
if (uprv_strchr(legacyTypeId, ':') != nullptr) {
|
||||
icu::CharString* legacyTypeIdBuf =
|
||||
gKeyTypeStringPool->create(legacyTypeId, sts);
|
||||
if (legacyTypeIdBuf == nullptr) {
|
||||
U_ASSERT(legacyTypeId != nullptr && *legacyTypeId != '\0');
|
||||
std::string_view legacyTypeIdView = legacyTypeId;
|
||||
icu::FixedString* legacyTypeIdBuf = gKeyTypeStringPool->create(legacyTypeIdView);
|
||||
if (legacyTypeIdBuf == nullptr || legacyTypeIdBuf->isEmpty()) {
|
||||
sts = U_MEMORY_ALLOCATION_ERROR;
|
||||
break;
|
||||
}
|
||||
if (U_FAILURE(sts)) {
|
||||
break;
|
||||
}
|
||||
std::replace(
|
||||
legacyTypeIdBuf->data(),
|
||||
legacyTypeIdBuf->data() + legacyTypeIdBuf->length(),
|
||||
legacyTypeIdBuf->getAlias(),
|
||||
legacyTypeIdBuf->getAlias() + legacyTypeIdView.length(),
|
||||
':', '/');
|
||||
legacyTypeId = legacyTypeIdBuf->data();
|
||||
}
|
||||
@@ -245,12 +243,12 @@ initFromResourceBundle(UErrorCode& sts) {
|
||||
// empty value indicates that BCP type is same with the legacy type.
|
||||
const char* bcpTypeId = legacyTypeId;
|
||||
if (!uBcpTypeId.isEmpty()) {
|
||||
icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create();
|
||||
icu::FixedString* bcpTypeIdBuf = gKeyTypeStringPool->create();
|
||||
if (bcpTypeIdBuf == nullptr) {
|
||||
sts = U_MEMORY_ALLOCATION_ERROR;
|
||||
break;
|
||||
}
|
||||
bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts);
|
||||
copyInvariantChars(uBcpTypeId, *bcpTypeIdBuf, sts);
|
||||
if (U_FAILURE(sts)) {
|
||||
break;
|
||||
}
|
||||
@@ -302,20 +300,18 @@ initFromResourceBundle(UErrorCode& sts) {
|
||||
if (isTZ) {
|
||||
// replace colon with slash if necessary
|
||||
if (uprv_strchr(from, ':') != nullptr) {
|
||||
icu::CharString* fromBuf =
|
||||
gKeyTypeStringPool->create(from, sts);
|
||||
if (fromBuf == nullptr) {
|
||||
U_ASSERT(from != nullptr && *from != '\0');
|
||||
std::string_view fromView = from;
|
||||
icu::FixedString* fromBuf = gKeyTypeStringPool->create(fromView);
|
||||
if (fromBuf == nullptr || fromBuf->isEmpty()) {
|
||||
sts = U_MEMORY_ALLOCATION_ERROR;
|
||||
break;
|
||||
}
|
||||
if (U_FAILURE(sts)) {
|
||||
break;
|
||||
}
|
||||
std::replace(
|
||||
fromBuf->data(),
|
||||
fromBuf->data() + fromBuf->length(),
|
||||
fromBuf->getAlias(),
|
||||
fromBuf->getAlias() + fromView.length(),
|
||||
':', '/');
|
||||
alias->from = fromBuf->toStringPiece();
|
||||
alias->from = {fromBuf->data(), fromView.length()};
|
||||
}
|
||||
}
|
||||
uhash_put(typeDataMap, &alias->from, t, &sts);
|
||||
|
||||
+39
-39
@@ -55,95 +55,95 @@ uloc_getCurrentCountryID(const char* oldID);
|
||||
U_CFUNC const char*
|
||||
uloc_getCurrentLanguageID(const char* oldID);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toBcpKeyWithFallback(std::string_view keyword);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toLegacyKeyWithFallback(std::string_view keyword);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
bool valuesToo,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
icu::ByteSink& sink,
|
||||
bool valuesToo,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getKeywordValue(const char* localeID,
|
||||
std::string_view keywordName,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getKeywordValue(const char* localeID,
|
||||
std::string_view keywordName,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getLanguage(std::string_view localeID, UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getScript(std::string_view localeID, UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getRegion(std::string_view localeID, UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getVariant(std::string_view localeID, UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_setKeywordValue(std::string_view keywordName,
|
||||
std::string_view keywordValue,
|
||||
icu::CharString& localeID,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT int32_t
|
||||
U_COMMON_API int32_t
|
||||
ulocimp_setKeywordValue(std::string_view keywords,
|
||||
std::string_view keywordName,
|
||||
std::string_view keywordValue,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getSubtags(
|
||||
std::string_view localeID,
|
||||
icu::CharString* language,
|
||||
@@ -153,7 +153,7 @@ ulocimp_getSubtags(
|
||||
const char** pEnd,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getSubtags(
|
||||
std::string_view localeID,
|
||||
icu::ByteSink* language,
|
||||
@@ -182,16 +182,16 @@ ulocimp_getSubtags(
|
||||
status);
|
||||
}
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getParent(const char* localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_getParent(const char* localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_toLanguageTag(const char* localeID,
|
||||
bool strict,
|
||||
UErrorCode& status);
|
||||
@@ -215,13 +215,13 @@ ulocimp_toLanguageTag(const char* localeID,
|
||||
*
|
||||
* @internal ICU 64
|
||||
*/
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_toLanguageTag(const char* localeID,
|
||||
icu::ByteSink& sink,
|
||||
bool strict,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_forLanguageTag(const char* langtag,
|
||||
int32_t tagLen,
|
||||
int32_t* parsedLength,
|
||||
@@ -253,7 +253,7 @@ ulocimp_forLanguageTag(const char* langtag,
|
||||
* failed.
|
||||
* @internal ICU 63
|
||||
*/
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_forLanguageTag(const char* langtag,
|
||||
int32_t tagLen,
|
||||
icu::ByteSink& sink,
|
||||
@@ -280,11 +280,11 @@ ulocimp_forLanguageTag(const char* langtag,
|
||||
* The region code found, empty if none found.
|
||||
* @internal ICU 57
|
||||
*/
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_addLikelySubtags(const char* localeID,
|
||||
UErrorCode& status);
|
||||
|
||||
@@ -317,12 +317,12 @@ ulocimp_addLikelySubtags(const char* localeID,
|
||||
* or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
|
||||
* @internal ICU 64
|
||||
*/
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_addLikelySubtags(const char* localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
U_COMMON_API icu::CharString
|
||||
ulocimp_minimizeSubtags(const char* localeID,
|
||||
bool favorScript,
|
||||
UErrorCode& status);
|
||||
@@ -357,7 +357,7 @@ ulocimp_minimizeSubtags(const char* localeID,
|
||||
* or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
|
||||
* @internal ICU 64
|
||||
*/
|
||||
U_EXPORT void
|
||||
U_COMMON_API void
|
||||
ulocimp_minimizeSubtags(const char* localeID,
|
||||
icu::ByteSink& sink,
|
||||
bool favorScript,
|
||||
@@ -405,24 +405,24 @@ ultag_isVariantSubtags(const char* s, int32_t len);
|
||||
const char*
|
||||
ultag_getTKeyStart(const char* localeID);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toBcpKey(std::string_view key);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toLegacyKey(std::string_view key);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toBcpType(std::string_view key, std::string_view type);
|
||||
|
||||
U_EXPORT std::optional<std::string_view>
|
||||
U_COMMON_API std::optional<std::string_view>
|
||||
ulocimp_toLegacyType(std::string_view key, std::string_view type);
|
||||
|
||||
/* Function for testing purpose */
|
||||
U_EXPORT const char* const*
|
||||
U_COMMON_API const char* const*
|
||||
ulocimp_getKnownCanonicalizedLocaleForTest(int32_t& length);
|
||||
|
||||
// Return true if the value is already canonicalized.
|
||||
U_EXPORT bool
|
||||
U_COMMON_API bool
|
||||
ulocimp_isCanonicalizedLocaleForTest(const char* localeName);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+7
@@ -119,6 +119,7 @@ typedef HANDLE MemoryMap;
|
||||
|
||||
HANDLE map = nullptr;
|
||||
HANDLE file = INVALID_HANDLE_VALUE;
|
||||
DWORD fileLength = 0;
|
||||
|
||||
UDataMemory_init(pData); /* Clear the output struct. */
|
||||
|
||||
@@ -159,6 +160,8 @@ typedef HANDLE MemoryMap;
|
||||
return false;
|
||||
}
|
||||
|
||||
fileLength = GetFileSize(file, nullptr);
|
||||
|
||||
// Note: We use nullptr/nullptr for lpAttributes parameter below.
|
||||
// This means our handle cannot be inherited and we will get the default security descriptor.
|
||||
/* create an unnamed Windows file-mapping object for the specified file */
|
||||
@@ -181,6 +184,8 @@ typedef HANDLE MemoryMap;
|
||||
return false;
|
||||
}
|
||||
pData->map = map;
|
||||
pData->length = fileLength;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -237,6 +242,7 @@ typedef HANDLE MemoryMap;
|
||||
pData->map = (char *)data + length;
|
||||
pData->pHeader=(const DataHeader *)data;
|
||||
pData->mapAddr = data;
|
||||
pData->length = length;
|
||||
#if U_PLATFORM == U_PF_IPHONE || U_PLATFORM == U_PF_ANDROID
|
||||
// Apparently supported from Android 23 and higher:
|
||||
// https://github.com/ggml-org/llama.cpp/pull/3631
|
||||
@@ -320,6 +326,7 @@ typedef HANDLE MemoryMap;
|
||||
pData->map=p;
|
||||
pData->pHeader=(const DataHeader *)p;
|
||||
pData->mapAddr=p;
|
||||
pData->length = fileLength;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+25
-39
@@ -37,31 +37,6 @@
|
||||
#error U_USER_ATOMICS and U_USER_MUTEX_H are not supported
|
||||
#endif
|
||||
|
||||
// Export an explicit template instantiation of std::atomic<int32_t>.
|
||||
// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class.
|
||||
// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
|
||||
//
|
||||
// Similar story for std::atomic<std::mutex *>, and the exported UMutex class.
|
||||
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN)
|
||||
#if defined(__clang__) || defined(_MSC_VER)
|
||||
#if defined(__clang__)
|
||||
// Suppress the warning that the explicit instantiation after explicit specialization has no effect.
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Winstantiation-after-specialization"
|
||||
#endif
|
||||
template struct U_COMMON_API std::atomic<int32_t>;
|
||||
template struct U_COMMON_API std::atomic<std::mutex *>;
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#elif defined(__GNUC__)
|
||||
// For GCC this class is already exported/visible, so no need for U_COMMON_API.
|
||||
template struct std::atomic<int32_t>;
|
||||
template struct std::atomic<std::mutex *>;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
/****************************************************************************
|
||||
@@ -95,11 +70,22 @@ inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) {
|
||||
*
|
||||
*************************************************************************************************/
|
||||
|
||||
struct U_COMMON_API UInitOnce {
|
||||
u_atomic_int32_t fState {0};
|
||||
UErrorCode fErrCode {U_ZERO_ERROR};
|
||||
void reset() {fState = 0;}
|
||||
UBool isReset() {return umtx_loadAcquire(fState) == 0;}
|
||||
struct U_COMMON_API_CLASS UInitOnce {
|
||||
private:
|
||||
friend U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce&);
|
||||
friend U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce&);
|
||||
template <typename T> friend void umtx_initOnce(UInitOnce&, T*, void (T::*)());
|
||||
friend void umtx_initOnce(UInitOnce&, void (*)());
|
||||
friend void umtx_initOnce(UInitOnce&, void (*)(UErrorCode&), UErrorCode&);
|
||||
template <typename T> friend void umtx_initOnce(UInitOnce&, void (*)(T), T);
|
||||
template <typename T> friend void umtx_initOnce(UInitOnce&, void (*)(T, UErrorCode&), T, UErrorCode&);
|
||||
|
||||
u_atomic_int32_t fState{0};
|
||||
UErrorCode fErrCode{U_ZERO_ERROR};
|
||||
|
||||
public:
|
||||
U_COMMON_API void reset() { fState = 0; }
|
||||
U_COMMON_API UBool isReset() { return umtx_loadAcquire(fState) == 0; }
|
||||
// Note: isReset() is used by service registration code.
|
||||
// Thread safety of this usage needs review.
|
||||
};
|
||||
@@ -216,24 +202,24 @@ template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UE
|
||||
* } // myMutex is released when lock goes out of scope.
|
||||
*/
|
||||
|
||||
class U_COMMON_API UMutex {
|
||||
class U_COMMON_API_CLASS UMutex {
|
||||
public:
|
||||
UMUTEX_CONSTEXPR UMutex() {}
|
||||
~UMutex() = default;
|
||||
U_COMMON_API UMUTEX_CONSTEXPR UMutex() {}
|
||||
U_COMMON_API ~UMutex() = default;
|
||||
|
||||
UMutex(const UMutex &other) = delete;
|
||||
UMutex &operator =(const UMutex &other) = delete;
|
||||
void *operator new(size_t) = delete;
|
||||
UMutex(const UMutex& other) = delete;
|
||||
UMutex& operator=(const UMutex& other) = delete;
|
||||
void* operator new(size_t) = delete;
|
||||
|
||||
// requirements for C++ BasicLockable, allows UMutex to work with std::lock_guard
|
||||
void lock() {
|
||||
U_COMMON_API void lock() {
|
||||
std::mutex *m = fMutex.load(std::memory_order_acquire);
|
||||
if (m == nullptr) { m = getMutex(); }
|
||||
m->lock();
|
||||
}
|
||||
void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
|
||||
U_COMMON_API void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); }
|
||||
|
||||
static void cleanup();
|
||||
U_COMMON_API static void cleanup();
|
||||
|
||||
private:
|
||||
alignas(std::mutex) char fStorage[sizeof(std::mutex)] {};
|
||||
|
||||
+56
-57
@@ -58,8 +58,6 @@ U_NAMESPACE_END
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class CharString;
|
||||
|
||||
/**
|
||||
* The BreakIterator class implements methods for finding the location
|
||||
* of boundaries in text. BreakIterator is an abstract base class.
|
||||
@@ -105,13 +103,13 @@ class CharString;
|
||||
* and in the sample program icu/source/samples/break/break.cpp
|
||||
*
|
||||
*/
|
||||
class U_COMMON_API BreakIterator : public UObject {
|
||||
class U_COMMON_API_CLASS BreakIterator : public UObject {
|
||||
public:
|
||||
/**
|
||||
* destructor
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual ~BreakIterator();
|
||||
U_COMMON_API virtual ~BreakIterator();
|
||||
|
||||
/**
|
||||
* Return true if another object is semantically equal to this
|
||||
@@ -126,7 +124,7 @@ public:
|
||||
* object, and styles are not considered.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual bool operator==(const BreakIterator&) const = 0;
|
||||
U_COMMON_API virtual bool operator==(const BreakIterator&) const = 0;
|
||||
|
||||
/**
|
||||
* Returns the complement of the result of operator==
|
||||
@@ -134,27 +132,27 @@ public:
|
||||
* @return the complement of the result of operator==
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
bool operator!=(const BreakIterator& rhs) const { return !operator==(rhs); }
|
||||
U_COMMON_API bool operator!=(const BreakIterator& rhs) const { return !operator==(rhs); }
|
||||
|
||||
/**
|
||||
* Return a polymorphic copy of this object. This is an abstract
|
||||
* method which subclasses implement.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual BreakIterator* clone() const = 0;
|
||||
U_COMMON_API virtual BreakIterator* clone() const = 0;
|
||||
|
||||
/**
|
||||
* Return a polymorphic class ID for this object. Different subclasses
|
||||
* will return distinct unequal values.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UClassID getDynamicClassID() const override = 0;
|
||||
U_COMMON_API virtual UClassID getDynamicClassID() const override = 0;
|
||||
|
||||
/**
|
||||
* Return a CharacterIterator over the text being analyzed.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual CharacterIterator& getText() const = 0;
|
||||
U_COMMON_API virtual CharacterIterator& getText() const = 0;
|
||||
|
||||
/**
|
||||
* Get a UText for the text being analyzed.
|
||||
@@ -170,7 +168,7 @@ public:
|
||||
* UText was provided, it will always be returned.
|
||||
* @stable ICU 3.4
|
||||
*/
|
||||
virtual UText *getUText(UText *fillIn, UErrorCode &status) const = 0;
|
||||
U_COMMON_API virtual UText* getUText(UText* fillIn, UErrorCode& status) const = 0;
|
||||
|
||||
/**
|
||||
* Change the text over which this operates. The text boundary is
|
||||
@@ -183,7 +181,7 @@ public:
|
||||
* @param text The UnicodeString used to change the text.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual void setText(const UnicodeString &text) = 0;
|
||||
U_COMMON_API virtual void setText(const UnicodeString& text) = 0;
|
||||
|
||||
/**
|
||||
* Reset the break iterator to operate over the text represented by
|
||||
@@ -203,7 +201,7 @@ public:
|
||||
* @param status receives any error codes.
|
||||
* @stable ICU 3.4
|
||||
*/
|
||||
virtual void setText(UText *text, UErrorCode &status) = 0;
|
||||
U_COMMON_API virtual void setText(UText* text, UErrorCode& status) = 0;
|
||||
|
||||
/**
|
||||
* Change the text over which this operates. The text boundary is
|
||||
@@ -213,7 +211,7 @@ public:
|
||||
* @param it The CharacterIterator used to change the text.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual void adoptText(CharacterIterator* it) = 0;
|
||||
U_COMMON_API virtual void adoptText(CharacterIterator* it) = 0;
|
||||
|
||||
enum {
|
||||
/**
|
||||
@@ -229,14 +227,14 @@ public:
|
||||
* @return The offset of the beginning of the text, zero.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t first() = 0;
|
||||
U_COMMON_API virtual int32_t first() = 0;
|
||||
|
||||
/**
|
||||
* Set the iterator position to the index immediately BEYOND the last character in the text being scanned.
|
||||
* @return The index immediately BEYOND the last character in the text being scanned.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t last() = 0;
|
||||
U_COMMON_API virtual int32_t last() = 0;
|
||||
|
||||
/**
|
||||
* Set the iterator position to the boundary preceding the current boundary.
|
||||
@@ -244,7 +242,7 @@ public:
|
||||
* boundaries have been returned.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t previous() = 0;
|
||||
U_COMMON_API virtual int32_t previous() = 0;
|
||||
|
||||
/**
|
||||
* Advance the iterator to the boundary following the current boundary.
|
||||
@@ -252,14 +250,14 @@ public:
|
||||
* boundaries have been returned.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t next() = 0;
|
||||
U_COMMON_API virtual int32_t next() = 0;
|
||||
|
||||
/**
|
||||
* Return character index of the current iterator position within the text.
|
||||
* @return The boundary most recently returned.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t current() const = 0;
|
||||
U_COMMON_API virtual int32_t current() const = 0;
|
||||
|
||||
/**
|
||||
* Advance the iterator to the first boundary following the specified offset.
|
||||
@@ -269,7 +267,7 @@ public:
|
||||
* @return The first boundary after the specified offset.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t following(int32_t offset) = 0;
|
||||
U_COMMON_API virtual int32_t following(int32_t offset) = 0;
|
||||
|
||||
/**
|
||||
* Set the iterator position to the first boundary preceding the specified offset.
|
||||
@@ -279,7 +277,7 @@ public:
|
||||
* @return The first boundary before the specified offset.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t preceding(int32_t offset) = 0;
|
||||
U_COMMON_API virtual int32_t preceding(int32_t offset) = 0;
|
||||
|
||||
/**
|
||||
* Return true if the specified position is a boundary position.
|
||||
@@ -289,7 +287,7 @@ public:
|
||||
* @return True if "offset" is a boundary position.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UBool isBoundary(int32_t offset) = 0;
|
||||
U_COMMON_API virtual UBool isBoundary(int32_t offset) = 0;
|
||||
|
||||
/**
|
||||
* Set the iterator position to the nth boundary from the current boundary
|
||||
@@ -300,9 +298,9 @@ public:
|
||||
* DONE if there are fewer than |n| boundaries in the specified direction.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t next(int32_t n) = 0;
|
||||
U_COMMON_API virtual int32_t next(int32_t n) = 0;
|
||||
|
||||
/**
|
||||
/**
|
||||
* For RuleBasedBreakIterators, return the status tag from the break rule
|
||||
* that determined the boundary at the current iteration position.
|
||||
* <p>
|
||||
@@ -315,7 +313,7 @@ public:
|
||||
* @see UWordBreak
|
||||
* @stable ICU 52
|
||||
*/
|
||||
virtual int32_t getRuleStatus() const;
|
||||
U_COMMON_API virtual int32_t getRuleStatus() const;
|
||||
|
||||
/**
|
||||
* For RuleBasedBreakIterators, get the status (tag) values from the break rule(s)
|
||||
@@ -345,7 +343,9 @@ public:
|
||||
* @see getRuleStatus
|
||||
* @stable ICU 52
|
||||
*/
|
||||
virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status);
|
||||
U_COMMON_API virtual int32_t getRuleStatusVec(int32_t* fillInVec,
|
||||
int32_t capacity,
|
||||
UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Create BreakIterator for word-breaks using the given locale.
|
||||
@@ -366,7 +366,7 @@ public:
|
||||
* The caller owns the returned object and is responsible for deleting it.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static BreakIterator* U_EXPORT2
|
||||
U_COMMON_API static BreakIterator* U_EXPORT2
|
||||
createWordInstance(const Locale& where, UErrorCode& status);
|
||||
|
||||
/**
|
||||
@@ -390,7 +390,7 @@ public:
|
||||
* The caller owns the returned object and is responsible for deleting it.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static BreakIterator* U_EXPORT2
|
||||
U_COMMON_API static BreakIterator* U_EXPORT2
|
||||
createLineInstance(const Locale& where, UErrorCode& status);
|
||||
|
||||
/**
|
||||
@@ -412,7 +412,7 @@ public:
|
||||
* The caller owns the returned object and is responsible for deleting it.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static BreakIterator* U_EXPORT2
|
||||
U_COMMON_API static BreakIterator* U_EXPORT2
|
||||
createCharacterInstance(const Locale& where, UErrorCode& status);
|
||||
|
||||
/**
|
||||
@@ -433,7 +433,7 @@ public:
|
||||
* The caller owns the returned object and is responsible for deleting it.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static BreakIterator* U_EXPORT2
|
||||
U_COMMON_API static BreakIterator* U_EXPORT2
|
||||
createSentenceInstance(const Locale& where, UErrorCode& status);
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
@@ -459,7 +459,7 @@ public:
|
||||
* The caller owns the returned object and is responsible for deleting it.
|
||||
* @deprecated ICU 64 Use createWordInstance instead.
|
||||
*/
|
||||
static BreakIterator* U_EXPORT2
|
||||
U_COMMON_API static BreakIterator* U_EXPORT2
|
||||
createTitleInstance(const Locale& where, UErrorCode& status);
|
||||
#endif /* U_HIDE_DEPRECATED_API */
|
||||
|
||||
@@ -472,7 +472,7 @@ public:
|
||||
* @return available locales
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
|
||||
U_COMMON_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
|
||||
|
||||
/**
|
||||
* Get name of the object for the desired Locale, in the desired language.
|
||||
@@ -483,9 +483,9 @@ public:
|
||||
* @return user-displayable name
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
|
||||
const Locale& displayLocale,
|
||||
UnicodeString& name);
|
||||
U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
|
||||
const Locale& displayLocale,
|
||||
UnicodeString& name);
|
||||
|
||||
/**
|
||||
* Get name of the object for the desired Locale, in the language of the
|
||||
@@ -495,8 +495,8 @@ public:
|
||||
* @return user-displayable name
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
|
||||
UnicodeString& name);
|
||||
U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale,
|
||||
UnicodeString& name);
|
||||
|
||||
#ifndef U_FORCE_HIDE_DEPRECATED_API
|
||||
/**
|
||||
@@ -518,9 +518,9 @@ public:
|
||||
*
|
||||
* @deprecated ICU 52. Use clone() instead.
|
||||
*/
|
||||
virtual BreakIterator * createBufferClone(void *stackBuffer,
|
||||
int32_t &BufferSize,
|
||||
UErrorCode &status) = 0;
|
||||
U_COMMON_API virtual BreakIterator* createBufferClone(void* stackBuffer,
|
||||
int32_t& BufferSize,
|
||||
UErrorCode& status) = 0;
|
||||
#endif // U_FORCE_HIDE_DEPRECATED_API
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
@@ -531,7 +531,7 @@ public:
|
||||
* must be closed by an explicit call to the destructor (not delete).
|
||||
* @deprecated ICU 52. Always delete the BreakIterator.
|
||||
*/
|
||||
inline UBool isBufferClone();
|
||||
U_COMMON_API inline UBool isBufferClone();
|
||||
|
||||
#endif /* U_HIDE_DEPRECATED_API */
|
||||
|
||||
@@ -551,10 +551,10 @@ public:
|
||||
* @return a registry key that can be used to unregister this instance
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
static URegistryKey U_EXPORT2 registerInstance(BreakIterator* toAdopt,
|
||||
const Locale& locale,
|
||||
UBreakIteratorType kind,
|
||||
UErrorCode& status);
|
||||
U_COMMON_API static URegistryKey U_EXPORT2 registerInstance(BreakIterator* toAdopt,
|
||||
const Locale& locale,
|
||||
UBreakIteratorType kind,
|
||||
UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Unregister a previously-registered BreakIterator using the key returned from the
|
||||
@@ -568,7 +568,7 @@ public:
|
||||
* @return true if the iterator for the key was successfully unregistered
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
|
||||
U_COMMON_API static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Return a StringEnumeration over the locales available at the time of the call,
|
||||
@@ -576,7 +576,7 @@ public:
|
||||
* @return a StringEnumeration over the locales available at the time of the call
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
static StringEnumeration* U_EXPORT2 getAvailableLocales();
|
||||
U_COMMON_API static StringEnumeration* U_EXPORT2 getAvailableLocales();
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -584,7 +584,7 @@ public:
|
||||
* actual locale.
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
U_COMMON_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/** Get the locale for this break iterator object. You can choose between valid and actual locale.
|
||||
@@ -593,7 +593,7 @@ public:
|
||||
* @return the locale
|
||||
* @internal
|
||||
*/
|
||||
const char *getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
U_COMMON_API const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
/**
|
||||
@@ -621,7 +621,7 @@ public:
|
||||
*
|
||||
* @stable ICU 49
|
||||
*/
|
||||
virtual BreakIterator &refreshInputText(UText *input, UErrorCode &status) = 0;
|
||||
U_COMMON_API virtual BreakIterator& refreshInputText(UText* input, UErrorCode& status) = 0;
|
||||
|
||||
private:
|
||||
static BreakIterator* buildInstance(const Locale& loc, const char *type, UErrorCode& status);
|
||||
@@ -635,22 +635,21 @@ protected:
|
||||
// Do not enclose protected default/copy constructors with #ifndef U_HIDE_INTERNAL_API
|
||||
// or else the compiler will create a public ones.
|
||||
/** @internal */
|
||||
BreakIterator();
|
||||
U_COMMON_API BreakIterator();
|
||||
/** @internal */
|
||||
BreakIterator (const BreakIterator &other);
|
||||
U_COMMON_API BreakIterator(const BreakIterator& other);
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/** @internal */
|
||||
BreakIterator (const Locale& valid, const Locale &actual);
|
||||
U_COMMON_API BreakIterator(const Locale& valid, const Locale& actual);
|
||||
/** @internal. Assignment Operator, used by RuleBasedBreakIterator. */
|
||||
BreakIterator &operator = (const BreakIterator &other);
|
||||
U_COMMON_API BreakIterator& operator=(const BreakIterator& other);
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
private:
|
||||
|
||||
/** @internal (private) */
|
||||
CharString* actualLocale = nullptr;
|
||||
CharString* validLocale = nullptr;
|
||||
CharString* requestLocale = nullptr;
|
||||
Locale actualLocale;
|
||||
Locale validLocale;
|
||||
Locale requestLocale;
|
||||
};
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
|
||||
+33
-2
@@ -41,6 +41,8 @@
|
||||
|
||||
#if U_SHOW_CPLUSPLUS_API
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include "unicode/uobject.h"
|
||||
#include "unicode/std_string.h"
|
||||
|
||||
@@ -258,13 +260,36 @@ private:
|
||||
CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete;
|
||||
};
|
||||
|
||||
namespace prv {
|
||||
/** @internal */
|
||||
template<typename StringClass, typename = void>
|
||||
struct value_type_or_char {
|
||||
/** @internal */
|
||||
using type = char;
|
||||
};
|
||||
/** @internal */
|
||||
template<typename StringClass>
|
||||
struct value_type_or_char<StringClass, std::void_t<typename StringClass::value_type>> {
|
||||
/** @internal */
|
||||
using type = typename StringClass::value_type;
|
||||
};
|
||||
/** @internal */
|
||||
template<typename StringClass>
|
||||
using value_type_or_char_t = typename value_type_or_char<StringClass>::type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of ByteSink that writes to a "string".
|
||||
* The StringClass is usually instantiated with a std::string.
|
||||
* The StringClass is usually instantiated with a std::string or a std::u8string.
|
||||
* StringClass must have public member functions reserve(integer type), capacity(), length(), and
|
||||
* append(value type, integer type) with the same semantics as those of std::basic_string, and must
|
||||
* have an 8-bit value type. If the value type is not char, it must be a public member type
|
||||
* StringClass::value_type.
|
||||
* @stable ICU 4.2
|
||||
*/
|
||||
template<typename StringClass>
|
||||
class StringByteSink : public ByteSink {
|
||||
using Unit = typename prv::value_type_or_char_t<StringClass>;
|
||||
public:
|
||||
/**
|
||||
* Constructs a ByteSink that will append bytes to the dest string.
|
||||
@@ -291,7 +316,13 @@ class StringByteSink : public ByteSink {
|
||||
* @param n the number of bytes; must be non-negative
|
||||
* @stable ICU 4.2
|
||||
*/
|
||||
virtual void Append(const char* data, int32_t n) override { dest_->append(data, n); }
|
||||
virtual void Append(const char* data, int32_t n) override {
|
||||
if constexpr (std::is_same_v<Unit, char>) {
|
||||
dest_->append(data, n);
|
||||
} else {
|
||||
dest_->append(reinterpret_cast<const Unit*>(data), n);
|
||||
}
|
||||
}
|
||||
private:
|
||||
StringClass* dest_;
|
||||
|
||||
|
||||
@@ -150,9 +150,6 @@ private:
|
||||
virtual int32_t getMinLinearMatch() const override { return BytesTrie::kMinLinearMatch; }
|
||||
virtual int32_t getMaxLinearMatchLength() const override { return BytesTrie::kMaxLinearMatchLength; }
|
||||
|
||||
/**
|
||||
* @internal (private)
|
||||
*/
|
||||
class BTLinearMatchNode : public LinearMatchNode {
|
||||
public:
|
||||
BTLinearMatchNode(const char *units, int32_t len, Node *nextNode);
|
||||
|
||||
@@ -156,13 +156,11 @@ private:
|
||||
|
||||
/**
|
||||
* Copy constructor. Private for now.
|
||||
* @internal (private)
|
||||
*/
|
||||
CanonicalIterator(const CanonicalIterator& other) = delete;
|
||||
|
||||
/**
|
||||
* Assignment operator. Private for now.
|
||||
* @internal (private)
|
||||
*/
|
||||
CanonicalIterator& operator=(const CanonicalIterator& other) = delete;
|
||||
|
||||
|
||||
+4
-2
@@ -75,7 +75,8 @@
|
||||
* <tr>
|
||||
* <td>Strings and Character Iteration</td>
|
||||
* <td>ustring.h, utf8.h, utf16.h, icu::StringPiece, UText, UCharIterator, icu::ByteSink</td>
|
||||
* <td>icu::UnicodeString, icu::CharacterIterator, icu::Appendable, icu::StringPiece,icu::ByteSink</td>
|
||||
* <td>icu::UnicodeString, utfiterator.h (ICU 78+), icu::CharacterIterator, icu::Appendable,<br>
|
||||
* icu::StringPiece, icu::ByteSink</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Unicode Character<br/>Properties and Names</td>
|
||||
@@ -160,7 +161,8 @@
|
||||
* <tr>
|
||||
* <td>Number Formatting<br/>(includes currency and unit formatting)</td>
|
||||
* <td>unumberformatter.h, unum.h, usimplenumberformatter.h</td>
|
||||
* <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)<br>icu::number::SimpleNumberFormatter (ICU 73+)</td>
|
||||
* <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)<br>
|
||||
* icu::number::SimpleNumberFormatter (ICU 73+)</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Number Range Formatting<br />(includes currency and unit ranges)</td>
|
||||
|
||||
+2
-2
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
class CharString;
|
||||
class FixedString;
|
||||
|
||||
/**
|
||||
* <code>LocaleBuilder</code> is used to build instances of <code>Locale</code>
|
||||
@@ -297,7 +297,7 @@ private:
|
||||
char language_[9];
|
||||
char script_[5];
|
||||
char region_[4];
|
||||
CharString *variant_; // Pointer not object so we need not #include internal charstr.h.
|
||||
FixedString *variant_; // Pointer not object so we need not #include internal fixedstring.h.
|
||||
icu::Locale *extensions_; // Pointer not object. Storage for all other fields.
|
||||
|
||||
};
|
||||
|
||||
@@ -70,9 +70,7 @@ public:
|
||||
// No heap allocation. Use only on the stack.
|
||||
static void* U_EXPORT2 operator new(size_t) = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) = delete;
|
||||
#if U_HAVE_PLACEMENT_NEW
|
||||
static void* U_EXPORT2 operator new(size_t, void*) = delete;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Constructor takes ownership.
|
||||
|
||||
+246
-138
@@ -35,6 +35,9 @@
|
||||
|
||||
#if U_SHOW_CPLUSPLUS_API
|
||||
|
||||
#include <cstdint>
|
||||
#include <string_view>
|
||||
|
||||
#include "unicode/bytestream.h"
|
||||
#include "unicode/localpointer.h"
|
||||
#include "unicode/strenum.h"
|
||||
@@ -192,53 +195,53 @@ class UnicodeString;
|
||||
* @stable ICU 2.0
|
||||
* @see ResourceBundle
|
||||
*/
|
||||
class U_COMMON_API Locale : public UObject {
|
||||
class U_COMMON_API_CLASS Locale : public UObject {
|
||||
public:
|
||||
/** Useful constant for the Root locale. @stable ICU 4.4 */
|
||||
static const Locale& U_EXPORT2 getRoot();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getRoot();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getEnglish();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getEnglish();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getFrench();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getFrench();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getGerman();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getGerman();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getItalian();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getItalian();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getJapanese();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getJapanese();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getKorean();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getKorean();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getChinese();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getChinese();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getSimplifiedChinese();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getSimplifiedChinese();
|
||||
/** Useful constant for this language. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getTraditionalChinese();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getTraditionalChinese();
|
||||
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getFrance();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getFrance();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getGermany();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getGermany();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getItaly();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getItaly();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getJapan();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getJapan();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getKorea();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getKorea();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getChina();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getChina();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getPRC();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getPRC();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getTaiwan();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getTaiwan();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getUK();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getUK();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getUS();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getUS();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getCanada();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getCanada();
|
||||
/** Useful constant for this country/region. @stable ICU 2.0 */
|
||||
static const Locale& U_EXPORT2 getCanadaFrench();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getCanadaFrench();
|
||||
|
||||
/**
|
||||
* Construct a default locale object, a Locale for the default locale ID.
|
||||
@@ -247,7 +250,7 @@ public:
|
||||
* @see uloc_getDefault
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
Locale();
|
||||
U_COMMON_API Locale();
|
||||
|
||||
/**
|
||||
* Construct a locale from language, country, variant.
|
||||
@@ -273,10 +276,10 @@ public:
|
||||
* @see uloc_getDefault
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
Locale(const char* language,
|
||||
const char* country = nullptr,
|
||||
const char* variant = nullptr,
|
||||
const char* keywordsAndValues = nullptr);
|
||||
U_COMMON_API Locale(const char* language,
|
||||
const char* country = nullptr,
|
||||
const char* variant = nullptr,
|
||||
const char* keywordsAndValues = nullptr);
|
||||
|
||||
/**
|
||||
* Initializes a Locale object from another Locale object.
|
||||
@@ -284,7 +287,7 @@ public:
|
||||
* @param other The Locale object being copied in.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
Locale(const Locale& other);
|
||||
U_COMMON_API Locale(const Locale& other);
|
||||
|
||||
/**
|
||||
* Move constructor; might leave source in bogus state.
|
||||
@@ -293,13 +296,13 @@ public:
|
||||
* @param other The Locale object being moved in.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
Locale(Locale&& other) noexcept;
|
||||
U_COMMON_API Locale(Locale&& other) noexcept;
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual ~Locale() ;
|
||||
U_COMMON_API virtual ~Locale();
|
||||
|
||||
/**
|
||||
* Replaces the entire contents of *this with the specified value.
|
||||
@@ -308,7 +311,7 @@ public:
|
||||
* @return *this
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
Locale& operator=(const Locale& other);
|
||||
U_COMMON_API Locale& operator=(const Locale& other);
|
||||
|
||||
/**
|
||||
* Move assignment operator; might leave source in bogus state.
|
||||
@@ -319,7 +322,7 @@ public:
|
||||
* @return *this
|
||||
* @stable ICU 63
|
||||
*/
|
||||
Locale& operator=(Locale&& other) noexcept;
|
||||
U_COMMON_API Locale& operator=(Locale&& other) noexcept;
|
||||
|
||||
/**
|
||||
* Checks if two locale keys are the same.
|
||||
@@ -328,7 +331,7 @@ public:
|
||||
* @return true if the two locale keys are the same, false otherwise.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
bool operator==(const Locale& other) const;
|
||||
U_COMMON_API bool operator==(const Locale& other) const;
|
||||
|
||||
/**
|
||||
* Checks if two locale keys are not the same.
|
||||
@@ -338,7 +341,7 @@ public:
|
||||
* otherwise.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
inline bool operator!=(const Locale& other) const;
|
||||
U_COMMON_API inline bool operator!=(const Locale& other) const;
|
||||
|
||||
/**
|
||||
* Clone this object.
|
||||
@@ -351,7 +354,7 @@ public:
|
||||
* @see getDynamicClassID
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
Locale *clone() const;
|
||||
U_COMMON_API Locale* clone() const;
|
||||
|
||||
#ifndef U_HIDE_SYSTEM_API
|
||||
/**
|
||||
@@ -369,7 +372,7 @@ public:
|
||||
* @system
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static const Locale& U_EXPORT2 getDefault();
|
||||
U_COMMON_API static const Locale& U_EXPORT2 getDefault();
|
||||
|
||||
/**
|
||||
* Sets the default. Normally set once at the beginning of a process,
|
||||
@@ -383,8 +386,7 @@ public:
|
||||
* @system
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static void U_EXPORT2 setDefault(const Locale& newLocale,
|
||||
UErrorCode& success);
|
||||
U_COMMON_API static void U_EXPORT2 setDefault(const Locale& newLocale, UErrorCode& success);
|
||||
#endif /* U_HIDE_SYSTEM_API */
|
||||
|
||||
/**
|
||||
@@ -408,7 +410,7 @@ public:
|
||||
* @return the Locale for the specified BCP47 language tag.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status);
|
||||
U_COMMON_API static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Returns a well-formed language tag for this Locale.
|
||||
@@ -423,7 +425,7 @@ public:
|
||||
* @param status error information if creating the language tag failed.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void toLanguageTag(ByteSink& sink, UErrorCode& status) const;
|
||||
U_COMMON_API void toLanguageTag(ByteSink& sink, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Returns a well-formed language tag for this Locale.
|
||||
@@ -447,11 +449,11 @@ public:
|
||||
* @stable ICU 2.0
|
||||
* @see uloc_getName
|
||||
*/
|
||||
static Locale U_EXPORT2 createFromName(const char *name);
|
||||
U_COMMON_API static Locale U_EXPORT2 createFromName(const char* name);
|
||||
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/** @internal */
|
||||
static Locale U_EXPORT2 createFromName(StringPiece name);
|
||||
U_COMMON_API static Locale U_EXPORT2 createFromName(StringPiece name);
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
/**
|
||||
@@ -462,14 +464,14 @@ public:
|
||||
* @stable ICU 3.0
|
||||
* @see uloc_canonicalize
|
||||
*/
|
||||
static Locale U_EXPORT2 createCanonical(const char* name);
|
||||
U_COMMON_API static Locale U_EXPORT2 createCanonical(const char* name);
|
||||
|
||||
/**
|
||||
* Returns the locale's ISO-639 language code.
|
||||
* @return An alias to the code
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
inline const char * getLanguage( ) const;
|
||||
U_COMMON_API const char* getLanguage() const;
|
||||
|
||||
/**
|
||||
* Returns the locale's ISO-15924 abbreviation script code.
|
||||
@@ -478,21 +480,21 @@ public:
|
||||
* @see uscript_getCode
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
inline const char * getScript( ) const;
|
||||
U_COMMON_API const char* getScript() const;
|
||||
|
||||
/**
|
||||
* Returns the locale's ISO-3166 country code.
|
||||
* @return An alias to the code
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
inline const char * getCountry( ) const;
|
||||
U_COMMON_API const char* getCountry() const;
|
||||
|
||||
/**
|
||||
* Returns the locale's variant code.
|
||||
* @return An alias to the code
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
inline const char * getVariant( ) const;
|
||||
U_COMMON_API const char* getVariant() const;
|
||||
|
||||
/**
|
||||
* Returns the programmatic name of the entire locale, with the language,
|
||||
@@ -502,7 +504,7 @@ public:
|
||||
* @return A pointer to "name".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
inline const char * getName() const;
|
||||
U_COMMON_API const char* getName() const;
|
||||
|
||||
/**
|
||||
* Returns the programmatic name of the entire locale as getName() would return,
|
||||
@@ -511,7 +513,7 @@ public:
|
||||
* @see getName
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
const char * getBaseName() const;
|
||||
U_COMMON_API const char* getBaseName() const;
|
||||
|
||||
/**
|
||||
* Add the likely subtags for this Locale, per the algorithm described
|
||||
@@ -542,7 +544,7 @@ public:
|
||||
* U_ILLEGAL_ARGUMENT_ERROR.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void addLikelySubtags(UErrorCode& status);
|
||||
U_COMMON_API void addLikelySubtags(UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Minimize the subtags for this Locale, per the algorithm described
|
||||
@@ -573,7 +575,7 @@ public:
|
||||
* U_ILLEGAL_ARGUMENT_ERROR.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void minimizeSubtags(UErrorCode& status);
|
||||
U_COMMON_API void minimizeSubtags(UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Canonicalize the locale ID of this object according to CLDR.
|
||||
@@ -581,7 +583,7 @@ public:
|
||||
* @stable ICU 67
|
||||
* @see createCanonical
|
||||
*/
|
||||
void canonicalize(UErrorCode& status);
|
||||
U_COMMON_API void canonicalize(UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Gets the list of keywords for the specified locale.
|
||||
@@ -592,7 +594,7 @@ public:
|
||||
* @see getKeywords
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
StringEnumeration * createKeywords(UErrorCode &status) const;
|
||||
U_COMMON_API StringEnumeration* createKeywords(UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Gets the list of Unicode keywords for the specified locale.
|
||||
@@ -603,7 +605,7 @@ public:
|
||||
* @see getUnicodeKeywords
|
||||
* @stable ICU 63
|
||||
*/
|
||||
StringEnumeration * createUnicodeKeywords(UErrorCode &status) const;
|
||||
U_COMMON_API StringEnumeration* createUnicodeKeywords(UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Gets the set of keywords for this Locale.
|
||||
@@ -649,7 +651,10 @@ public:
|
||||
*
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const;
|
||||
U_COMMON_API int32_t getKeywordValue(const char* keywordName,
|
||||
char* buffer,
|
||||
int32_t bufferCapacity,
|
||||
UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Gets the value for a keyword.
|
||||
@@ -664,7 +669,7 @@ public:
|
||||
* @param status error information if getting the value failed.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
|
||||
U_COMMON_API void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Gets the value for a keyword.
|
||||
@@ -695,7 +700,9 @@ public:
|
||||
* @param status error information if getting the value failed.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void getUnicodeKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
|
||||
U_COMMON_API void getUnicodeKeywordValue(StringPiece keywordName,
|
||||
ByteSink& sink,
|
||||
UErrorCode& status) const;
|
||||
|
||||
/**
|
||||
* Gets the Unicode value for a Unicode keyword.
|
||||
@@ -732,7 +739,9 @@ public:
|
||||
*
|
||||
* @stable ICU 49
|
||||
*/
|
||||
void setKeywordValue(const char* keywordName, const char* keywordValue, UErrorCode &status) {
|
||||
U_COMMON_API void setKeywordValue(const char* keywordName,
|
||||
const char* keywordValue,
|
||||
UErrorCode& status) {
|
||||
setKeywordValue(StringPiece{keywordName}, StringPiece{keywordValue}, status);
|
||||
}
|
||||
|
||||
@@ -754,7 +763,9 @@ public:
|
||||
* @param status Returns any error information while performing this operation.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void setKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status);
|
||||
U_COMMON_API void setKeywordValue(StringPiece keywordName,
|
||||
StringPiece keywordValue,
|
||||
UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Sets or removes the Unicode value for a Unicode keyword.
|
||||
@@ -774,7 +785,9 @@ public:
|
||||
* @param status Returns any error information while performing this operation.
|
||||
* @stable ICU 63
|
||||
*/
|
||||
void setUnicodeKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status);
|
||||
U_COMMON_API void setUnicodeKeywordValue(StringPiece keywordName,
|
||||
StringPiece keywordValue,
|
||||
UErrorCode& status);
|
||||
|
||||
/**
|
||||
* returns the locale's three-letter language code, as specified
|
||||
@@ -782,14 +795,14 @@ public:
|
||||
* @return An alias to the code, or an empty string
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
const char * getISO3Language() const;
|
||||
U_COMMON_API const char* getISO3Language() const;
|
||||
|
||||
/**
|
||||
* Fills in "name" with the locale's three-letter ISO-3166 country code.
|
||||
* @return An alias to the code, or an empty string
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
const char * getISO3Country() const;
|
||||
U_COMMON_API const char* getISO3Country() const;
|
||||
|
||||
/**
|
||||
* Returns the Windows LCID value corresponding to this locale.
|
||||
@@ -798,7 +811,7 @@ public:
|
||||
* there is no Windows LCID value that corresponds to this locale, returns 0.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
uint32_t getLCID() const;
|
||||
U_COMMON_API uint32_t getLCID() const;
|
||||
|
||||
/**
|
||||
* Returns whether this locale's script is written right-to-left.
|
||||
@@ -813,7 +826,7 @@ public:
|
||||
* @return true if the locale's script is written right-to-left
|
||||
* @stable ICU 54
|
||||
*/
|
||||
UBool isRightToLeft() const;
|
||||
U_COMMON_API UBool isRightToLeft() const;
|
||||
|
||||
/**
|
||||
* Fills in "dispLang" with the name of this locale's language in a format suitable for
|
||||
@@ -824,7 +837,7 @@ public:
|
||||
* @return A reference to "dispLang".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const;
|
||||
U_COMMON_API UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispLang" with the name of this locale's language in a format suitable for
|
||||
@@ -839,8 +852,8 @@ public:
|
||||
* @return A reference to "dispLang".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayLanguage( const Locale& displayLocale,
|
||||
UnicodeString& dispLang) const;
|
||||
U_COMMON_API UnicodeString& getDisplayLanguage(const Locale& displayLocale,
|
||||
UnicodeString& dispLang) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispScript" with the name of this locale's script in a format suitable
|
||||
@@ -851,7 +864,7 @@ public:
|
||||
* @return A reference to "dispScript".
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
UnicodeString& getDisplayScript( UnicodeString& dispScript) const;
|
||||
U_COMMON_API UnicodeString& getDisplayScript(UnicodeString& dispScript) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispScript" with the name of this locale's country in a format suitable
|
||||
@@ -867,8 +880,8 @@ public:
|
||||
* @return A reference to "dispScript".
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
UnicodeString& getDisplayScript( const Locale& displayLocale,
|
||||
UnicodeString& dispScript) const;
|
||||
U_COMMON_API UnicodeString& getDisplayScript(const Locale& displayLocale,
|
||||
UnicodeString& dispScript) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispCountry" with the name of this locale's country in a format suitable
|
||||
@@ -879,7 +892,7 @@ public:
|
||||
* @return A reference to "dispCountry".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayCountry( UnicodeString& dispCountry) const;
|
||||
U_COMMON_API UnicodeString& getDisplayCountry(UnicodeString& dispCountry) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispCountry" with the name of this locale's country in a format suitable
|
||||
@@ -895,8 +908,8 @@ public:
|
||||
* @return A reference to "dispCountry".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayCountry( const Locale& displayLocale,
|
||||
UnicodeString& dispCountry) const;
|
||||
U_COMMON_API UnicodeString& getDisplayCountry(const Locale& displayLocale,
|
||||
UnicodeString& dispCountry) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispVar" with the name of this locale's variant code in a format suitable
|
||||
@@ -905,7 +918,7 @@ public:
|
||||
* @return A reference to "dispVar".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayVariant( UnicodeString& dispVar) const;
|
||||
U_COMMON_API UnicodeString& getDisplayVariant(UnicodeString& dispVar) const;
|
||||
|
||||
/**
|
||||
* Fills in "dispVar" with the name of this locale's variant code in a format
|
||||
@@ -915,8 +928,8 @@ public:
|
||||
* @return A reference to "dispVar".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayVariant( const Locale& displayLocale,
|
||||
UnicodeString& dispVar) const;
|
||||
U_COMMON_API UnicodeString& getDisplayVariant(const Locale& displayLocale,
|
||||
UnicodeString& dispVar) const;
|
||||
|
||||
/**
|
||||
* Fills in "name" with the name of this locale in a format suitable for user display
|
||||
@@ -929,7 +942,7 @@ public:
|
||||
* @return A reference to "name".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayName( UnicodeString& name) const;
|
||||
U_COMMON_API UnicodeString& getDisplayName(UnicodeString& name) const;
|
||||
|
||||
/**
|
||||
* Fills in "name" with the name of this locale in a format suitable for user display
|
||||
@@ -943,14 +956,13 @@ public:
|
||||
* @return A reference to "name".
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
UnicodeString& getDisplayName( const Locale& displayLocale,
|
||||
UnicodeString& name) const;
|
||||
U_COMMON_API UnicodeString& getDisplayName(const Locale& displayLocale, UnicodeString& name) const;
|
||||
|
||||
/**
|
||||
* Generates a hash code for the locale.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
int32_t hashCode() const;
|
||||
U_COMMON_API int32_t hashCode() const;
|
||||
|
||||
/**
|
||||
* Sets the locale to bogus
|
||||
@@ -960,14 +972,14 @@ public:
|
||||
* instantiated from a locale and from a rule set).
|
||||
* @stable ICU 2.1
|
||||
*/
|
||||
void setToBogus();
|
||||
U_COMMON_API void setToBogus();
|
||||
|
||||
/**
|
||||
* Gets the bogus state. Locale object can be bogus if it doesn't exist
|
||||
* @return false if it is a real locale, true if it is a bogus locale
|
||||
* @stable ICU 2.1
|
||||
*/
|
||||
inline UBool isBogus() const;
|
||||
U_COMMON_API inline UBool isBogus() const;
|
||||
|
||||
/**
|
||||
* Returns a list of all installed locales.
|
||||
@@ -977,7 +989,7 @@ public:
|
||||
* get ownership of this list, and must NOT delete it.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
|
||||
U_COMMON_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
|
||||
|
||||
/**
|
||||
* Gets a list of all available 2-letter country codes defined in ISO 3166. This is a
|
||||
@@ -987,7 +999,7 @@ public:
|
||||
* @return a list of all available country codes
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static const char* const* U_EXPORT2 getISOCountries();
|
||||
U_COMMON_API static const char* const* U_EXPORT2 getISOCountries();
|
||||
|
||||
/**
|
||||
* Returns a list of all unique language codes defined in ISO 639.
|
||||
@@ -1000,21 +1012,21 @@ public:
|
||||
* @return a list of all available language codes
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
static const char* const* U_EXPORT2 getISOLanguages();
|
||||
U_COMMON_API static const char* const* U_EXPORT2 getISOLanguages();
|
||||
|
||||
/**
|
||||
* ICU "poor man's RTTI", returns a UClassID for this class.
|
||||
*
|
||||
* @stable ICU 2.2
|
||||
*/
|
||||
static UClassID U_EXPORT2 getStaticClassID();
|
||||
U_COMMON_API static UClassID U_EXPORT2 getStaticClassID();
|
||||
|
||||
/**
|
||||
* ICU "poor man's RTTI", returns a UClassID for the actual class.
|
||||
*
|
||||
* @stable ICU 2.2
|
||||
*/
|
||||
virtual UClassID getDynamicClassID() const override;
|
||||
U_COMMON_API virtual UClassID getDynamicClassID() const override;
|
||||
|
||||
/**
|
||||
* A Locale iterator interface similar to a Java Iterator<Locale>.
|
||||
@@ -1118,7 +1130,7 @@ protected: /* only protected for testing purposes. DO NOT USE. */
|
||||
* Set this from a single POSIX style locale string.
|
||||
* @internal
|
||||
*/
|
||||
void setFromPOSIXID(const char *posixID);
|
||||
U_COMMON_API void setFromPOSIXID(const char* posixID);
|
||||
/**
|
||||
* Minimize the subtags for this Locale, per the algorithm described
|
||||
* @param favorScript favor to keep script if true, to keep region if false.
|
||||
@@ -1127,7 +1139,7 @@ protected: /* only protected for testing purposes. DO NOT USE. */
|
||||
* U_ILLEGAL_ARGUMENT_ERROR.
|
||||
* @internal
|
||||
*/
|
||||
void minimizeSubtags(bool favorScript, UErrorCode& status);
|
||||
U_COMMON_API void minimizeSubtags(bool favorScript, UErrorCode& status);
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
private:
|
||||
@@ -1139,7 +1151,6 @@ private:
|
||||
* @param canonicalize whether to call uloc_canonicalize on cLocaleID
|
||||
*/
|
||||
Locale& init(const char* localeID, UBool canonicalize);
|
||||
/** @internal */
|
||||
Locale& init(StringPiece localeID, UBool canonicalize);
|
||||
|
||||
/*
|
||||
@@ -1147,8 +1158,10 @@ private:
|
||||
* NO side effects. (Default constructor tries to get
|
||||
* the default locale.)
|
||||
*/
|
||||
enum ELocaleType {
|
||||
eBOGUS
|
||||
enum ELocaleType : uint8_t {
|
||||
eBOGUS,
|
||||
eNEST,
|
||||
eHEAP,
|
||||
};
|
||||
Locale(ELocaleType);
|
||||
|
||||
@@ -1157,33 +1170,158 @@ private:
|
||||
*/
|
||||
static Locale* getLocaleCache();
|
||||
|
||||
char language[ULOC_LANG_CAPACITY];
|
||||
char script[ULOC_SCRIPT_CAPACITY];
|
||||
char country[ULOC_COUNTRY_CAPACITY];
|
||||
int32_t variantBegin;
|
||||
char* fullName;
|
||||
char fullNameBuffer[ULOC_FULLNAME_CAPACITY];
|
||||
// name without keywords
|
||||
char* baseName;
|
||||
void initBaseName(UErrorCode& status);
|
||||
union Payload;
|
||||
struct Nest;
|
||||
struct Heap;
|
||||
|
||||
UBool fIsBogus;
|
||||
/**
|
||||
* Locale data that can be nested directly within the union Payload object.
|
||||
*/
|
||||
struct Nest {
|
||||
static constexpr size_t SIZE = 32;
|
||||
|
||||
ELocaleType type = eNEST;
|
||||
char language[4];
|
||||
char script[5];
|
||||
char region[4];
|
||||
uint8_t variantBegin;
|
||||
char baseName[SIZE -
|
||||
sizeof type -
|
||||
sizeof language -
|
||||
sizeof script -
|
||||
sizeof region -
|
||||
sizeof variantBegin];
|
||||
|
||||
const char* getLanguage() const { return language; }
|
||||
const char* getScript() const { return script; }
|
||||
const char* getRegion() const { return region; }
|
||||
const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; }
|
||||
const char* getBaseName() const { return baseName; }
|
||||
|
||||
// Doesn't inherit from UMemory, shouldn't be heap allocated.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
|
||||
Nest() : language{'\0'}, script{'\0'}, region{'\0'}, variantBegin{0}, baseName{'\0'} {}
|
||||
|
||||
void init(std::string_view language,
|
||||
std::string_view script,
|
||||
std::string_view region,
|
||||
uint8_t variantBegin);
|
||||
|
||||
static bool fits(int32_t length,
|
||||
std::string_view language,
|
||||
std::string_view script,
|
||||
std::string_view region) {
|
||||
return length < static_cast<int32_t>(sizeof Nest::baseName) &&
|
||||
language.size() < sizeof Nest::language &&
|
||||
script.size() < sizeof Nest::script &&
|
||||
region.size() < sizeof Nest::region;
|
||||
}
|
||||
|
||||
private:
|
||||
friend union Payload;
|
||||
Nest(Heap&& heap, uint8_t variantBegin);
|
||||
};
|
||||
static_assert(sizeof(Nest) == Nest::SIZE);
|
||||
|
||||
/**
|
||||
* Locale data that needs to be heap allocated in the union Payload object.
|
||||
*/
|
||||
struct Heap {
|
||||
struct Alloc;
|
||||
|
||||
ELocaleType type;
|
||||
char language[ULOC_LANG_CAPACITY];
|
||||
char script[ULOC_SCRIPT_CAPACITY];
|
||||
char region[ULOC_COUNTRY_CAPACITY];
|
||||
Alloc* ptr;
|
||||
|
||||
const char* getLanguage() const { return language; }
|
||||
const char* getScript() const { return script; }
|
||||
const char* getRegion() const { return region; }
|
||||
const char* getVariant() const;
|
||||
const char* getFullName() const;
|
||||
const char* getBaseName() const;
|
||||
|
||||
// Doesn't inherit from UMemory, shouldn't be heap allocated.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
|
||||
Heap(std::string_view language,
|
||||
std::string_view script,
|
||||
std::string_view region,
|
||||
int32_t variantBegin);
|
||||
~Heap();
|
||||
|
||||
Heap& operator=(const Heap& other);
|
||||
Heap& operator=(Heap&& other) noexcept;
|
||||
};
|
||||
static_assert(sizeof(Heap) <= sizeof(Nest));
|
||||
|
||||
/**
|
||||
* This is kind of std::variant but customized to not waste any space on the
|
||||
* discriminator or on any padding, and to copy any heap allocated object.
|
||||
*/
|
||||
union Payload {
|
||||
private:
|
||||
Nest nest;
|
||||
Heap heap;
|
||||
ELocaleType type;
|
||||
|
||||
void copy(const Payload& other);
|
||||
void move(Payload&& other) noexcept;
|
||||
|
||||
public:
|
||||
// Doesn't inherit from UMemory, shouldn't be heap allocated.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
|
||||
Payload() : type{eBOGUS} {}
|
||||
~Payload();
|
||||
|
||||
Payload(const Payload& other);
|
||||
Payload(Payload&& other) noexcept;
|
||||
|
||||
Payload& operator=(const Payload& other);
|
||||
Payload& operator=(Payload&& other) noexcept;
|
||||
|
||||
void setToBogus();
|
||||
bool isBogus() const { return type == eBOGUS; }
|
||||
|
||||
template <typename T, typename... Args> T& emplace(Args&&... args);
|
||||
|
||||
template <typename T> T* get();
|
||||
|
||||
template <typename BogusFn, typename NestFn, typename HeapFn, typename... Args>
|
||||
auto visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const;
|
||||
} payload;
|
||||
|
||||
/**
|
||||
* Call a field getter function on either Nest or Heap in payload.
|
||||
* (This is kind of std::visit but simpler and without exceptions.)
|
||||
*
|
||||
* @tparam NEST Pointer to the Nest getter function.
|
||||
* @tparam HEAP Pointer to the Heap getter function.
|
||||
* @return the result from the getter, or the empty string if isBogus().
|
||||
*/
|
||||
template <const char* (Nest::*const NEST)() const,
|
||||
const char* (Heap::*const HEAP)() const>
|
||||
const char* getField() const;
|
||||
|
||||
static const Locale &getLocale(int locid);
|
||||
|
||||
/**
|
||||
* A friend to allow the default locale to be set by either the C or C++ API.
|
||||
* @internal (private)
|
||||
*/
|
||||
friend Locale *locale_set_default_internal(const char *, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* @internal (private)
|
||||
*/
|
||||
friend void U_CALLCONV locale_available_init();
|
||||
};
|
||||
|
||||
inline bool
|
||||
U_COMMON_API inline bool
|
||||
Locale::operator!=(const Locale& other) const
|
||||
{
|
||||
return !operator==(other);
|
||||
@@ -1199,36 +1337,6 @@ Locale::toLanguageTag(UErrorCode& status) const
|
||||
return result;
|
||||
}
|
||||
|
||||
inline const char *
|
||||
Locale::getCountry() const
|
||||
{
|
||||
return country;
|
||||
}
|
||||
|
||||
inline const char *
|
||||
Locale::getLanguage() const
|
||||
{
|
||||
return language;
|
||||
}
|
||||
|
||||
inline const char *
|
||||
Locale::getScript() const
|
||||
{
|
||||
return script;
|
||||
}
|
||||
|
||||
inline const char *
|
||||
Locale::getVariant() const
|
||||
{
|
||||
return fIsBogus ? "" : &baseName[variantBegin];
|
||||
}
|
||||
|
||||
inline const char *
|
||||
Locale::getName() const
|
||||
{
|
||||
return fullName;
|
||||
}
|
||||
|
||||
template<typename StringClass, typename OutputIterator> inline void
|
||||
Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const
|
||||
{
|
||||
@@ -1285,9 +1393,9 @@ Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) cons
|
||||
return result;
|
||||
}
|
||||
|
||||
inline UBool
|
||||
U_COMMON_API inline UBool
|
||||
Locale::isBogus() const {
|
||||
return fIsBogus;
|
||||
return payload.isBogus();
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
+8
-17
@@ -368,19 +368,6 @@
|
||||
# define U_IS_BIG_ENDIAN 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \def U_HAVE_PLACEMENT_NEW
|
||||
* Determines whether to override placement new and delete for STL.
|
||||
* @stable ICU 2.6
|
||||
*/
|
||||
#ifdef U_HAVE_PLACEMENT_NEW
|
||||
/* Use the predefined value. */
|
||||
#elif defined(__BORLANDC__)
|
||||
# define U_HAVE_PLACEMENT_NEW 0
|
||||
#else
|
||||
# define U_HAVE_PLACEMENT_NEW 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \def U_HAVE_DEBUG_LOCATION_NEW
|
||||
* Define this to define the MFC debug version of the operator new.
|
||||
@@ -479,6 +466,12 @@
|
||||
/* Otherwise use the predefined value. */
|
||||
#elif !defined(__cplusplus)
|
||||
# define U_CPLUSPLUS_VERSION 0
|
||||
// The value of _MSVC_LANG for C++23 preview is undocumented, except that it is larger than 202002.
|
||||
// As of this writing, it is 202004.
|
||||
#elif __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L)
|
||||
# define U_CPLUSPLUS_VERSION 23
|
||||
#elif __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
|
||||
# define U_CPLUSPLUS_VERSION 20
|
||||
#elif __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
||||
# define U_CPLUSPLUS_VERSION 17
|
||||
#elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
|
||||
@@ -493,12 +486,10 @@
|
||||
/**
|
||||
* \def U_FALLTHROUGH
|
||||
* Annotate intentional fall-through between switch labels.
|
||||
* http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
|
||||
* https://clang.llvm.org/docs/AttributeReference.html#fallthrough
|
||||
* @internal
|
||||
*/
|
||||
#ifndef __cplusplus
|
||||
// Not for C.
|
||||
#elif defined(U_FALLTHROUGH)
|
||||
#if defined(U_FALLTHROUGH)
|
||||
// Use the predefined value.
|
||||
#elif defined(__clang__)
|
||||
// Test for compiler vs. feature separately.
|
||||
|
||||
-13
@@ -122,7 +122,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator {
|
||||
private:
|
||||
/**
|
||||
* The UText through which this BreakIterator accesses the text
|
||||
* @internal (private)
|
||||
*/
|
||||
UText fText = UTEXT_INITIALIZER;
|
||||
|
||||
@@ -172,7 +171,6 @@ private:
|
||||
* If present, UStack of LanguageBreakEngine objects that might handle
|
||||
* dictionary characters. Searched from top to bottom to find an object to
|
||||
* handle a given character.
|
||||
* @internal (private)
|
||||
*/
|
||||
UStack *fLanguageBreakEngines = nullptr;
|
||||
|
||||
@@ -181,14 +179,12 @@ private:
|
||||
* If present, the special LanguageBreakEngine used for handling
|
||||
* characters that are in the dictionary set, but not handled by any
|
||||
* LanguageBreakEngine.
|
||||
* @internal (private)
|
||||
*/
|
||||
UnhandledEngine *fUnhandledBreakEngine = nullptr;
|
||||
|
||||
/**
|
||||
* Counter for the number of characters encountered with the "dictionary"
|
||||
* flag set.
|
||||
* @internal (private)
|
||||
*/
|
||||
uint32_t fDictionaryCharCount = 0;
|
||||
|
||||
@@ -233,7 +229,6 @@ private:
|
||||
*
|
||||
* The break iterator adopts the memory, and will
|
||||
* free it when done.
|
||||
* @internal (private)
|
||||
*/
|
||||
RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status);
|
||||
|
||||
@@ -248,20 +243,16 @@ private:
|
||||
* @param isPhraseBreaking true if phrase based breaking is required, otherwise false.
|
||||
* @see udata_open
|
||||
* @see #getBinaryRules
|
||||
* @internal (private)
|
||||
*/
|
||||
RuleBasedBreakIterator(UDataMemory* image, UBool isPhraseBreaking, UErrorCode &status);
|
||||
|
||||
/** @internal */
|
||||
friend class RBBIRuleBuilder;
|
||||
/** @internal */
|
||||
friend class BreakIterator;
|
||||
|
||||
/**
|
||||
* Default constructor with an error code parameter.
|
||||
* Aside from error handling, otherwise identical to the default constructor.
|
||||
* Internally, handles common initialization for other constructors.
|
||||
* @internal (private)
|
||||
*/
|
||||
RuleBasedBreakIterator(UErrorCode *status);
|
||||
|
||||
@@ -732,7 +723,6 @@ private:
|
||||
* will operate correctly. A Safe Position is not necessarily a boundary itself.
|
||||
*
|
||||
* @param fromPosition the position in the input text to begin the iteration.
|
||||
* @internal (private)
|
||||
*/
|
||||
int32_t handleSafePrevious(int32_t fromPosition);
|
||||
|
||||
@@ -745,8 +735,6 @@ private:
|
||||
* fDictionaryCharCount the number of dictionary characters encountered.
|
||||
* If > 0, the segment will be further subdivided
|
||||
* fRuleStatusIndex Info from the state table indicating which rules caused the boundary.
|
||||
*
|
||||
* @internal (private)
|
||||
*/
|
||||
int32_t handleNext();
|
||||
|
||||
@@ -778,7 +766,6 @@ private:
|
||||
* given character c.
|
||||
* @param c A character in the dictionary set
|
||||
* @param locale The locale.
|
||||
* @internal (private)
|
||||
*/
|
||||
const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c, const char* locale);
|
||||
|
||||
|
||||
+1
-1
@@ -333,7 +333,7 @@ class U_COMMON_API StringPiece : public UMemory {
|
||||
* @return true if the string data is equal
|
||||
* @stable ICU 4.8
|
||||
*/
|
||||
U_EXPORT UBool U_EXPORT2
|
||||
U_COMMON_API UBool U_EXPORT2
|
||||
operator==(const StringPiece& x, const StringPiece& y);
|
||||
|
||||
/**
|
||||
|
||||
+34
-17
@@ -61,7 +61,7 @@ U_CDECL_BEGIN
|
||||
* @see u_getUnicodeVersion
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
#define U_UNICODE_VERSION "16.0"
|
||||
#define U_UNICODE_VERSION "17.0"
|
||||
|
||||
/**
|
||||
* \file
|
||||
@@ -552,14 +552,12 @@ typedef enum UProperty {
|
||||
* @stable ICU 74
|
||||
*/
|
||||
UCHAR_ID_COMPAT_MATH_CONTINUE=74,
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Binary property Modifier_Combining_Mark.
|
||||
* Used by the AMTRA algorithm in UAX #53.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
UCHAR_MODIFIER_COMBINING_MARK=75,
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the last constant for binary Unicode properties.
|
||||
@@ -682,14 +680,12 @@ typedef enum UProperty {
|
||||
* @stable ICU 75
|
||||
*/
|
||||
UCHAR_IDENTIFIER_STATUS=0x1019,
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Enumerated property Indic_Conjunct_Break.
|
||||
* Used in the grapheme cluster break algorithm in UAX #29.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
UCHAR_INDIC_CONJUNCT_BREAK=0x101A,
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the last constant for enumerated/integer Unicode properties.
|
||||
@@ -1985,6 +1981,25 @@ enum UBlockCode {
|
||||
/** @stable ICU 76 */
|
||||
UBLOCK_TULU_TIGALARI = 338, /*[11380]*/
|
||||
|
||||
// New blocks in Unicode 17.0.0
|
||||
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_BERIA_ERFE = 339, /*[16EA0]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_J = 340, /*[323B0]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_MISCELLANEOUS_SYMBOLS_SUPPLEMENT = 341, /*[1CEC0]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_SHARADA_SUPPLEMENT = 342, /*[11B60]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_SIDETIC = 343, /*[10940]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_TAI_YO = 344, /*[1E6C0]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_TANGUT_COMPONENTS_SUPPLEMENT = 345, /*[18D80]*/
|
||||
/** @stable ICU 78 */
|
||||
UBLOCK_TOLONG_SIKI = 346, /*[11DB0]*/
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the highest normal UBlockCode value.
|
||||
@@ -1992,7 +2007,7 @@ enum UBlockCode {
|
||||
*
|
||||
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
|
||||
*/
|
||||
UBLOCK_COUNT = 339,
|
||||
UBLOCK_COUNT = 347,
|
||||
#endif // U_HIDE_DEPRECATED_API
|
||||
|
||||
/** @stable ICU 2.0 */
|
||||
@@ -2289,6 +2304,8 @@ typedef enum UJoiningGroup {
|
||||
|
||||
U_JG_KASHMIRI_YEH, /**< @stable ICU 76 */
|
||||
|
||||
U_JG_THIN_NOON, /**< @stable ICU 78 */
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the highest normal UJoiningGroup value.
|
||||
@@ -2536,6 +2553,8 @@ typedef enum ULineBreak {
|
||||
U_LB_VIRAMA_FINAL = 46, /*[VF]*/
|
||||
/** @stable ICU 74 */
|
||||
U_LB_VIRAMA = 47, /*[VI]*/
|
||||
/** @stable ICU 78 */
|
||||
U_LB_UNAMBIGUOUS_HYPHEN = 48,/*[HH]*/
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the highest normal ULineBreak value.
|
||||
@@ -2543,7 +2562,7 @@ typedef enum ULineBreak {
|
||||
*
|
||||
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
|
||||
*/
|
||||
U_LB_COUNT = 48
|
||||
U_LB_COUNT = 49
|
||||
#endif // U_HIDE_DEPRECATED_API
|
||||
} ULineBreak;
|
||||
|
||||
@@ -2741,12 +2760,11 @@ typedef enum UIndicSyllabicCategory {
|
||||
U_INSC_REORDERING_KILLER,
|
||||
} UIndicSyllabicCategory;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Indic Conjunct Break constants.
|
||||
*
|
||||
* @see UCHAR_INDIC_CONJUNCT_BREAK
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
typedef enum UIndicConjunctBreak {
|
||||
/*
|
||||
@@ -2755,16 +2773,15 @@ typedef enum UIndicConjunctBreak {
|
||||
* U_INCB_<Unicode Indic_Conjunct_Break value name>
|
||||
*/
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
U_INCB_NONE,
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
U_INCB_CONSONANT,
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
U_INCB_EXTEND,
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
U_INCB_LINKER,
|
||||
} UIndicConjunctBreak;
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Vertical Orientation constants.
|
||||
@@ -2918,7 +2935,7 @@ u_stringHasBinaryProperty(const UChar *s, int32_t length, UProperty which);
|
||||
* @return the property as a set
|
||||
* @see UProperty
|
||||
* @see u_hasBinaryProperty
|
||||
* @see Unicode::fromUSet
|
||||
* @see UnicodeSet::fromUSet
|
||||
* @stable ICU 63
|
||||
*/
|
||||
U_CAPI const USet * U_EXPORT2
|
||||
|
||||
+22
@@ -119,6 +119,28 @@
|
||||
/** Obsolete/same as U_CAPI; was used to declare a function as an internal ICU C API */
|
||||
#define U_INTERNAL U_CAPI
|
||||
|
||||
/**
|
||||
* \def U_FORCE_INLINE
|
||||
* Forces function inlining on compilers that are known to support it.
|
||||
* Place this before specifiers like "static" and "explicit".
|
||||
*
|
||||
* This does not replace the "inline" keyword which suspends the One Definition Rule (ODR)
|
||||
* in addition to optionally serving as an inlining hint to the compiler.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
#ifdef U_FORCE_INLINE
|
||||
// already defined
|
||||
#elif defined(U_IN_DOXYGEN)
|
||||
# define U_FORCE_INLINE inline
|
||||
#elif (defined(__clang__) && __clang__) || U_GCC_MAJOR_MINOR != 0
|
||||
# define U_FORCE_INLINE [[gnu::always_inline]]
|
||||
#elif defined(U_REAL_MSVC)
|
||||
# define U_FORCE_INLINE __forceinline
|
||||
#else
|
||||
# define U_FORCE_INLINE inline
|
||||
#endif
|
||||
|
||||
// Before ICU 65, function-like, multi-statement ICU macros were just defined as
|
||||
// series of statements wrapped in { } blocks and the caller could choose to
|
||||
// either treat them as if they were actual functions and end the invocation
|
||||
|
||||
+25
-27
@@ -495,7 +495,7 @@ public:
|
||||
* @return <tt>true</tt> if the specified set is equal to this set.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual bool operator==(const UnicodeSet& o) const;
|
||||
bool operator==(const UnicodeSet& o) const;
|
||||
|
||||
/**
|
||||
* Compares the specified object with this set for equality. Returns
|
||||
@@ -522,7 +522,7 @@ public:
|
||||
* @see Object#hashCode()
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual int32_t hashCode() const;
|
||||
int32_t hashCode() const;
|
||||
|
||||
/**
|
||||
* Get a UnicodeSet pointer from a USet
|
||||
@@ -792,7 +792,7 @@ public:
|
||||
* @stable ICU 2.0
|
||||
* @see getRangeCount
|
||||
*/
|
||||
virtual int32_t size() const;
|
||||
int32_t size() const;
|
||||
|
||||
/**
|
||||
* Returns <tt>true</tt> if this set contains no elements.
|
||||
@@ -800,7 +800,7 @@ public:
|
||||
* @return <tt>true</tt> if this set contains no elements.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UBool isEmpty() const;
|
||||
UBool isEmpty() const;
|
||||
|
||||
/**
|
||||
* @return true if this set contains multi-character strings or the empty string.
|
||||
@@ -825,7 +825,7 @@ public:
|
||||
* @return true if the test condition is met
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UBool contains(UChar32 start, UChar32 end) const;
|
||||
UBool contains(UChar32 start, UChar32 end) const;
|
||||
|
||||
/**
|
||||
* Returns <tt>true</tt> if this set contains the given
|
||||
@@ -843,7 +843,7 @@ public:
|
||||
* @return true if the test condition is met
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UBool containsAll(const UnicodeSet& c) const;
|
||||
UBool containsAll(const UnicodeSet& c) const;
|
||||
|
||||
/**
|
||||
* Returns true if this set contains all the characters
|
||||
@@ -1021,7 +1021,7 @@ public:
|
||||
* Implement UnicodeMatcher::matches()
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UMatchDegree matches(const Replaceable& text,
|
||||
UMatchDegree matches(const Replaceable& text,
|
||||
int32_t& offset,
|
||||
int32_t limit,
|
||||
UBool incremental) override;
|
||||
@@ -1102,7 +1102,6 @@ public:
|
||||
*/
|
||||
UChar32 charAt(int32_t index) const;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Returns a C++ "range" for iterating over the code points of this set.
|
||||
*
|
||||
@@ -1114,7 +1113,7 @@ public:
|
||||
* \endcode
|
||||
*
|
||||
* @return a "range" object for iterating over the code points of this set.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see ranges
|
||||
* @see strings
|
||||
* @see begin
|
||||
@@ -1140,7 +1139,7 @@ public:
|
||||
* \endcode
|
||||
*
|
||||
* @return a "range" object for iterating over the code point ranges of this set.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see codePoints
|
||||
* @see strings
|
||||
* @see begin
|
||||
@@ -1164,7 +1163,7 @@ public:
|
||||
* \endcode
|
||||
*
|
||||
* @return a "range" object for iterating over the strings of this set.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see codePoints
|
||||
* @see ranges
|
||||
* @see begin
|
||||
@@ -1173,7 +1172,6 @@ public:
|
||||
inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const {
|
||||
return U_HEADER_NESTED_NAMESPACE::USetStrings(toUSet());
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
@@ -1231,7 +1229,7 @@ public:
|
||||
* to this set.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& add(UChar32 start, UChar32 end);
|
||||
UnicodeSet& add(UChar32 start, UChar32 end);
|
||||
|
||||
/**
|
||||
* Adds the specified character to this set if it is not already
|
||||
@@ -1337,7 +1335,7 @@ public:
|
||||
* @param end last character, inclusive, of range
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& retain(UChar32 start, UChar32 end);
|
||||
UnicodeSet& retain(UChar32 start, UChar32 end);
|
||||
|
||||
|
||||
/**
|
||||
@@ -1375,7 +1373,7 @@ public:
|
||||
* from this set.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& remove(UChar32 start, UChar32 end);
|
||||
UnicodeSet& remove(UChar32 start, UChar32 end);
|
||||
|
||||
/**
|
||||
* Removes the specified character from this set if it is present.
|
||||
@@ -1412,7 +1410,7 @@ public:
|
||||
* A frozen set will not be modified.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& complement();
|
||||
UnicodeSet& complement();
|
||||
|
||||
/**
|
||||
* Complements the specified range in this set. Any character in
|
||||
@@ -1426,7 +1424,7 @@ public:
|
||||
* @param end last character, inclusive, of range
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& complement(UChar32 start, UChar32 end);
|
||||
UnicodeSet& complement(UChar32 start, UChar32 end);
|
||||
|
||||
/**
|
||||
* Complements the specified character in this set. The character
|
||||
@@ -1463,7 +1461,7 @@ public:
|
||||
* @see #add(UChar32, UChar32)
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& addAll(const UnicodeSet& c);
|
||||
UnicodeSet& addAll(const UnicodeSet& c);
|
||||
|
||||
/**
|
||||
* Retains only the elements in this set that are contained in the
|
||||
@@ -1476,7 +1474,7 @@ public:
|
||||
* @param c set that defines which elements this set will retain.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& retainAll(const UnicodeSet& c);
|
||||
UnicodeSet& retainAll(const UnicodeSet& c);
|
||||
|
||||
/**
|
||||
* Removes from this set all of its elements that are contained in the
|
||||
@@ -1489,7 +1487,7 @@ public:
|
||||
* this set.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& removeAll(const UnicodeSet& c);
|
||||
UnicodeSet& removeAll(const UnicodeSet& c);
|
||||
|
||||
/**
|
||||
* Complements in this set all elements contained in the specified
|
||||
@@ -1501,7 +1499,7 @@ public:
|
||||
* this set.
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UnicodeSet& complementAll(const UnicodeSet& c);
|
||||
UnicodeSet& complementAll(const UnicodeSet& c);
|
||||
|
||||
/**
|
||||
* Removes all of the elements from this set. This set will be
|
||||
@@ -1509,7 +1507,7 @@ public:
|
||||
* A frozen set will not be modified.
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
virtual UnicodeSet& clear();
|
||||
UnicodeSet& clear();
|
||||
|
||||
/**
|
||||
* Close this set over the given attribute. For the attribute
|
||||
@@ -1546,7 +1544,7 @@ public:
|
||||
* @return a reference to this set.
|
||||
* @stable ICU 4.2
|
||||
*/
|
||||
virtual UnicodeSet &removeAllStrings();
|
||||
UnicodeSet &removeAllStrings();
|
||||
|
||||
/**
|
||||
* Iteration method that returns the number of ranges contained in
|
||||
@@ -1555,7 +1553,7 @@ public:
|
||||
* @see #getRangeEnd
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual int32_t getRangeCount() const;
|
||||
int32_t getRangeCount() const;
|
||||
|
||||
/**
|
||||
* Iteration method that returns the first character in the
|
||||
@@ -1564,7 +1562,7 @@ public:
|
||||
* @see #getRangeEnd
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UChar32 getRangeStart(int32_t index) const;
|
||||
UChar32 getRangeStart(int32_t index) const;
|
||||
|
||||
/**
|
||||
* Iteration method that returns the last character in the
|
||||
@@ -1573,7 +1571,7 @@ public:
|
||||
* @see #getRangeEnd
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UChar32 getRangeEnd(int32_t index) const;
|
||||
UChar32 getRangeEnd(int32_t index) const;
|
||||
|
||||
/**
|
||||
* Serializes this set into an array of 16-bit integers. Serialization
|
||||
@@ -1631,7 +1629,7 @@ public:
|
||||
* A frozen set will not be modified.
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
virtual UnicodeSet& compact();
|
||||
UnicodeSet& compact();
|
||||
|
||||
/**
|
||||
* Return the class ID for this class. This is useful only for
|
||||
|
||||
+93
-32
@@ -215,6 +215,10 @@ class UnicodeStringAppendable; // unicode/appendable.h
|
||||
*
|
||||
* The UnicodeString equivalent of std::string’s clear() is remove().
|
||||
*
|
||||
* Starting with ICU 78, a UnicodeString is a C++ "range" of char16_t code units.
|
||||
* utfStringCodePoints() and unsafeUTFStringCodePoints() can be used to iterate over
|
||||
* the code points.
|
||||
*
|
||||
* A UnicodeString may "alias" an external array of characters
|
||||
* (that is, point to it, rather than own the array)
|
||||
* whose lifetime must then at least match the lifetime of the aliasing object.
|
||||
@@ -289,12 +293,17 @@ class UnicodeStringAppendable; // unicode/appendable.h
|
||||
* [User Guide Strings chapter](https://unicode-org.github.io/icu/userguide/strings#maximizing-performance-with-the-unicodestring-storage-model).
|
||||
*
|
||||
* @see utf.h
|
||||
* @see utfiterator.h
|
||||
* @see utfStringCodePoints
|
||||
* @see unsafeUTFStringCodePoints
|
||||
* @see CharacterIterator
|
||||
* @stable ICU 2.0
|
||||
*/
|
||||
class U_COMMON_API UnicodeString : public Replaceable
|
||||
{
|
||||
public:
|
||||
/** C++ boilerplate @internal */
|
||||
using value_type = char16_t;
|
||||
|
||||
/**
|
||||
* Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor
|
||||
@@ -327,7 +336,6 @@ public:
|
||||
*/
|
||||
inline bool operator== (const UnicodeString& text) const;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Equality operator. Performs only bitwise comparison with `text`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -341,7 +349,7 @@ public:
|
||||
* \endcode
|
||||
* @param text The string view to compare to this string.
|
||||
* @return true if `text` contains the same characters as this one, false otherwise.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline bool operator==(const S &text) const {
|
||||
@@ -349,7 +357,6 @@ public:
|
||||
uint32_t len; // unsigned to avoid a compiler warning
|
||||
return !isBogus() && (len = length()) == sv.length() && doEquals(sv.data(), len);
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Inequality operator. Performs only bitwise comparison.
|
||||
@@ -360,7 +367,6 @@ public:
|
||||
*/
|
||||
inline bool operator!= (const UnicodeString& text) const;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Inequality operator. Performs only bitwise comparison with `text`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -376,13 +382,12 @@ public:
|
||||
* \endcode
|
||||
* @param text The string view to compare to this string.
|
||||
* @return false if `text` contains the same characters as this one, true otherwise.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline bool operator!=(const S &text) const {
|
||||
return !operator==(text);
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Greater than operator. Performs only bitwise comparison.
|
||||
@@ -1767,7 +1772,8 @@ public:
|
||||
* Unpaired surrogates are replaced with U+FFFD.
|
||||
* Calls toUTF8().
|
||||
*
|
||||
* @param result A standard string (or a compatible object)
|
||||
* @tparam StringClass A std::string or a std::u8string (or a compatible type)
|
||||
* @param result A std::string or a std::u8string (or a compatible object)
|
||||
* to which the UTF-8 version of the string is appended.
|
||||
* @return The string object.
|
||||
* @stable ICU 4.2
|
||||
@@ -1780,6 +1786,27 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Convert the UnicodeString to a UTF-8 string.
|
||||
* Unpaired surrogates are replaced with U+FFFD.
|
||||
* Calls toUTF8().
|
||||
*
|
||||
* @tparam StringClass A std::string or a std::u8string (or a compatible type)
|
||||
* @return A std::string or a std::u8string (or a compatible object)
|
||||
* with the UTF-8 version of the string.
|
||||
* @draft ICU 78
|
||||
* @see toUTF8
|
||||
*/
|
||||
template<typename StringClass>
|
||||
StringClass toUTF8String() const {
|
||||
StringClass result;
|
||||
StringByteSink<StringClass> sbs(&result, length());
|
||||
toUTF8(sbs);
|
||||
return result;
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Convert the UnicodeString to UTF-32.
|
||||
* Unpaired surrogates are replaced with U+FFFD.
|
||||
@@ -1892,6 +1919,42 @@ public:
|
||||
*/
|
||||
inline UBool isBogus() const;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
private:
|
||||
// These type aliases are private; there is no guarantee that they will remain
|
||||
// aliases to the same types in subsequent versions of ICU.
|
||||
// Note that whether `std::u16string_view::const_iterator` is a pointer or a
|
||||
// class that models contiguous_iterator is platform-dependent.
|
||||
using unspecified_iterator = std::u16string_view::const_iterator;
|
||||
using unspecified_reverse_iterator = std::u16string_view::const_reverse_iterator;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @return an iterator to the first code unit in this string.
|
||||
* The iterator may be a pointer or a contiguous-iterator object.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
unspecified_iterator begin() const { return std::u16string_view(*this).begin(); }
|
||||
/**
|
||||
* @return an iterator to just past the last code unit in this string.
|
||||
* The iterator may be a pointer or a contiguous-iterator object.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
unspecified_iterator end() const { return std::u16string_view(*this).end(); }
|
||||
/**
|
||||
* @return a reverse iterator to the last code unit in this string.
|
||||
* The iterator may be a pointer or a contiguous-iterator object.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
unspecified_reverse_iterator rbegin() const { return std::u16string_view(*this).rbegin(); }
|
||||
/**
|
||||
* @return a reverse iterator to just before the first code unit in this string.
|
||||
* The iterator may be a pointer or a contiguous-iterator object.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
unspecified_reverse_iterator rend() const { return std::u16string_view(*this).rend(); }
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
//========================================
|
||||
// Write operations
|
||||
//========================================
|
||||
@@ -1945,7 +2008,6 @@ public:
|
||||
*/
|
||||
UnicodeString &fastCopyFrom(const UnicodeString &src);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Assignment operator. Replaces the characters in this UnicodeString
|
||||
* with a copy of the characters from the `src`
|
||||
@@ -1954,14 +2016,13 @@ public:
|
||||
*
|
||||
* @param src The string view containing the characters to copy.
|
||||
* @return a reference to this
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline UnicodeString &operator=(const S &src) {
|
||||
unBogus();
|
||||
return doReplace(0, length(), internal::toU16StringView(src));
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Move assignment operator; might leave src in bogus state.
|
||||
@@ -2212,7 +2273,6 @@ public:
|
||||
*/
|
||||
inline UnicodeString& operator+= (const UnicodeString& srcText);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Append operator. Appends the characters in `src`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -2221,13 +2281,12 @@ public:
|
||||
*
|
||||
* @param src the source for the new characters
|
||||
* @return a reference to this
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline UnicodeString& operator+=(const S &src) {
|
||||
return doAppend(internal::toU16StringView(src));
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Append the characters
|
||||
@@ -2285,7 +2344,6 @@ public:
|
||||
inline UnicodeString& append(ConstChar16Ptr srcChars,
|
||||
int32_t srcLength);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Appends the characters in `src`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -2294,13 +2352,12 @@ public:
|
||||
*
|
||||
* @param src the source for the new characters
|
||||
* @return a reference to this
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline UnicodeString& append(const S &src) {
|
||||
return doAppend(internal::toU16StringView(src));
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Append the code unit `srcChar` to the UnicodeString object.
|
||||
@@ -2318,6 +2375,16 @@ public:
|
||||
*/
|
||||
UnicodeString& append(UChar32 srcChar);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Appends the code unit `c` to the UnicodeString object.
|
||||
* Same as append(c) except does not return *this.
|
||||
*
|
||||
* @param c the code unit to append
|
||||
* @draft ICU 78
|
||||
*/
|
||||
inline void push_back(char16_t c) { append(c); }
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/* Insert operations */
|
||||
|
||||
@@ -3025,12 +3092,11 @@ public:
|
||||
*/
|
||||
const char16_t *getTerminatedBuffer();
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Converts to a std::u16string_view.
|
||||
*
|
||||
* @return a string view of the contents of this string
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
inline operator std::u16string_view() const {
|
||||
return {getBuffer(), static_cast<std::u16string_view::size_type>(length())};
|
||||
@@ -3044,7 +3110,7 @@ public:
|
||||
* about char16_t vs. wchar_t become clearer.
|
||||
*
|
||||
* @return a string view of the contents of this string
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
inline operator std::wstring_view() const {
|
||||
const char16_t *p = getBuffer();
|
||||
@@ -3054,7 +3120,6 @@ public:
|
||||
return { reinterpret_cast<const wchar_t *>(p), (std::wstring_view::size_type)length() };
|
||||
}
|
||||
#endif // U_SIZEOF_WCHAR_T
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
//========================================
|
||||
// Constructors
|
||||
@@ -3257,7 +3322,6 @@ public:
|
||||
*/
|
||||
inline UnicodeString(const std::nullptr_t text, int32_t textLength);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Constructor from `text`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -3268,14 +3332,13 @@ public:
|
||||
* then you can call the UnicodeString::readOnlyAlias() function instead of this constructor.
|
||||
*
|
||||
* @param text UTF-16 string
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) {
|
||||
fUnion.fFields.fLengthAndFlags = kShortString;
|
||||
doAppend(internal::toU16StringViewNullable(text));
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Readonly-aliasing char16_t* constructor.
|
||||
@@ -3573,7 +3636,6 @@ public:
|
||||
*/
|
||||
virtual ~UnicodeString();
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Readonly-aliasing factory method.
|
||||
* Aliases the same buffer as the input `text`
|
||||
@@ -3594,7 +3656,7 @@ public:
|
||||
* so that both strings then alias the same readonly-text.
|
||||
*
|
||||
* @param text The string view to alias for the UnicodeString.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
static inline UnicodeString readOnlyAlias(const S &text) {
|
||||
@@ -3618,12 +3680,11 @@ public:
|
||||
* so that both strings then alias the same readonly-text.
|
||||
*
|
||||
* @param text The UnicodeString to alias.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
static inline UnicodeString readOnlyAlias(const UnicodeString &text) {
|
||||
return readOnlyAliasFromUnicodeString(text);
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Create a UnicodeString from a UTF-8 string.
|
||||
@@ -4102,7 +4163,6 @@ private:
|
||||
U_COMMON_API UnicodeString U_EXPORT2
|
||||
operator+ (const UnicodeString &s1, const UnicodeString &s2);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Creates a new UnicodeString from the concatenation of a UnicodeString and `s2`
|
||||
* which is, or which is implicitly convertible to,
|
||||
@@ -4111,13 +4171,14 @@ operator+ (const UnicodeString &s1, const UnicodeString &s2);
|
||||
* @param s1 The string to be copied to the new one.
|
||||
* @param s2 The string view to be copied to the new string, after s1.
|
||||
* @return UnicodeString(s1).append(s2)
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
|
||||
inline UnicodeString operator+(const UnicodeString &s1, const S &s2) {
|
||||
template<
|
||||
typename US, typename S,
|
||||
typename = std::enable_if_t<ConvertibleToU16StringView<S> && std::is_same_v<US, UnicodeString>>>
|
||||
inline UnicodeString operator+(const US &s1, const S &s2) {
|
||||
return unistr_internalConcat(s1, internal::toU16StringView(s2));
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
#ifndef U_FORCE_HIDE_INTERNAL_API
|
||||
/** @internal */
|
||||
|
||||
+1
-2
@@ -157,7 +157,6 @@ public:
|
||||
*/
|
||||
static void U_EXPORT2 operator delete[](void *p) noexcept;
|
||||
|
||||
#if U_HAVE_PLACEMENT_NEW
|
||||
/**
|
||||
* Override for ICU4C C++ memory management for STL.
|
||||
* See new().
|
||||
@@ -171,7 +170,7 @@ public:
|
||||
* @stable ICU 2.6
|
||||
*/
|
||||
static inline void U_EXPORT2 operator delete(void *, void *) noexcept {}
|
||||
#endif /* U_HAVE_PLACEMENT_NEW */
|
||||
|
||||
#if U_HAVE_DEBUG_LOCATION_NEW
|
||||
/**
|
||||
* This method overrides the MFC debug version of the operator new
|
||||
|
||||
+5
-3
@@ -33,8 +33,9 @@
|
||||
|
||||
#if !U_DISABLE_RENAMING
|
||||
|
||||
// Disable Renaming for Visual Studio's IntelliSense feature, so that 'Go-to-Definition' (F12) will work.
|
||||
#if !(defined(_MSC_VER) && defined(__INTELLISENSE__))
|
||||
// Disable Renaming for Visual Studio's IntelliSense feature and for LLVM's Clang-Tidy tool, so that
|
||||
// 'Go-to-Definition' (F12) and 'include-cleaner' respectively will work.
|
||||
#if !(defined(_MSC_VER) && defined(__INTELLISENSE__)) && !defined(__clang_analyzer__)
|
||||
|
||||
/* We need the U_ICU_ENTRY_POINT_RENAME definition. There's a default one in unicode/uvernum.h we can use, but we will give
|
||||
the platform a chance to define it first.
|
||||
@@ -1392,6 +1393,7 @@
|
||||
#define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource)
|
||||
#define upropsvec_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(upropsvec_addPropertyStarts)
|
||||
#define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow)
|
||||
#define uprv_addScriptExtensionsCodePoints U_ICU_ENTRY_POINT_RENAME(uprv_addScriptExtensionsCodePoints)
|
||||
#define uprv_aestrncpy U_ICU_ENTRY_POINT_RENAME(uprv_aestrncpy)
|
||||
#define uprv_asciiFromEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_asciiFromEbcdic)
|
||||
#define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower)
|
||||
@@ -2037,7 +2039,7 @@
|
||||
#define ztrans_setTime U_ICU_ENTRY_POINT_RENAME(ztrans_setTime)
|
||||
#define ztrans_setTo U_ICU_ENTRY_POINT_RENAME(ztrans_setTo)
|
||||
|
||||
#endif /* !(defined(_MSC_VER) && defined(__INTELLISENSE__)) */
|
||||
#endif /* !(defined(_MSC_VER) && defined(__INTELLISENSE__)) && !defined(__clang_analyzer__) */
|
||||
#endif /* U_DISABLE_RENAMING */
|
||||
#endif /* URENAME_H */
|
||||
|
||||
+12
-1
@@ -518,6 +518,17 @@ typedef enum UScriptCode {
|
||||
/** @stable ICU 76 */
|
||||
USCRIPT_TULU_TIGALARI = 207, /* Tutg */
|
||||
|
||||
/** @stable ICU 78 */
|
||||
USCRIPT_BERIA_ERFE = 208, /* Berf */
|
||||
/** @stable ICU 78 */
|
||||
USCRIPT_SIDETIC = 209, /* Sidt */
|
||||
/** @stable ICU 78 */
|
||||
USCRIPT_TAI_YO = 210, /* Tayo */
|
||||
/** @stable ICU 78 */
|
||||
USCRIPT_TOLONG_SIKI = 211, /* Tols */
|
||||
/** @stable ICU 78 */
|
||||
USCRIPT_TRADITIONAL_HAN_WITH_LATIN = 212, /* Hntl */
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the highest normal UScriptCode value.
|
||||
@@ -525,7 +536,7 @@ typedef enum UScriptCode {
|
||||
*
|
||||
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
|
||||
*/
|
||||
USCRIPT_CODE_LIMIT = 208
|
||||
USCRIPT_CODE_LIMIT = 213
|
||||
#endif // U_HIDE_DEPRECATED_API
|
||||
} UScriptCode;
|
||||
|
||||
|
||||
+56
-61
@@ -987,12 +987,10 @@ uset_size(const USet* set);
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
uset_getRangeCount(const USet *set);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* @param set the set
|
||||
* @return the number of strings in this set.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see uset_getRangeCount
|
||||
* @see uset_getItemCount
|
||||
* @see uset_size
|
||||
@@ -1009,14 +1007,12 @@ uset_getStringCount(const USet *set);
|
||||
* @param index the string index, 0 .. uset_getStringCount() - 1
|
||||
* @param pLength the output string length; must not be NULL
|
||||
* @return the pointer to the string; NULL if the index is out of range or pLength is NULL
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see uset_getStringCount
|
||||
*/
|
||||
U_CAPI const UChar* U_EXPORT2
|
||||
uset_getString(const USet *set, int32_t index, int32_t *pLength);
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Returns the number of items in this set. An item is either a range
|
||||
* of characters or a single multicharacter string.
|
||||
@@ -1327,7 +1323,6 @@ uset_getSerializedRange(const USerializedSet* set, int32_t rangeIndex,
|
||||
UChar32* pStart, UChar32* pEnd);
|
||||
|
||||
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
|
||||
namespace U_HEADER_ONLY_NAMESPACE {
|
||||
|
||||
@@ -1336,14 +1331,14 @@ namespace U_HEADER_ONLY_NAMESPACE {
|
||||
|
||||
/**
|
||||
* Iterator returned by USetCodePoints.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
class USetCodePointIterator {
|
||||
public:
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetCodePointIterator(const USetCodePointIterator &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator==(const USetCodePointIterator &other) const {
|
||||
// No need to compare rangeCount & end given private constructor
|
||||
// and assuming we don't compare iterators across the set being modified.
|
||||
@@ -1353,15 +1348,15 @@ public:
|
||||
return uset == other.uset && c == other.c;
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator!=(const USetCodePointIterator &other) const { return !operator==(other); }
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
UChar32 operator*() const { return c; }
|
||||
|
||||
/**
|
||||
* Pre-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetCodePointIterator &operator++() {
|
||||
if (c < end) {
|
||||
@@ -1382,7 +1377,7 @@ public:
|
||||
|
||||
/**
|
||||
* Post-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetCodePointIterator operator++(int) {
|
||||
USetCodePointIterator result(*this);
|
||||
@@ -1419,7 +1414,7 @@ private:
|
||||
*
|
||||
* C++ UnicodeSet has member functions for iteration, including codePoints().
|
||||
*
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see USetRanges
|
||||
* @see USetStrings
|
||||
* @see USetElements
|
||||
@@ -1428,19 +1423,19 @@ class USetCodePoints {
|
||||
public:
|
||||
/**
|
||||
* Constructs a C++ "range" object over the code points of the USet.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetCodePoints(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetCodePoints(const USetCodePoints &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetCodePointIterator begin() const {
|
||||
return USetCodePointIterator(uset, 0, rangeCount);
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetCodePointIterator end() const {
|
||||
return USetCodePointIterator(uset, rangeCount, rangeCount);
|
||||
}
|
||||
@@ -1455,25 +1450,25 @@ private:
|
||||
* Returned by USetRangeIterator which is returned by USetRanges.
|
||||
* Both the rangeStart and rangeEnd are in the range.
|
||||
* (end() returns an iterator corresponding to rangeEnd+1.)
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
struct CodePointRange {
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
struct iterator {
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
iterator(UChar32 aC) : c(aC) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator==(const iterator &other) const { return c == other.c; }
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator!=(const iterator &other) const { return !operator==(other); }
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
UChar32 operator*() const { return c; }
|
||||
|
||||
/**
|
||||
* Pre-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
iterator &operator++() {
|
||||
++c;
|
||||
@@ -1482,7 +1477,7 @@ struct CodePointRange {
|
||||
|
||||
/**
|
||||
* Post-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
iterator operator++(int) {
|
||||
return c++;
|
||||
@@ -1490,44 +1485,44 @@ struct CodePointRange {
|
||||
|
||||
/**
|
||||
* The current code point in the range.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
UChar32 c;
|
||||
};
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
CodePointRange(UChar32 start, UChar32 end) : rangeStart(start), rangeEnd(end) {}
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
CodePointRange(const CodePointRange &other) = default;
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
size_t size() const { return (rangeEnd + 1) - rangeStart; }
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
iterator begin() const { return rangeStart; }
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
iterator end() const { return rangeEnd + 1; }
|
||||
|
||||
/**
|
||||
* Start of a USet/UnicodeSet range of code points.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
UChar32 rangeStart;
|
||||
/**
|
||||
* Inclusive end of a USet/UnicodeSet range of code points.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
UChar32 rangeEnd;
|
||||
};
|
||||
|
||||
/**
|
||||
* Iterator returned by USetRanges.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
class USetRangeIterator {
|
||||
public:
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetRangeIterator(const USetRangeIterator &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator==(const USetRangeIterator &other) const {
|
||||
// No need to compare rangeCount given private constructor
|
||||
// and assuming we don't compare iterators across the set being modified.
|
||||
@@ -1536,10 +1531,10 @@ public:
|
||||
return uset == other.uset && rangeIndex == other.rangeIndex;
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator!=(const USetRangeIterator &other) const { return !operator==(other); }
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
CodePointRange operator*() const {
|
||||
if (rangeIndex < rangeCount) {
|
||||
UChar32 start, end;
|
||||
@@ -1554,7 +1549,7 @@ public:
|
||||
|
||||
/**
|
||||
* Pre-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetRangeIterator &operator++() {
|
||||
++rangeIndex;
|
||||
@@ -1563,7 +1558,7 @@ public:
|
||||
|
||||
/**
|
||||
* Post-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetRangeIterator operator++(int) {
|
||||
USetRangeIterator result(*this);
|
||||
@@ -1600,7 +1595,7 @@ private:
|
||||
*
|
||||
* C++ UnicodeSet has member functions for iteration, including ranges().
|
||||
*
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see USetCodePoints
|
||||
* @see USetStrings
|
||||
* @see USetElements
|
||||
@@ -1609,19 +1604,19 @@ class USetRanges {
|
||||
public:
|
||||
/**
|
||||
* Constructs a C++ "range" object over the code point ranges of the USet.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetRanges(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetRanges(const USetRanges &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetRangeIterator begin() const {
|
||||
return USetRangeIterator(uset, 0, rangeCount);
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetRangeIterator end() const {
|
||||
return USetRangeIterator(uset, rangeCount, rangeCount);
|
||||
}
|
||||
@@ -1633,14 +1628,14 @@ private:
|
||||
|
||||
/**
|
||||
* Iterator returned by USetStrings.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
class USetStringIterator {
|
||||
public:
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetStringIterator(const USetStringIterator &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator==(const USetStringIterator &other) const {
|
||||
// No need to compare count given private constructor
|
||||
// and assuming we don't compare iterators across the set being modified.
|
||||
@@ -1649,10 +1644,10 @@ public:
|
||||
return uset == other.uset && index == other.index;
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
bool operator!=(const USetStringIterator &other) const { return !operator==(other); }
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
std::u16string_view operator*() const {
|
||||
if (index < count) {
|
||||
int32_t length;
|
||||
@@ -1665,7 +1660,7 @@ public:
|
||||
|
||||
/**
|
||||
* Pre-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetStringIterator &operator++() {
|
||||
++index;
|
||||
@@ -1674,7 +1669,7 @@ public:
|
||||
|
||||
/**
|
||||
* Post-increment.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetStringIterator operator++(int) {
|
||||
USetStringIterator result(*this);
|
||||
@@ -1710,7 +1705,7 @@ private:
|
||||
*
|
||||
* C++ UnicodeSet has member functions for iteration, including strings().
|
||||
*
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see USetCodePoints
|
||||
* @see USetRanges
|
||||
* @see USetElements
|
||||
@@ -1719,19 +1714,19 @@ class USetStrings {
|
||||
public:
|
||||
/**
|
||||
* Constructs a C++ "range" object over the strings of the USet.
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
USetStrings(const USet *pUset) : uset(pUset), count(uset_getStringCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetStrings(const USetStrings &other) = default;
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetStringIterator begin() const {
|
||||
return USetStringIterator(uset, 0, count);
|
||||
}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
/** @stable ICU 76 */
|
||||
USetStringIterator end() const {
|
||||
return USetStringIterator(uset, count, count);
|
||||
}
|
||||
@@ -1740,7 +1735,6 @@ private:
|
||||
const USet *uset;
|
||||
int32_t count;
|
||||
};
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
@@ -1900,9 +1894,10 @@ private:
|
||||
int32_t rangeCount, stringCount;
|
||||
};
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
} // namespace U_HEADER_ONLY_NAMESPACE
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
|
||||
|
||||
#endif // __USET_H__
|
||||
+32
-1
@@ -121,8 +121,39 @@
|
||||
|
||||
/* single-code point definitions -------------------------------------------- */
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Is c a Unicode code point U+0000..U+10FFFF?
|
||||
* https://www.unicode.org/glossary/#code_point
|
||||
*
|
||||
* @param c 32-bit code point
|
||||
* @return true or false
|
||||
* @draft ICU 78
|
||||
* @see AllCodePoints
|
||||
* @see U_IS_SCALAR_VALUE
|
||||
*/
|
||||
#define U_IS_CODE_POINT(c) ((uint32_t)(c)<=0x10ffff)
|
||||
|
||||
/**
|
||||
* Is c a Unicode scalar value, that is, a non-surrogate code point?
|
||||
* Only scalar values can be represented in well-formed UTF-8/16/32.
|
||||
* https://www.unicode.org/glossary/#unicode_scalar_value
|
||||
*
|
||||
* @param c 32-bit code point
|
||||
* @return true or false
|
||||
* @draft ICU 78
|
||||
* @see AllScalarValues
|
||||
* @see U_IS_CODE_POINT
|
||||
*/
|
||||
#define U_IS_SCALAR_VALUE(c) ((uint32_t)(c)<0xd800 || (0xe000<=(c) && (c)<=0x10ffff))
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Is this code point a Unicode noncharacter?
|
||||
* https://www.unicode.org/glossary/#noncharacter
|
||||
*
|
||||
* @param c 32-bit code point
|
||||
* @return true or false
|
||||
* @stable ICU 2.4
|
||||
@@ -150,7 +181,7 @@
|
||||
*/
|
||||
#define U_IS_UNICODE_CHAR(c) \
|
||||
((uint32_t)(c)<0xd800 || \
|
||||
(0xdfff<(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c)))
|
||||
(0xe000<=(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c)))
|
||||
|
||||
/**
|
||||
* Is this code point a BMP code point (U+0000..U+ffff)?
|
||||
|
||||
+29
-3
@@ -170,7 +170,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
|
||||
* @return true or false
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
#define U8_IS_SINGLE(c) (((c)&0x80)==0)
|
||||
#define U8_IS_SINGLE(c) ((int8_t)(c)>=0)
|
||||
|
||||
/**
|
||||
* Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4)
|
||||
@@ -214,6 +214,32 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
|
||||
*/
|
||||
#define U8_MAX_LENGTH 4
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Returns the length of a well-formed UTF-8 byte sequence according to its lead byte.
|
||||
* Returns 1 for 0..0xc1 as well as for 0xf5..0xff.
|
||||
* leadByte might be evaluated multiple times.
|
||||
*
|
||||
* @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff.
|
||||
* @return 1..4
|
||||
* @draft ICU 78
|
||||
*/
|
||||
#define U8_LENGTH_FROM_LEAD_BYTE(leadByte) (U8_COUNT_TRAIL_BYTES(leadByte) + 1)
|
||||
|
||||
/**
|
||||
* Returns the length of a well-formed UTF-8 byte sequence according to its lead byte.
|
||||
* Returns 1 for 0..0xc1. Undefined for 0xf5..0xff.
|
||||
* leadByte might be evaluated multiple times.
|
||||
*
|
||||
* @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff.
|
||||
* @return 1..4
|
||||
* @draft ICU 78
|
||||
*/
|
||||
#define U8_LENGTH_FROM_LEAD_BYTE_UNSAFE(leadByte) (U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte) + 1)
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Get a code point from a string at a random-access offset,
|
||||
* without changing the offset.
|
||||
@@ -517,7 +543,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
|
||||
if(U8_IS_TRAIL(__t1)) { \
|
||||
++(i); \
|
||||
} \
|
||||
} else /* c>=0xf0 */ { \
|
||||
} else /* b>=0xf0 */ { \
|
||||
if(U8_IS_VALID_LEAD4_AND_T1(__b, __t1) && \
|
||||
++(i)!=(length) && U8_IS_TRAIL((s)[i]) && \
|
||||
++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \
|
||||
@@ -683,7 +709,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i);
|
||||
*/
|
||||
#define U8_PREV_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
|
||||
(c)=(uint8_t)(s)[--(i)]; \
|
||||
if(U8_IS_TRAIL(c)) { \
|
||||
if(!U8_IS_SINGLE(c)) { \
|
||||
uint8_t __b, __count=1, __shift=6; \
|
||||
\
|
||||
/* c is a trail byte */ \
|
||||
|
||||
@@ -385,8 +385,10 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[];
|
||||
/* each following branch falls through to the next one */ \
|
||||
case 3: \
|
||||
(c)=((c)<<6)|((s)[(i)++]&0x3f); \
|
||||
U_FALLTHROUGH; \
|
||||
case 2: \
|
||||
(c)=((c)<<6)|((s)[(i)++]&0x3f); \
|
||||
U_FALLTHROUGH; \
|
||||
case 1: \
|
||||
(c)=((c)<<6)|((s)[(i)++]&0x3f); \
|
||||
/* no other branches to optimize switch() */ \
|
||||
|
||||
+2677
File diff suppressed because it is too large.
Load diff
+161
@@ -0,0 +1,161 @@
|
||||
// © 2025 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: https://www.unicode.org/copyright.html
|
||||
|
||||
// utfstring.h
|
||||
// created: 2025jul18 Markus W. Scherer
|
||||
|
||||
#ifndef __UTFSTRING_H__
|
||||
#define __UTFSTRING_H__
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API || !defined(UTYPES_H)
|
||||
|
||||
#include "unicode/utf16.h"
|
||||
|
||||
/**
|
||||
* \file
|
||||
* \brief C++ header-only API: C++ string helper functions.
|
||||
*/
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
|
||||
namespace U_HEADER_ONLY_NAMESPACE {
|
||||
namespace utfstring {
|
||||
|
||||
// Write code points to strings -------------------------------------------- ***
|
||||
|
||||
#ifndef U_IN_DOXYGEN
|
||||
namespace prv {
|
||||
|
||||
// This function, and the public wrappers,
|
||||
// want to be U_FORCE_INLINE but the gcc-debug-build-and-test CI check failed with
|
||||
// error: ‘always_inline’ function might not be inlinable [-Werror=attributes]
|
||||
template<typename StringClass, bool validate>
|
||||
inline StringClass &appendCodePoint(StringClass &s, uint32_t c) {
|
||||
using Unit = typename StringClass::value_type;
|
||||
if constexpr (sizeof(Unit) == 1) {
|
||||
// UTF-8: Similar to U8_APPEND().
|
||||
if (c <= 0x7f) {
|
||||
s.push_back(static_cast<Unit>(c));
|
||||
} else {
|
||||
Unit buf[4];
|
||||
uint8_t len;
|
||||
if (c <= 0x7ff) {
|
||||
len = 2;
|
||||
buf[2] = (c >> 6) | 0xc0;
|
||||
} else {
|
||||
if (validate ?
|
||||
c < 0xd800 ||
|
||||
(c < 0xe000 || c > 0x10ffff ? (c = 0xfffd, true) : c <= 0xffff) :
|
||||
c <= 0xffff) {
|
||||
len = 3;
|
||||
buf[1] = (c >> 12) | 0xe0;
|
||||
} else {
|
||||
len = 4;
|
||||
buf[0] = (c >> 18) | 0xf0;
|
||||
buf[1] = ((c >> 12) & 0x3f) | 0x80;
|
||||
}
|
||||
buf[2] = ((c >> 6) & 0x3f) | 0x80;
|
||||
}
|
||||
buf[3] = (c & 0x3f) | 0x80;
|
||||
s.append(buf + 4 - len, len);
|
||||
}
|
||||
} else if constexpr (sizeof(Unit) == 2) {
|
||||
// UTF-16: Similar to U16_APPEND().
|
||||
if (validate ?
|
||||
c < 0xd800 || (c < 0xe000 || c > 0x10ffff ? (c = 0xfffd, true) : c <= 0xffff) :
|
||||
c <= 0xffff) {
|
||||
s.push_back(static_cast<Unit>(c));
|
||||
} else {
|
||||
Unit buf[2] = { U16_LEAD(c), U16_TRAIL(c) };
|
||||
s.append(buf, 2);
|
||||
}
|
||||
} else {
|
||||
// UTF-32
|
||||
s.push_back(!validate || U_IS_SCALAR_VALUE(c) ? c : 0xfffd);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
} // namespace prv
|
||||
#endif // U_IN_DOXYGEN
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Appends the code point to the string.
|
||||
* Appends the U+FFFD replacement character instead if c is not a scalar value.
|
||||
* See https://www.unicode.org/glossary/#unicode_scalar_value
|
||||
*
|
||||
* @tparam StringClass A version of std::basic_string (or a compatible type)
|
||||
* @param s The string to append to
|
||||
* @param c The code point to append
|
||||
* @return s
|
||||
* @draft ICU 78
|
||||
* @see U_IS_SCALAR_VALUE
|
||||
*/
|
||||
template<typename StringClass>
|
||||
inline StringClass &appendOrFFFD(StringClass &s, UChar32 c) {
|
||||
return prv::appendCodePoint<StringClass, true>(s, c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the code point to the string.
|
||||
* The code point must be a scalar value; otherwise the behavior is undefined.
|
||||
* See https://www.unicode.org/glossary/#unicode_scalar_value
|
||||
*
|
||||
* @tparam StringClass A version of std::basic_string (or a compatible type)
|
||||
* @param s The string to append to
|
||||
* @param c The code point to append (must be a scalar value)
|
||||
* @return s
|
||||
* @draft ICU 78
|
||||
* @see U_IS_SCALAR_VALUE
|
||||
*/
|
||||
template<typename StringClass>
|
||||
inline StringClass &appendUnsafe(StringClass &s, UChar32 c) {
|
||||
return prv::appendCodePoint<StringClass, false>(s, c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the code point as a string of code units.
|
||||
* Returns the U+FFFD replacement character instead if c is not a scalar value.
|
||||
* See https://www.unicode.org/glossary/#unicode_scalar_value
|
||||
*
|
||||
* @tparam StringClass A version of std::basic_string (or a compatible type)
|
||||
* @param c The code point
|
||||
* @return the string of c's code units
|
||||
* @draft ICU 78
|
||||
* @see U_IS_SCALAR_VALUE
|
||||
*/
|
||||
template<typename StringClass>
|
||||
inline StringClass encodeOrFFFD(UChar32 c) {
|
||||
StringClass s;
|
||||
prv::appendCodePoint<StringClass, true>(s, c);
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the code point as a string of code units.
|
||||
* The code point must be a scalar value; otherwise the behavior is undefined.
|
||||
* See https://www.unicode.org/glossary/#unicode_scalar_value
|
||||
*
|
||||
* @tparam StringClass A version of std::basic_string (or a compatible type)
|
||||
* @param c The code point
|
||||
* @return the string of c's code units
|
||||
* @draft ICU 78
|
||||
* @see U_IS_SCALAR_VALUE
|
||||
*/
|
||||
template<typename StringClass>
|
||||
inline StringClass encodeUnsafe(UChar32 c) {
|
||||
StringClass s;
|
||||
prv::appendCodePoint<StringClass, false>(s, c);
|
||||
return s;
|
||||
}
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
} // namespace utfstring
|
||||
} // namespace U_HEADER_ONLY_NAMESPACE
|
||||
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
|
||||
#endif // __UTFSTRING_H__
|
||||
+79
@@ -384,6 +384,85 @@ typedef double UDate;
|
||||
#define U_TOOLUTIL_API U_IMPORT
|
||||
#endif
|
||||
|
||||
#ifndef U_FORCE_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* \def U_DATA_API_CLASS
|
||||
* Set to export library symbols from inside the stubdata library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_COMMON_API_CLASS
|
||||
* Set to export library symbols from inside the common library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_I18N_API_CLASS
|
||||
* Set to export library symbols from inside the i18n library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_LAYOUT_API_CLASS
|
||||
* Set to export library symbols from inside the layout engine library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_LAYOUTEX_API_CLASS
|
||||
* Set to export library symbols from inside the layout extensions library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_IO_API_CLASS
|
||||
* Set to export library symbols from inside the ustdio library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
/**
|
||||
* \def U_TOOLUTIL_API_CLASS
|
||||
* Set to export library symbols from inside the toolutil library,
|
||||
* and to import them from outside, to be used on a class.
|
||||
* @draft ICU 78
|
||||
*/
|
||||
|
||||
// When used on Windows, the U_..._API macros expand to __declspec(dllexport)
|
||||
// and __declspec(dllimport), which when used on a class results in all members
|
||||
// of the class being exported, including private members, which is problematic
|
||||
// for classes that have private members that can't be exported (such as
|
||||
// templates from the standard library):
|
||||
//
|
||||
// https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4251
|
||||
//
|
||||
#if U_PLATFORM_HAS_WIN32_API
|
||||
#define U_DATA_API_CLASS
|
||||
#define U_COMMON_API_CLASS
|
||||
#define U_I18N_API_CLASS
|
||||
#define U_LAYOUT_API_CLASS
|
||||
#define U_LAYOUTEX_API_CLASS
|
||||
#define U_IO_API_CLASS
|
||||
#define U_TOOLUTIL_API_CLASS
|
||||
#else
|
||||
#define U_DATA_API_CLASS U_DATA_API
|
||||
#define U_COMMON_API_CLASS U_COMMON_API
|
||||
#define U_I18N_API_CLASS U_I18N_API
|
||||
#define U_LAYOUT_API_CLASS U_LAYOUT_API
|
||||
#define U_LAYOUTEX_API_CLASS U_LAYOUTEX_API
|
||||
#define U_IO_API_CLASS U_IO_API
|
||||
#define U_TOOLUTIL_API_CLASS U_TOOLUTIL_API
|
||||
#endif
|
||||
|
||||
#endif // U_FORCE_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* \def U_STANDARD_CPP_NAMESPACE
|
||||
* Control of C++ Namespace
|
||||
|
||||
+6
-6
@@ -53,13 +53,13 @@
|
||||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
#define U_ICU_VERSION_MAJOR_NUM 77
|
||||
#define U_ICU_VERSION_MAJOR_NUM 78
|
||||
|
||||
/** 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 2
|
||||
|
||||
/** The current ICU patchlevel version as an integer.
|
||||
* This value will change in the subsequent releases of ICU
|
||||
@@ -79,7 +79,7 @@
|
||||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.6
|
||||
*/
|
||||
#define U_ICU_VERSION_SUFFIX _77
|
||||
#define U_ICU_VERSION_SUFFIX _78
|
||||
|
||||
/**
|
||||
* \def U_DEF2_ICU_ENTRY_POINT_RENAME
|
||||
@@ -132,7 +132,7 @@
|
||||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
#define U_ICU_VERSION "77.1"
|
||||
#define U_ICU_VERSION "78.2"
|
||||
|
||||
/**
|
||||
* The current ICU library major version number as a string, for library name suffixes.
|
||||
@@ -145,13 +145,13 @@
|
||||
*
|
||||
* @stable ICU 2.6
|
||||
*/
|
||||
#define U_ICU_VERSION_SHORT "77"
|
||||
#define U_ICU_VERSION_SHORT "78"
|
||||
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/** Data version in ICU4C.
|
||||
* @internal ICU 4.4 Internal Use Only
|
||||
**/
|
||||
#define U_ICU_DATA_VERSION "77.1"
|
||||
#define U_ICU_DATA_VERSION "78.2"
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
+4
-4
@@ -125,7 +125,6 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
|
||||
U_NAMESPACE_USE
|
||||
# endif
|
||||
|
||||
#ifndef U_FORCE_HIDE_DRAFT_API
|
||||
/**
|
||||
* \def U_HEADER_NESTED_NAMESPACE
|
||||
* Nested namespace used inside U_ICU_NAMESPACE for header-only APIs.
|
||||
@@ -136,7 +135,7 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
|
||||
* this is always "header". Header-only types are not marked for export,
|
||||
* which on Windows already avoids callers linking with library instantiations.
|
||||
*
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
* @see U_HEADER_ONLY_NAMESPACE
|
||||
*/
|
||||
|
||||
@@ -147,9 +146,10 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
|
||||
* "U_ICU_NAMESPACE::header" or "U_ICU_NAMESPACE::internal",
|
||||
* see U_HEADER_NESTED_NAMESPACE for details.
|
||||
*
|
||||
* @draft ICU 76
|
||||
* @stable ICU 76
|
||||
*/
|
||||
|
||||
#ifndef U_FORCE_HIDE_DRAFT_API
|
||||
/**
|
||||
* \def U_ICU_NAMESPACE_OR_INTERNAL
|
||||
* Namespace used for header-only APIs that used to be regular C++ APIs.
|
||||
@@ -159,6 +159,7 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
|
||||
*
|
||||
* @draft ICU 77
|
||||
*/
|
||||
#endif // U_FORCE_HIDE_DRAFT_API
|
||||
|
||||
// The first test is the same as for defining U_EXPORT for Windows.
|
||||
#if defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \
|
||||
@@ -180,7 +181,6 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH];
|
||||
#define U_HEADER_ONLY_NAMESPACE U_ICU_NAMESPACE::U_HEADER_NESTED_NAMESPACE
|
||||
|
||||
namespace U_HEADER_ONLY_NAMESPACE {}
|
||||
#endif // U_FORCE_HIDE_DRAFT_API
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
+3
-3
@@ -974,12 +974,12 @@ void UnicodeSet::_add(const UnicodeString& s) {
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
UnicodeString* t = new UnicodeString(s);
|
||||
if (t == nullptr) { // Check for memory allocation error.
|
||||
LocalPointer<UnicodeString> t(new UnicodeString(s));
|
||||
if (t.isNull()) { // Check for memory allocation error.
|
||||
setToBogus();
|
||||
return;
|
||||
}
|
||||
strings_->sortedInsert(t, compareUnicodeString, ec);
|
||||
strings_->sortedInsert(t.orphan(), compareUnicodeString, ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
setToBogus();
|
||||
}
|
||||
|
||||
+15
-10
@@ -275,20 +275,24 @@ UnicodeString::doExtract(int32_t start, int32_t length,
|
||||
}
|
||||
|
||||
// perform the conversion
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &errorCode);
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
length = static_cast<int32_t>(dest - originalDest);
|
||||
|
||||
// if an overflow occurs, then get the preflighting length
|
||||
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR) {
|
||||
char buffer[1024];
|
||||
|
||||
destLimit=buffer+sizeof(buffer);
|
||||
do {
|
||||
dest=buffer;
|
||||
errorCode=U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &errorCode);
|
||||
bufferStatus=U_ZERO_ERROR;
|
||||
ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus);
|
||||
length += static_cast<int32_t>(dest - buffer);
|
||||
} while(errorCode==U_BUFFER_OVERFLOW_ERROR);
|
||||
} while(bufferStatus==U_BUFFER_OVERFLOW_ERROR);
|
||||
}
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
errorCode = bufferStatus;
|
||||
}
|
||||
|
||||
return u_terminateChars(originalDest, destCapacity, length, &errorCode);
|
||||
@@ -389,17 +393,15 @@ UnicodeString::doCodepageCreate(const char *codepageData,
|
||||
// perform the conversion
|
||||
array = getArrayStart();
|
||||
myTarget = array + length();
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
ucnv_toUnicode(converter, &myTarget, array + getCapacity(),
|
||||
&mySource, mySourceEnd, nullptr, true, &status);
|
||||
&mySource, mySourceEnd, nullptr, true, &bufferStatus);
|
||||
|
||||
// update the conversion parameters
|
||||
setLength(static_cast<int32_t>(myTarget - array));
|
||||
|
||||
// allocate more space and copy data, if needed
|
||||
if(status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
// reset the error code
|
||||
status = U_ZERO_ERROR;
|
||||
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR) {
|
||||
// keep the previous conversion results
|
||||
doCopyArray = true;
|
||||
|
||||
@@ -407,6 +409,9 @@ UnicodeString::doCodepageCreate(const char *codepageData,
|
||||
// try 2 char16_t's per remaining source byte
|
||||
arraySize = static_cast<int32_t>(length() + 2 * (mySourceEnd - mySource));
|
||||
} else {
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
status = bufferStatus;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -74,4 +74,9 @@
|
||||
#define _POSIX_C_SOURCE 200809L
|
||||
#endif
|
||||
|
||||
/* Prevent _XOPEN_SOURCE from breaking build on macOS when aligned_alloc exists. */
|
||||
#if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE)
|
||||
# define _DARWIN_C_SOURCE
|
||||
#endif
|
||||
|
||||
#endif /* __UPOSIXDEFS_H__ */
|
||||
+5
-1
@@ -336,7 +336,7 @@ U_CFUNC uint32_t
|
||||
u_getUnicodeProperties(UChar32 c, int32_t column);
|
||||
|
||||
/**
|
||||
* Get the the maximum values for some enum/int properties.
|
||||
* Get the maximum values for some enum/int properties.
|
||||
* Use the same column numbers as for u_getUnicodeProperties().
|
||||
* The returned value will contain maximum values stored in the same bit fields
|
||||
* as where the enum values are stored in the u_getUnicodeProperties()
|
||||
@@ -500,6 +500,10 @@ ublock_addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode);
|
||||
uprv_getInclusions(const USetAdder *sa, UErrorCode *pErrorCode);
|
||||
*/
|
||||
|
||||
/** @internal for icuexportdata */
|
||||
U_CAPI void U_EXPORT2
|
||||
uprv_addScriptExtensionsCodePoints(const USetAdder *sa, UErrorCode *pErrorCode);
|
||||
|
||||
// TODO: Move this into a different header file (udataswp.h? new unames.h?) so that uprops.h
|
||||
// need not be C-compatible any more.
|
||||
/**
|
||||
|
||||
-2
@@ -120,9 +120,7 @@ public:
|
||||
// No heap allocation. Use only on the stack.
|
||||
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
|
||||
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
|
||||
#if U_HAVE_PLACEMENT_NEW
|
||||
static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete;
|
||||
#endif
|
||||
|
||||
StackUResourceBundle();
|
||||
~StackUResourceBundle();
|
||||
|
||||
+7
-3
@@ -45,11 +45,11 @@ const int32_t SCRIPT_PROPS[] = {
|
||||
// Begin copy-paste output from
|
||||
// tools/trunk/unicode/py/parsescriptmetadata.py
|
||||
0x0040 | RECOMMENDED, // Zyyy
|
||||
0x0308 | RECOMMENDED, // Zinh
|
||||
0x030F | RECOMMENDED, // Zinh
|
||||
0x0628 | RECOMMENDED | RTL, // Arab
|
||||
0x0531 | RECOMMENDED | CASED, // Armn
|
||||
0x0995 | RECOMMENDED, // Beng
|
||||
0x3105 | RECOMMENDED | LB_LETTERS, // Bopo
|
||||
0x3105 | LIMITED_USE | LB_LETTERS, // Bopo
|
||||
0x13C4 | LIMITED_USE | CASED, // Cher
|
||||
0x03E2 | EXCLUSION | CASED, // Copt
|
||||
0x042F | RECOMMENDED | CASED, // Cyrl
|
||||
@@ -223,7 +223,7 @@ const int32_t SCRIPT_PROPS[] = {
|
||||
0x11A5C | EXCLUSION, // Soyo
|
||||
0x11A0B | EXCLUSION, // Zanb
|
||||
0x1180B | EXCLUSION, // Dogr
|
||||
0x11D71 | LIMITED_USE, // Gong
|
||||
0x11D71 | EXCLUSION, // Gong
|
||||
0x11EE5 | EXCLUSION, // Maka
|
||||
0x16E40 | EXCLUSION | CASED, // Medf
|
||||
0x10D12 | LIMITED_USE | RTL, // Rohg
|
||||
@@ -252,6 +252,10 @@ const int32_t SCRIPT_PROPS[] = {
|
||||
0x11BC4 | EXCLUSION, // Sunu
|
||||
0x105C2 | EXCLUSION, // Todr
|
||||
0x11392 | EXCLUSION, // Tutg
|
||||
0x16EA1 | EXCLUSION | CASED, // Berf
|
||||
0x10950 | EXCLUSION | RTL, // Sidt
|
||||
0x1E6D5 | EXCLUSION | LB_LETTERS, // Tayo
|
||||
0x11DC6 | EXCLUSION, // Tols
|
||||
// End copy-paste from parsescriptmetadata.py
|
||||
};
|
||||
|
||||
|
||||
+9
-7
@@ -666,11 +666,12 @@ usprep_prepare( const UStringPrepProfile* profile,
|
||||
*status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return 0;
|
||||
}
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
int32_t b1Len = usprep_map(profile, src, srcLength,
|
||||
b1, s1.getCapacity(), options, parseError, status);
|
||||
s1.releaseBuffer(U_SUCCESS(*status) ? b1Len : 0);
|
||||
b1, s1.getCapacity(), options, parseError, &bufferStatus);
|
||||
s1.releaseBuffer(U_SUCCESS(bufferStatus) ? b1Len : 0);
|
||||
|
||||
if(*status == U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){
|
||||
// redo processing of string
|
||||
/* we do not have enough room so grow the buffer*/
|
||||
b1 = s1.getBuffer(b1Len);
|
||||
@@ -679,12 +680,13 @@ usprep_prepare( const UStringPrepProfile* profile,
|
||||
return 0;
|
||||
}
|
||||
|
||||
*status = U_ZERO_ERROR; // reset error
|
||||
bufferStatus = U_ZERO_ERROR; // reset error
|
||||
b1Len = usprep_map(profile, src, srcLength,
|
||||
b1, s1.getCapacity(), options, parseError, status);
|
||||
s1.releaseBuffer(U_SUCCESS(*status) ? b1Len : 0);
|
||||
b1, s1.getCapacity(), options, parseError, &bufferStatus);
|
||||
s1.releaseBuffer(U_SUCCESS(bufferStatus) ? b1Len : 0);
|
||||
}
|
||||
if(U_FAILURE(*status)){
|
||||
if(U_FAILURE(bufferStatus)){
|
||||
*status = bufferStatus;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+16
-16
@@ -95,15 +95,14 @@ _strToWCS(wchar_t *dest,
|
||||
pSrcLimit = pSrc + srcLength;
|
||||
|
||||
for(;;) {
|
||||
/* reset the error state */
|
||||
*pErrorCode = U_ZERO_ERROR;
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
|
||||
/* convert to chars using default converter */
|
||||
ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,nullptr,(UBool)(pSrc==pSrcLimit),pErrorCode);
|
||||
ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,nullptr,(UBool)(pSrc==pSrcLimit),&bufferStatus);
|
||||
count =(tempBuf - saveBuf);
|
||||
|
||||
/* This should rarely occur */
|
||||
if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR){
|
||||
tempBuf = saveBuf;
|
||||
|
||||
/* we don't have enough room on the stack grow the buffer */
|
||||
@@ -119,16 +118,15 @@ _strToWCS(wchar_t *dest,
|
||||
saveBuf = tempBuf;
|
||||
tempBufLimit = tempBuf + tempBufCapacity;
|
||||
tempBuf = tempBuf + count;
|
||||
|
||||
} else {
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*pErrorCode = bufferStatus;
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(U_FAILURE(*pErrorCode)){
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* done with conversion null terminate the char buffer */
|
||||
if(count>=tempBufCapacity){
|
||||
tempBuf = saveBuf;
|
||||
@@ -441,20 +439,22 @@ _strFromWCS( char16_t *dest,
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
|
||||
*pErrorCode = U_ZERO_ERROR;
|
||||
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
|
||||
/* convert to stack buffer*/
|
||||
ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,nullptr,(UBool)(pCSrc==pCSrcLimit),pErrorCode);
|
||||
|
||||
ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,nullptr,(UBool)(pCSrc==pCSrcLimit),&bufferStatus);
|
||||
|
||||
/* increment count to number written to stack */
|
||||
count+= pTarget - target;
|
||||
|
||||
if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){
|
||||
|
||||
if(bufferStatus==U_BUFFER_OVERFLOW_ERROR){
|
||||
target = uStack;
|
||||
pTarget = uStack;
|
||||
pTargetLimit = uStack + _STACK_BUFFER_CAPACITY;
|
||||
} else {
|
||||
if (U_FAILURE(bufferStatus)) {
|
||||
*pErrorCode = bufferStatus;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -872,11 +872,12 @@ UTS46::processLabel(UnicodeString &dest,
|
||||
buffer[1]=0x6e;
|
||||
buffer[2]=0x2d;
|
||||
buffer[3]=0x2d;
|
||||
UErrorCode punycodeErrorCode=U_ZERO_ERROR;
|
||||
int32_t punycodeLength=u_strToPunycode(label, labelLength,
|
||||
buffer+4, punycode.getCapacity()-4,
|
||||
nullptr, &errorCode);
|
||||
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
|
||||
errorCode=U_ZERO_ERROR;
|
||||
nullptr, &punycodeErrorCode);
|
||||
if(punycodeErrorCode==U_BUFFER_OVERFLOW_ERROR) {
|
||||
punycodeErrorCode=U_ZERO_ERROR;
|
||||
punycode.releaseBuffer(4);
|
||||
buffer=punycode.getBuffer(4+punycodeLength);
|
||||
if(buffer==nullptr) {
|
||||
@@ -885,11 +886,12 @@ UTS46::processLabel(UnicodeString &dest,
|
||||
}
|
||||
punycodeLength=u_strToPunycode(label, labelLength,
|
||||
buffer+4, punycode.getCapacity()-4,
|
||||
nullptr, &errorCode);
|
||||
nullptr, &punycodeErrorCode);
|
||||
}
|
||||
punycodeLength+=4;
|
||||
punycode.releaseBuffer(punycodeLength);
|
||||
if(U_FAILURE(errorCode)) {
|
||||
if(U_FAILURE(punycodeErrorCode)) {
|
||||
errorCode = punycodeErrorCode;
|
||||
return destLabelLength;
|
||||
}
|
||||
if(punycodeLength>63) {
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+18
-21
@@ -140,8 +140,8 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
int32_t initialRaw, initialDst;
|
||||
UnicodeString initialName;
|
||||
|
||||
AnnualTimeZoneRule *ar1 = nullptr;
|
||||
AnnualTimeZoneRule *ar2 = nullptr;
|
||||
LocalPointer<AnnualTimeZoneRule> ar1;
|
||||
LocalPointer<AnnualTimeZoneRule> ar2;
|
||||
UnicodeString name;
|
||||
|
||||
UBool avail;
|
||||
@@ -179,8 +179,8 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
// zone to return wrong offset after the transition.
|
||||
// When we encounter such case, we do not inspect next next
|
||||
// transition for another rule.
|
||||
ar1 = new AnnualTimeZoneRule(name, initialRaw, tr.getTo()->getDSTSavings(),
|
||||
dtr, year, AnnualTimeZoneRule::MAX_YEAR);
|
||||
ar1.adoptInstead(new AnnualTimeZoneRule(name, initialRaw, tr.getTo()->getDSTSavings(),
|
||||
dtr, year, AnnualTimeZoneRule::MAX_YEAR));
|
||||
|
||||
if (tr.getTo()->getRawOffset() == initialRaw) {
|
||||
// Get the next next transition
|
||||
@@ -200,8 +200,8 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
// Generate another DOW rule
|
||||
dtr = new DateTimeRule(month, weekInMonth, dow, mid, DateTimeRule::WALL_TIME);
|
||||
tr.getTo()->getName(name);
|
||||
ar2 = new AnnualTimeZoneRule(name, tr.getTo()->getRawOffset(), tr.getTo()->getDSTSavings(),
|
||||
dtr, year - 1, AnnualTimeZoneRule::MAX_YEAR);
|
||||
ar2.adoptInstead(new AnnualTimeZoneRule(name, tr.getTo()->getRawOffset(), tr.getTo()->getDSTSavings(),
|
||||
dtr, year - 1, AnnualTimeZoneRule::MAX_YEAR));
|
||||
|
||||
// Make sure this rule can be applied to the specified date
|
||||
avail = ar2->getPreviousStart(date, tr.getFrom()->getRawOffset(), tr.getFrom()->getDSTSavings(), true, d);
|
||||
@@ -209,13 +209,12 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
|| initialRaw != tr.getTo()->getRawOffset()
|
||||
|| initialDst != tr.getTo()->getDSTSavings()) {
|
||||
// We cannot use this rule as the second transition rule
|
||||
delete ar2;
|
||||
ar2 = nullptr;
|
||||
ar2.adoptInstead(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ar2 == nullptr) {
|
||||
if (ar2.isNull()) {
|
||||
// Try previous transition
|
||||
avail = getPreviousTransition(date, true, tr);
|
||||
if (avail) {
|
||||
@@ -234,23 +233,21 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
|
||||
// second rule raw/dst offsets should match raw/dst offsets
|
||||
// at the given time
|
||||
ar2 = new AnnualTimeZoneRule(name, initialRaw, initialDst,
|
||||
dtr, ar1->getStartYear() - 1, AnnualTimeZoneRule::MAX_YEAR);
|
||||
ar2.adoptInstead(new AnnualTimeZoneRule(name, initialRaw, initialDst,
|
||||
dtr, ar1->getStartYear() - 1, AnnualTimeZoneRule::MAX_YEAR));
|
||||
|
||||
// Check if this rule start after the first rule after the specified date
|
||||
avail = ar2->getNextStart(date, tr.getFrom()->getRawOffset(), tr.getFrom()->getDSTSavings(), false, d);
|
||||
if (!avail || d <= nextTransitionTime) {
|
||||
// We cannot use this rule as the second transition rule
|
||||
delete ar2;
|
||||
ar2 = nullptr;
|
||||
ar2.adoptInstead(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ar2 == nullptr) {
|
||||
if (ar2.isNull()) {
|
||||
// Cannot find a good pair of AnnualTimeZoneRule
|
||||
delete ar1;
|
||||
ar1 = nullptr;
|
||||
ar1.adoptInstead(nullptr);
|
||||
} else {
|
||||
// The initial rule should represent the rule before the previous transition
|
||||
ar1->getName(initialName);
|
||||
@@ -278,13 +275,13 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
|
||||
initial = new InitialTimeZoneRule(initialName, initialRaw, initialDst);
|
||||
|
||||
// Set the standard and daylight saving rules
|
||||
if (ar1 != nullptr && ar2 != nullptr) {
|
||||
if (ar1.isValid() && ar2.isValid()) {
|
||||
if (ar1->getDSTSavings() != 0) {
|
||||
dst = ar1;
|
||||
std = ar2;
|
||||
dst = ar1.orphan();
|
||||
std = ar2.orphan();
|
||||
} else {
|
||||
std = ar1;
|
||||
dst = ar2;
|
||||
std = ar1.orphan();
|
||||
dst = ar2.orphan();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+46
-22
@@ -702,7 +702,9 @@ fAreAllFieldsSet(false),
|
||||
fAreFieldsVirtuallySet(false),
|
||||
fLenient(true),
|
||||
fRepeatedWallTime(UCAL_WALLTIME_LAST),
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST)
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST),
|
||||
validLocale(Locale::getRoot()),
|
||||
actualLocale(Locale::getRoot())
|
||||
{
|
||||
clear();
|
||||
if (U_FAILURE(success)) {
|
||||
@@ -725,7 +727,9 @@ fAreAllFieldsSet(false),
|
||||
fAreFieldsVirtuallySet(false),
|
||||
fLenient(true),
|
||||
fRepeatedWallTime(UCAL_WALLTIME_LAST),
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST)
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST),
|
||||
validLocale(Locale::getRoot()),
|
||||
actualLocale(Locale::getRoot())
|
||||
{
|
||||
LocalPointer<TimeZone> zone(adoptZone, success);
|
||||
if (U_FAILURE(success)) {
|
||||
@@ -755,7 +759,9 @@ fAreAllFieldsSet(false),
|
||||
fAreFieldsVirtuallySet(false),
|
||||
fLenient(true),
|
||||
fRepeatedWallTime(UCAL_WALLTIME_LAST),
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST)
|
||||
fSkippedWallTime(UCAL_WALLTIME_LAST),
|
||||
validLocale(Locale::getRoot()),
|
||||
actualLocale(Locale::getRoot())
|
||||
{
|
||||
if (U_FAILURE(success)) {
|
||||
return;
|
||||
@@ -774,8 +780,6 @@ fSkippedWallTime(UCAL_WALLTIME_LAST)
|
||||
Calendar::~Calendar()
|
||||
{
|
||||
delete fZone;
|
||||
delete actualLocale;
|
||||
delete validLocale;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
@@ -814,10 +818,8 @@ Calendar::operator=(const Calendar &right)
|
||||
fWeekendCease = right.fWeekendCease;
|
||||
fWeekendCeaseMillis = right.fWeekendCeaseMillis;
|
||||
fNextStamp = right.fNextStamp;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
locBased.setLocaleIDs(right.validLocale, right.actualLocale, status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
validLocale = right.validLocale;
|
||||
actualLocale = right.actualLocale;
|
||||
}
|
||||
|
||||
return *this;
|
||||
@@ -1236,16 +1238,31 @@ Calendar::set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t m
|
||||
// -------------------------------------
|
||||
int32_t Calendar::getRelatedYear(UErrorCode &status) const
|
||||
{
|
||||
return get(UCAL_EXTENDED_YEAR, status);
|
||||
int32_t year = get(UCAL_EXTENDED_YEAR, status);
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
if (uprv_add32_overflow(year, getRelatedYearDifference(), &year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
return year;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
void Calendar::setRelatedYear(int32_t year)
|
||||
{
|
||||
// set extended year
|
||||
if (uprv_add32_overflow(year, -getRelatedYearDifference(), &year)) {
|
||||
return;
|
||||
}
|
||||
set(UCAL_EXTENDED_YEAR, year);
|
||||
}
|
||||
|
||||
int32_t Calendar::getRelatedYearDifference() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
|
||||
void
|
||||
@@ -1529,9 +1546,15 @@ void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode& ec) {
|
||||
ec = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
int8_t dayOfWeek;
|
||||
Grego::dayToFields(julianDay, fGregorianYear, fGregorianMonth,
|
||||
fGregorianDayOfMonth,
|
||||
dayOfWeek,
|
||||
fGregorianDayOfYear, ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
return;
|
||||
}
|
||||
internalSet(UCAL_DAY_OF_WEEK, dayOfWeek);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1560,8 +1583,7 @@ void Calendar::computeWeekFields(UErrorCode &ec) {
|
||||
}
|
||||
|
||||
// Compute day of week: JD 0 = Monday
|
||||
int32_t dayOfWeek = julianDayToDayOfWeek(fFields[UCAL_JULIAN_DAY]);
|
||||
internalSet(UCAL_DAY_OF_WEEK, dayOfWeek);
|
||||
int32_t dayOfWeek = fFields[UCAL_DAY_OF_WEEK];
|
||||
int32_t firstDayOfWeek = getFirstDayOfWeek();
|
||||
// Calculate 1-based localized day of week
|
||||
int32_t dowLocal = dayOfWeek - firstDayOfWeek + 1;
|
||||
@@ -4115,9 +4137,8 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode&
|
||||
}
|
||||
|
||||
if (U_SUCCESS(status)) {
|
||||
U_LOCALE_BASED(locBased,*this);
|
||||
locBased.setLocaleIDs(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status),
|
||||
ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status), status);
|
||||
validLocale = Locale(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status));
|
||||
actualLocale = Locale(ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status));
|
||||
} else {
|
||||
status = U_USING_FALLBACK_WARNING;
|
||||
return;
|
||||
@@ -4251,17 +4272,20 @@ int32_t Calendar::internalGetMonth(UErrorCode& status) const {
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
if (resolveFields(kMonthPrecedence) == UCAL_MONTH) {
|
||||
return internalGet(UCAL_MONTH, status);
|
||||
if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) {
|
||||
return internalGet(UCAL_ORDINAL_MONTH);
|
||||
}
|
||||
return internalGet(UCAL_ORDINAL_MONTH, status);
|
||||
return internalGet(UCAL_MONTH);
|
||||
}
|
||||
|
||||
int32_t Calendar::internalGetMonth(int32_t defaultValue, UErrorCode& /* status */) const {
|
||||
if (resolveFields(kMonthPrecedence) == UCAL_MONTH) {
|
||||
return internalGet(UCAL_MONTH, defaultValue);
|
||||
int32_t Calendar::internalGetMonth(int32_t defaultValue, UErrorCode& status) const {
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
return internalGet(UCAL_ORDINAL_MONTH);
|
||||
if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) {
|
||||
return internalGet(UCAL_ORDINAL_MONTH);
|
||||
}
|
||||
return internalGet(UCAL_MONTH, defaultValue);
|
||||
}
|
||||
|
||||
BasicTimeZone*
|
||||
|
||||
Vendored
+23
-3
@@ -101,8 +101,8 @@ CECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) cons
|
||||
// Calendar system Conversion methods...
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
void
|
||||
CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day, UErrorCode& status)
|
||||
namespace {
|
||||
void jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day, int32_t& doy, UErrorCode& status)
|
||||
{
|
||||
int32_t c4; // number of 4 year cycle (1461 days)
|
||||
int32_t r4; // remainder of 4 year cycle, always positive
|
||||
@@ -115,10 +115,30 @@ CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int3
|
||||
|
||||
year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle>
|
||||
|
||||
int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year
|
||||
doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year
|
||||
|
||||
month = doy / 30; // 30 -> Coptic/Ethiopic month length up to 12th month
|
||||
day = (doy % 30) + 1; // 1-based days in a month
|
||||
doy++; // 1-based days in a year.
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void
|
||||
CECalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
|
||||
{
|
||||
int32_t eyear, month, day, doy;
|
||||
jdToCE(julianDay, getJDEpochOffset(), eyear, month, day, doy, status);
|
||||
if (U_FAILURE(status)) return;
|
||||
int32_t era = extendedYearToEra(eyear);
|
||||
int32_t year = extendedYearToYear(eyear);
|
||||
|
||||
internalSet(UCAL_EXTENDED_YEAR, eyear);
|
||||
internalSet(UCAL_ERA, era);
|
||||
internalSet(UCAL_YEAR, year);
|
||||
internalSet(UCAL_MONTH, month);
|
||||
internalSet(UCAL_ORDINAL_MONTH, month);
|
||||
internalSet(UCAL_DATE, day);
|
||||
internalSet(UCAL_DAY_OF_YEAR, doy);
|
||||
}
|
||||
|
||||
static const char* kMonthCode13 = "M13";
|
||||
|
||||
Vendored
+14
-9
@@ -99,6 +99,12 @@ protected:
|
||||
*/
|
||||
virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override;
|
||||
|
||||
/**
|
||||
* Compute fields from the JD
|
||||
* @internal
|
||||
*/
|
||||
virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
|
||||
|
||||
protected:
|
||||
/**
|
||||
* The Coptic and Ethiopic calendars differ only in their epochs.
|
||||
@@ -109,17 +115,16 @@ protected:
|
||||
virtual int32_t getJDEpochOffset() const = 0;
|
||||
|
||||
/**
|
||||
* Convert a Julian day to an Coptic/Ethiopic year, month and day
|
||||
*
|
||||
* @param julianDay the Julian day
|
||||
* @param jdEpochOffset the epoch offset from Julian epoch
|
||||
* @param year receives the extended year
|
||||
* @param month receives the month
|
||||
* @param date receives the day
|
||||
* Compute the era from extended year.
|
||||
* @internal
|
||||
*/
|
||||
static void jdToCE(int32_t julianDay, int32_t jdEpochOffset,
|
||||
int32_t& year, int32_t& month, int32_t& day, UErrorCode& status);
|
||||
virtual int32_t extendedYearToEra(int32_t extendedYear) const = 0;
|
||||
|
||||
/**
|
||||
* Compute the year from extended year.
|
||||
* @internal
|
||||
*/
|
||||
virtual int32_t extendedYearToYear(int32_t extendedYear) const = 0;
|
||||
};
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
+64
-52
@@ -60,13 +60,18 @@ static icu::CalendarCache *gNewYearCache = nullptr;
|
||||
static icu::TimeZone *gAstronomerTimeZone = nullptr;
|
||||
static icu::UInitOnce gAstronomerTimeZoneInitOnce {};
|
||||
|
||||
/**
|
||||
* The start year of the Chinese calendar, the 61st year of the reign
|
||||
* of Huang Di. Some sources use the first year of his reign,
|
||||
* resulting in EXTENDED_YEAR values 60 years greater and ERA (cycle)
|
||||
* values one greater.
|
||||
/*
|
||||
* The start year of the Chinese calendar, 1CE.
|
||||
*/
|
||||
static const int32_t CHINESE_EPOCH_YEAR = -2636; // Gregorian year
|
||||
static const int32_t CHINESE_EPOCH_YEAR = 1; // Gregorian year
|
||||
//
|
||||
/**
|
||||
* The start year of the Chinese calendar for cycle calculation,
|
||||
* the 61st year of the reign of Huang Di.
|
||||
* Some sources use the first year of his reign,
|
||||
* resulting in ERA (cycle) values one greater.
|
||||
*/
|
||||
static const int32_t CYCLE_EPOCH = -2636; // Gregorian year
|
||||
|
||||
/**
|
||||
* The offset from GMT in milliseconds at which we perform astronomical
|
||||
@@ -226,16 +231,12 @@ int32_t ChineseCalendar::handleGetExtendedYear(UErrorCode& status) {
|
||||
// adjust to the instance specific epoch
|
||||
int32_t cycle = internalGet(UCAL_ERA, 1);
|
||||
year = internalGet(UCAL_YEAR, 1);
|
||||
const Setting setting = getSetting(status);
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
// Handle int32 overflow calculation for
|
||||
// year = year + (cycle-1) * 60 -(fEpochYear - CHINESE_EPOCH_YEAR)
|
||||
// year = year + (cycle-1) * 60 + CYCLE_EPOCH - CHINESE_EPOCH_YEAR
|
||||
if (uprv_add32_overflow(cycle, -1, &cycle) || // 0-based cycle
|
||||
uprv_mul32_overflow(cycle, 60, &cycle) ||
|
||||
uprv_add32_overflow(year, cycle, &year) ||
|
||||
uprv_add32_overflow(year, -(setting.epochYear-CHINESE_EPOCH_YEAR),
|
||||
uprv_add32_overflow(year, CYCLE_EPOCH-CHINESE_EPOCH_YEAR,
|
||||
&year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
@@ -362,12 +363,7 @@ int64_t ChineseCalendar::handleComputeMonthStartWithLeap(int32_t eyear, int32_t
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
int32_t gyear;
|
||||
if (uprv_add32_overflow(eyear, setting.epochYear - 1, &gyear)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t gyear = eyear;
|
||||
int32_t theNewYear = newYear(setting, gyear, status);
|
||||
int32_t newMoon = newMoonNear(setting.zoneAstroCalc, theNewYear + month * 29, true, status);
|
||||
if (U_FAILURE(status)) {
|
||||
@@ -791,10 +787,20 @@ struct MonthInfo computeMonthInfo(
|
||||
return output;
|
||||
}
|
||||
if (days < solsticeAfter) {
|
||||
solsticeBefore = winterSolstice(setting, gyear - 1, status);
|
||||
int32_t gprevious_year;
|
||||
if (uprv_add32_overflow(gyear, -1, &gprevious_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return output;
|
||||
}
|
||||
solsticeBefore = winterSolstice(setting, gprevious_year, status);
|
||||
} else {
|
||||
solsticeBefore = solsticeAfter;
|
||||
solsticeAfter = winterSolstice(setting, gyear + 1, status);
|
||||
int32_t gnext_year;
|
||||
if (uprv_add32_overflow(gyear, 1, &gnext_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return output;
|
||||
}
|
||||
solsticeAfter = winterSolstice(setting, gnext_year, status);
|
||||
}
|
||||
if (!(solsticeBefore <= days && days < solsticeAfter)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
@@ -824,7 +830,12 @@ struct MonthInfo computeMonthInfo(
|
||||
return output;
|
||||
}
|
||||
if (days < theNewYear) {
|
||||
theNewYear = newYear(setting, gyear-1, status);
|
||||
int32_t gprevious_year;
|
||||
if (uprv_add32_overflow(gyear, -1, &gprevious_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return output;
|
||||
}
|
||||
theNewYear = newYear(setting, gprevious_year, status);
|
||||
if (U_FAILURE(status)) {
|
||||
return output;
|
||||
}
|
||||
@@ -897,12 +908,21 @@ void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode & status
|
||||
hasLeapMonthBetweenWinterSolstices = monthInfo.hasLeapMonthBetweenWinterSolstices;
|
||||
|
||||
// Extended year and cycle year is based on the epoch year
|
||||
int32_t eyear = gyear - setting.epochYear;
|
||||
int32_t cycle_year = gyear - CHINESE_EPOCH_YEAR;
|
||||
int32_t eyear;
|
||||
int32_t cycle_year;
|
||||
if (uprv_add32_overflow(gyear, -CHINESE_EPOCH_YEAR, &eyear) ||
|
||||
uprv_add32_overflow(gyear, -CYCLE_EPOCH, &cycle_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
if (monthInfo.month < 11 ||
|
||||
gmonth >= UCAL_JULY) {
|
||||
eyear++;
|
||||
cycle_year++;
|
||||
// forward to next year
|
||||
if (uprv_add32_overflow(eyear, 1, &eyear) ||
|
||||
uprv_add32_overflow(cycle_year, 1, &cycle_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
}
|
||||
int32_t dayOfMonth = days - monthInfo.thisMoon + 1;
|
||||
|
||||
@@ -919,7 +939,12 @@ void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode & status
|
||||
return;
|
||||
}
|
||||
if (days < theNewYear) {
|
||||
theNewYear = newYear(setting, gyear-1, status);
|
||||
int32_t gprevious_year;
|
||||
if (uprv_add32_overflow(gyear, -1, &gprevious_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return;
|
||||
}
|
||||
theNewYear = newYear(setting, gprevious_year, status);
|
||||
}
|
||||
if (U_FAILURE(status)) {
|
||||
return;
|
||||
@@ -982,7 +1007,12 @@ int32_t newYear(const icu::ChineseCalendar::Setting& setting,
|
||||
|
||||
if (cacheValue == 0) {
|
||||
|
||||
int32_t solsticeBefore= winterSolstice(setting, gyear - 1, status);
|
||||
int32_t gprevious_year;
|
||||
if (uprv_add32_overflow(gyear, -1, &gprevious_year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
int32_t solsticeBefore= winterSolstice(setting, gprevious_year, status);
|
||||
int32_t solsticeAfter = winterSolstice(setting, gyear, status);
|
||||
int32_t newMoon1 = newMoonNear(timeZone, solsticeBefore + 1, true, status);
|
||||
int32_t newMoon2 = newMoonNear(timeZone, newMoon1 + SYNODIC_GAP, true, status);
|
||||
@@ -1074,27 +1104,6 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dayOfMonth, int32_t d
|
||||
}
|
||||
}
|
||||
|
||||
constexpr uint32_t kChineseRelatedYearDiff = -2637;
|
||||
|
||||
int32_t ChineseCalendar::getRelatedYear(UErrorCode &status) const
|
||||
{
|
||||
int32_t year = get(UCAL_EXTENDED_YEAR, status);
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
if (uprv_add32_overflow(year, kChineseRelatedYearDiff, &year)) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
return year;
|
||||
}
|
||||
|
||||
void ChineseCalendar::setRelatedYear(int32_t year)
|
||||
{
|
||||
// set extended year
|
||||
set(UCAL_EXTENDED_YEAR, year - kChineseRelatedYearDiff);
|
||||
}
|
||||
|
||||
IMPL_SYSTEM_DEFAULT_CENTURY(ChineseCalendar, "@calendar=chinese")
|
||||
|
||||
bool
|
||||
@@ -1177,15 +1186,18 @@ int32_t ChineseCalendar::internalGetMonth(int32_t defaultValue, UErrorCode& stat
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
if (resolveFields(kMonthPrecedence) == UCAL_MONTH) {
|
||||
return internalGet(UCAL_MONTH, defaultValue);
|
||||
switch (resolveFields(kMonthPrecedence)) {
|
||||
case UCAL_MONTH:
|
||||
return internalGet(UCAL_MONTH);
|
||||
case UCAL_ORDINAL_MONTH:
|
||||
return internalGetMonth(status);
|
||||
default:
|
||||
return defaultValue;
|
||||
}
|
||||
return internalGetMonth(status);
|
||||
}
|
||||
|
||||
ChineseCalendar::Setting ChineseCalendar::getSetting(UErrorCode&) const {
|
||||
return {
|
||||
CHINESE_EPOCH_YEAR,
|
||||
getAstronomerTimeZone(),
|
||||
&gWinterSolsticeCache,
|
||||
&gNewYearCache
|
||||
|
||||
-15
@@ -204,20 +204,6 @@ class U_I18N_API ChineseCalendar : public Calendar {
|
||||
virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode &status) override;
|
||||
virtual void roll(EDateFields field, int32_t amount, UErrorCode &status) override;
|
||||
|
||||
/**
|
||||
* @return The related Gregorian year; will be obtained by modifying the value
|
||||
* obtained by get from UCAL_EXTENDED_YEAR field
|
||||
* @internal
|
||||
*/
|
||||
virtual int32_t getRelatedYear(UErrorCode &status) const override;
|
||||
|
||||
/**
|
||||
* @param year The related Gregorian year to set; will be modified as necessary then
|
||||
* set in UCAL_EXTENDED_YEAR field
|
||||
* @internal
|
||||
*/
|
||||
virtual void setRelatedYear(int32_t year) override;
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Internal methods & astronomical calculations
|
||||
//----------------------------------------------------------------------
|
||||
@@ -261,7 +247,6 @@ class U_I18N_API ChineseCalendar : public Calendar {
|
||||
virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const override;
|
||||
|
||||
struct Setting {
|
||||
int32_t epochYear;
|
||||
const TimeZone* zoneAstroCalc;
|
||||
CalendarCache** winterSolsticeCache;
|
||||
CalendarCache** newYearCache;
|
||||
|
||||
+1
-1
@@ -353,7 +353,7 @@ private:
|
||||
* (&[before 2] resets to an explicit secondary node so that
|
||||
* the following addRelation(secondary) tailors right after that.
|
||||
* If we did not have this node and instead were to reset on the primary node,
|
||||
* then addRelation(secondary) would skip forward to the the COMMON_WEIGHT16 node.)
|
||||
* then addRelation(secondary) would skip forward to the COMMON_WEIGHT16 node.)
|
||||
*
|
||||
* If the flag is not set, then there are no explicit secondary nodes
|
||||
* with the common or lower weights.
|
||||
|
||||
+91
-1
@@ -655,6 +655,20 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString &
|
||||
return;
|
||||
}
|
||||
}
|
||||
int32_t sCount = s.countChar32();
|
||||
UChar32 sUtf32[32];
|
||||
int32_t sLen = s.toUTF32(sUtf32, 32, errorCode);
|
||||
if (sLen != sCount) {
|
||||
// If this error is ever reached, just increase the buffer
|
||||
// size above.
|
||||
errorCode = U_UNSUPPORTED_ERROR;
|
||||
return;
|
||||
}
|
||||
for (int32_t i = 1; i < sLen - 1; ++i) {
|
||||
if (u_getCombiningClass(sUtf32[i]) == 0) {
|
||||
contractionMiddleStarter.add(sUtf32[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -697,6 +711,20 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString &
|
||||
UnicodeString suffix(s, cLength);
|
||||
UnicodeString context(static_cast<char16_t>(prefix.length()));
|
||||
context.append(prefix).append(suffix);
|
||||
if (icu4xMode && !suffix.isEmpty() && !prefix.isEmpty()) {
|
||||
// ICU4X does not support the combination of prefix and contraction.
|
||||
// This combination is supported by LDML but does not occur in the
|
||||
// root or any tailorings in CLDR as of February 2025.
|
||||
// If support for this case becomes necessary, a practical change
|
||||
// would be allocating a flag on prefix ce32 and setting the
|
||||
// flag on a prefix ce32 if any ce32 that can be found under
|
||||
// the prefix ce32 (either the default or any UCharsTrie value) is
|
||||
// a contraction ce32 or if the prefix ce32 is the utrie2 value
|
||||
// for a character that is a starter that occurs in a middle
|
||||
// (neither first nor last) position in a contraction.
|
||||
errorCode = U_UNSUPPORTED_ERROR;
|
||||
return;
|
||||
}
|
||||
unsafeBackwardSet.addAll(suffix);
|
||||
for(;;) {
|
||||
// invariant: context > cond->context
|
||||
@@ -1391,7 +1419,69 @@ CollationDataBuilder::buildMappings(CollationData &data, UErrorCode &errorCode)
|
||||
setDigitTags(errorCode);
|
||||
setLeadSurrogates(errorCode);
|
||||
|
||||
if (!icu4xMode) {
|
||||
if (icu4xMode) {
|
||||
// Make sure that starters that occur is the middle of a
|
||||
// contraction have contraction ce32 with the
|
||||
// `CONTRACT_HAS_STARTER` flag set so that starters that
|
||||
// can occur in a non-final position in a contraction can
|
||||
// be easily recognized from having a contraction ce32
|
||||
// that has the `CONTRACT_HAS_STARTER` flag set.
|
||||
|
||||
UCharsTrieBuilder contractionBuilder(errorCode);
|
||||
// Intentionally unpaired low surrogate to make it never
|
||||
// match well-formed UTF-16 which ICU4X feeds to the
|
||||
// matcher.
|
||||
UnicodeString placeholder(0xDC00);
|
||||
|
||||
for (UChar32 c : contractionMiddleStarter.codePoints()) {
|
||||
uint32_t ce32 = utrie2_get32(trie, c);
|
||||
UBool fromBase = false;
|
||||
if(ce32 == Collation::FALLBACK_CE32) {
|
||||
fromBase = true;
|
||||
ce32 = base->getCE32(c);
|
||||
}
|
||||
if (!(Collation::hasCE32Tag(ce32, Collation::CONTRACTION_TAG) && (ce32 & Collation::CONTRACT_HAS_STARTER))) {
|
||||
if (fromBase) {
|
||||
// This case does not actually happen as of February 2025.
|
||||
ce32 = copyFromBaseCE32(c, ce32, true, errorCode);
|
||||
}
|
||||
if (Collation::hasCE32Tag(ce32, Collation::CONTRACTION_TAG)) {
|
||||
// This middle starter is also the first character of another
|
||||
// contraction, but that contraction does not have the
|
||||
// CONTRACT_HAS_STARTER flag. Let's add the flag to
|
||||
// mark this at the expense of pessimizing the matching
|
||||
// of this contraction.
|
||||
// As of February 2025, this case does not actually occur
|
||||
// in CLDR.
|
||||
ce32 |= Collation::CONTRACT_HAS_STARTER;
|
||||
} else {
|
||||
// This middle starter is not also the first character
|
||||
// in another contraction.
|
||||
|
||||
// The UCharsTrie needs to contain some placeholder
|
||||
// because it cannot be empty. We build a trie
|
||||
// that never actually matches anything that ICU4X can try to
|
||||
// match, since ICU4X always passes well-formed UTF-16 to the
|
||||
// matcher and we put an unpaired low surrogate into the trie.
|
||||
// This pessimizes the character to CE mapping of the `c`,
|
||||
// since useless trie matching will be attempted but as of
|
||||
// February 2025, only two relatively rare characters are affected.
|
||||
contractionBuilder.clear();
|
||||
contractionBuilder.add(placeholder, static_cast<int32_t>(ce32), errorCode);
|
||||
|
||||
int32_t index = addContextTrie(ce32, contractionBuilder, errorCode);
|
||||
if(U_FAILURE(errorCode)) { return; }
|
||||
if(index > Collation::MAX_INDEX) {
|
||||
errorCode = U_BUFFER_OVERFLOW_ERROR;
|
||||
return;
|
||||
}
|
||||
// Set CONTRACT_HAS_STARTER to make identical prefix matching able to catch this.
|
||||
ce32 = Collation::makeCE32FromTagAndIndex(Collation::CONTRACTION_TAG, index) | Collation::CONTRACT_HAS_STARTER;
|
||||
}
|
||||
utrie2_set32(trie, c, ce32, &errorCode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// For U+0000, move its normal ce32 into CE32s[0] and set U0000_TAG.
|
||||
ce32s.setElementAt(static_cast<int32_t>(utrie2_get32(trie, 0)), 0);
|
||||
utrie2_set32(trie, 0, Collation::makeCE32FromTagAndIndex(Collation::U0000_TAG, 0), &errorCode);
|
||||
|
||||
@@ -254,6 +254,12 @@ private:
|
||||
int32_t contextsEra = 0;
|
||||
protected:
|
||||
UnicodeSet unsafeBackwardSet;
|
||||
/**
|
||||
* For ICU4X only: The starters that occur in some contraction
|
||||
* in a position that is neither the first nor the last code point
|
||||
* of the contraction.
|
||||
*/
|
||||
UnicodeSet contractionMiddleStarter;
|
||||
UBool modified;
|
||||
UBool icu4xMode;
|
||||
|
||||
|
||||
+9
-5
@@ -39,16 +39,20 @@ RuleBasedCollator::cloneRuleData(int32_t &length, UErrorCode &errorCode) const {
|
||||
errorCode = U_MEMORY_ALLOCATION_ERROR;
|
||||
return nullptr;
|
||||
}
|
||||
length = cloneBinary(buffer.getAlias(), 20000, errorCode);
|
||||
if(errorCode == U_BUFFER_OVERFLOW_ERROR) {
|
||||
UErrorCode bufferStatus = U_ZERO_ERROR;
|
||||
length = cloneBinary(buffer.getAlias(), 20000, bufferStatus);
|
||||
if(bufferStatus == U_BUFFER_OVERFLOW_ERROR) {
|
||||
if(buffer.allocateInsteadAndCopy(length, 0) == nullptr) {
|
||||
errorCode = U_MEMORY_ALLOCATION_ERROR;
|
||||
return nullptr;
|
||||
}
|
||||
errorCode = U_ZERO_ERROR;
|
||||
length = cloneBinary(buffer.getAlias(), length, errorCode);
|
||||
bufferStatus = U_ZERO_ERROR;
|
||||
length = cloneBinary(buffer.getAlias(), length, bufferStatus);
|
||||
}
|
||||
if(U_FAILURE(bufferStatus)) {
|
||||
errorCode = bufferStatus;
|
||||
return nullptr;
|
||||
}
|
||||
if(U_FAILURE(errorCode)) { return nullptr; }
|
||||
return buffer.orphan();
|
||||
}
|
||||
|
||||
|
||||
+19
-19
@@ -29,18 +29,18 @@ const uint8_t CollationFCD::lcccIndex[2048]={
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0x27,0x28,0,0,0,0,0x29,0,
|
||||
0,0,0,0,0,0x2a,0,0,0,0x13,0,0,0,0,0,0,
|
||||
0x2b,0,0,0x2c,0,0x2d,0x2e,0,0,0x28,0x2f,0x30,0,0x31,0,0x32,
|
||||
0,0x33,0,0,0,0,0x34,0x35,0,0,0,0,0,0,1,1,
|
||||
0x2b,0,0,0x2c,0,0x2d,0x2e,0x2f,0,0x28,0x30,0x31,0,0x32,0,0x33,
|
||||
0,0x34,0,0,0,0,0x35,0x36,0,0,0,0,0,0,1,1,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0x36,0x37,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0x37,0x38,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,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,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,0,0,0,0,0,0x38,0,0,0,0x39,0,0,0,1,
|
||||
0,0,0,0,0,0,0,0x39,0,0,0,0x3a,0,0,0,1,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0x3a,0,0,0x3b,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0x3b,0,0,0x3c,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,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,
|
||||
@@ -99,9 +99,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={
|
||||
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,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0x3c,0x3d,0,0,0x3e,0,0,0,0,0,0,0,0,
|
||||
0x24,0x3f,0,0,0,0,0x2f,0x40,0,0x41,0x42,0,0,0x42,0x43,0,
|
||||
0,0,0,0,0,0x44,0x45,0x46,0,0,0,0,0,0,0,0x19,
|
||||
0,0,0,0x3d,0x3e,0,0,0x3f,0,0,0,0,0,0,0,0,
|
||||
0x24,0x40,0,0,0,0,0x30,0x41,0,0x42,0x43,0,0,0x43,0x44,0,
|
||||
0,0,0,0,0,0x45,0x46,0x47,0,0,0,0,0,0,0,0x19,
|
||||
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,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
@@ -124,7 +124,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={
|
||||
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,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x47,0x48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0x48,0x49,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,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
@@ -146,12 +146,12 @@ const uint8_t CollationFCD::lcccIndex[2048]={
|
||||
0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
const uint32_t CollationFCD::lcccBits[73]={
|
||||
const uint32_t CollationFCD::lcccBits[74]={
|
||||
0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff,
|
||||
0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10000000,0x1e2000,0x2000,0x40000000,0x602000,0x18000000,0x400,0x7000000,0xf00,
|
||||
0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x7fff,0x10,
|
||||
0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x1000,
|
||||
0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000fd,0x7108000
|
||||
0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff,
|
||||
0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,
|
||||
0x1000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000fd,0x7108000
|
||||
};
|
||||
|
||||
const uint8_t CollationFCD::tcccIndex[2048]={
|
||||
@@ -168,9 +168,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0x41,0x42,0,0,0,0,0x43,0,
|
||||
0,0,0,0,0,0x44,0,0,0,0x28,0,0,0,0,0,0,
|
||||
0x45,0,0,0x46,0,0x47,0x48,0,0,0x42,0x49,0x4a,0,0x4b,0,0x4c,
|
||||
0,0x4d,0,0,0,0,0x4e,0x4f,0,0,0,0,0,0,1,1,
|
||||
1,1,1,1,0x50,1,1,0x51,0x52,1,0x53,0x54,1,0x55,0x56,0x57,
|
||||
0x45,0,0,0x46,0,0x47,0x48,0x49,0,0x42,0x4a,0x4b,0,0x4c,0,0x4d,
|
||||
0,0x4e,0,0,0,0,0x4f,0x50,0,0,0,0,0,0,1,1,
|
||||
1,1,1,1,0x51,1,1,0x52,0x53,1,0x54,0x48,1,0x55,0x56,0x57,
|
||||
0,0,0,0,0,0,0x58,0x59,0,0x5a,0,0,0x5b,0x5c,0x5d,0,
|
||||
0x5e,0x5f,0x60,0x61,0x62,0x63,0,0x64,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
@@ -239,7 +239,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={
|
||||
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,0,0,
|
||||
0,0,0,0x6c,0x6d,0,0,0x6e,0,0,0,0,0,0,0,0,
|
||||
0x3e,0x6f,0,0,0,0,0x49,0x70,0,0x71,0x72,0,0,0x72,0x73,0,
|
||||
0x3e,0x6f,0,0,0,0,0x4a,0x70,0,0x71,0x72,0,0,0x72,0x73,0,
|
||||
0,0,0,0,0,0x74,0x75,0x76,0,0,0,0,0,0,0,0x33,
|
||||
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,0,0,
|
||||
@@ -290,8 +290,8 @@ const uint32_t CollationFCD::tcccBits[123]={
|
||||
0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000,
|
||||
0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000,
|
||||
0x40000000,0x10480000,0x4e002000,0x2000,0x30002000,0x602100,0x18000000,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,
|
||||
0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x7fff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,
|
||||
0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,
|
||||
0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,
|
||||
0x31021fd,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,
|
||||
0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x1000,
|
||||
0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000ff,0x7108000,0x5f7ffc00,0x7fdb
|
||||
};
|
||||
|
||||
+5
-17
@@ -31,27 +31,15 @@ class UVector32;
|
||||
/* Large enough for CEs of most short strings. */
|
||||
#define CEBUFFER_INITIAL_CAPACITY 40
|
||||
|
||||
// Export an explicit template instantiation of the MaybeStackArray that
|
||||
// is used as a data member of CEBuffer.
|
||||
//
|
||||
// When building DLLs for Windows this is required even though
|
||||
// no direct access to the MaybeStackArray leaks out of the i18n library.
|
||||
//
|
||||
// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
|
||||
//
|
||||
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
|
||||
template class U_I18N_API MaybeStackArray<int64_t, CEBUFFER_INITIAL_CAPACITY>;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Collation element iterator and abstract character iterator.
|
||||
*
|
||||
* When a method returns a code point value, it must be in 0..10FFFF,
|
||||
* except it can be negative as a sentinel value.
|
||||
*/
|
||||
class U_I18N_API CollationIterator : public UObject {
|
||||
class U_I18N_API_CLASS CollationIterator : public UObject {
|
||||
private:
|
||||
class U_I18N_API CEBuffer {
|
||||
class CEBuffer {
|
||||
private:
|
||||
/** Large enough for CEs of most short strings. */
|
||||
static const int32_t INITIAL_CAPACITY = CEBUFFER_INITIAL_CAPACITY;
|
||||
@@ -69,7 +57,7 @@ private:
|
||||
buffer[length++] = ce;
|
||||
}
|
||||
|
||||
UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode);
|
||||
U_I18N_API UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode);
|
||||
|
||||
inline UBool incLength(UErrorCode &errorCode) {
|
||||
// Use INITIAL_CAPACITY for a very simple fastpath.
|
||||
@@ -278,8 +266,8 @@ protected:
|
||||
const CollationData *data;
|
||||
|
||||
private:
|
||||
int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
|
||||
UErrorCode &errorCode);
|
||||
U_I18N_API int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
|
||||
UErrorCode &errorCode);
|
||||
|
||||
uint32_t getCE32FromPrefix(const CollationData *d, uint32_t ce32,
|
||||
UErrorCode &errorCode);
|
||||
|
||||
+14
-11
@@ -46,21 +46,23 @@ class UnicodeSet;
|
||||
* The fields are public for convenience.
|
||||
*
|
||||
* It is shared, reference-counted, and auto-deleted; see SharedObject.
|
||||
*
|
||||
* U_I18N_API because genuca & genrb use it.
|
||||
*/
|
||||
struct U_I18N_API CollationTailoring : public SharedObject {
|
||||
CollationTailoring(const CollationSettings *baseSettings);
|
||||
virtual ~CollationTailoring();
|
||||
struct U_I18N_API_CLASS CollationTailoring : public SharedObject {
|
||||
U_I18N_API CollationTailoring(const CollationSettings *baseSettings);
|
||||
U_I18N_API virtual ~CollationTailoring();
|
||||
|
||||
/**
|
||||
* Returns true if the constructor could not initialize properly.
|
||||
*/
|
||||
UBool isBogus() { return settings == nullptr; }
|
||||
U_I18N_API UBool isBogus() { return settings == nullptr; }
|
||||
|
||||
UBool ensureOwnedData(UErrorCode &errorCode);
|
||||
U_I18N_API UBool ensureOwnedData(UErrorCode &errorCode);
|
||||
|
||||
static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version);
|
||||
void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion);
|
||||
int32_t getUCAVersion() const;
|
||||
U_I18N_API static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version);
|
||||
U_I18N_API void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion);
|
||||
U_I18N_API int32_t getUCAVersion() const;
|
||||
|
||||
// data for sorting etc.
|
||||
const CollationData *data; // == base data or ownedData
|
||||
@@ -94,14 +96,15 @@ private:
|
||||
CollationTailoring(const CollationTailoring &other) = delete;
|
||||
};
|
||||
|
||||
struct U_I18N_API CollationCacheEntry : public SharedObject {
|
||||
CollationCacheEntry(const Locale &loc, const CollationTailoring *t)
|
||||
// U_I18N_API because gencolusb uses it.
|
||||
struct U_I18N_API_CLASS CollationCacheEntry : public SharedObject {
|
||||
U_I18N_API CollationCacheEntry(const Locale &loc, const CollationTailoring *t)
|
||||
: validLocale(loc), tailoring(t) {
|
||||
if(t != nullptr) {
|
||||
t->addRef();
|
||||
}
|
||||
}
|
||||
~CollationCacheEntry();
|
||||
U_I18N_API ~CollationCacheEntry();
|
||||
|
||||
Locale validLocale;
|
||||
const CollationTailoring *tailoring;
|
||||
|
||||
+143
-95
@@ -12,116 +12,164 @@
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
|
||||
#define COLLUNSAFE_ICU_VERSION "56.0.1"
|
||||
#define COLLUNSAFE_COLL_VERSION "9.64"
|
||||
#define COLLUNSAFE_ICU_VERSION "78.0.1"
|
||||
#define COLLUNSAFE_COLL_VERSION "9.136"
|
||||
#define COLLUNSAFE_SERIALIZE 1
|
||||
static const int32_t unsafe_serializedCount = 850;
|
||||
static const uint16_t unsafe_serializedData[850] = {
|
||||
0x8350, 0x01B8, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8
|
||||
static const int32_t unsafe_serializedCount = 1236;
|
||||
static const uint16_t unsafe_serializedData[1236] = {
|
||||
0x84D2, 0x01C2, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8
|
||||
0x0300, 0x034F, 0x0350, 0x0370, 0x03A9, 0x03AA, 0x03E2, 0x03E3, // 16
|
||||
0x042F, 0x0430, 0x0483, 0x0488, 0x0531, 0x0532, 0x0591, 0x05BE, // 24
|
||||
0x05BF, 0x05C0, 0x05C1, 0x05C3, 0x05C4, 0x05C6, 0x05C7, 0x05C8, // 32
|
||||
0x05D0, 0x05D1, 0x0610, 0x061B, 0x0628, 0x0629, 0x064B, 0x0660, // 40
|
||||
0x0670, 0x0671, 0x06D6, 0x06DD, 0x06DF, 0x06E5, 0x06E7, 0x06E9, // 48
|
||||
0x06EA, 0x06EE, 0x0710, 0x0712, 0x0730, 0x074B, 0x078C, 0x078D, // 56
|
||||
0x07D8, 0x07D9, 0x07EB, 0x07F4, 0x0800, 0x0801, 0x0816, 0x081A, // 64
|
||||
0x081B, 0x0824, 0x0825, 0x0828, 0x0829, 0x082E, 0x0840, 0x0841, // 72
|
||||
0x0859, 0x085C, 0x08E3, 0x0900, 0x0905, 0x0906, 0x093C, 0x093D, // 80
|
||||
0x094D, 0x094E, 0x0951, 0x0955, 0x0995, 0x0996, 0x09BC, 0x09BD, // 88
|
||||
0x09BE, 0x09BF, 0x09CD, 0x09CE, 0x09D7, 0x09D8, 0x0A15, 0x0A16, // 96
|
||||
0x0A3C, 0x0A3D, 0x0A4D, 0x0A4E, 0x0A95, 0x0A96, 0x0ABC, 0x0ABD, // 104
|
||||
0x0ACD, 0x0ACE, 0x0B15, 0x0B16, 0x0B3C, 0x0B3D, 0x0B3E, 0x0B3F, // 112
|
||||
0x0B4D, 0x0B4E, 0x0B56, 0x0B58, 0x0B95, 0x0B96, 0x0BBE, 0x0BBF, // 120
|
||||
0x0BCD, 0x0BCE, 0x0BD7, 0x0BD8, 0x0C15, 0x0C16, 0x0C4D, 0x0C4E, // 128
|
||||
0x0C55, 0x0C57, 0x0C95, 0x0C96, 0x0CBC, 0x0CBD, 0x0CC2, 0x0CC3, // 136
|
||||
0x0CCD, 0x0CCE, 0x0CD5, 0x0CD7, 0x0D15, 0x0D16, 0x0D3E, 0x0D3F, // 144
|
||||
0x0D4D, 0x0D4E, 0x0D57, 0x0D58, 0x0D85, 0x0D86, 0x0DCA, 0x0DCB, // 152
|
||||
0x0DCF, 0x0DD0, 0x0DDF, 0x0DE0, 0x0E01, 0x0E2F, 0x0E32, 0x0E33, // 160
|
||||
0x0E38, 0x0E3B, 0x0E48, 0x0E4C, 0x0E81, 0x0E83, 0x0E84, 0x0E85, // 168
|
||||
0x0E87, 0x0E89, 0x0E8A, 0x0E8B, 0x0E8D, 0x0E8E, 0x0E94, 0x0E98, // 176
|
||||
0x0E99, 0x0EA0, 0x0EA1, 0x0EA4, 0x0EA5, 0x0EA6, 0x0EA7, 0x0EA8, // 184
|
||||
0x0EAA, 0x0EAC, 0x0EAD, 0x0EAF, 0x0EB2, 0x0EB3, 0x0EB8, 0x0EBA, // 192
|
||||
0x07CA, 0x07CB, 0x07EB, 0x07F4, 0x07FD, 0x07FE, 0x0800, 0x0801, // 64
|
||||
0x0816, 0x081A, 0x081B, 0x0824, 0x0825, 0x0828, 0x0829, 0x082E, // 72
|
||||
0x0840, 0x0841, 0x0859, 0x085C, 0x0897, 0x08A0, 0x08CA, 0x08E2, // 80
|
||||
0x08E3, 0x0900, 0x0905, 0x0906, 0x093C, 0x093D, 0x094D, 0x094E, // 88
|
||||
0x0951, 0x0955, 0x0995, 0x0996, 0x09BC, 0x09BD, 0x09BE, 0x09BF, // 96
|
||||
0x09CD, 0x09CE, 0x09D7, 0x09D8, 0x09FE, 0x09FF, 0x0A15, 0x0A16, // 104
|
||||
0x0A3C, 0x0A3D, 0x0A4D, 0x0A4E, 0x0A95, 0x0A96, 0x0ABC, 0x0ABD, // 112
|
||||
0x0ACD, 0x0ACE, 0x0B15, 0x0B16, 0x0B3C, 0x0B3D, 0x0B3E, 0x0B3F, // 120
|
||||
0x0B4D, 0x0B4E, 0x0B56, 0x0B58, 0x0B95, 0x0B96, 0x0BBE, 0x0BBF, // 128
|
||||
0x0BCD, 0x0BCE, 0x0BD7, 0x0BD8, 0x0C15, 0x0C16, 0x0C3C, 0x0C3D, // 136
|
||||
0x0C4D, 0x0C4E, 0x0C55, 0x0C57, 0x0C95, 0x0C96, 0x0CBC, 0x0CBD, // 144
|
||||
0x0CC2, 0x0CC3, 0x0CCD, 0x0CCE, 0x0CD5, 0x0CD7, 0x0D15, 0x0D16, // 152
|
||||
0x0D3B, 0x0D3D, 0x0D3E, 0x0D3F, 0x0D4D, 0x0D4E, 0x0D57, 0x0D58, // 160
|
||||
0x0D85, 0x0D86, 0x0DCA, 0x0DCB, 0x0DCF, 0x0DD0, 0x0DDF, 0x0DE0, // 168
|
||||
0x0E01, 0x0E2F, 0x0E32, 0x0E33, 0x0E38, 0x0E3B, 0x0E48, 0x0E4C, // 176
|
||||
0x0E81, 0x0E83, 0x0E84, 0x0E85, 0x0E86, 0x0E8B, 0x0E8C, 0x0EA4, // 184
|
||||
0x0EA5, 0x0EA6, 0x0EA7, 0x0EAF, 0x0EB2, 0x0EB3, 0x0EB8, 0x0EBB, // 192
|
||||
0x0EC8, 0x0ECC, 0x0EDC, 0x0EE0, 0x0F18, 0x0F1A, 0x0F35, 0x0F36, // 200
|
||||
0x0F37, 0x0F38, 0x0F39, 0x0F3A, 0x0F40, 0x0F41, 0x0F71, 0x0F76, // 208
|
||||
0x0F7A, 0x0F7E, 0x0F80, 0x0F85, 0x0F86, 0x0F88, 0x0FC6, 0x0FC7, // 216
|
||||
0x1000, 0x1001, 0x102E, 0x102F, 0x1037, 0x1038, 0x1039, 0x103B, // 224
|
||||
0x108D, 0x108E, 0x10D3, 0x10D4, 0x12A0, 0x12A1, 0x135D, 0x1360, // 232
|
||||
0x13C4, 0x13C5, 0x14C0, 0x14C1, 0x168F, 0x1690, 0x16A0, 0x16A1, // 240
|
||||
0x1703, 0x1704, 0x1714, 0x1715, 0x1723, 0x1724, 0x1734, 0x1735, // 248
|
||||
0x1703, 0x1704, 0x1714, 0x1716, 0x1723, 0x1724, 0x1734, 0x1735, // 248
|
||||
0x1743, 0x1744, 0x1763, 0x1764, 0x1780, 0x1781, 0x17D2, 0x17D3, // 256
|
||||
0x17DD, 0x17DE, 0x1826, 0x1827, 0x18A9, 0x18AA, 0x1900, 0x1901, // 264
|
||||
0x1939, 0x193C, 0x1950, 0x1951, 0x1980, 0x19AC, 0x1A00, 0x1A01, // 272
|
||||
0x1A17, 0x1A19, 0x1A20, 0x1A21, 0x1A60, 0x1A61, 0x1A75, 0x1A7D, // 280
|
||||
0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1B05, 0x1B06, 0x1B34, 0x1B36, // 288
|
||||
0x1B44, 0x1B45, 0x1B6B, 0x1B74, 0x1B83, 0x1B84, 0x1BAA, 0x1BAC, // 296
|
||||
0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, 0x1BF2, 0x1BF4, 0x1C00, 0x1C01, // 304
|
||||
0x1C37, 0x1C38, 0x1C5A, 0x1C5B, 0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, // 312
|
||||
0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, 0x1CF4, 0x1CF5, 0x1CF8, 0x1CFA, // 320
|
||||
0x1DC0, 0x1DF6, 0x1DFC, 0x1E00, 0x201C, 0x201D, 0x20AC, 0x20AD, // 328
|
||||
0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, 0x263A, 0x263B, // 336
|
||||
0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D5E, 0x2D5F, 0x2D7F, 0x2D80, // 344
|
||||
0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, 0x3099, 0x309B, // 352
|
||||
0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, 0xA288, 0xA289, // 360
|
||||
0xA4E8, 0xA4E9, 0xA549, 0xA54A, 0xA66F, 0xA670, 0xA674, 0xA67E, // 368
|
||||
0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, 0xA806, 0xA807, // 376
|
||||
0xA840, 0xA841, 0xA882, 0xA883, 0xA8C4, 0xA8C5, 0xA8E0, 0xA8F2, // 384
|
||||
0xA90A, 0xA90B, 0xA92B, 0xA92E, 0xA930, 0xA931, 0xA953, 0xA954, // 392
|
||||
0xA984, 0xA985, 0xA9B3, 0xA9B4, 0xA9C0, 0xA9C1, 0xAA00, 0xAA01, // 400
|
||||
0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, 0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, // 408
|
||||
0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, 0xABC0, 0xABC1, 0xABED, 0xABEE, // 416
|
||||
0xAC00, 0xAC01, 0xD800, 0xD807, 0xD808, 0xD809, 0xD80C, 0xD80D, // 424
|
||||
0xD811, 0xD812, 0xD81A, 0xD81C, 0xD82F, 0xD830, 0xD834, 0xD835, // 432
|
||||
0xD83A, 0xD83B, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, 0xFDD0, 0xFDD1, // 440
|
||||
0xFE20, 0xFE30, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x01FD, // 448
|
||||
0x0001, 0x01FE, 0x0001, 0x0280, 0x0001, 0x0281, 0x0001, 0x02B7, // 456
|
||||
0x0001, 0x02B8, 0x0001, 0x02E0, 0x0001, 0x02E1, 0x0001, 0x0308, // 464
|
||||
0x0001, 0x0309, 0x0001, 0x0330, 0x0001, 0x0331, 0x0001, 0x036B, // 472
|
||||
0x0001, 0x036C, 0x0001, 0x0376, 0x0001, 0x037B, 0x0001, 0x0380, // 480
|
||||
0x0001, 0x0381, 0x0001, 0x03A0, 0x0001, 0x03A1, 0x0001, 0x0414, // 488
|
||||
0x0001, 0x0415, 0x0001, 0x0450, 0x0001, 0x0451, 0x0001, 0x0480, // 496
|
||||
0x0001, 0x0481, 0x0001, 0x0500, 0x0001, 0x0501, 0x0001, 0x0537, // 504
|
||||
0x0001, 0x0538, 0x0001, 0x0647, 0x0001, 0x0648, 0x0001, 0x0800, // 512
|
||||
0x0001, 0x0801, 0x0001, 0x0840, 0x0001, 0x0841, 0x0001, 0x0873, // 520
|
||||
0x0001, 0x0874, 0x0001, 0x0896, 0x0001, 0x0897, 0x0001, 0x08F4, // 528
|
||||
0x0001, 0x08F5, 0x0001, 0x0900, 0x0001, 0x0901, 0x0001, 0x0920, // 536
|
||||
0x0001, 0x0921, 0x0001, 0x0980, 0x0001, 0x0981, 0x0001, 0x09A0, // 544
|
||||
0x0001, 0x09A1, 0x0001, 0x0A00, 0x0001, 0x0A01, 0x0001, 0x0A0D, // 552
|
||||
0x0001, 0x0A0E, 0x0001, 0x0A0F, 0x0001, 0x0A10, 0x0001, 0x0A38, // 560
|
||||
0x0001, 0x0A3B, 0x0001, 0x0A3F, 0x0001, 0x0A40, 0x0001, 0x0A60, // 568
|
||||
0x0001, 0x0A61, 0x0001, 0x0A95, 0x0001, 0x0A96, 0x0001, 0x0AC1, // 576
|
||||
0x0001, 0x0AC2, 0x0001, 0x0AE5, 0x0001, 0x0AE7, 0x0001, 0x0B00, // 584
|
||||
0x0001, 0x0B01, 0x0001, 0x0B40, 0x0001, 0x0B41, 0x0001, 0x0B60, // 592
|
||||
0x0001, 0x0B61, 0x0001, 0x0B8F, 0x0001, 0x0B90, 0x0001, 0x0C00, // 600
|
||||
0x0001, 0x0C01, 0x0001, 0x0CA1, 0x0001, 0x0CA2, 0x0001, 0x1005, // 608
|
||||
0x0001, 0x1006, 0x0001, 0x1046, 0x0001, 0x1047, 0x0001, 0x107F, // 616
|
||||
0x0001, 0x1080, 0x0001, 0x1083, 0x0001, 0x1084, 0x0001, 0x10B9, // 624
|
||||
0x0001, 0x10BB, 0x0001, 0x10D0, 0x0001, 0x10D1, 0x0001, 0x1100, // 632
|
||||
0x0001, 0x1104, 0x0001, 0x1127, 0x0001, 0x1128, 0x0001, 0x1133, // 640
|
||||
0x0001, 0x1135, 0x0001, 0x1152, 0x0001, 0x1153, 0x0001, 0x1173, // 648
|
||||
0x0001, 0x1174, 0x0001, 0x1183, 0x0001, 0x1184, 0x0001, 0x11C0, // 656
|
||||
0x0001, 0x11C1, 0x0001, 0x11CA, 0x0001, 0x11CB, 0x0001, 0x1208, // 664
|
||||
0x0001, 0x1209, 0x0001, 0x1235, 0x0001, 0x1237, 0x0001, 0x128F, // 672
|
||||
0x0001, 0x1290, 0x0001, 0x12BE, 0x0001, 0x12BF, 0x0001, 0x12E9, // 680
|
||||
0x0001, 0x12EB, 0x0001, 0x1315, 0x0001, 0x1316, 0x0001, 0x133C, // 688
|
||||
0x0001, 0x133D, 0x0001, 0x133E, 0x0001, 0x133F, 0x0001, 0x134D, // 696
|
||||
0x0001, 0x134E, 0x0001, 0x1357, 0x0001, 0x1358, 0x0001, 0x1366, // 704
|
||||
0x0001, 0x136D, 0x0001, 0x1370, 0x0001, 0x1375, 0x0001, 0x1484, // 712
|
||||
0x0001, 0x1485, 0x0001, 0x14B0, 0x0001, 0x14B1, 0x0001, 0x14BA, // 720
|
||||
0x0001, 0x14BB, 0x0001, 0x14BD, 0x0001, 0x14BE, 0x0001, 0x14C2, // 728
|
||||
0x0001, 0x14C4, 0x0001, 0x158E, 0x0001, 0x158F, 0x0001, 0x15AF, // 736
|
||||
0x0001, 0x15B0, 0x0001, 0x15BF, 0x0001, 0x15C1, 0x0001, 0x160E, // 744
|
||||
0x0001, 0x160F, 0x0001, 0x163F, 0x0001, 0x1640, 0x0001, 0x1680, // 752
|
||||
0x0001, 0x1681, 0x0001, 0x16B6, 0x0001, 0x16B8, 0x0001, 0x1717, // 760
|
||||
0x0001, 0x1718, 0x0001, 0x172B, 0x0001, 0x172C, 0x0001, 0x18B4, // 768
|
||||
0x0001, 0x18B5, 0x0001, 0x1AC0, 0x0001, 0x1AC1, 0x0001, 0x2000, // 776
|
||||
0x0001, 0x2001, 0x0001, 0x3153, 0x0001, 0x3154, 0x0001, 0x4400, // 784
|
||||
0x0001, 0x4401, 0x0001, 0x6A4F, 0x0001, 0x6A50, 0x0001, 0x6AE6, // 792
|
||||
0x0001, 0x6AE7, 0x0001, 0x6AF0, 0x0001, 0x6AF5, 0x0001, 0x6B1C, // 800
|
||||
0x0001, 0x6B1D, 0x0001, 0x6B30, 0x0001, 0x6B37, 0x0001, 0x6F00, // 808
|
||||
0x0001, 0x6F01, 0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, // 816
|
||||
0x0001, 0xBC9F, 0x0001, 0xD165, 0x0001, 0xD16A, 0x0001, 0xD16D, // 824
|
||||
0x0001, 0xD173, 0x0001, 0xD17B, 0x0001, 0xD183, 0x0001, 0xD185, // 832
|
||||
0x0001, 0xD18C, 0x0001, 0xD1AA, 0x0001, 0xD1AE, 0x0001, 0xD242, // 840
|
||||
0x0001, 0xD245, 0x0001, 0xE802, 0x0001, 0xE803, 0x0001, 0xE8D0, // 848
|
||||
0x0001, 0xE8D7};
|
||||
0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1ABF, 0x1ADE, 0x1AE0, 0x1AEC, // 288
|
||||
0x1B05, 0x1B06, 0x1B34, 0x1B36, 0x1B44, 0x1B45, 0x1B6B, 0x1B74, // 296
|
||||
0x1B83, 0x1B84, 0x1BAA, 0x1BAC, 0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, // 304
|
||||
0x1BF2, 0x1BF4, 0x1C00, 0x1C01, 0x1C37, 0x1C38, 0x1C5A, 0x1C5B, // 312
|
||||
0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, 0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, // 320
|
||||
0x1CF4, 0x1CF5, 0x1CF8, 0x1CFA, 0x1DC0, 0x1E00, 0x201C, 0x201D, // 328
|
||||
0x20AC, 0x20AD, 0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, // 336
|
||||
0x263A, 0x263B, 0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D30, 0x2D31, // 344
|
||||
0x2D7F, 0x2D80, 0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, // 352
|
||||
0x3099, 0x309B, 0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, // 360
|
||||
0xA288, 0xA289, 0xA4D0, 0xA4D1, 0xA549, 0xA54A, 0xA66F, 0xA670, // 368
|
||||
0xA674, 0xA67E, 0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, // 376
|
||||
0xA806, 0xA807, 0xA82C, 0xA82D, 0xA840, 0xA841, 0xA882, 0xA883, // 384
|
||||
0xA8C4, 0xA8C5, 0xA8E0, 0xA8F2, 0xA90A, 0xA90B, 0xA92B, 0xA92E, // 392
|
||||
0xA930, 0xA931, 0xA953, 0xA954, 0xA984, 0xA985, 0xA9B3, 0xA9B4, // 400
|
||||
0xA9C0, 0xA9C1, 0xAA00, 0xAA01, 0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, // 408
|
||||
0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, 0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, // 416
|
||||
0xABC0, 0xABC1, 0xABED, 0xABEE, 0xAC00, 0xAC01, 0xD800, 0xD809, // 424
|
||||
0xD80B, 0xD80D, 0xD811, 0xD812, 0xD818, 0xD819, 0xD81A, 0xD81C, // 432
|
||||
0xD820, 0xD821, 0xD823, 0xD824, 0xD82C, 0xD82D, 0xD82F, 0xD830, // 440
|
||||
0xD834, 0xD835, 0xD838, 0xD83B, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, // 448
|
||||
0xFDD0, 0xFDD1, 0xFE20, 0xFE30, 0x0001, 0x0000, 0x0001, 0x0001, // 456
|
||||
0x0001, 0x01FD, 0x0001, 0x01FE, 0x0001, 0x0280, 0x0001, 0x0281, // 464
|
||||
0x0001, 0x02A0, 0x0001, 0x02A1, 0x0001, 0x02E0, 0x0001, 0x02E1, // 472
|
||||
0x0001, 0x0300, 0x0001, 0x0301, 0x0001, 0x0330, 0x0001, 0x0331, // 480
|
||||
0x0001, 0x036B, 0x0001, 0x036C, 0x0001, 0x0376, 0x0001, 0x037B, // 488
|
||||
0x0001, 0x0380, 0x0001, 0x0381, 0x0001, 0x03A0, 0x0001, 0x03A1, // 496
|
||||
0x0001, 0x0414, 0x0001, 0x0415, 0x0001, 0x0450, 0x0001, 0x0451, // 504
|
||||
0x0001, 0x0480, 0x0001, 0x0481, 0x0001, 0x04B5, 0x0001, 0x04B6, // 512
|
||||
0x0001, 0x0500, 0x0001, 0x0501, 0x0001, 0x0537, 0x0001, 0x0538, // 520
|
||||
0x0001, 0x0582, 0x0001, 0x0583, 0x0001, 0x05C2, 0x0001, 0x05C3, // 528
|
||||
0x0001, 0x0647, 0x0001, 0x0648, 0x0001, 0x0800, 0x0001, 0x0801, // 536
|
||||
0x0001, 0x0840, 0x0001, 0x0841, 0x0001, 0x0873, 0x0001, 0x0874, // 544
|
||||
0x0001, 0x0896, 0x0001, 0x0897, 0x0001, 0x08F4, 0x0001, 0x08F5, // 552
|
||||
0x0001, 0x0900, 0x0001, 0x0901, 0x0001, 0x0920, 0x0001, 0x0921, // 560
|
||||
0x0001, 0x0950, 0x0001, 0x0951, 0x0001, 0x0980, 0x0001, 0x0981, // 568
|
||||
0x0001, 0x09A0, 0x0001, 0x09A1, 0x0001, 0x0A00, 0x0001, 0x0A01, // 576
|
||||
0x0001, 0x0A0D, 0x0001, 0x0A0E, 0x0001, 0x0A0F, 0x0001, 0x0A10, // 584
|
||||
0x0001, 0x0A38, 0x0001, 0x0A3B, 0x0001, 0x0A3F, 0x0001, 0x0A40, // 592
|
||||
0x0001, 0x0A60, 0x0001, 0x0A61, 0x0001, 0x0A95, 0x0001, 0x0A96, // 600
|
||||
0x0001, 0x0AD8, 0x0001, 0x0AD9, 0x0001, 0x0AE5, 0x0001, 0x0AE7, // 608
|
||||
0x0001, 0x0B00, 0x0001, 0x0B01, 0x0001, 0x0B40, 0x0001, 0x0B41, // 616
|
||||
0x0001, 0x0B60, 0x0001, 0x0B61, 0x0001, 0x0B8F, 0x0001, 0x0B90, // 624
|
||||
0x0001, 0x0C00, 0x0001, 0x0C01, 0x0001, 0x0CA1, 0x0001, 0x0CA2, // 632
|
||||
0x0001, 0x0D12, 0x0001, 0x0D13, 0x0001, 0x0D24, 0x0001, 0x0D28, // 640
|
||||
0x0001, 0x0D5D, 0x0001, 0x0D5E, 0x0001, 0x0D69, 0x0001, 0x0D6E, // 648
|
||||
0x0001, 0x0E88, 0x0001, 0x0E89, 0x0001, 0x0EAB, 0x0001, 0x0EAD, // 656
|
||||
0x0001, 0x0EFA, 0x0001, 0x0EFC, 0x0001, 0x0EFD, 0x0001, 0x0F00, // 664
|
||||
0x0001, 0x0F19, 0x0001, 0x0F1A, 0x0001, 0x0F42, 0x0001, 0x0F43, // 672
|
||||
0x0001, 0x0F46, 0x0001, 0x0F51, 0x0001, 0x0F7C, 0x0001, 0x0F7D, // 680
|
||||
0x0001, 0x0F82, 0x0001, 0x0F86, 0x0001, 0x0FBF, 0x0001, 0x0FC0, // 688
|
||||
0x0001, 0x0FF1, 0x0001, 0x0FF2, 0x0001, 0x1005, 0x0001, 0x1006, // 696
|
||||
0x0001, 0x1046, 0x0001, 0x1047, 0x0001, 0x1070, 0x0001, 0x1071, // 704
|
||||
0x0001, 0x107F, 0x0001, 0x1080, 0x0001, 0x1083, 0x0001, 0x1084, // 712
|
||||
0x0001, 0x10B9, 0x0001, 0x10BB, 0x0001, 0x10D0, 0x0001, 0x10D1, // 720
|
||||
0x0001, 0x1100, 0x0001, 0x1104, 0x0001, 0x1127, 0x0001, 0x1128, // 728
|
||||
0x0001, 0x1133, 0x0001, 0x1135, 0x0001, 0x1152, 0x0001, 0x1153, // 736
|
||||
0x0001, 0x1173, 0x0001, 0x1174, 0x0001, 0x1183, 0x0001, 0x1184, // 744
|
||||
0x0001, 0x11C0, 0x0001, 0x11C1, 0x0001, 0x11CA, 0x0001, 0x11CB, // 752
|
||||
0x0001, 0x1208, 0x0001, 0x1209, 0x0001, 0x1235, 0x0001, 0x1237, // 760
|
||||
0x0001, 0x128F, 0x0001, 0x1290, 0x0001, 0x12BE, 0x0001, 0x12BF, // 768
|
||||
0x0001, 0x12E9, 0x0001, 0x12EB, 0x0001, 0x1315, 0x0001, 0x1316, // 776
|
||||
0x0001, 0x133B, 0x0001, 0x133D, 0x0001, 0x133E, 0x0001, 0x133F, // 784
|
||||
0x0001, 0x134D, 0x0001, 0x134E, 0x0001, 0x1357, 0x0001, 0x1358, // 792
|
||||
0x0001, 0x1366, 0x0001, 0x136D, 0x0001, 0x1370, 0x0001, 0x1375, // 800
|
||||
0x0001, 0x1392, 0x0001, 0x1393, 0x0001, 0x13B8, 0x0001, 0x13B9, // 808
|
||||
0x0001, 0x13BB, 0x0001, 0x13BC, 0x0001, 0x13C2, 0x0001, 0x13C3, // 816
|
||||
0x0001, 0x13C9, 0x0001, 0x13CA, 0x0001, 0x13CE, 0x0001, 0x13D1, // 824
|
||||
0x0001, 0x1412, 0x0001, 0x1413, 0x0001, 0x1442, 0x0001, 0x1443, // 832
|
||||
0x0001, 0x1446, 0x0001, 0x1447, 0x0001, 0x145E, 0x0001, 0x145F, // 840
|
||||
0x0001, 0x1484, 0x0001, 0x1485, 0x0001, 0x14B0, 0x0001, 0x14B1, // 848
|
||||
0x0001, 0x14BA, 0x0001, 0x14BB, 0x0001, 0x14BD, 0x0001, 0x14BE, // 856
|
||||
0x0001, 0x14C2, 0x0001, 0x14C4, 0x0001, 0x158E, 0x0001, 0x158F, // 864
|
||||
0x0001, 0x15AF, 0x0001, 0x15B0, 0x0001, 0x15BF, 0x0001, 0x15C1, // 872
|
||||
0x0001, 0x160E, 0x0001, 0x160F, 0x0001, 0x163F, 0x0001, 0x1640, // 880
|
||||
0x0001, 0x1680, 0x0001, 0x1681, 0x0001, 0x16B6, 0x0001, 0x16B8, // 888
|
||||
0x0001, 0x1717, 0x0001, 0x1718, 0x0001, 0x172B, 0x0001, 0x172C, // 896
|
||||
0x0001, 0x180B, 0x0001, 0x180C, 0x0001, 0x1839, 0x0001, 0x183B, // 904
|
||||
0x0001, 0x18B4, 0x0001, 0x18B5, 0x0001, 0x190C, 0x0001, 0x190D, // 912
|
||||
0x0001, 0x1930, 0x0001, 0x1931, 0x0001, 0x193D, 0x0001, 0x193F, // 920
|
||||
0x0001, 0x1943, 0x0001, 0x1944, 0x0001, 0x19CE, 0x0001, 0x19CF, // 928
|
||||
0x0001, 0x19E0, 0x0001, 0x19E1, 0x0001, 0x1A0B, 0x0001, 0x1A0C, // 936
|
||||
0x0001, 0x1A34, 0x0001, 0x1A35, 0x0001, 0x1A47, 0x0001, 0x1A48, // 944
|
||||
0x0001, 0x1A5C, 0x0001, 0x1A5D, 0x0001, 0x1A99, 0x0001, 0x1A9A, // 952
|
||||
0x0001, 0x1AC0, 0x0001, 0x1AC1, 0x0001, 0x1BC4, 0x0001, 0x1BC5, // 960
|
||||
0x0001, 0x1C0E, 0x0001, 0x1C0F, 0x0001, 0x1C3F, 0x0001, 0x1C40, // 968
|
||||
0x0001, 0x1C72, 0x0001, 0x1C73, 0x0001, 0x1D10, 0x0001, 0x1D11, // 976
|
||||
0x0001, 0x1D42, 0x0001, 0x1D43, 0x0001, 0x1D44, 0x0001, 0x1D46, // 984
|
||||
0x0001, 0x1D71, 0x0001, 0x1D72, 0x0001, 0x1D97, 0x0001, 0x1D98, // 992
|
||||
0x0001, 0x1DC6, 0x0001, 0x1DC7, 0x0001, 0x1EE5, 0x0001, 0x1EE6, // 1000
|
||||
0x0001, 0x1F1B, 0x0001, 0x1F1C, 0x0001, 0x1F41, 0x0001, 0x1F43, // 1008
|
||||
0x0001, 0x2000, 0x0001, 0x2001, 0x0001, 0x2FE5, 0x0001, 0x2FE6, // 1016
|
||||
0x0001, 0x3153, 0x0001, 0x3154, 0x0001, 0x4400, 0x0001, 0x4401, // 1024
|
||||
0x0001, 0x611C, 0x0001, 0x611D, 0x0001, 0x611E, 0x0001, 0x6121, // 1032
|
||||
0x0001, 0x6123, 0x0001, 0x6126, 0x0001, 0x6129, 0x0001, 0x612A, // 1040
|
||||
0x0001, 0x612F, 0x0001, 0x6130, 0x0001, 0x6A4F, 0x0001, 0x6A50, // 1048
|
||||
0x0001, 0x6ABC, 0x0001, 0x6ABD, 0x0001, 0x6AE6, 0x0001, 0x6AE7, // 1056
|
||||
0x0001, 0x6AF0, 0x0001, 0x6AF5, 0x0001, 0x6B1C, 0x0001, 0x6B1D, // 1064
|
||||
0x0001, 0x6B30, 0x0001, 0x6B37, 0x0001, 0x6D45, 0x0001, 0x6D46, // 1072
|
||||
0x0001, 0x6D67, 0x0001, 0x6D69, 0x0001, 0x6E40, 0x0001, 0x6E41, // 1080
|
||||
0x0001, 0x6EA1, 0x0001, 0x6EA2, 0x0001, 0x6F00, 0x0001, 0x6F01, // 1088
|
||||
0x0001, 0x6FF0, 0x0001, 0x6FF2, 0x0001, 0x8229, 0x0001, 0x822A, // 1096
|
||||
0x0001, 0x8C65, 0x0001, 0x8C66, 0x0001, 0xB1C4, 0x0001, 0xB1C5, // 1104
|
||||
0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, 0x0001, 0xBC9F, // 1112
|
||||
0x0001, 0xD165, 0x0001, 0xD16A, 0x0001, 0xD16D, 0x0001, 0xD173, // 1120
|
||||
0x0001, 0xD17B, 0x0001, 0xD183, 0x0001, 0xD185, 0x0001, 0xD18C, // 1128
|
||||
0x0001, 0xD1AA, 0x0001, 0xD1AE, 0x0001, 0xD242, 0x0001, 0xD245, // 1136
|
||||
0x0001, 0xE000, 0x0001, 0xE007, 0x0001, 0xE008, 0x0001, 0xE019, // 1144
|
||||
0x0001, 0xE01B, 0x0001, 0xE022, 0x0001, 0xE023, 0x0001, 0xE025, // 1152
|
||||
0x0001, 0xE026, 0x0001, 0xE02B, 0x0001, 0xE08F, 0x0001, 0xE090, // 1160
|
||||
0x0001, 0xE108, 0x0001, 0xE109, 0x0001, 0xE130, 0x0001, 0xE137, // 1168
|
||||
0x0001, 0xE290, 0x0001, 0xE291, 0x0001, 0xE2AE, 0x0001, 0xE2AF, // 1176
|
||||
0x0001, 0xE2E1, 0x0001, 0xE2E2, 0x0001, 0xE2EC, 0x0001, 0xE2F0, // 1184
|
||||
0x0001, 0xE4E6, 0x0001, 0xE4E7, 0x0001, 0xE4EC, 0x0001, 0xE4F0, // 1192
|
||||
0x0001, 0xE5D0, 0x0001, 0xE5D1, 0x0001, 0xE5EE, 0x0001, 0xE5F0, // 1200
|
||||
0x0001, 0xE6D5, 0x0001, 0xE6D6, 0x0001, 0xE6E3, 0x0001, 0xE6E4, // 1208
|
||||
0x0001, 0xE6E6, 0x0001, 0xE6E7, 0x0001, 0xE6EE, 0x0001, 0xE6F0, // 1216
|
||||
0x0001, 0xE6F5, 0x0001, 0xE6F6, 0x0001, 0xE802, 0x0001, 0xE803, // 1224
|
||||
0x0001, 0xE8D0, 0x0001, 0xE8D7, 0x0001, 0xE909, 0x0001, 0xE90A, // 1232
|
||||
0x0001, 0xE944, 0x0001, 0xE94B};
|
||||
#endif
|
||||
+18
-41
@@ -78,47 +78,6 @@ CopticCalendar::handleGetExtendedYear(UErrorCode& status)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
|
||||
{
|
||||
int32_t eyear, month, day, era, year;
|
||||
jdToCE(julianDay, getJDEpochOffset(), eyear, month, day, status);
|
||||
if (U_FAILURE(status)) return;
|
||||
|
||||
if (eyear <= 0) {
|
||||
era = BCE;
|
||||
year = 1 - eyear;
|
||||
} else {
|
||||
era = CE;
|
||||
year = eyear;
|
||||
}
|
||||
|
||||
internalSet(UCAL_EXTENDED_YEAR, eyear);
|
||||
internalSet(UCAL_ERA, era);
|
||||
internalSet(UCAL_YEAR, year);
|
||||
internalSet(UCAL_MONTH, month);
|
||||
internalSet(UCAL_ORDINAL_MONTH, month);
|
||||
internalSet(UCAL_DATE, day);
|
||||
internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day);
|
||||
}
|
||||
|
||||
constexpr uint32_t kCopticRelatedYearDiff = 284;
|
||||
|
||||
int32_t CopticCalendar::getRelatedYear(UErrorCode &status) const
|
||||
{
|
||||
int32_t year = get(UCAL_EXTENDED_YEAR, status);
|
||||
if (U_FAILURE(status)) {
|
||||
return 0;
|
||||
}
|
||||
return year + kCopticRelatedYearDiff;
|
||||
}
|
||||
|
||||
void CopticCalendar::setRelatedYear(int32_t year)
|
||||
{
|
||||
// set extended year
|
||||
set(UCAL_EXTENDED_YEAR, year - kCopticRelatedYearDiff);
|
||||
}
|
||||
|
||||
IMPL_SYSTEM_DEFAULT_CENTURY(CopticCalendar, "@calendar=coptic")
|
||||
|
||||
int32_t
|
||||
@@ -127,6 +86,24 @@ CopticCalendar::getJDEpochOffset() const
|
||||
return COPTIC_JD_EPOCH_OFFSET;
|
||||
}
|
||||
|
||||
int32_t CopticCalendar::extendedYearToEra(int32_t extendedYear) const {
|
||||
return extendedYear <= 0 ? BCE : CE;
|
||||
}
|
||||
|
||||
int32_t CopticCalendar::extendedYearToYear(int32_t extendedYear) const {
|
||||
return extendedYear <= 0 ? 1 - extendedYear : extendedYear;
|
||||
}
|
||||
|
||||
bool CopticCalendar::isEra0CountingBackward() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
int32_t
|
||||
CopticCalendar::getRelatedYearDifference() const {
|
||||
constexpr int32_t kCopticCalendarRelatedYearDifference = 284;
|
||||
return kCopticCalendarRelatedYearDifference;
|
||||
}
|
||||
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
|
||||
+22
-40
@@ -154,46 +154,46 @@ public:
|
||||
*/
|
||||
const char * getType() const override;
|
||||
|
||||
/**
|
||||
* @return The related Gregorian year; will be obtained by modifying the value
|
||||
* obtained by get from UCAL_EXTENDED_YEAR field
|
||||
* @internal
|
||||
*/
|
||||
virtual int32_t getRelatedYear(UErrorCode &status) const override;
|
||||
|
||||
/**
|
||||
* @param year The related Gregorian year to set; will be modified as necessary then
|
||||
* set in UCAL_EXTENDED_YEAR field
|
||||
* @internal
|
||||
*/
|
||||
virtual void setRelatedYear(int32_t year) override;
|
||||
|
||||
protected:
|
||||
//-------------------------------------------------------------------------
|
||||
// Calendar framework
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
int32_t getRelatedYearDifference() const override;
|
||||
|
||||
/**
|
||||
* Return the extended year defined by the current fields.
|
||||
* @internal
|
||||
*/
|
||||
virtual int32_t handleGetExtendedYear(UErrorCode& status) override;
|
||||
|
||||
/**
|
||||
* Compute fields from the JD
|
||||
* @internal
|
||||
*/
|
||||
virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override;
|
||||
|
||||
DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY
|
||||
|
||||
/**
|
||||
* Return the date offset from Julian
|
||||
* @internal
|
||||
*/
|
||||
virtual int32_t getJDEpochOffset() const override;
|
||||
int32_t getJDEpochOffset() const override;
|
||||
|
||||
virtual bool isEra0CountingBackward() const override { return true; }
|
||||
/**
|
||||
* Compute the era from extended year.
|
||||
* @internal
|
||||
*/
|
||||
int32_t extendedYearToEra(int32_t extendedYear) const override;
|
||||
|
||||
/**
|
||||
* Compute the year from extended year.
|
||||
* @internal
|
||||
*/
|
||||
int32_t extendedYearToYear(int32_t extendedYear) const override;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
bool isEra0CountingBackward() const override;
|
||||
public:
|
||||
/**
|
||||
* Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual
|
||||
@@ -220,24 +220,6 @@ public:
|
||||
*/
|
||||
U_I18N_API static UClassID U_EXPORT2 getStaticClassID();
|
||||
|
||||
#if 0
|
||||
// We do not want to introduce this API in ICU4C.
|
||||
// It was accidentally introduced in ICU4J as a public API.
|
||||
public:
|
||||
//-------------------------------------------------------------------------
|
||||
// Calendar system Conversion methods...
|
||||
//-------------------------------------------------------------------------
|
||||
/**
|
||||
* Convert an Coptic year, month, and day to a Julian day.
|
||||
*
|
||||
* @param year the extended year
|
||||
* @param month the month
|
||||
* @param day the day
|
||||
* @return Julian day
|
||||
* @internal
|
||||
*/
|
||||
static int32_t copticToJD(int32_t year, int32_t month, int32_t day);
|
||||
#endif
|
||||
};
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
||||
Vendored
+1
-1
@@ -43,7 +43,7 @@ class CharsetRecognizer : public UMemory
|
||||
* Try the given input text against this Charset, and fill in the results object
|
||||
* with the quality of the match plus other information related to the match.
|
||||
*
|
||||
* Return true if the the input bytes are a potential match, and
|
||||
* Return true if the input bytes are a potential match, and
|
||||
* false if the input data is not compatible with, or illegal in this charset.
|
||||
*/
|
||||
virtual UBool match(InputText *textIn, CharsetMatch *results) const = 0;
|
||||
|
||||
Loaded 100 of 241 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user