summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-02-20 12:40:49 +0100
committerMichael Stahl <michael.stahl@cib.de>2020-02-21 12:33:47 +0100
commitdfbc66454dac0371acb977a84ab29b81377704c0 (patch)
tree906ac695b6964a6141ca1922f173c35eead07d1a /basic
parent9ed15a8f5e9a7f4de190499fbfc1fa9a4ff26c67 (diff)
tdf#130426 Support Basic Chr(&H8000), ..., Chr(&HFFFF) again
...after it had been broken by d5b7627a0e738c0866b819910153b96b611813f8 "tdf#62326 - Macros: Converting Hex strings of negative value". The corresponding help update is <https://gerrit.libreoffice.org/c/help/+/89100> "tdf#130426 Update documentation for Basic Chr and ChrW functions". Change-Id: I5f08b1ef907d840b491315a1f445f729b4999d0d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89090 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com> (cherry picked from commit 5fc8b470f22bc7a8a5dc9a6bd86a591090abfcf3) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88965 Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'basic')
-rw-r--r--basic/qa/basic_coverage/test_chr_method.vb64
-rw-r--r--basic/source/runtime/methods.cxx11
2 files changed, 73 insertions, 2 deletions
diff --git a/basic/qa/basic_coverage/test_chr_method.vb b/basic/qa/basic_coverage/test_chr_method.vb
new file mode 100644
index 000000000000..8e8179463535
--- /dev/null
+++ b/basic/qa/basic_coverage/test_chr_method.vb
@@ -0,0 +1,64 @@
+' 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 overflow1 as Integer
+ On Error GoTo handler
+ Chr(-32769)
+ overflow1 = 0
+ Exit Function
+handler:
+ if (Err <> 6) Then
+ overflow1 = 0
+ Exit Function
+ Endif
+ overflow1 = 1
+End Function
+
+Function overflow2 as Integer
+ On Error GoTo handler
+ Chr(65536)
+ overflow2 = 0
+ Exit Function
+handler:
+ if (Err <> 6) Then
+ overflow2 = 0
+ Exit Function
+ Endif
+ overflow2 = 1
+End Function
+
+Function overflow3 as Integer
+ On Error GoTo handler
+ Chr(&H10000)
+ overflow3 = 0
+ Exit Function
+handler:
+ if (Err <> 6) Then
+ overflow3 = 0
+ Exit Function
+ Endif
+ overflow3 = 1
+End Function
+
+Function doUnitTest as Integer
+ Chr(-32768)
+ Chr(65535)
+ Chr(&H8000)
+ Chr(&HFFFF)
+ if (overflow1 = 0) Then
+ doUnitTest = 0
+ Exit Function
+ Endif
+ if (overflow2 = 0) Then
+ doUnitTest = 0
+ Exit Function
+ Endif
+ if (overflow3 = 0) Then
+ doUnitTest = 0
+ Exit Function
+ Endif
+ doUnitTest = 1
+End Function
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index 4860ec34376d..e2ed754122c6 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -329,8 +329,15 @@ static void implChr( SbxArray& rPar, bool bChrW )
}
else
{
- sal_Unicode aCh = static_cast<sal_Unicode>(pArg->GetUShort());
- aStr = OUString(aCh);
+ // Map negative 16-bit values to large positive ones, so that code like Chr(&H8000)
+ // still works after the fix for tdf#62326 changed those four-digit hex notations to
+ // produce negative values:
+ sal_Int32 aCh = pArg->GetLong();
+ if (aCh < -0x8000 || aCh > 0xFFFF) {
+ StarBASIC::Error(ERRCODE_BASIC_MATH_OVERFLOW);
+ aCh = 0;
+ }
+ aStr = OUString(static_cast<sal_Unicode>(aCh));
}
rPar.Get(0)->PutString( aStr );
}