basic/qa/basic_coverage/test_chr_method.vb |   64 +++++++++++++++++++++++++++++
 basic/source/runtime/methods.cxx           |   11 ++++
 2 files changed, 73 insertions(+), 2 deletions(-)

New commits:
commit 5fc8b470f22bc7a8a5dc9a6bd86a591090abfcf3
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Thu Feb 20 12:40:49 2020 +0100
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Thu Feb 20 15:59:49 2020 +0100

    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 <sberg...@redhat.com>

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 8543c0817762..3214dd28602c 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -330,8 +330,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.Get32(0)->PutString( aStr );
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to