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();
|
const auto len = code.size();
|
||||||
if (len != 2 && len != 3)
|
if (len != 2 && len != 3)
|
||||||
return QLocale::C;
|
return QLocale::C;
|
||||||
ushort uc1 = code[0].toLower().unicode();
|
char16_t uc1 = code[0].toLower().unicode();
|
||||||
ushort uc2 = code[1].toLower().unicode();
|
char16_t uc2 = code[1].toLower().unicode();
|
||||||
ushort uc3 = len > 2 ? code[2].toLower().unicode() : 0;
|
char16_t uc3 = len > 2 ? code[2].toLower().unicode() : 0;
|
||||||
|
|
||||||
const unsigned char *c = language_code_list;
|
const unsigned char *c = language_code_list;
|
||||||
for (; *c != 0; c += 3) {
|
for (; *c != 0; c += 3) {
|
||||||
@ -168,9 +168,9 @@ QLocale::Country QLocalePrivate::codeToCountry(QStringView code) noexcept
|
|||||||
if (len != 2 && len != 3)
|
if (len != 2 && len != 3)
|
||||||
return QLocale::AnyCountry;
|
return QLocale::AnyCountry;
|
||||||
|
|
||||||
ushort uc1 = code[0].toUpper().unicode();
|
char16_t uc1 = code[0].toUpper().unicode();
|
||||||
ushort uc2 = code[1].toUpper().unicode();
|
char16_t uc2 = code[1].toUpper().unicode();
|
||||||
ushort uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
|
char16_t uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
|
||||||
|
|
||||||
const unsigned char *c = country_code_list;
|
const unsigned char *c = country_code_list;
|
||||||
for (; *c != 0; c += 3) {
|
for (; *c != 0; c += 3) {
|
||||||
@ -879,7 +879,7 @@ QString QLocaleData::zeroDigit() const
|
|||||||
return zero().getData(single_character_data);
|
return zero().getData(single_character_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint QLocaleData::zeroUcs() const
|
char32_t QLocaleData::zeroUcs() const
|
||||||
{
|
{
|
||||||
#ifndef QT_NO_SYSTEMLOCALE
|
#ifndef QT_NO_SYSTEMLOCALE
|
||||||
if (this == systemData()) {
|
if (this == systemData()) {
|
||||||
@ -3326,7 +3326,7 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
|
|||||||
QString converted;
|
QString converted;
|
||||||
converted.reserve(2 * digits.size());
|
converted.reserve(2 * digits.size());
|
||||||
for (int i = 0; i < digits.length(); ++i) {
|
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));
|
Q_ASSERT(QChar::requiresSurrogates(digit));
|
||||||
converted.append(QChar::highSurrogate(digit));
|
converted.append(QChar::highSurrogate(digit));
|
||||||
converted.append(QChar::lowSurrogate(digit));
|
converted.append(QChar::lowSurrogate(digit));
|
||||||
@ -3335,8 +3335,8 @@ QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
|
|||||||
} else {
|
} else {
|
||||||
Q_ASSERT(zero.size() == 1);
|
Q_ASSERT(zero.size() == 1);
|
||||||
Q_ASSERT(!zero.at(0).isSurrogate());
|
Q_ASSERT(!zero.at(0).isSurrogate());
|
||||||
ushort z = zero.at(0).unicode();
|
char16_t z = zero.at(0).unicode();
|
||||||
ushort *const value = reinterpret_cast<ushort *>(digits.data());
|
char16_t *const value = reinterpret_cast<char16_t *>(digits.data());
|
||||||
for (int i = 0; i < digits.length(); ++i)
|
for (int i = 0; i < digits.length(); ++i)
|
||||||
value[i] = unicodeForDigit(value[i] - '0', z);
|
value[i] = unicodeForDigit(value[i] - '0', z);
|
||||||
}
|
}
|
||||||
|
@ -282,7 +282,7 @@ public:
|
|||||||
QString listSeparator() const;
|
QString listSeparator() const;
|
||||||
QString percentSign() const;
|
QString percentSign() const;
|
||||||
QString zeroDigit() const;
|
QString zeroDigit() const;
|
||||||
uint zeroUcs() const;
|
char32_t zeroUcs() const;
|
||||||
QString positiveSign() const;
|
QString positiveSign() const;
|
||||||
QString negativeSign() const;
|
QString negativeSign() const;
|
||||||
QString exponentSeparator() const;
|
QString exponentSeparator() const;
|
||||||
@ -309,7 +309,7 @@ public:
|
|||||||
{
|
{
|
||||||
return listEntry(table, index).viewData(table);
|
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]))
|
if (size && !QChar::isSurrogate(table[offset]))
|
||||||
return 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" ")
|
if ((group == u"\xa0" || group == u"\x202f") && in == u" ")
|
||||||
return ',';
|
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();
|
? 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()
|
// Must match qlocale_tools.h's unicodeForDigit()
|
||||||
if (zeroUcs4 == 0x3007u) {
|
if (zeroUcs4 == u'\u3007') {
|
||||||
// QTBUG-85409: Suzhou's digits aren't contiguous !
|
// QTBUG-85409: Suzhou's digits aren't contiguous !
|
||||||
if (inUcs4 == zeroUcs4)
|
if (inUcs4 == zeroUcs4)
|
||||||
return '0';
|
return '0';
|
||||||
if (inUcs4 > 0x3020u && inUcs4 <= 0x3029u)
|
if (inUcs4 > u'\u3020' && inUcs4 <= u'\u3029')
|
||||||
return inUcs4 - 0x3020u;
|
return inUcs4 - u'\u3020';
|
||||||
} else {
|
} else if (zeroUcs4 <= inUcs4 && inUcs4 < zeroUcs4 + 10) {
|
||||||
const uint tenUcs4 = zeroUcs4 + 10;
|
return '0' + inUcs4 - zeroUcs4;
|
||||||
|
|
||||||
if (zeroUcs4 <= inUcs4 && inUcs4 < tenUcs4)
|
|
||||||
return '0' + inUcs4 - zeroUcs4;
|
|
||||||
}
|
}
|
||||||
if ('0' <= inUcs4 && inUcs4 <= '9')
|
if ('0' <= inUcs4 && inUcs4 <= '9')
|
||||||
return inUcs4;
|
return inUcs4;
|
||||||
|
@ -461,8 +461,8 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
|
|||||||
// per digit. We do not need a terminator.
|
// per digit. We do not need a terminator.
|
||||||
const unsigned maxlen = 128;
|
const unsigned maxlen = 128;
|
||||||
static_assert(CHAR_BIT * sizeof(number) <= maxlen);
|
static_assert(CHAR_BIT * sizeof(number) <= maxlen);
|
||||||
ushort buff[maxlen];
|
char16_t buff[maxlen];
|
||||||
ushort *const end = buff + maxlen, *p = end;
|
char16_t *const end = buff + maxlen, *p = end;
|
||||||
|
|
||||||
if (base != 10 || zero == u"0") {
|
if (base != 10 || zero == u"0") {
|
||||||
while (number != 0) {
|
while (number != 0) {
|
||||||
@ -471,16 +471,16 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
|
|||||||
number /= base;
|
number /= base;
|
||||||
}
|
}
|
||||||
} else if (zero.size() && !zero.at(0).isSurrogate()) {
|
} 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) {
|
while (number != 0) {
|
||||||
*(--p) = unicodeForDigit(number % base, zeroUcs4);
|
*(--p) = unicodeForDigit(number % base, zeroUcs2);
|
||||||
|
|
||||||
number /= base;
|
number /= base;
|
||||||
}
|
}
|
||||||
} else if (zero.size() == 2 && zero.at(0).isHighSurrogate()) {
|
} 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) {
|
while (number != 0) {
|
||||||
const uint digit = unicodeForDigit(number % base, zeroUcs4);
|
const char32_t digit = unicodeForDigit(number % base, zeroUcs4);
|
||||||
|
|
||||||
*(--p) = QChar::lowSurrogate(digit);
|
*(--p) = QChar::lowSurrogate(digit);
|
||||||
*(--p) = QChar::highSurrogate(digit);
|
*(--p) = QChar::highSurrogate(digit);
|
||||||
|
@ -100,8 +100,8 @@ inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
|
|||||||
return zero;
|
return zero;
|
||||||
|
|
||||||
// See QTBUG-85409: Suzhou's digits are U+3007, U+2021, ..., U+3029
|
// See QTBUG-85409: Suzhou's digits are U+3007, U+2021, ..., U+3029
|
||||||
if (zero == 0x3007u)
|
if (zero == u'\u3007')
|
||||||
return 0x3020u + digit;
|
return u'\u3020' + digit;
|
||||||
// At CLDR 36.1, no other number system's digits were discontinuous.
|
// At CLDR 36.1, no other number system's digits were discontinuous.
|
||||||
|
|
||||||
return zero + digit;
|
return zero + digit;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user