Use char32_t for QLocaleData::zeroUcs() and friends
Also catch some stray ushort that should be char16_t by now, use unicode character values for some constants and rename a UCS2 variable to not claim it's UCS4. Change-Id: I374b791947f5c965eaa22ad5b16060b475081c9d Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
2d6705575c
commit
e7db401b48
@ -103,9 +103,9 @@ QLocale::Language QLocalePrivate::codeToLanguage(QStringView code) noexcept
|
||||
const auto len = code.size();
|
||||
if (len != 2 && len != 3)
|
||||
return QLocale::C;
|
||||
ushort uc1 = code[0].toLower().unicode();
|
||||
ushort uc2 = code[1].toLower().unicode();
|
||||
ushort uc3 = len > 2 ? code[2].toLower().unicode() : 0;
|
||||
char16_t uc1 = code[0].toLower().unicode();
|
||||
char16_t uc2 = code[1].toLower().unicode();
|
||||
char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
|
||||
|
||||
const unsigned char *c = language_code_list;
|
||||
for (; *c != 0; c += 3) {
|
||||
@ -168,9 +168,9 @@ QLocale::Country QLocalePrivate::codeToCountry(QStringView code) noexcept
|
||||
if (len != 2 && len != 3)
|
||||
return QLocale::AnyCountry;
|
||||
|
||||
ushort uc1 = code[0].toUpper().unicode();
|
||||
ushort uc2 = code[1].toUpper().unicode();
|
||||
ushort uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
|
||||
char16_t uc1 = code[0].toUpper().unicode();
|
||||
char16_t uc2 = code[1].toUpper().unicode();
|
||||
char16_t uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
|
||||
|
||||
const unsigned char *c = country_code_list;
|
||||
for (; *c != 0; c += 3) {
|
||||
@ -879,7 +879,7 @@ QString QLocaleData::zeroDigit() const
|
||||
return zero().getData(single_character_data);
|
||||
}
|
||||
|
||||
uint QLocaleData::zeroUcs() const
|
||||
char32_t QLocaleData::zeroUcs() const
|
||||
{
|
||||
#ifndef QT_NO_SYSTEMLOCALE
|
||||
if (this == systemData()) {
|
||||
@ -3326,7 +3326,7 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
|
||||
QString converted;
|
||||
converted.reserve(2 * digits.size());
|
||||
for (int i = 0; i < digits.length(); ++i) {
|
||||
const uint digit = unicodeForDigit(digits.at(i).unicode() - '0', zeroUcs4);
|
||||
const char32_t digit = unicodeForDigit(digits.at(i).unicode() - '0', zeroUcs4);
|
||||
Q_ASSERT(QChar::requiresSurrogates(digit));
|
||||
converted.append(QChar::highSurrogate(digit));
|
||||
converted.append(QChar::lowSurrogate(digit));
|
||||
@ -3335,8 +3335,8 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
|
||||
} else {
|
||||
Q_ASSERT(zero.size() == 1);
|
||||
Q_ASSERT(!zero.at(0).isSurrogate());
|
||||
ushort z = zero.at(0).unicode();
|
||||
ushort *const value = reinterpret_cast<ushort *>(digits.data());
|
||||
char16_t z = zero.at(0).unicode();
|
||||
char16_t *const value = reinterpret_cast<char16_t *>(digits.data());
|
||||
for (int i = 0; i < digits.length(); ++i)
|
||||
value[i] = unicodeForDigit(value[i] - '0', z);
|
||||
}
|
||||
|
@ -282,7 +282,7 @@ public:
|
||||
QString listSeparator() const;
|
||||
QString percentSign() const;
|
||||
QString zeroDigit() const;
|
||||
uint zeroUcs() const;
|
||||
char32_t zeroUcs() const;
|
||||
QString positiveSign() const;
|
||||
QString negativeSign() const;
|
||||
QString exponentSeparator() const;
|
||||
@ -309,7 +309,7 @@ public:
|
||||
{
|
||||
return listEntry(table, index).viewData(table);
|
||||
}
|
||||
uint ucsFirst(const char16_t *table) const
|
||||
char32_t ucsFirst(const char16_t *table) const
|
||||
{
|
||||
if (size && !QChar::isSurrogate(table[offset]))
|
||||
return table[offset];
|
||||
@ -462,21 +462,18 @@ inline char QLocaleData::numericToCLocale(QStringView in) const
|
||||
if ((group == u"\xa0" || group == u"\x202f") && in == u" ")
|
||||
return ',';
|
||||
|
||||
const uint inUcs4 = in.size() == 2
|
||||
const char32_t inUcs4 = in.size() == 2
|
||||
? QChar::surrogateToUcs4(in.at(0), in.at(1)) : in.at(0).unicode();
|
||||
const uint zeroUcs4 = zeroUcs();
|
||||
const char32_t zeroUcs4 = zeroUcs();
|
||||
// Must match qlocale_tools.h's unicodeForDigit()
|
||||
if (zeroUcs4 == 0x3007u) {
|
||||
if (zeroUcs4 == u'\u3007') {
|
||||
// QTBUG-85409: Suzhou's digits aren't contiguous !
|
||||
if (inUcs4 == zeroUcs4)
|
||||
return '0';
|
||||
if (inUcs4 > 0x3020u && inUcs4 <= 0x3029u)
|
||||
return inUcs4 - 0x3020u;
|
||||
} else {
|
||||
const uint tenUcs4 = zeroUcs4 + 10;
|
||||
|
||||
if (zeroUcs4 <= inUcs4 && inUcs4 < tenUcs4)
|
||||
return '0' + inUcs4 - zeroUcs4;
|
||||
if (inUcs4 > u'\u3020' && inUcs4 <= u'\u3029')
|
||||
return inUcs4 - u'\u3020';
|
||||
} else if (zeroUcs4 <= inUcs4 && inUcs4 < zeroUcs4 + 10) {
|
||||
return '0' + inUcs4 - zeroUcs4;
|
||||
}
|
||||
if ('0' <= inUcs4 && inUcs4 <= '9')
|
||||
return inUcs4;
|
||||
|
@ -461,8 +461,8 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
|
||||
// per digit. We do not need a terminator.
|
||||
const unsigned maxlen = 128;
|
||||
static_assert(CHAR_BIT * sizeof(number) <= maxlen);
|
||||
ushort buff[maxlen];
|
||||
ushort *const end = buff + maxlen, *p = end;
|
||||
char16_t buff[maxlen];
|
||||
char16_t *const end = buff + maxlen, *p = end;
|
||||
|
||||
if (base != 10 || zero == u"0") {
|
||||
while (number != 0) {
|
||||
@ -471,16 +471,16 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
|
||||
number /= base;
|
||||
}
|
||||
} else if (zero.size() && !zero.at(0).isSurrogate()) {
|
||||
const ushort zeroUcs4 = zero.at(0).unicode();
|
||||
const char16_t zeroUcs2 = zero.at(0).unicode();
|
||||
while (number != 0) {
|
||||
*(--p) = unicodeForDigit(number % base, zeroUcs4);
|
||||
*(--p) = unicodeForDigit(number % base, zeroUcs2);
|
||||
|
||||
number /= base;
|
||||
}
|
||||
} else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
|
||||
const uint zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
|
||||
const char32_t zeroUcs4 = QChar::surrogateToUcs4(zero.at(0), zero.at(1));
|
||||
while (number != 0) {
|
||||
const uint digit = unicodeForDigit(number % base, zeroUcs4);
|
||||
const char32_t digit = unicodeForDigit(number % base, zeroUcs4);
|
||||
|
||||
*(--p) = QChar::lowSurrogate(digit);
|
||||
*(--p) = QChar::highSurrogate(digit);
|
||||
|
@ -100,8 +100,8 @@ inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
|
||||
return zero;
|
||||
|
||||
// See QTBUG-85409: Suzhou's digits are U+3007, U+2021, ..., U+3029
|
||||
if (zero == 0x3007u)
|
||||
return 0x3020u + digit;
|
||||
if (zero == u'\u3007')
|
||||
return u'\u3020' + digit;
|
||||
// At CLDR 36.1, no other number system's digits were discontinuous.
|
||||
|
||||
return zero + digit;
|
||||
|
Loading…
Reference in New Issue
Block a user