summaryrefslogtreecommitdiffstats
path: root/basic
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2021-07-15 20:43:32 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2021-07-19 14:05:43 +0200
commit632fd5fd504d9800d580ceeeb87bc2b5d626d56a (patch)
tree29e4b94b843b158c0f7ceee02ddd1b5681cf3416 /basic
parenttdf#143125 sd: fix crash when closing Custom Slide Shows dialog (diff)
downloadcore-632fd5fd504d9800d580ceeeb87bc2b5d626d56a.tar.gz
core-632fd5fd504d9800d580ceeeb87bc2b5d626d56a.zip
tdf#139840 - Use utl::TextSearch to implement the InStr function
In addtion, fixed a crash if the start position is greater than the length of the string being searched. Change-Id: I9bcda1131324bdfac6957018e91b3a36dd2dc3d6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118996 Tested-by: Jenkins Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119165
Diffstat (limited to 'basic')
-rw-r--r--basic/qa/basic_coverage/test_instr_method.vb6
-rw-r--r--basic/qa/vba_tests/instr.vb6
-rw-r--r--basic/source/runtime/methods.cxx37
3 files changed, 34 insertions, 15 deletions
diff --git a/basic/qa/basic_coverage/test_instr_method.vb b/basic/qa/basic_coverage/test_instr_method.vb
index 47fa7a94ede1..630db562d261 100644
--- a/basic/qa/basic_coverage/test_instr_method.vb
+++ b/basic/qa/basic_coverage/test_instr_method.vb
@@ -16,6 +16,12 @@ Function doUnitTest as Integer
' tdf#139840 - case-insensitive operation for non-ASCII characters
If (InStr(1, "α", "Α", 1) <> 1) Then Exit Function
+ ' tdf#139840 - German Eszett is uppercased to a two-character 'SS'.
+ ' This test should fail after tdf#110003 has been fixed.
+ If (InStr(2, "Straße", "s", 1) <> 5) Then Exit Function
+
+ ' Start position is greater than the length of the string being searched.
+ If (InStr(2, "α", "Α", 1) <> 0) Then Exit Function
doUnitTest = 1
diff --git a/basic/qa/vba_tests/instr.vb b/basic/qa/vba_tests/instr.vb
index 3ced2a07c8ca..cda19712b296 100644
--- a/basic/qa/vba_tests/instr.vb
+++ b/basic/qa/vba_tests/instr.vb
@@ -32,6 +32,12 @@ Sub verify_testInStr()
' tdf#139840 - case-insensitive operation for non-ASCII characters
TestUtil.AssertEqual(InStr(1, "α", "Α", 1), 1, "InStr(1, ""α"", ""Α"", 1)")
+ ' tdf#139840 - German Eszett is uppercased to a two-character 'SS'.
+ ' This test should fail after tdf#110003 has been fixed.
+ TestUtil.AssertEqual(InStr(2, "Straße", "s", 1), 5, "InStr(2, ""Straße"", ""s"", 1)")
+
+ ' Start position is greater than the length of the string being searched.
+ TestUtil.AssertEqual(InStr(2, "α", "Α", 1), 0, "InStr(2, ""α"", ""Α"", 1)")
Exit Sub
errorHandler:
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index ab77fc895b6e..ff2474a094e1 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -885,25 +885,32 @@ void SbRtl_InStr(StarBASIC *, SbxArray & rPar, bool)
}
else
{
- if( !bTextMode )
+ const OUString& rStr1 = rPar.Get(nFirstStringPos)->GetOUString();
+ const sal_Int32 nrStr1Len = rStr1.getLength();
+ if (nStartPos > nrStr1Len)
{
- const OUString& rStr1 = rPar.Get(nFirstStringPos)->GetOUString();
- nPos = rStr1.indexOf( rToken, nStartPos - 1 ) + 1;
+ // Start position is greater than the string being searched
+ nPos = 0;
}
else
{
- OUString aStr1 = rPar.Get(nFirstStringPos)->GetOUString();
- OUString aToken = rToken;
-
- // tdf#139840 - case-insensitive operation for non-ASCII characters
- const css::lang::Locale& rLocale
- = Application::GetSettings().GetLanguageTag().getLocale();
- css::uno::Reference<i18n::XCharacterClassification> xCharClass
- = vcl::unohelper::CreateCharacterClassification();
- aStr1 = xCharClass->toUpper(aStr1, 0, aStr1.getLength(), rLocale);
- aToken = xCharClass->toUpper(aToken, 0, aToken.getLength(), rLocale);
-
- nPos = aStr1.indexOf( aToken, nStartPos-1 ) + 1;
+ if( !bTextMode )
+ {
+ nPos = rStr1.indexOf( rToken, nStartPos - 1 ) + 1;
+ }
+ else
+ {
+ // tdf#139840 - case-insensitive operation for non-ASCII characters
+ i18nutil::SearchOptions2 aSearchOptions;
+ aSearchOptions.searchString = rToken;
+ aSearchOptions.AlgorithmType2 = util::SearchAlgorithms2::ABSOLUTE;
+ aSearchOptions.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
+ utl::TextSearch textSearch(aSearchOptions);
+
+ sal_Int32 nStart = nStartPos - 1;
+ sal_Int32 nEnd = nrStr1Len;
+ nPos = textSearch.SearchForward(rStr1, &nStart, &nEnd) ? nStart + 1 : 0;
+ }
}
}
rPar.Get(0)->PutLong(nPos);