6#ifndef QSTRINGCONVERTER_P_H
7#define QSTRINGCONVERTER_P_H
20#include <QtCore/qstring.h>
21#include <QtCore/qendian.h>
22#include <QtCore/qstringconverter.h>
23#include <QtCore/private/qglobal_p.h>
30using qchar8_t = char8_t;
36 static char16_t *
convertToUnicode(
char16_t *dst, QLatin1StringView in)
noexcept;
40 char16_t *dst =
reinterpret_cast<
char16_t *>(buffer);
41 dst = convertToUnicode(dst, in);
42 return reinterpret_cast<QChar *>(dst);
46 [[
maybe_unused]] QStringConverter::State *state)
noexcept
50 return convertToUnicode(dst, QLatin1StringView(in.data(), in.size()));
53 static char *
convertFromUnicode(
char *out, QStringView in, QStringConverter::State *state)
noexcept;
102 { *ptr++ =
char16_t(uc); }
106 appendUtf16(ptr, QChar::highSurrogate(uc));
107 appendUtf16(ptr, QChar::lowSurrogate(uc));
110 static char16_t peekUtf16(
const char16_t *ptr, qsizetype n = 0) {
return ptr[n]; }
113 {
return end - ptr; }
115 static void advanceUtf16(
const char16_t *&ptr, qsizetype n = 1) { ptr += n; }
118 { *ptr++ =
char32_t(uc); }
135 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
136 int toUtf8(
char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
138 if (!Traits::skipAsciiHandling && u < 0x80) {
140 Traits::appendByte(dst, uchar(u));
142 }
else if (u < 0x0800) {
145 Traits::appendByte(dst, 0xc0 | uchar(u >> 6));
147 if (!QChar::isSurrogate(u)) {
149 if (!Traits::allowNonCharacters && QChar::isNonCharacter(u))
150 return Traits::Error;
153 Traits::appendByte(dst, 0xe0 | uchar(u >> 12));
157 if (Traits::availableUtf16(src, end) == 0)
158 return Traits::EndOfString;
160 char16_t low = Traits::peekUtf16(src);
161 if (!QChar::isHighSurrogate(u))
162 return Traits::Error;
163 if (!QChar::isLowSurrogate(low))
164 return Traits::Error;
166 Traits::advanceUtf16(src);
167 char32_t ucs4 = QChar::surrogateToUcs4(u, low);
169 if (!Traits::allowNonCharacters && QChar::isNonCharacter(ucs4))
170 return Traits::Error;
173 Traits::appendByte(dst, 0xf0 | (uchar(ucs4 >> 18) & 0xf));
176 Traits::appendByte(dst, 0x80 | (uchar(ucs4 >> 12) & 0x3f));
183 Traits::appendByte(dst, 0x80 | (uchar(u >> 6) & 0x3f));
187 Traits::appendByte(dst, 0x80 | (u & 0x3f));
193 return (b & 0xc0) == 0x80;
198 template <
typename Traits,
typename OutputPtr,
typename InputPtr>
inline
201 qsizetype charsNeeded;
205 if (!Traits::skipAsciiHandling && b < 0x80) {
207 Traits::appendUtf16(dst, b);
211 if (!Traits::isTrusted && Q_UNLIKELY(b <= 0xC1)) {
214 return Traits::Error;
215 }
else if (b < 0xe0) {
219 }
else if (b < 0xf0) {
223 }
else if (b < 0xf5) {
231 return Traits::Error;
234 qptrdiff bytesAvailable = Traits::availableBytes(src, end);
235 if (Q_UNLIKELY(bytesAvailable < charsNeeded - 1)) {
237 if (bytesAvailable > 0 && !isContinuationByte(Traits::peekByte(src, 0)))
238 return Traits::Error;
239 if (bytesAvailable > 1 && !isContinuationByte(Traits::peekByte(src, 1)))
240 return Traits::Error;
241 return Traits::EndOfString;
245 b = Traits::peekByte(src, 0);
246 if (!isContinuationByte(b))
247 return Traits::Error;
251 if (charsNeeded > 2) {
253 b = Traits::peekByte(src, 1);
254 if (!isContinuationByte(b))
255 return Traits::Error;
259 if (charsNeeded > 3) {
261 b = Traits::peekByte(src, 2);
262 if (!isContinuationByte(b))
263 return Traits::Error;
270 if (!Traits::isTrusted) {
272 return Traits::Error;
273 if (QChar::isSurrogate(uc) || uc > QChar::LastValidCodePoint)
274 return Traits::Error;
275 if (!Traits::allowNonCharacters && QChar::isNonCharacter(uc))
276 return Traits::Error;
280 if (!QChar::requiresSurrogates(uc)) {
283 Traits::appendUtf16(dst,
char16_t(uc));
286 Traits::appendUcs4(dst, uc);
289 Traits::advanceByte(src, charsNeeded - 1);
305 char16_t *dst =
reinterpret_cast<
char16_t *>(buffer);
306 dst =
QUtf8::convertToUnicode(dst, in);
307 return reinterpret_cast<QChar *>(dst);
310 Q_CORE_EXPORT
static char16_t*
convertToUnicode(
char16_t *dst, QByteArrayView in)
noexcept;
316 char16_t *buffer =
reinterpret_cast<
char16_t *>(out);
317 buffer = convertToUnicode(buffer, in, state);
318 return reinterpret_cast<QChar *>(buffer);
321 static char16_t *
convertToUnicode(
char16_t *dst, QByteArrayView in, QStringConverter::State *state);
326 static char *
convertFromUnicode(
char *out, QStringView in, QStringConverter::State *state);
333 static int compareUtf8(QByteArrayView utf8, QStringView utf16,
335 static int compareUtf8(QByteArrayView utf8, QLatin1StringView s,
337 static int compareUtf8(QByteArrayView lhs, QByteArrayView rhs,
341 template <
typename OnErrorLambda>
static char *
342 convertFromUnicode(
char *out, QStringView in, OnErrorLambda &&onError)
noexcept;
343 template <
typename OnErrorLambda>
static char16_t *
344 convertToUnicode(
char16_t *dst, QByteArrayView in, OnErrorLambda &&onError)
noexcept;
365#if !defined(Q_OS_WIN) || defined(QT_BOOTSTRAPPED)
366 static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
367 {
return QUtf8::convertToUnicode(in, state); }
368 static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
369 {
return QUtf8::convertFromUnicode(in, state); }
371 static int checkUtf8();
375 static QBasicAtomicInteger<qint8> result = { 0 };
376 int r = result.loadRelaxed();
379 result.storeRelaxed(r);
383 static QString convertToUnicode_sys(QByteArrayView, quint32, QStringConverter::State *);
384 static QString convertToUnicode_sys(QByteArrayView, QStringConverter::State *);
385 static QString convertToUnicode(QByteArrayView in, QStringConverter::State *state)
388 return QUtf8::convertToUnicode(in, state);
389 return convertToUnicode_sys(in, state);
391 static QByteArray convertFromUnicode_sys(QStringView, quint32, QStringConverter::State *);
392 static QByteArray convertFromUnicode_sys(QStringView, QStringConverter::State *);
393 static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state)
396 return QUtf8::convertFromUnicode(in, state);
397 return convertFromUnicode_sys(in, state);
QDataStream & operator>>(QDataStream &in, QByteArray &ba)
Reads a byte array into ba from the stream in and returns a reference to the stream.
quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
static QLatin1StringView scriptToCode(QLocale::Script script)
QString toUpper(const QString &str, bool *ok) const
static const QLocalePrivate * get(const QLocale &l)
QString toLower(const QString &str, bool *ok) const
quint16 languageId() const
static QLocale::Language codeToLanguage(QStringView code, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) noexcept
const QLocaleData *const m_data
QLatin1StringView scriptCode() const
QLocale::MeasurementSystem measurementSystem() const
quint16 territoryId() const
static QLatin1StringView territoryToCode(QLocale::Territory territory)
static QLocale::Territory codeToTerritory(QStringView code) noexcept
static std::array< char, 4 > languageToCode(QLocale::Language language, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode)
static QLocale::Script codeToScript(QStringView code) noexcept
QLocale::NumberOptions m_numberOptions
QLatin1StringView territoryCode() const
constexpr QLocalePrivate(const QLocaleData *data, qsizetype index, QLocale::NumberOptions numberOptions=QLocale::DefaultNumberOptions, int refs=0)
std::array< char, 4 > languageCode(QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) const
static QBasicAtomicInt s_generation
QByteArray bcp47Name(char separator='-') const
~QScopedArrayPointer()=default
const T & operator[](qsizetype i) const
T & operator[](qsizetype i)
friend bool operator==(std::nullptr_t, const QScopedPointer< T, Cleanup > &rhs) noexcept
bool operator!() const noexcept
friend bool operator==(const QScopedPointer< T, Cleanup > &lhs, std::nullptr_t) noexcept
T * operator->() const noexcept
bool isNull() const noexcept
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
friend bool operator!=(std::nullptr_t, const QScopedPointer< T, Cleanup > &rhs) noexcept
friend bool operator!=(const QScopedPointer< T, Cleanup > &lhs, std::nullptr_t) noexcept
T * data() const noexcept
friend bool operator!=(const QScopedPointer< T, Cleanup > &lhs, const QScopedPointer< T, Cleanup > &rhs) noexcept
friend bool operator==(const QScopedPointer< T, Cleanup > &lhs, const QScopedPointer< T, Cleanup > &rhs) noexcept
qsizetype fallbackLocaleIndex() const
@ StringToAlternateQuotation
@ StandaloneMonthNameLong
@ StandaloneDayNameNarrow
@ StandaloneMonthNameNarrow
@ StringToStandardQuotation
@ StandaloneMonthNameShort
virtual QLocale fallbackLocale() const
virtual QVariant query(QueryType type, QVariant &&in=QVariant()) const
Combined button and popup list for selecting options.
qsizetype fromUtf8(uchar b, OutputPtr &dst, InputPtr &src, InputPtr end)
int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
bool isContinuationByte(uchar b)
constexpr char ascii_space_chars[]
constexpr auto makeCharacterSetMatch() noexcept
static constexpr bool isLowerCaseAscii(char c)
static const quint16 crc_tbl[16]
QByteArray qCompress(const uchar *data, qsizetype nbytes, int compressionLevel)
static Q_DECL_COLD_FUNCTION const char * zlibOpAsString(ZLibOp op)
static QByteArray toCase_template(T &input, uchar(*lookup)(uchar))
static void q_fromPercentEncoding(QByteArray *ba, char percent)
int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2)
static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char *needle, qsizetype ol, qsizetype from)
static constexpr bool isUpperCaseAscii(char c)
static QByteArray xxflate(ZLibOp op, QArrayDataPointer< char > out, QByteArrayView input, qxp::function_ref< int(z_stream *) const > init, qxp::function_ref< int(z_stream *, size_t) const > processChunk, qxp::function_ref< void(z_stream *) const > deinit)
static constexpr uchar asciiLower(uchar c)
static qsizetype countCharHelper(QByteArrayView haystack, char needle) noexcept
static constexpr uchar asciiUpper(uchar c)
Q_CORE_EXPORT char * qstrncpy(char *dst, const char *src, size_t len)
Q_CORE_EXPORT int qstrnicmp(const char *, const char *, size_t len)
Q_CORE_EXPORT int qstricmp(const char *, const char *)
Q_CORE_EXPORT char * qstrdup(const char *)
Q_CORE_EXPORT char * qstrcpy(char *dst, const char *src)
Q_DECL_PURE_FUNCTION Q_CORE_EXPORT const void * qmemrchr(const void *s, int needle, size_t n) noexcept
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Q_DECLARE_TYPEINFO(QLocaleData::GroupSizes, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE)
qsizetype qt_repeatCount(QStringView s) noexcept
constexpr bool ascii_isspace(uchar c) noexcept
#define ForEachQLocaleRange(X)
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
QScopedPointerObjectDeleteLater< QObject > QScopedPointerDeleteLater
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept
static constexpr int MaxRange
constexpr bool matches(uchar c) const noexcept
constexpr QCharacterSetMatch(std::string_view set) noexcept
static char16_t * convertToUnicode(char16_t *dst, QLatin1StringView in) noexcept
static QChar * convertToUnicode(QChar *dst, QByteArrayView in, QStringConverter::State *state) noexcept
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state) noexcept
static QChar * convertToUnicode(QChar *buffer, QLatin1StringView in) noexcept
static Q_CORE_EXPORT char * convertFromUnicode(char *out, QStringView in) noexcept
QStringView viewListEntry(const char16_t *table, qsizetype index) const
char32_t ucsFirst(const char16_t *table) const
QString getData(const char16_t *table) const
QString getListEntry(const char16_t *table, qsizetype index) const
QStringView viewData(const char16_t *table) const
void setZero(QStringView zero)
bool isValid(NumberMode mode) const
QString positiveSign() const
static float convertDoubleToFloat(double d, bool *ok)
QString groupSeparator() const
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
QString zeroDigit() const
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
QString decimalPoint() const
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
static Q_AUTOTEST_EXPORT bool allLocaleDataRows(bool(*check)(qsizetype, const QLocaleData &))
QString listSeparator() const
static QSimpleParsedNumber< quint64 > bytearrayToUnsLongLong(QByteArrayView num, int base)
QString percentSign() const
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
quint8 m_first_day_of_week
NumericData numericData(NumberMode mode) const
quint8 m_currency_rounding
QString exponentSeparator() const
static qsizetype findLocaleIndex(QLocaleId localeId) noexcept
QString negativeSign() const
static const QLocaleData * c() noexcept
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
QLocaleId withLikelySubtagsRemoved() const noexcept
bool operator==(QLocaleId other) const noexcept
bool matchesAll() const noexcept
bool isValid() const noexcept
bool operator!=(QLocaleId other) const noexcept
bool acceptScriptTerritory(QLocaleId other) const noexcept
bool acceptLanguage(quint16 lang) const noexcept
QByteArray name(char separator='-') const
static void cleanup(T *pointer) noexcept
void operator()(T *pointer) const noexcept
void operator()(T *pointer) const
static void cleanup(T *pointer)
void operator()(void *pointer) const noexcept
static void cleanup(void *pointer) noexcept
CurrencyToStringArgument(const QVariant &v, const QString &s)
CurrencyToStringArgument()
static QChar * convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state, DataEndianness endian)
static QChar * convertToUnicode(QChar *out, QByteArrayView, QStringConverter::State *state, DataEndianness endian)
static const bool skipAsciiHandling
static void appendByte(qchar8_t *&ptr, qchar8_t b)
static uchar peekByte(const uchar *ptr, qsizetype n=0)
static qptrdiff availableBytes(const qchar8_t *ptr, const qchar8_t *end)
static void appendByte(uchar *&ptr, uchar b)
static void advanceByte(const uchar *&ptr, qsizetype n=1)
static const bool isTrusted
static void appendUtf16(char32_t *&ptr, char16_t uc)
static const bool skipAsciiHandling
static char16_t peekUtf16(const char16_t *ptr, qsizetype n=0)
static void appendUcs4(char16_t *&ptr, char32_t uc)
static const int EndOfString
static void advanceUtf16(const char16_t *&ptr, qsizetype n=1)
static uchar peekByte(const char *ptr, qsizetype n=0)
static void advanceByte(const char *&ptr, qsizetype n=1)
static uchar peekByte(const qchar8_t *ptr, qsizetype n=0)
static void appendUtf16(char16_t *&ptr, char16_t uc)
static const bool allowNonCharacters
static qptrdiff availableUtf16(const char16_t *ptr, const char16_t *end)
static qptrdiff availableBytes(const char *ptr, const char *end)
static void appendUcs4(char32_t *&ptr, char32_t uc)
static qptrdiff availableBytes(const uchar *ptr, const uchar *end)
static void advanceByte(const qchar8_t *&ptr, qsizetype n=1)
static Q_CORE_EXPORT char16_t * convertToUnicode(char16_t *dst, QByteArrayView in) noexcept
static int compareUtf8(QByteArrayView utf8, QStringView utf16, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
static QChar * convertToUnicode(QChar *buffer, QByteArrayView in) noexcept
static ValidUtf8Result isValidUtf8(QByteArrayView in)
static QString convertToUnicode(QByteArrayView in)
static Q_CORE_EXPORT char * convertFromLatin1(char *out, QLatin1StringView in)
static char16_t * convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state)
static QChar * convertToUnicode(QChar *out, QByteArrayView in, QStringConverter::State *state)
static char * convertFromUnicode(char *out, QStringView in, QStringConverter::State *state)
static char * convertFromUnicode(char *dst, QStringView in) noexcept