diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2020-02-20 12:40:49 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-02-21 12:33:47 +0100 |
commit | dfbc66454dac0371acb977a84ab29b81377704c0 (patch) | |
tree | 906ac695b6964a6141ca1922f173c35eead07d1a /basic | |
parent | 9ed15a8f5e9a7f4de190499fbfc1fa9a4ff26c67 (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.vb | 64 | ||||
-rw-r--r-- | basic/source/runtime/methods.cxx | 11 |
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 ); } |