[Libreoffice-commits] core.git: 2 commits - basic/qa basic/source

Eike Rathke erack at redhat.com
Fri Apr 28 13:47:04 UTC 2017


 basic/qa/basic_coverage/test_cdatetofromiso_methods.vb |    3 
 basic/source/runtime/methods.cxx                       |   61 +++++++++++++----
 2 files changed, 50 insertions(+), 14 deletions(-)

New commits:
commit af754ef9d6655a7b76a39f5a2c5bef8290fc3163
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 28 15:45:54 2017 +0200

    Add unit test for CDateFromIso with YYYY-MM-DD, tdf#106956
    
    Change-Id: Id7867228c091bb60764225a6436087dd390f13de

diff --git a/basic/qa/basic_coverage/test_cdatetofromiso_methods.vb b/basic/qa/basic_coverage/test_cdatetofromiso_methods.vb
index 02ec5853ccb4..3eb5e63e83ff 100644
--- a/basic/qa/basic_coverage/test_cdatetofromiso_methods.vb
+++ b/basic/qa/basic_coverage/test_cdatetofromiso_methods.vb
@@ -10,7 +10,10 @@ Function doUnitTest as Integer
     ' CDateFromIso CDateToIso
     If ( CDateToIso( CDateFromIso("20161016") ) <> "20161016" ) Then
         doUnitTest = 0
+    ElseIf ( CDateToIso( CDateFromIso("2016-10-16") ) <> "20161016" ) Then
+        doUnitTest = 0
     Else
         doUnitTest = 1
     End If
+    ' TODO: add some failure tests for misformed input, On Error whatever?
 End Function
commit cdcbdf88b7f74184b532925eaf140dbf65a2cd21
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 28 15:37:17 2017 +0200

    Resolves: tdf#106956 CDateFromIso accept also YYYY-MM-DD form
    
    Previous implementation was over-simplified and accepted all sort of malformed
    input to yield some arbitrary date, including longer and shorter and not
    strictly numeric strings.
    
    Change-Id: I2158429aeff7431f5ec5a1c9125018a5455a4730

diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index a8468a61b908..1bb3a474bc60 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -2045,31 +2045,64 @@ RTLFUNC(CDateToIso)
     }
 }
 
-// Function to convert date from ISO 8601 date format
+// Function to convert date from ISO 8601 date format YYYYMMDD or YYYY-MM-DD
 RTLFUNC(CDateFromIso)
 {
     (void)pBasic;
     (void)bWrite;
 
-    if ( rPar.Count() == 2 )
+    do
     {
+        if ( rPar.Count() != 2 )
+            break;
+
         OUString aStr = rPar.Get(1)->GetOUString();
-        const sal_Int32 iMonthStart = aStr.getLength() - 4;
-        OUString aYearStr  = aStr.copy( 0, iMonthStart );
-        OUString aMonthStr = aStr.copy( iMonthStart, 2 );
-        OUString aDayStr   = aStr.copy( iMonthStart+2, 2 );
+        const sal_Int32 nLen = aStr.getLength();
+        if (nLen != 8 && nLen != 10)
+            break;
 
-        double dDate;
-        if( implDateSerial( (sal_Int16)aYearStr.toInt32(),
-            (sal_Int16)aMonthStr.toInt32(), (sal_Int16)aDayStr.toInt32(), dDate ) )
+        OUString aYearStr, aMonthStr, aDayStr;
+        if (nLen == 8)
         {
-            rPar.Get(0)->PutDate( dDate );
+            // YYYYMMDD
+            if (!comphelper::string::isdigitAsciiString(aStr))
+                break;
+
+            aYearStr  = aStr.copy( 0, 4 );
+            aMonthStr = aStr.copy( 4, 2 );
+            aDayStr   = aStr.copy( 6, 2 );
         }
+        else
+        {
+            // YYYY-MM-DD
+            const sal_Int32 nSep1 = aStr.indexOf('-');
+            if (nSep1 != 4)
+                break;
+            const sal_Int32 nSep2 = aStr.indexOf('-', nSep1+1);
+            if (nSep2 != 7)
+                break;
+
+            aYearStr  = aStr.copy( 0, 4 );
+            aMonthStr = aStr.copy( 5, 2 );
+            aDayStr   = aStr.copy( 8, 2 );
+            if (    !comphelper::string::isdigitAsciiString(aYearStr) ||
+                    !comphelper::string::isdigitAsciiString(aMonthStr) ||
+                    !comphelper::string::isdigitAsciiString(aDayStr))
+                break;
+        }
+
+        double dDate;
+        if (!implDateSerial( (sal_Int16)aYearStr.toInt32(),
+                    (sal_Int16)aMonthStr.toInt32(), (sal_Int16)aDayStr.toInt32(), dDate ))
+            break;
+
+        rPar.Get(0)->PutDate( dDate );
+
+        return;
     }
-    else
-    {
-        StarBASIC::Error( ERRCODE_BASIC_BAD_ARGUMENT );
-    }
+    while (false);
+
+    StarBASIC::Error( ERRCODE_BASIC_BAD_ARGUMENT );
 }
 
 RTLFUNC(DateSerial)


More information about the Libreoffice-commits mailing list