| Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qcollator_icu.cpp |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||
|---|---|---|---|---|---|---|---|---|
| 1 | /**************************************************************************** | - | ||||||
| 2 | ** | - | ||||||
| 3 | ** Copyright (C) 2015 The Qt Company Ltd. | - | ||||||
| 4 | ** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org> | - | ||||||
| 5 | ** Contact: http://www.qt.io/licensing/ | - | ||||||
| 6 | ** | - | ||||||
| 7 | ** This file is part of the QtCore module of the Qt Toolkit. | - | ||||||
| 8 | ** | - | ||||||
| 9 | ** $QT_BEGIN_LICENSE:LGPL21$ | - | ||||||
| 10 | ** Commercial License Usage | - | ||||||
| 11 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||
| 12 | ** accordance with the commercial license agreement provided with the | - | ||||||
| 13 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||
| 14 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||
| 15 | ** and conditions see http://www.qt.io/terms-conditions. For further | - | ||||||
| 16 | ** information use the contact form at http://www.qt.io/contact-us. | - | ||||||
| 17 | ** | - | ||||||
| 18 | ** GNU Lesser General Public License Usage | - | ||||||
| 19 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||
| 20 | ** General Public License version 2.1 or version 3 as published by the Free | - | ||||||
| 21 | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and | - | ||||||
| 22 | ** LICENSE.LGPLv3 included in the packaging of this file. Please review the | - | ||||||
| 23 | ** following information to ensure the GNU Lesser General Public License | - | ||||||
| 24 | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and | - | ||||||
| 25 | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - | ||||||
| 26 | ** | - | ||||||
| 27 | ** As a special exception, The Qt Company gives you certain additional | - | ||||||
| 28 | ** rights. These rights are described in The Qt Company LGPL Exception | - | ||||||
| 29 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - | ||||||
| 30 | ** | - | ||||||
| 31 | ** $QT_END_LICENSE$ | - | ||||||
| 32 | ** | - | ||||||
| 33 | ****************************************************************************/ | - | ||||||
| 34 | - | |||||||
| 35 | #include "qcollator_p.h" | - | ||||||
| 36 | #include "qstringlist.h" | - | ||||||
| 37 | #include "qstring.h" | - | ||||||
| 38 | - | |||||||
| 39 | #include <unicode/utypes.h> | - | ||||||
| 40 | #include <unicode/ucol.h> | - | ||||||
| 41 | #include <unicode/ustring.h> | - | ||||||
| 42 | #include <unicode/ures.h> | - | ||||||
| 43 | - | |||||||
| 44 | #include "qdebug.h" | - | ||||||
| 45 | - | |||||||
| 46 | QT_BEGIN_NAMESPACE | - | ||||||
| 47 | - | |||||||
| 48 | void QCollatorPrivate::init() | - | ||||||
| 49 | { | - | ||||||
| 50 | cleanup(); | - | ||||||
| 51 | - | |||||||
| 52 | UErrorCode status = U_ZERO_ERROR; | - | ||||||
| 53 | QByteArray name = locale.bcp47Name().replace(QLatin1Char('-'), QLatin1Char('_')).toLatin1(); | - | ||||||
| 54 | collator = ucol_open(name.constData(), &status); | - | ||||||
| 55 | if (U_FAILURE(status)) {
| 0-332 | ||||||
| 56 | qWarning("Could not create collator: %d", status); | - | ||||||
| 57 | collator = 0; | - | ||||||
| 58 | dirty = false; | - | ||||||
| 59 | return; never executed: return; | 0 | ||||||
| 60 | } | - | ||||||
| 61 | - | |||||||
| 62 | // enable normalization by default | - | ||||||
| 63 | ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); | - | ||||||
| 64 | - | |||||||
| 65 | // The strength attribute in ICU is rather badly documented. Basically UCOL_PRIMARY | - | ||||||
| 66 | // ignores differences between base characters and accented characters as well as case. | - | ||||||
| 67 | // So A and A-umlaut would compare equal. | - | ||||||
| 68 | // UCOL_SECONDARY ignores case differences. UCOL_TERTIARY is the default in most languages | - | ||||||
| 69 | // and does case sensitive comparison. | - | ||||||
| 70 | // UCOL_QUATERNARY is used as default in a few languages such as Japanese to take care of some | - | ||||||
| 71 | // additional differences in those languages. | - | ||||||
| 72 | UColAttributeValue val = (caseSensitivity == Qt::CaseSensitive) ? UCOL_DEFAULT_STRENGTH : UCOL_SECONDARY;
| 136-196 | ||||||
| 73 | - | |||||||
| 74 | status = U_ZERO_ERROR; | - | ||||||
| 75 | ucol_setAttribute(collator, UCOL_STRENGTH, val, &status); | - | ||||||
| 76 | if (U_FAILURE(status))
| 0-332 | ||||||
| 77 | qWarning("ucol_setAttribute: Case First failed: %d", status); never executed: QMessageLogger(__FILE__, 77, __PRETTY_FUNCTION__).warning("ucol_setAttribute: Case First failed: %d", status); | 0 | ||||||
| 78 | - | |||||||
| 79 | status = U_ZERO_ERROR; | - | ||||||
| 80 | ucol_setAttribute(collator, UCOL_NUMERIC_COLLATION, numericMode ? UCOL_ON : UCOL_OFF, &status); | - | ||||||
| 81 | if (U_FAILURE(status))
| 0-332 | ||||||
| 82 | qWarning("ucol_setAttribute: numeric collation failed: %d", status); never executed: QMessageLogger(__FILE__, 82, __PRETTY_FUNCTION__).warning("ucol_setAttribute: numeric collation failed: %d", status); | 0 | ||||||
| 83 | - | |||||||
| 84 | status = U_ZERO_ERROR; | - | ||||||
| 85 | ucol_setAttribute(collator, UCOL_ALTERNATE_HANDLING, ignorePunctuation ? UCOL_SHIFTED : UCOL_NON_IGNORABLE, &status); | - | ||||||
| 86 | if (U_FAILURE(status))
| 0-332 | ||||||
| 87 | qWarning("ucol_setAttribute: Alternate handling failed: %d", status); never executed: QMessageLogger(__FILE__, 87, __PRETTY_FUNCTION__).warning("ucol_setAttribute: Alternate handling failed: %d", status); | 0 | ||||||
| 88 | - | |||||||
| 89 | dirty = false; | - | ||||||
| 90 | } executed 332 times by 13 tests: end of blockExecuted by:
| 332 | ||||||
| 91 | - | |||||||
| 92 | void QCollatorPrivate::cleanup() | - | ||||||
| 93 | { | - | ||||||
| 94 | if (collator)
| 332-382 | ||||||
| 95 | ucol_close(collator); executed 332 times by 13 tests: ucol_close_52(collator);Executed by:
| 332 | ||||||
| 96 | collator = 0; | - | ||||||
| 97 | } executed 714 times by 19 tests: end of blockExecuted by:
| 714 | ||||||
| 98 | - | |||||||
| 99 | int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const | - | ||||||
| 100 | { | - | ||||||
| 101 | if (d->dirty)
| 141-18739 | ||||||
| 102 | d->init(); executed 141 times by 6 tests: d->init();Executed by:
| 141 | ||||||
| 103 | - | |||||||
| 104 | if (d->collator)
| 0-18880 | ||||||
| 105 | return ucol_strcoll(d->collator, (const UChar *)s1, len1, (const UChar *)s2, len2); executed 18880 times by 12 tests: return ucol_strcoll_52(d->collator, (const UChar *)s1, len1, (const UChar *)s2, len2);Executed by:
| 18880 | ||||||
| 106 | - | |||||||
| 107 | return QString::compare(QString(s1, len1), QString(s2, len2), d->caseSensitivity); never executed: return QString::compare(QString(s1, len1), QString(s2, len2), d->caseSensitivity); | 0 | ||||||
| 108 | } | - | ||||||
| 109 | - | |||||||
| 110 | int QCollator::compare(const QString &s1, const QString &s2) const | - | ||||||
| 111 | { | - | ||||||
| 112 | if (d->collator)
| 0-7485 | ||||||
| 113 | return compare(s1.constData(), s1.size(), s2.constData(), s2.size()); executed 7485 times by 6 tests: return compare(s1.constData(), s1.size(), s2.constData(), s2.size());Executed by:
| 7485 | ||||||
| 114 | - | |||||||
| 115 | return QString::compare(s1, s2, d->caseSensitivity); never executed: return QString::compare(s1, s2, d->caseSensitivity); | 0 | ||||||
| 116 | } | - | ||||||
| 117 | - | |||||||
| 118 | int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const | - | ||||||
| 119 | { | - | ||||||
| 120 | if (d->collator)
| 0 | ||||||
| 121 | return compare(s1.constData(), s1.size(), s2.constData(), s2.size()); never executed: return compare(s1.constData(), s1.size(), s2.constData(), s2.size()); | 0 | ||||||
| 122 | - | |||||||
| 123 | return QStringRef::compare(s1, s2, d->caseSensitivity); never executed: return QStringRef::compare(s1, s2, d->caseSensitivity); | 0 | ||||||
| 124 | } | - | ||||||
| 125 | - | |||||||
| 126 | QCollatorSortKey QCollator::sortKey(const QString &string) const | - | ||||||
| 127 | { | - | ||||||
| 128 | if (d->dirty)
| 0 | ||||||
| 129 | d->init(); never executed: d->init(); | 0 | ||||||
| 130 | - | |||||||
| 131 | if (d->collator) {
| 0 | ||||||
| 132 | QByteArray result(16 + string.size() + (string.size() >> 2), Qt::Uninitialized); | - | ||||||
| 133 | int size = ucol_getSortKey(d->collator, (const UChar *)string.constData(), | - | ||||||
| 134 | string.size(), (uint8_t *)result.data(), result.size()); | - | ||||||
| 135 | if (size > result.size()) {
| 0 | ||||||
| 136 | result.resize(size); | - | ||||||
| 137 | size = ucol_getSortKey(d->collator, (const UChar *)string.constData(), | - | ||||||
| 138 | string.size(), (uint8_t *)result.data(), result.size()); | - | ||||||
| 139 | } never executed: end of block | 0 | ||||||
| 140 | result.truncate(size); | - | ||||||
| 141 | return QCollatorSortKey(new QCollatorSortKeyPrivate(result)); never executed: return QCollatorSortKey(new QCollatorSortKeyPrivate(result)); | 0 | ||||||
| 142 | } | - | ||||||
| 143 | - | |||||||
| 144 | return QCollatorSortKey(new QCollatorSortKeyPrivate(QByteArray())); never executed: return QCollatorSortKey(new QCollatorSortKeyPrivate(QByteArray())); | 0 | ||||||
| 145 | } | - | ||||||
| 146 | - | |||||||
| 147 | int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const | - | ||||||
| 148 | { | - | ||||||
| 149 | return qstrcmp(d->m_key, otherKey.d->m_key); never executed: return qstrcmp(d->m_key, otherKey.d->m_key); | 0 | ||||||
| 150 | } | - | ||||||
| 151 | - | |||||||
| 152 | QT_END_NAMESPACE | - | ||||||
| Source code | Switch to Preprocessed file |