[Libreoffice-commits] core.git: 8 commits - sc/source

Eike Rathke erack at redhat.com
Thu Jun 30 10:59:00 UTC 2016


 sc/source/core/inc/interpre.hxx  |    8 +++
 sc/source/core/tool/interpr1.cxx |   56 +++++++++++-----------
 sc/source/core/tool/interpr2.cxx |   99 ++++++++++++++++++---------------------
 sc/source/core/tool/interpr4.cxx |   44 +++++++++++++++++
 sc/source/core/tool/interpr5.cxx |   15 ++++-
 5 files changed, 141 insertions(+), 81 deletions(-)

New commits:
commit 0ac0061b437310c8bfb9d8b3596dae579a264b46
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 30 12:51:01 2016 +0200

    use GetInt*() in the most obvious places
    
    found with /approxFloor.*GetDouble
    
    Change-Id: Ice058c9cb318d7b0b0cadb9a26b4eb9f3691752f

diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index 3da084f..6e8d9a7 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -513,8 +513,15 @@ void ScInterpreter::ScMatValue()
     if ( MustHaveParamCount( GetByte(), 3 ) )
     {
         // 0 to count-1
-        SCSIZE nR = static_cast<SCSIZE>(::rtl::math::approxFloor(GetDouble()));
-        SCSIZE nC = static_cast<SCSIZE>(::rtl::math::approxFloor(GetDouble()));
+        // Theoretically we could have GetSize() instead of GetUInt32(), but
+        // really, practically ...
+        SCSIZE nR = static_cast<SCSIZE>(GetUInt32());
+        SCSIZE nC = static_cast<SCSIZE>(GetUInt32());
+        if (nGlobalError)
+        {
+            PushError( nGlobalError);
+            return;
+        }
         switch (GetStackType())
         {
             case svSingleRef :
@@ -606,8 +613,8 @@ void ScInterpreter::ScEMat()
 {
     if ( MustHaveParamCount( GetByte(), 1 ) )
     {
-        SCSIZE nDim = static_cast<SCSIZE>(::rtl::math::approxFloor(GetDouble()));
-        if (nDim == 0)
+        SCSIZE nDim = static_cast<SCSIZE>(GetUInt32());
+        if (nGlobalError || nDim == 0)
             PushIllegalArgument();
         else if (!ScMatrix::IsSizeAllocatable( nDim, nDim))
             PushError( errMatrixSize);
commit 2b376803a79c8eb74ebe2569badd271b63ccd4d6
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 30 12:39:52 2016 +0200

    use GetInt*() in the most obvious places
    
    found with /approxFloor.*GetDouble
    
    Change-Id: I2a08d8c268e6c1d64270d9c9f343b69a62f27708

diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 5888abf..548e842 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -126,21 +126,21 @@ void ScInterpreter::ScGetActTime()
 void ScInterpreter::ScGetYear()
 {
     Date aDate = *(pFormatter->GetNullDate());
-    aDate += (long) ::rtl::math::approxFloor(GetDouble());
+    aDate += (long) GetInt32();
     PushDouble( (double) aDate.GetYear() );
 }
 
 void ScInterpreter::ScGetMonth()
 {
     Date aDate = *(pFormatter->GetNullDate());
-    aDate += (long) ::rtl::math::approxFloor(GetDouble());
+    aDate += (long) GetInt32();
     PushDouble( (double) aDate.GetMonth() );
 }
 
 void ScInterpreter::ScGetDay()
 {
     Date aDate = *(pFormatter->GetNullDate());
-    aDate += (long)::rtl::math::approxFloor(GetDouble());
+    aDate += (long) GetInt32();
     PushDouble((double) aDate.GetDay());
 }
 
@@ -192,19 +192,12 @@ void ScInterpreter::ScGetDayOfWeek()
     {
         sal_Int16 nFlag;
         if (nParamCount == 2)
-        {
             nFlag = GetInt16();
-            if (nGlobalError)
-            {
-                PushError( nGlobalError);
-                return;
-            }
-        }
         else
             nFlag = 1;
 
         Date aDate = *(pFormatter->GetNullDate());
-        aDate += (long)::rtl::math::approxFloor(GetDouble());
+        aDate += (long) GetInt32();
         int nVal = (int) aDate.GetDayOfWeek();  // MONDAY = 0
         switch (nFlag)
         {
@@ -243,10 +236,10 @@ void ScInterpreter::ScWeeknumOOo()
 {
     if ( MustHaveParamCount( GetByte(), 2 ) )
     {
-        short nFlag = (short) ::rtl::math::approxFloor(GetDouble());
+        sal_Int16 nFlag = GetInt16();
 
         Date aDate = *(pFormatter->GetNullDate());
-        aDate += (long)::rtl::math::approxFloor(GetDouble());
+        aDate += (long) GetInt32();
         PushInt( (int) aDate.GetWeekOfYear( nFlag == 1 ? SUNDAY : MONDAY ));
     }
 }
@@ -258,21 +251,12 @@ void ScInterpreter::ScGetWeekOfYear()
     {
         sal_Int16 nFlag;
         if (nParamCount == 1)
-        {
             nFlag = 1;
-        }
         else
-        {
             nFlag = GetInt16();
-            if (nGlobalError)
-            {
-                PushError( nGlobalError);
-                return;
-            }
-        }
 
         Date aDate = *(pFormatter->GetNullDate());
-        aDate += (long)::rtl::math::approxFloor(GetDouble());
+        aDate += (long) GetInt32();
 
         sal_Int32 nMinimumNumberOfDaysInWeek;
         DayOfWeek eFirstDayOfWeek;
@@ -315,7 +299,7 @@ void ScInterpreter::ScGetIsoWeekOfYear()
     if ( MustHaveParamCount( GetByte(), 1 ) )
     {
         Date aDate = *(pFormatter->GetNullDate());
-        aDate += (long)::rtl::math::approxFloor(GetDouble());
+        aDate += (long) GetInt32();
         PushInt( (int) aDate.GetWeekOfYear() );
     }
 }
@@ -507,8 +491,15 @@ void ScInterpreter::ScNetWorkdays( bool bOOXML_Version )
             PushError( nErr );
         else
         {
-            sal_uInt32 nDate2 = ( sal_uInt32 )::rtl::math::approxFloor( GetDouble() ) + nNullDate;
-            sal_uInt32 nDate1 = ( sal_uInt32 )::rtl::math::approxFloor( GetDouble() ) + nNullDate;
+            sal_uInt32 nDate2 = GetUInt32();
+            sal_uInt32 nDate1 = GetUInt32();
+            if (nGlobalError || (nDate1 > SAL_MAX_UINT32 - nNullDate) || nDate2 > (SAL_MAX_UINT32 - nNullDate))
+            {
+                PushIllegalArgument();
+                return;
+            }
+            nDate2 += nNullDate;
+            nDate1 += nNullDate;
 
             sal_Int32 nCnt = 0;
             size_t nRef = 0;
@@ -552,8 +543,14 @@ void ScInterpreter::ScWorkday_MS()
             PushError( nErr );
         else
         {
-            sal_Int32 nDays = ::rtl::math::approxFloor( GetDouble() );
-            sal_uInt32 nDate = ( sal_uInt32 )::rtl::math::approxFloor( GetDouble() ) + nNullDate;
+            sal_Int32 nDays = GetInt32();
+            sal_uInt32 nDate = GetUInt32();
+            if (nGlobalError || (nDate > SAL_MAX_UINT32 - nNullDate))
+            {
+                PushIllegalArgument();
+                return;
+            }
+            nDate += nNullDate;
 
             if ( !nDays )
                 PushDouble( ( double ) ( nDate - nNullDate ) );
@@ -601,10 +598,10 @@ void ScInterpreter::ScGetDate()
     nFuncFmtType = css::util::NumberFormat::DATE;
     if ( MustHaveParamCount( GetByte(), 3 ) )
     {
-        sal_Int16 nDay   = (sal_Int16) ::rtl::math::approxFloor(GetDouble());
-        sal_Int16 nMonth = (sal_Int16) ::rtl::math::approxFloor(GetDouble());
-        sal_Int16 nYear  = (sal_Int16) ::rtl::math::approxFloor(GetDouble());
-        if (nYear < 0)
+        sal_Int16 nDay   = GetInt16();
+        sal_Int16 nMonth = GetInt16();
+        sal_Int16 nYear  = GetInt16();
+        if (nGlobalError || nYear < 0)
             PushIllegalArgument();
         else
         {
@@ -931,11 +928,11 @@ void ScInterpreter::RoundNumber( rtl_math_RoundingMode eMode )
             fVal = ::rtl::math::round( GetDouble(), 0, eMode );
         else
         {
-            sal_Int32 nDec = (sal_Int32) ::rtl::math::approxFloor(GetDouble());
-            if( nDec < -20 || nDec > 20 )
+            sal_Int16 nDec = GetInt16();
+            if ( nGlobalError || nDec < -20 || nDec > 20 )
                 PushIllegalArgument();
             else
-                fVal = ::rtl::math::round( GetDouble(), (short)nDec, eMode );
+                fVal = ::rtl::math::round( GetDouble(), nDec, eMode );
         }
         PushDouble(fVal);
     }
@@ -2496,7 +2493,15 @@ void ScInterpreter::ScDde()
     {
         sal_uInt8 nMode = SC_DDE_DEFAULT;
         if (nParamCount == 4)
-            nMode = (sal_uInt8) ::rtl::math::approxFloor(GetDouble());
+        {
+            sal_uInt32 nTmp = GetUInt32();
+            if (nGlobalError || nTmp > SAL_MAX_UINT8)
+            {
+                PushIllegalArgument();
+                return;
+            }
+            nMode = (sal_uInt8) nTmp;
+        }
         OUString aItem  = GetString().getString();
         OUString aTopic = GetString().getString();
         OUString aAppl  = GetString().getString();
commit 366a1669368856b329144a791c030445149fdd72
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 30 12:08:38 2016 +0200

    use GetInt*() in the most obvious places
    
    found with /approxFloor.*GetDouble
    
    Change-Id: Ib14a60e872c6a3adde2aa11f96f391c42b4e510c

diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 5b18611..491b4c8 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -489,7 +489,7 @@ void ScInterpreter::ScChooseJump()
         break;
         default:
         {
-            double nJumpIndex = ::rtl::math::approxFloor( GetDouble() );
+            sal_Int16 nJumpIndex = GetInt16();
             if (!nGlobalError && (nJumpIndex >= 1) && (nJumpIndex < nJumpCount))
             {
                 aCode.Jump( pJump[ (short) nJumpIndex ], pJump[ nJumpCount ] );
@@ -3410,12 +3410,11 @@ void ScInterpreter::ScUnichar()
 {
     if ( MustHaveParamCount( GetByte(), 1 ) )
     {
-        double dVal = ::rtl::math::approxFloor( GetDouble() );
-        if (dVal < 0 || !rtl::isUnicodeCodePoint(dVal))
+        sal_uInt32 nCodePoint = GetUInt32();
+        if (nGlobalError || !rtl::isUnicodeCodePoint(nCodePoint))
             PushIllegalArgument();
         else
         {
-            sal_uInt32 nCodePoint = static_cast<sal_uInt32>( dVal );
             OUString aStr( &nCodePoint, 1 );
             PushString( aStr );
         }
@@ -6635,8 +6634,8 @@ void ScInterpreter::ScSubTotal()
     {
         // We must fish the 1st parameter deep from the stack! And push it on top.
         const FormulaToken* p = pStack[ sp - nParamCount ];
-        PushTempToken( *p );
-        int nFunc = (int) ::rtl::math::approxFloor( GetDouble() );
+        PushTempToken( *p );    /* TODO: use FormulaTokenRef instead */
+        sal_Int32 nFunc = GetInt32();
         mnSubTotalFlags |= SUBTOTAL_IGN_NESTED_ST_AG | SUBTOTAL_IGN_FILTERED;
         if (nFunc > 100)
         {
@@ -6646,7 +6645,7 @@ void ScInterpreter::ScSubTotal()
             nFunc -= 100;
         }
 
-        if ( nFunc < 1 || nFunc > 11 )
+        if ( nGlobalError || nFunc < 1 || nFunc > 11 )
             PushIllegalArgument();  // simulate return on stack, not SetError(...)
         else
         {
@@ -6682,14 +6681,14 @@ void ScInterpreter::ScAggregate()
     {
         // fish the 1st parameter from the stack and push it on top.
         const FormulaToken* p = pStack[ sp - nParamCount ];
-        PushTempToken( *p );
-        int nFunc = ( int ) ::rtl::math::approxFloor( GetDouble() );
+        PushTempToken( *p );    /* TODO: use FormulaTokenRef instead */
+        sal_Int32 nFunc = GetInt32();
         // fish the 2nd parameter from the stack and push it on top.
         const FormulaToken* p2 = pStack[ sp - ( nParamCount - 1 ) ];
-        PushTempToken( *p2 );
-        int nOption = ( int ) ::rtl::math::approxFloor( GetDouble() );
+        PushTempToken( *p2 );   /* TODO: use FormulaTokenRef instead */
+        sal_Int32 nOption = GetInt32();
 
-        if ( nFunc < 1 || nFunc > 19 )
+        if ( nGlobalError || nFunc < 1 || nFunc > 19 )
             PushIllegalArgument();
         else
         {
@@ -7341,7 +7340,7 @@ void ScInterpreter::ScAddressFunc()
     ScRefFlags  nFlags = ScRefFlags::COL_ABS | ScRefFlags::ROW_ABS;   // default
     if( nParamCount >= 3 )
     {
-        sal_uInt16 n = (sal_uInt16) ::rtl::math::approxFloor( GetDoubleWithDefault( 1.0));
+        sal_Int32 n = GetInt32WithDefault(1);
         switch ( n )
         {
             default :
@@ -7360,8 +7359,8 @@ void ScInterpreter::ScAddressFunc()
     }
     nFlags |= ScRefFlags::VALID | ScRefFlags::ROW_VALID | ScRefFlags::COL_VALID;
 
-    SCCOL nCol = (SCCOL) ::rtl::math::approxFloor(GetDouble());
-    SCROW nRow = (SCROW) ::rtl::math::approxFloor(GetDouble());
+    SCCOL nCol = (SCCOL) GetInt16();
+    SCROW nRow = (SCROW) GetInt32();
     if( eConv == FormulaGrammar::CONV_XL_R1C1 )
     {
         // YUCK!  The XL interface actually treats rel R1C1 refs differently
@@ -7374,7 +7373,7 @@ void ScInterpreter::ScAddressFunc()
 
     --nCol;
     --nRow;
-    if(!ValidCol( nCol) || !ValidRow( nRow))
+    if (nGlobalError || !ValidCol( nCol) || !ValidRow( nRow))
     {
         PushIllegalArgument();
         return;
@@ -7418,13 +7417,18 @@ void ScInterpreter::ScOffset()
     sal_uInt8 nParamCount = GetByte();
     if ( MustHaveParamCount( nParamCount, 3, 5 ) )
     {
-        long nColNew = -1, nRowNew = -1, nColPlus, nRowPlus;
+        sal_Int32 nColNew = -1, nRowNew = -1, nColPlus, nRowPlus;
         if (nParamCount == 5)
-            nColNew = (long) ::rtl::math::approxFloor(GetDouble());
+            nColNew = GetInt32();
         if (nParamCount >= 4)
-            nRowNew = (long) ::rtl::math::approxFloor(GetDoubleWithDefault( -1.0 ));
-        nColPlus = (long) ::rtl::math::approxFloor(GetDouble());
-        nRowPlus = (long) ::rtl::math::approxFloor(GetDouble());
+            nRowNew = GetInt32WithDefault(-1);
+        nColPlus = GetInt32();
+        nRowPlus = GetInt32();
+        if (nGlobalError)
+        {
+            PushError( nGlobalError);
+            return;
+        }
         SCCOL nCol1(0);
         SCROW nRow1(0);
         SCTAB nTab1(0);
@@ -7565,27 +7569,27 @@ void ScInterpreter::ScIndex()
     sal_uInt8 nParamCount = GetByte();
     if ( MustHaveParamCount( nParamCount, 1, 4 ) )
     {
-        long nArea;
+        sal_uInt32 nArea;
         size_t nAreaCount;
         SCCOL nCol;
         SCROW nRow;
         if (nParamCount == 4)
-            nArea = (long) ::rtl::math::approxFloor(GetDouble());
+            nArea = GetUInt32();
         else
             nArea = 1;
         if (nParamCount >= 3)
-            nCol = (SCCOL) ::rtl::math::approxFloor(GetDouble());
+            nCol = (SCCOL) GetInt16();
         else
             nCol = 0;
         if (nParamCount >= 2)
-            nRow = (SCROW) ::rtl::math::approxFloor(GetDouble());
+            nRow = (SCROW) GetInt32();
         else
             nRow = 0;
         if (GetStackType() == svRefList)
             nAreaCount = (sp ? pStack[sp-1]->GetRefList()->size() : 0);
         else
             nAreaCount = 1;     // one reference or array or whatever
-        if (nAreaCount == 0 || (size_t)nArea > nAreaCount)
+        if (nGlobalError || nAreaCount == 0 || (size_t)nArea > nAreaCount)
         {
             PushError( errNoRef);
             return;
commit f8f655da5919858994dafb292429cf4d0298be4c
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 30 11:30:53 2016 +0200

    return SAL_MAX_... instead of 0 for GetInt*()
    
    Most places will use GetInt*() to obtain flags or enums in a range
    0..somenumber and explicitly check for valid values, so returning MAX instead
    of 0 will save us an extra comparison of nGlobalError and push/return.
    
    Change-Id: I84c5d693d3642ea643308dc4650a391de2ebe82a

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 6e95f02..1c7baa5 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -406,14 +406,13 @@ double GetDoubleFromMatrix(const ScMatrixRef& pMat);
 double GetDouble();
 double GetDoubleWithDefault(double nDefault);
 bool IsMissing();
-/// if GetDouble() not within int32 limits sets nGlobalError and returns 0
+/** if GetDouble() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
 sal_Int32 GetInt32();
-/** if GetDoubleWithDefault() not within int32 limits sets nGlobalError and
-    returns nDefault */
+/** if GetDoubleWithDefault() not within int32 limits sets nGlobalError and returns SAL_MAX_INT32 */
 sal_Int32 GetInt32WithDefault( sal_Int32 nDefault );
-/// if GetDouble() not within int16 limits sets nGlobalError and returns 0
+/** if GetDouble() not within int16 limits sets nGlobalError and returns SAL_MAX_INT16 */
 sal_Int16 GetInt16();
-/// if GetDouble() not within uint32 limits sets nGlobalError and returns 0
+/** if GetDouble() not within uint32 limits sets nGlobalError and returns SAL_MAX_UINT32 */
 sal_uInt32 GetUInt32();
 bool GetBool() { return GetDouble() != 0.0; }
 /// returns TRUE if double (or error, check nGlobalError), else FALSE
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 29881d9..1421f87 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2099,7 +2099,7 @@ sal_Int32 ScInterpreter::GetInt32()
     if (fVal < SAL_MIN_INT32 || fVal > SAL_MAX_INT32)
     {
         SetError( errIllegalArgument);
-        return 0;
+        return SAL_MAX_INT32;
     }
     return static_cast<sal_Int32>(fVal);
 }
@@ -2110,7 +2110,7 @@ sal_Int32 ScInterpreter::GetInt32WithDefault( sal_Int32 nDefault )
     if (fVal < SAL_MIN_INT32 || fVal > SAL_MAX_INT32)
     {
         SetError( errIllegalArgument);
-        return nDefault;
+        return SAL_MAX_INT32;
     }
     return static_cast<sal_Int32>(fVal);
 }
@@ -2121,7 +2121,7 @@ sal_Int16 ScInterpreter::GetInt16()
     if (fVal < SAL_MIN_INT16 || fVal > SAL_MAX_INT16)
     {
         SetError( errIllegalArgument);
-        return 0;
+        return SAL_MAX_INT16;
     }
     return static_cast<sal_Int16>(fVal);
 }
@@ -2132,7 +2132,7 @@ sal_uInt32 ScInterpreter::GetUInt32()
     if (fVal < 0.0 || fVal > SAL_MAX_UINT32)
     {
         SetError( errIllegalArgument);
-        return 0;
+        return SAL_MAX_UINT32;
     }
     return static_cast<sal_uInt32>(fVal);
 }
commit 2087b8f2f66487f6e5940eb5fc318944a1865e31
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 30 10:54:16 2016 +0200

    introduce ScInterpreter::GetInt32WithDefault()
    
    Change-Id: Ic3a5c65e4846a4582461564f572be83897b1d12d

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 5ac28bc..6e95f02 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -408,6 +408,9 @@ double GetDoubleWithDefault(double nDefault);
 bool IsMissing();
 /// if GetDouble() not within int32 limits sets nGlobalError and returns 0
 sal_Int32 GetInt32();
+/** if GetDoubleWithDefault() not within int32 limits sets nGlobalError and
+    returns nDefault */
+sal_Int32 GetInt32WithDefault( sal_Int32 nDefault );
 /// if GetDouble() not within int16 limits sets nGlobalError and returns 0
 sal_Int16 GetInt16();
 /// if GetDouble() not within uint32 limits sets nGlobalError and returns 0
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 8ac5609..29881d9 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2104,6 +2104,17 @@ sal_Int32 ScInterpreter::GetInt32()
     return static_cast<sal_Int32>(fVal);
 }
 
+sal_Int32 ScInterpreter::GetInt32WithDefault( sal_Int32 nDefault )
+{
+    double fVal = rtl::math::approxFloor( GetDoubleWithDefault( nDefault));
+    if (fVal < SAL_MIN_INT32 || fVal > SAL_MAX_INT32)
+    {
+        SetError( errIllegalArgument);
+        return nDefault;
+    }
+    return static_cast<sal_Int32>(fVal);
+}
+
 sal_Int16 ScInterpreter::GetInt16()
 {
     double fVal = rtl::math::approxFloor( GetDouble());
commit 75c364e426eb34ba1be2ac71f768fd3969e85226
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jun 29 23:49:08 2016 +0200

    introduce ScInterpreter::GetUInt32()
    
    Change-Id: Iba1a8cfcab01083a23b4956d7da51651ad3a447f

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 642b569..5ac28bc 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -410,6 +410,8 @@ bool IsMissing();
 sal_Int32 GetInt32();
 /// if GetDouble() not within int16 limits sets nGlobalError and returns 0
 sal_Int16 GetInt16();
+/// if GetDouble() not within uint32 limits sets nGlobalError and returns 0
+sal_uInt32 GetUInt32();
 bool GetBool() { return GetDouble() != 0.0; }
 /// returns TRUE if double (or error, check nGlobalError), else FALSE
 bool GetDoubleOrString( double& rValue, svl::SharedString& rString );
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index ed7b9f8..8ac5609 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2115,6 +2115,17 @@ sal_Int16 ScInterpreter::GetInt16()
     return static_cast<sal_Int16>(fVal);
 }
 
+sal_uInt32 ScInterpreter::GetUInt32()
+{
+    double fVal = rtl::math::approxFloor( GetDouble());
+    if (fVal < 0.0 || fVal > SAL_MAX_UINT32)
+    {
+        SetError( errIllegalArgument);
+        return 0;
+    }
+    return static_cast<sal_uInt32>(fVal);
+}
+
 bool ScInterpreter::GetDoubleOrString( double& rDouble, svl::SharedString& rString )
 {
     bool bDouble = true;
commit 7b2432a2b7fa7a7cc87160e7cc1823a0354988ff
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jun 29 23:36:35 2016 +0200

    use GetInt16()
    
    in the places changed by 2606915f0f480af30367a5d0f67adbf930c2c6b9 and
    002697221215e009cdf20fd5c12b50350b8a2128
    
    Change-Id: Iea056b3101c5c41ee932defe13edf4769cb9eab1

diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index ebee443..5888abf 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -190,17 +190,15 @@ void ScInterpreter::ScGetDayOfWeek()
     sal_uInt8 nParamCount = GetByte();
     if ( MustHaveParamCount( nParamCount, 1, 2 ) )
     {
-        short nFlag;
+        sal_Int16 nFlag;
         if (nParamCount == 2)
         {
-            double x = rtl::math::approxFloor(GetDouble());
-            if (x > double(std::numeric_limits<short>::min()) - 1
-                && x < double(std::numeric_limits<short>::max()) + 1)
+            nFlag = GetInt16();
+            if (nGlobalError)
             {
-                nFlag = static_cast<short>(x);
+                PushError( nGlobalError);
+                return;
             }
-            else
-                nFlag = -1; // cause error in switch below
         }
         else
             nFlag = 1;
@@ -258,22 +256,18 @@ void ScInterpreter::ScGetWeekOfYear()
     sal_uInt8 nParamCount = GetByte();
     if ( MustHaveParamCount( nParamCount, 1, 2 ) )
     {
-        short nFlag;
+        sal_Int16 nFlag;
         if (nParamCount == 1)
         {
             nFlag = 1;
         }
         else
         {
-            double x = rtl::math::approxFloor(GetDouble());
-            if (x > double(std::numeric_limits<short>::min()) - 1
-                && x < double(std::numeric_limits<short>::max()) + 1)
-            {
-                nFlag = static_cast<short>(x);
-            }
-            else
+            nFlag = GetInt16();
+            if (nGlobalError)
             {
-                nFlag = -1; // cause error in switch below
+                PushError( nGlobalError);
+                return;
             }
         }
 
@@ -332,14 +326,12 @@ void ScInterpreter::ScEasterSunday()
     if ( MustHaveParamCount( GetByte(), 1 ) )
     {
         sal_Int16 nDay, nMonth, nYear;
-        double x = rtl::math::approxFloor( GetDouble() );
-        if (x <= sal_Int32(SAL_MIN_INT16) - 1
-            || x >= sal_Int32(SAL_MAX_INT16) + 1)
+        nYear = GetInt16();
+        if (nGlobalError)
         {
-            PushIllegalArgument();
+            PushError( nGlobalError);
             return;
         }
-        nYear = static_cast<sal_Int16>(x);
         if ( nYear < 100 )
             nYear = pFormatter->ExpandTwoDigitYear( nYear );
         if (nYear < 1583 || nYear > 9956)
commit 7dd093b283fa629e00958f6d91e6006d1e604fdf
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jun 29 23:03:05 2016 +0200

    introduce ScInterpreter GetInt32() and GetInt16()
    
    in preparation of replacing oversimplifying casts and special handling
    like in 2606915f0f480af30367a5d0f67adbf930c2c6b9 and
    002697221215e009cdf20fd5c12b50350b8a2128
    
    Change-Id: I81327dbc2218f40359c3485cf3d639d19fd69cef

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index c0af821..642b569 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -406,6 +406,10 @@ double GetDoubleFromMatrix(const ScMatrixRef& pMat);
 double GetDouble();
 double GetDoubleWithDefault(double nDefault);
 bool IsMissing();
+/// if GetDouble() not within int32 limits sets nGlobalError and returns 0
+sal_Int32 GetInt32();
+/// if GetDouble() not within int16 limits sets nGlobalError and returns 0
+sal_Int16 GetInt16();
 bool GetBool() { return GetDouble() != 0.0; }
 /// returns TRUE if double (or error, check nGlobalError), else FALSE
 bool GetDoubleOrString( double& rValue, svl::SharedString& rString );
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 848bebb..ed7b9f8 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2093,6 +2093,28 @@ double ScInterpreter::GetDoubleWithDefault(double nDefault)
     return nResultVal;
 }
 
+sal_Int32 ScInterpreter::GetInt32()
+{
+    double fVal = rtl::math::approxFloor( GetDouble());
+    if (fVal < SAL_MIN_INT32 || fVal > SAL_MAX_INT32)
+    {
+        SetError( errIllegalArgument);
+        return 0;
+    }
+    return static_cast<sal_Int32>(fVal);
+}
+
+sal_Int16 ScInterpreter::GetInt16()
+{
+    double fVal = rtl::math::approxFloor( GetDouble());
+    if (fVal < SAL_MIN_INT16 || fVal > SAL_MAX_INT16)
+    {
+        SetError( errIllegalArgument);
+        return 0;
+    }
+    return static_cast<sal_Int16>(fVal);
+}
+
 bool ScInterpreter::GetDoubleOrString( double& rDouble, svl::SharedString& rString )
 {
     bool bDouble = true;


More information about the Libreoffice-commits mailing list