[Libreoffice-commits] .: sc/source

Eike Rathke erack at kemper.freedesktop.org
Wed Nov 30 07:53:37 PST 2011


 sc/source/core/inc/interpre.hxx  |    6 +++++-
 sc/source/core/tool/interpr2.cxx |    9 +++++----
 sc/source/core/tool/interpr4.cxx |    2 +-
 3 files changed, 11 insertions(+), 6 deletions(-)

New commits:
commit 445ae496f9a3b8abf8427e8ffe82d85cdaecd384
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Nov 30 16:52:56 2011 +0100

    sort out Gregorian cut-off date as side effect of validity

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 111f74f..586a4dd 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -551,8 +551,12 @@ void ScTTT();
         1999-03-03.
         If TRUE, the date passed must be a valid Gregorian calendar date. No
         two-digit expanding or rollover is done.
+
+    @param bCheckGregorian
+        If TRUE, date must be Gregorian, i.e. >= 1582-10-15.
+        If FALSE, don't care, any valid date >= 0-1-1 will do.
  */
-double GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict );
+double GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict, bool bCheckGregorian );
 
 void ScGetActDate();
 void ScGetActTime();
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index ef42258..5859a1a 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -66,7 +66,8 @@ using namespace formula;
 // Datum und Zeit
 //-----------------------------------------------------------------------------
 
-double ScInterpreter::GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay, bool bStrict )
+double ScInterpreter::GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay,
+        bool bStrict, bool bCheckGregorian )
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetDateSerial" );
     if ( nYear < 100 && !bStrict )
@@ -93,7 +94,7 @@ double ScInterpreter::GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int1
     Date aDate( nD, nM, nY);
     if (!bStrict)
         aDate += nDay - 1;
-    if (aDate.IsValidAndGregorian())
+    if ((!bCheckGregorian && aDate.IsValidDate()) || (bCheckGregorian && aDate.IsValidAndGregorian()))
         return (double) (aDate - *(pFormatter->GetNullDate()));
     else
     {
@@ -266,7 +267,7 @@ void ScInterpreter::ScEasterSunday()
         O = H + L - 7 * M + 114;
         nDay = sal::static_int_cast<sal_Int16>( O % 31 + 1 );
         nMonth = sal::static_int_cast<sal_Int16>( int(O / 31) );
-        PushDouble( GetDateSerial( nYear, nMonth, nDay, true ) );
+        PushDouble( GetDateSerial( nYear, nMonth, nDay, true, true ) );
     }
 }
 
@@ -283,7 +284,7 @@ void ScInterpreter::ScGetDate()
             PushIllegalArgument();
         else
         {
-            PushDouble(GetDateSerial(nYear, nMonth, nDay, false));
+            PushDouble(GetDateSerial(nYear, nMonth, nDay, false, true));
         }
     }
 }
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index d134d74..1bbad1c 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -405,7 +405,7 @@ double ScInterpreter::ConvertStringToValue( const String& rStr )
                                         sal::static_int_cast<sal_Int16>(nUnit[year]),
                                         sal::static_int_cast<sal_Int16>(nUnit[month]),
                                         sal::static_int_cast<sal_Int16>(nUnit[day]),
-                                        true) : 0.0);
+                                        true, false) : 0.0);
                             fValue += ((nUnit[hour] * 3600) + (nUnit[minute] * 60) + nUnit[second] + fFraction) / 86400.0;
                         }
                     }


More information about the Libreoffice-commits mailing list