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

Eike Rathke erack at redhat.com
Tue May 23 11:33:02 UTC 2017


 sc/source/core/tool/interpr1.cxx |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

New commits:
commit 5e974c89c8647040f796605aeae1322303532e58
Author: Eike Rathke <erack at redhat.com>
Date:   Tue May 23 13:32:19 2017 +0200

    Handle COUNTBLANK with array of references, tdf#58874
    
    Change-Id: Icf8d2ac32a75ebb45c8c6b3b5ae46d01757eb07a

diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index a782953b5425..28b12c351227 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -4924,6 +4924,9 @@ void ScInterpreter::ScCountEmptyCells()
 {
     if ( MustHaveParamCount( GetByte(), 1 ) )
     {
+        const SCSIZE nMatRows = GetRefListArrayMaxSize(1);
+        // There's either one RefList and nothing else, or none.
+        ScMatrixRef xResMat = (nMatRows ? GetNewMat( 1, nMatRows) : nullptr);
         sal_uLong nMaxCount = 0, nCount = 0;
         switch (GetStackType())
         {
@@ -4937,14 +4940,16 @@ void ScInterpreter::ScCountEmptyCells()
                     nCount = 1;
             }
             break;
-            case svDoubleRef :
             case svRefList :
+            case svDoubleRef :
             {
                 ScRange aRange;
                 short nParam = 1;
+                SCSIZE nRefListArrayPos = 0;
                 size_t nRefInList = 0;
                 while (nParam-- > 0)
                 {
+                    nRefListArrayPos = nRefInList;
                     PopDoubleRef( aRange, nParam, nRefInList);
                     nMaxCount +=
                         static_cast<sal_uLong>(aRange.aEnd.Row() - aRange.aStart.Row() + 1) *
@@ -4958,12 +4963,20 @@ void ScInterpreter::ScCountEmptyCells()
                         if (!isCellContentEmpty(rCell))
                             ++nCount;
                     }
+                    if (xResMat)
+                    {
+                        xResMat->PutDouble( nMaxCount - nCount, 0, nRefListArrayPos);
+                        nMaxCount = nCount = 0;
+                    }
                 }
             }
             break;
             default : SetError(FormulaError::IllegalParameter); break;
         }
-        PushDouble(nMaxCount - nCount);
+        if (xResMat)
+            PushMatrix( xResMat);
+        else
+            PushDouble(nMaxCount - nCount);
     }
 }
 


More information about the Libreoffice-commits mailing list