summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2018-11-13 13:05:01 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-11-17 17:51:43 +0100
commitcb2cd5b76b0981bf07b8d1264f4b3074543a19eb (patch)
treefefd9dd1b777ceb605baf16c8264fe7e40387021 /basic
parentf2c6156a90093d38e1ab304d11ffed90555d5fa1 (diff)
tdf#121325: Replace all of given length, even if replacement is shorter
Both LO and MS Basic restrict the amount of replacement text ("If the Length parameter in the <emph>Mid statement</emph> is less than the length of the text that you want to replace, the text is reduced to the specified length." in helpcontent2/source/text/sbasic/shared/03120306.xhp, resp. "The number of characters replaced is always less than or equal to the number of characters in Target." at <https://docs.microsoft.com/en-us/dotnet/visual-basic/ language-reference/statements/mid-statement>). But cc20344010e94eda22fee662aab966d395a0796a "tdf#111313: Honor bWriteNoLenParam in !bCompatibility, too" had introduced a regression (in the non--compatibility- mode case), restricting the amount of replaced text to be no more than the amount of replacement text, even if the given length argument was larger. (Which had already regressed in the past, see <https://bugs.documentfoundation.org/show_bug.cgi?id=62090> "Mid statement doesn't work as expected".) Added test cases now. Change-Id: I21d4409f49a2437eb0e1a1e200561d803c42a24c Reviewed-on: https://gerrit.libreoffice.org/63328 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com> (cherry picked from commit a6a48eeef16e473be14642469cd922f177f54998) Reviewed-on: https://gerrit.libreoffice.org/63332 Tested-by: Xisco Faulí <xiscofauli@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'basic')
-rw-r--r--basic/qa/basic_coverage/test_mid_replace_less.vb19
-rw-r--r--basic/qa/basic_coverage/test_mid_replace_more.vb17
-rw-r--r--basic/qa/basic_coverage/test_mid_replace_more_end.vb19
-rw-r--r--basic/source/runtime/methods.cxx14
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() );
}