summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qcollator_posix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qcollator_posix.cpp')
-rw-r--r--src/corelib/text/qcollator_posix.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/corelib/text/qcollator_posix.cpp b/src/corelib/text/qcollator_posix.cpp
index b409dbd96d..5ed80c1b8e 100644
--- a/src/corelib/text/qcollator_posix.cpp
+++ b/src/corelib/text/qcollator_posix.cpp
@@ -36,7 +36,7 @@ void QCollatorPrivate::cleanup()
static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, QStringView string)
{
ret.resize(string.length());
- int len = string.toWCharArray(ret.data());
+ qsizetype len = string.toWCharArray(ret.data());
ret.resize(len+1);
ret[len] = 0;
}
@@ -50,8 +50,8 @@ int QCollator::compare(QStringView s1, QStringView s2) const
if (d->isC())
return s1.compare(s2, caseSensitivity());
- if (d->dirty)
- d->init();
+
+ d->ensureInitialized();
QVarLengthArray<wchar_t> array1, array2;
stringToWCharArray(array1, s1);
@@ -61,8 +61,7 @@ int QCollator::compare(QStringView s1, QStringView s2) const
QCollatorSortKey QCollator::sortKey(const QString &string) const
{
- if (d->dirty)
- d->init();
+ d->ensureInitialized();
QVarLengthArray<wchar_t> original;
stringToWCharArray(original, string);
@@ -70,13 +69,19 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
if (d->isC()) {
std::copy(original.cbegin(), original.cend(), result.begin());
} else {
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > uint(result.size())) {
- result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ auto availableSizeIncludingNullTerminator = result.size();
+ size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
+ result.data(), original.constData(), availableSizeIncludingNullTerminator);
+ if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ availableSizeIncludingNullTerminator = result.size();
+ neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
+ availableSizeIncludingNullTerminator);
+ Q_ASSERT(neededSizeExcludingNullTerminator
+ == size_t(availableSizeIncludingNullTerminator - 1));
}
- result.resize(size+1);
- result[size] = 0;
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ result[neededSizeExcludingNullTerminator] = 0;
}
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
}