From fa2eb4b43fc872c171129d477cfabe9fa29d78ce Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Tue, 17 Jan 2017 15:15:36 +0200 Subject: Some cleanups, tdf#105170 follow-up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Do some sanity checks on the arguments. * Use OUStringBuffer and append to it, instead of OUString. * Fold the string at once when offsets aren’t needed. Change-Id: I9c450f4cbb938b18ddfec2b9aca12a290b114c98 Reviewed-on: https://gerrit.libreoffice.org/33219 Reviewed-by: Eike Rathke Tested-by: Jenkins --- .../transliteration/ignoreDiacritics_CTL.cxx | 51 ++++++++++++---------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx b/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx index c910b94f8a96..7f611bb007ef 100644 --- a/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx +++ b/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx @@ -7,9 +7,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include #include -#include #include +#include namespace com { namespace sun { namespace star { namespace i18n { @@ -56,37 +57,43 @@ ignoreDiacritics_CTL::folding(const OUString& rInStr, sal_Int32 nStartPos, if (!m_transliterator) throw css::uno::RuntimeException(); - OUString aOutStr; + if (nStartPos < 0 || nStartPos + nCount > rInStr.getLength()) + throw css::uno::RuntimeException(); - sal_Int32 nPosition = nStartPos; - sal_Int32 nOffset = 0; if (useOffset) + { + OUStringBuffer aOutBuf(nCount); rOffset.realloc(nCount); - while (nPosition < nStartPos + nCount) - { - sal_Int32 nIndex = nPosition; - UChar32 nChar = rInStr.iterateCodePoints(&nIndex); - UnicodeString aChar(nChar); - m_transliterator->transliterate(aChar); + sal_Int32 nPosition = nStartPos; + sal_Int32 nOffset = 0; + while (nPosition < nStartPos + nCount) + { + sal_Int32 nIndex = nPosition; + UChar32 nChar = rInStr.iterateCodePoints(&nIndex); + UnicodeString aUStr(nChar); + m_transliterator->transliterate(aUStr); - if (useOffset && nOffset + aChar.length() > rOffset.getLength()) - rOffset.realloc(rOffset.getLength() + aChar.length()); + if (nOffset + aUStr.length() > rOffset.getLength()) + rOffset.realloc(rOffset.getLength() + aUStr.length()); - for (int32_t i = 0; i < aChar.length(); i++) - { - aOutStr += OUStringLiteral1(aChar[i]); - if (useOffset) + aOutBuf.append(reinterpret_cast(aUStr.getBuffer()), aUStr.length()); + + for (int32_t i = 0; i < aUStr.length(); i++) rOffset[nOffset++] = nPosition; + + nPosition = nIndex; } - nPosition = nIndex; + rOffset.realloc(aOutBuf.getLength()); + return aOutBuf.makeStringAndClear(); + } + else + { + UnicodeString aUStr(reinterpret_cast(rInStr.getStr()) + nStartPos, nCount); + m_transliterator->transliterate(aUStr); + return OUString(reinterpret_cast(aUStr.getBuffer()), aUStr.length()); } - - if (useOffset) - rOffset.realloc(aOutStr.getLength()); - - return aOutStr; } } } } } -- cgit