From 7a578c06352328799c644e0399f14d58b05246f9 Mon Sep 17 00:00:00 2001 From: Andreas Heinisch Date: Thu, 13 May 2021 09:38:14 +0200 Subject: tdf#139840 - Case-insensitive operation for non-ASCII characters Support case-insensitive operation for non-ASCII characters in the InStr function in Basic. Change-Id: Idb2b8e128adf3596fa49e3e86365d5724ea3e11c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115538 Tested-by: Jenkins Reviewed-by: Andreas Heinisch --- basic/qa/basic_coverage/test_instr_method.vb | 17 +++++++++++------ basic/qa/vba_tests/instr.vb | 3 +++ basic/source/runtime/methods.cxx | 9 +++++++-- 3 files changed, 21 insertions(+), 8 deletions(-) (limited to 'basic') diff --git a/basic/qa/basic_coverage/test_instr_method.vb b/basic/qa/basic_coverage/test_instr_method.vb index 716aa215878b..47fa7a94ede1 100644 --- a/basic/qa/basic_coverage/test_instr_method.vb +++ b/basic/qa/basic_coverage/test_instr_method.vb @@ -6,12 +6,17 @@ ' Function doUnitTest as Integer - dim aString as Variant + + doUnitTest = 0 + + Dim aString As Variant aString = "Hello" ' InStr - If ( InStr( 1, aString, "l", 1) <> 3 ) Then - doUnitTest = 0 - Else - doUnitTest = 1 - End If + If (InStr(1, aString, "l", 1) <> 3) Then Exit Function + + ' tdf#139840 - case-insensitive operation for non-ASCII characters + If (InStr(1, "α", "Α", 1) <> 1) Then Exit Function + + doUnitTest = 1 + End Function diff --git a/basic/qa/vba_tests/instr.vb b/basic/qa/vba_tests/instr.vb index 74f7e2f755d4..3ced2a07c8ca 100644 --- a/basic/qa/vba_tests/instr.vb +++ b/basic/qa/vba_tests/instr.vb @@ -30,6 +30,9 @@ Sub verify_testInStr() TestUtil.AssertEqual(InStr(1, SearchString, SearchChar, 0), 9, "InStr(1, SearchString, SearchChar, 0)") TestUtil.AssertEqual(InStr(1, SearchString, "W"), 0, "InStr(1, SearchString, ""W"")") + ' tdf#139840 - case-insensitive operation for non-ASCII characters + TestUtil.AssertEqual(InStr(1, "α", "Α", 1), 1, "InStr(1, ""α"", ""Α"", 1)") + Exit Sub errorHandler: TestUtil.ReportErrorHandler("verify_testInStr", Err, Error$, Erl) diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 843c85b4860f..73bfe7fbc2d0 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -887,8 +887,13 @@ void SbRtl_InStr(StarBASIC *, SbxArray & rPar, bool) OUString aStr1 = rPar.Get(nFirstStringPos)->GetOUString(); OUString aToken = rToken; - aStr1 = aStr1.toAsciiUpperCase(); - aToken = aToken.toAsciiUpperCase(); + // tdf#139840 - case-insensitive operation for non-ASCII characters + const css::lang::Locale& rLocale + = Application::GetSettings().GetLanguageTag().getLocale(); + css::uno::Reference 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; } -- cgit