Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qcollator_posix.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:critical reason:data-parser
5
6#include "qcollator_p.h"
7#include "qstringlist.h"
8#include "qstring.h"
10
11#include <cstring>
12#include <cwchar>
13
15
17{
18 if (!isC()) {
19 if (locale != QLocale::system().collation()) {
20 qCWarning(lcQCollator,
21 "Only the C and system collation locales are supported with the POSIX"
22 " collation implementation");
23 }
24 if (options.testFlag(Opt::CaseInsensitive)) {
25 qCWarning(lcQCollator,
26 "Case insensitive sorting unsupported in the POSIX collation implementation");
27 }
28 }
29 if (options.testFlag(Opt::NumericSort)) {
30 qCWarning(lcQCollator,
31 "Numeric mode unsupported in the POSIX collation implementation");
32 }
33 if (options.testFlag(Opt::IgnorePunctuation)) {
34 qCWarning(lcQCollator,
35 "Ignoring punctuation unsupported in the POSIX collation implementation");
36 }
37 if (options.testFlag(Opt::DiacriticInsensitive)) {
38 qCWarning(lcQCollator,
39 "Ignoring diacritic marks unsupported in the POSIX collation implementation.");
40 }
41 if (options.testFlag(Opt::WidthInsensitive)) {
42 qCWarning(lcQCollator,
43 "Width insensitive option unsupported in the POSIX collation implementation");
44 }
45
46 dirty = false;
47}
48
50{
51}
52
53static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, QStringView string)
54{
55 ret.resize(string.length());
56 qsizetype len = string.toWCharArray(ret.data());
57 ret.resize(len+1);
58 ret[len] = 0;
59}
60
61int QCollator::compare(QStringView s1, QStringView s2) const
62{
63 if (!s1.size())
64 return s2.size() ? -1 : 0;
65 if (!s2.size())
66 return +1;
67
68 if (!d)
69 d = new QCollatorPrivate(QLocale().collation());
70
71 if (d->isC())
72 return s1.compare(s2, caseSensitivity());
73
74 d->ensureInitialized();
75
76 QVarLengthArray<wchar_t> array1, array2;
77 stringToWCharArray(array1, s1);
78 stringToWCharArray(array2, s2);
79 return std::wcscoll(array1.constData(), array2.constData());
80}
81
82QCollatorSortKey QCollator::sortKey(const QString &string) const
83{
84 if (!d)
85 d = new QCollatorPrivate(QLocale().collation());
86
87 d->ensureInitialized();
88
89 QVarLengthArray<wchar_t> original;
90 stringToWCharArray(original, string);
91 QList<wchar_t> result(original.size());
92 if (d->isC()) {
93 std::copy(original.cbegin(), original.cend(), result.begin());
94 } else {
95 auto availableSizeIncludingNullTerminator = result.size();
96 size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
97 result.data(), original.constData(), availableSizeIncludingNullTerminator);
98 if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
99 result.resize(neededSizeExcludingNullTerminator + 1);
100 availableSizeIncludingNullTerminator = result.size();
101 neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
102 availableSizeIncludingNullTerminator);
103 Q_ASSERT(neededSizeExcludingNullTerminator
104 == size_t(availableSizeIncludingNullTerminator - 1));
105 }
106 result.resize(neededSizeExcludingNullTerminator + 1);
107 result[neededSizeExcludingNullTerminator] = 0;
108 }
109 return QCollatorPrivate::sortKeyFromData(std::move(result));
110}
111
112int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const noexcept
113{
114 return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData());
115}
116
117QT_END_NAMESPACE
bool isC() const
Definition qcollator_p.h:85
static void stringToWCharArray(QVarLengthArray< wchar_t > &ret, QStringView string)