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>
This commit is contained in:
committed by
Eike Rathke
parent
743f9fc86f
commit
fa2eb4b43f
@@ -7,9 +7,10 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <rtl/ustrbuf.hxx>
|
||||||
#include <transliteration_Ignore.hxx>
|
#include <transliteration_Ignore.hxx>
|
||||||
#include <unicode/uchar.h>
|
|
||||||
#include <unicode/translit.h>
|
#include <unicode/translit.h>
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
|
||||||
namespace com { namespace sun { namespace star { namespace i18n {
|
namespace com { namespace sun { namespace star { namespace i18n {
|
||||||
|
|
||||||
@@ -56,37 +57,43 @@ ignoreDiacritics_CTL::folding(const OUString& rInStr, sal_Int32 nStartPos,
|
|||||||
if (!m_transliterator)
|
if (!m_transliterator)
|
||||||
throw css::uno::RuntimeException();
|
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)
|
if (useOffset)
|
||||||
|
{
|
||||||
|
OUStringBuffer aOutBuf(nCount);
|
||||||
rOffset.realloc(nCount);
|
rOffset.realloc(nCount);
|
||||||
|
|
||||||
while (nPosition < nStartPos + nCount)
|
sal_Int32 nPosition = nStartPos;
|
||||||
{
|
sal_Int32 nOffset = 0;
|
||||||
sal_Int32 nIndex = nPosition;
|
while (nPosition < nStartPos + nCount)
|
||||||
UChar32 nChar = rInStr.iterateCodePoints(&nIndex);
|
|
||||||
UnicodeString aChar(nChar);
|
|
||||||
m_transliterator->transliterate(aChar);
|
|
||||||
|
|
||||||
if (useOffset && nOffset + aChar.length() > rOffset.getLength())
|
|
||||||
rOffset.realloc(rOffset.getLength() + aChar.length());
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < aChar.length(); i++)
|
|
||||||
{
|
{
|
||||||
aOutStr += OUStringLiteral1(aChar[i]);
|
sal_Int32 nIndex = nPosition;
|
||||||
if (useOffset)
|
UChar32 nChar = rInStr.iterateCodePoints(&nIndex);
|
||||||
|
UnicodeString aUStr(nChar);
|
||||||
|
m_transliterator->transliterate(aUStr);
|
||||||
|
|
||||||
|
if (nOffset + aUStr.length() > rOffset.getLength())
|
||||||
|
rOffset.realloc(rOffset.getLength() + aUStr.length());
|
||||||
|
|
||||||
|
aOutBuf.append(reinterpret_cast<const sal_Unicode*>(aUStr.getBuffer()), aUStr.length());
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < aUStr.length(); i++)
|
||||||
rOffset[nOffset++] = nPosition;
|
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} } } }
|
} } } }
|
||||||
|
Reference in New Issue
Block a user