summaryrefslogtreecommitdiff
path: root/i18npool
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2017-01-17 15:15:36 +0200
committerEike Rathke <erack@redhat.com>2017-01-18 01:17:52 +0000
commitfa2eb4b43fc872c171129d477cfabe9fa29d78ce (patch)
treeed06e9f352f24386bb6c1200661ec52f42aa1972 /i18npool
parent743f9fc86f3d3b6e87bf58c0654bcdccab0ab383 (diff)
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 <erack@redhat.com> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'i18npool')
-rw-r--r--i18npool/source/transliteration/ignoreDiacritics_CTL.cxx51
1 files 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 <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;
}
} } } }