diff options
Diffstat (limited to 'src/corelib/tools/qcollator_icu.cpp')
-rw-r--r-- | src/corelib/tools/qcollator_icu.cpp | 95 |
1 files changed, 32 insertions, 63 deletions
diff --git a/src/corelib/tools/qcollator_icu.cpp b/src/corelib/tools/qcollator_icu.cpp index 23e88b5015..4442442a65 100644 --- a/src/corelib/tools/qcollator_icu.cpp +++ b/src/corelib/tools/qcollator_icu.cpp @@ -1,41 +1,33 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ @@ -55,6 +47,8 @@ QT_BEGIN_NAMESPACE void QCollatorPrivate::init() { + cleanup(); + UErrorCode status = U_ZERO_ERROR; QByteArray name = locale.bcp47Name().replace(QLatin1Char('-'), QLatin1Char('_')).toLatin1(); collator = ucol_open(name.constData(), &status); @@ -63,17 +57,6 @@ void QCollatorPrivate::init() // enable normalization by default ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); -} - -void QCollatorPrivate::cleanup() -{ - if (collator) - ucol_close(collator); -} - -void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs) -{ - detach(); // The strength attribute in ICU is rather badly documented. Basically UCOL_PRIMARY // ignores differences between base characters and accented characters as well as case. @@ -82,55 +65,38 @@ void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs) // and does case sensitive comparison. // UCOL_QUATERNARY is used as default in a few languages such as Japanese to take care of some // additional differences in those languages. - UColAttributeValue val = (cs == Qt::CaseSensitive) ? UCOL_DEFAULT_STRENGTH : UCOL_SECONDARY; + UColAttributeValue val = (caseSensitivity == Qt::CaseSensitive) ? UCOL_DEFAULT_STRENGTH : UCOL_SECONDARY; - UErrorCode status = U_ZERO_ERROR; - ucol_setAttribute(d->collator, UCOL_STRENGTH, val, &status); + status = U_ZERO_ERROR; + ucol_setAttribute(collator, UCOL_STRENGTH, val, &status); if (U_FAILURE(status)) qWarning("ucol_setAttribute: Case First failed: %d", status); -} -Qt::CaseSensitivity QCollator::caseSensitivity() const -{ - UErrorCode status = U_ZERO_ERROR; - UColAttributeValue attribute = ucol_getAttribute(d->collator, UCOL_CASE_FIRST, &status); - return (attribute == UCOL_OFF) ? Qt::CaseInsensitive : Qt::CaseSensitive; -} - -void QCollator::setNumericMode(bool on) -{ - detach(); - - UErrorCode status = U_ZERO_ERROR; - ucol_setAttribute(d->collator, UCOL_NUMERIC_COLLATION, on ? UCOL_ON : UCOL_OFF, &status); + status = U_ZERO_ERROR; + ucol_setAttribute(collator, UCOL_NUMERIC_COLLATION, numericMode ? UCOL_ON : UCOL_OFF, &status); if (U_FAILURE(status)) qWarning("ucol_setAttribute: numeric collation failed: %d", status); -} - -bool QCollator::numericMode() const -{ - UErrorCode status; - return ucol_getAttribute(d->collator, UCOL_NUMERIC_COLLATION, &status) == UCOL_ON; -} -void QCollator::setIgnorePunctuation(bool on) -{ - detach(); - - UErrorCode status; - ucol_setAttribute(d->collator, UCOL_ALTERNATE_HANDLING, on ? UCOL_SHIFTED : UCOL_NON_IGNORABLE, &status); + status = U_ZERO_ERROR; + ucol_setAttribute(collator, UCOL_ALTERNATE_HANDLING, ignorePunctuation ? UCOL_SHIFTED : UCOL_NON_IGNORABLE, &status); if (U_FAILURE(status)) qWarning("ucol_setAttribute: Alternate handling failed: %d", status); + + dirty = false; } -bool QCollator::ignorePunctuation() const +void QCollatorPrivate::cleanup() { - UErrorCode status; - return ucol_getAttribute(d->collator, UCOL_ALTERNATE_HANDLING, &status) == UCOL_SHIFTED; + if (collator) + ucol_close(collator); + collator = 0; } int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const { + if (d->dirty) + d->init(); + return ucol_strcoll(d->collator, (const UChar *)s1, len1, (const UChar *)s2, len2); } @@ -146,6 +112,9 @@ int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const QCollatorSortKey QCollator::sortKey(const QString &string) const { + if (d->dirty) + d->init(); + QByteArray result(16 + string.size() + (string.size() >> 2), Qt::Uninitialized); int size = ucol_getSortKey(d->collator, (const UChar *)string.constData(), string.size(), (uint8_t *)result.data(), result.size()); |