diff options
-rw-r--r-- | basic/qa/basic_coverage/test_mid_replace_less.vb | 19 | ||||
-rw-r--r-- | basic/qa/basic_coverage/test_mid_replace_more.vb | 17 | ||||
-rw-r--r-- | basic/qa/basic_coverage/test_mid_replace_more_end.vb | 19 | ||||
-rw-r--r-- | basic/source/runtime/methods.cxx | 14 |
4 files changed, 60 insertions, 9 deletions
diff --git a/basic/qa/basic_coverage/test_mid_replace_less.vb b/basic/qa/basic_coverage/test_mid_replace_less.vb new file mode 100644 index 000000000000..27a02382c3fd --- /dev/null +++ b/basic/qa/basic_coverage/test_mid_replace_less.vb @@ -0,0 +1,19 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +' cf. <https://bugs.documentfoundation.org/show_bug.cgi?id=62090> "Mid statement doesn't work as +' expected": +Function doUnitTest as Integer + s = "The lightbrown fox" + Mid(s, 5, 10, "lazy") + If (s = "The lazy fox") Then + doUnitTest = 1 + Else + doUnitTest = 0 + End If +End Function diff --git a/basic/qa/basic_coverage/test_mid_replace_more.vb b/basic/qa/basic_coverage/test_mid_replace_more.vb new file mode 100644 index 000000000000..c6d75ca90245 --- /dev/null +++ b/basic/qa/basic_coverage/test_mid_replace_more.vb @@ -0,0 +1,17 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +Function doUnitTest as Integer + s = "The fox jumps" + Mid(s, 5, 3, "duck") + If (s = "The duc jumps") Then + doUnitTest = 1 + Else + doUnitTest = 0 + End If +End Function diff --git a/basic/qa/basic_coverage/test_mid_replace_more_end.vb b/basic/qa/basic_coverage/test_mid_replace_more_end.vb new file mode 100644 index 000000000000..c5d26a46a8db --- /dev/null +++ b/basic/qa/basic_coverage/test_mid_replace_more_end.vb @@ -0,0 +1,19 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +' cf. examples at <https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/ +' statements/mid-statement>: +Function doUnitTest as Integer + s = "The fox jumps" + Mid(s, 5, 100, "cow jumped over") + If (s = "The cow jumpe") Then + doUnitTest = 1 + Else + doUnitTest = 0 + End If +End Function diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 589105ff3935..a980e19b48b3 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -1155,26 +1155,22 @@ void SbRtl_Mid(StarBASIC *, SbxArray & rPar, bool bWrite) sal_Int32 nReplaceLen; if( bWriteNoLenParam ) { - nReplaceLen = nReplaceStrLen; + nReplaceLen = nArgLen - nStartPos; } else { nReplaceLen = nLen; - if( nReplaceLen < 0 || nReplaceLen > nReplaceStrLen ) + if( nReplaceLen < 0 || nReplaceLen > nArgLen - nStartPos ) { - nReplaceLen = nReplaceStrLen; + nReplaceLen = nArgLen - nStartPos; } } - sal_Int32 nReplaceEndPos = nStartPos + nReplaceLen; - if( nReplaceEndPos > nArgLen ) - { - nReplaceLen -= (nReplaceEndPos - nArgLen); - } OUStringBuffer aResultStr = aArgStr; sal_Int32 nErase = nReplaceLen; aResultStr.remove( nStartPos, nErase ); - aResultStr.insert( nStartPos, aReplaceStr.getStr(), nReplaceLen); + aResultStr.insert( + nStartPos, aReplaceStr.getStr(), std::min(nReplaceLen, nReplaceStrLen)); rPar.Get(1)->PutString( aResultStr.makeStringAndClear() ); } |