i18npool/source/transliteration/ignoreDiacritics_CTL.cxx | 51 ++++++++------- 1 file changed, 29 insertions(+), 22 deletions(-)
New commits: commit fa2eb4b43fc872c171129d477cfabe9fa29d78ce Author: Khaled Hosny <khaledho...@eglug.org> Date: Tue Jan 17 15:15:36 2017 +0200 Some cleanups, tdf#105170 follow-up * 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 <er...@redhat.com> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx b/i18npool/source/transliteration/ignoreDiacritics_CTL.cxx index c910b94..7f611bb 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 <rtl/ustrbuf.hxx> #include <transliteration_Ignore.hxx> -#include <unicode/uchar.h> #include <unicode/translit.h> +#include <unicode/uchar.h> 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<const sal_Unicode*>(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<const UChar*>(rInStr.getStr()) + nStartPos, nCount); + m_transliterator->transliterate(aUStr); + return OUString(reinterpret_cast<const sal_Unicode*>(aUStr.getBuffer()), aUStr.length()); } - - if (useOffset) - rOffset.realloc(aOutStr.getLength()); - - return aOutStr; } } } } }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits