include/formula/errorcodes.hxx   |    4 ++++
 sc/source/core/tool/interpr1.cxx |    2 +-
 sc/source/core/tool/interpr5.cxx |   16 ++++++++++++++--
 sc/source/core/tool/scmatrix.cxx |   10 +++++-----
 4 files changed, 24 insertions(+), 8 deletions(-)

New commits:
commit d6c55b4b2c549f19fe5bb7ab06d823ae5eced5df
Author: Eike Rathke <er...@redhat.com>
Date:   Fri Jun 13 14:16:11 2014 +0200

    resolved fdo#79978 propagate error through DoubleArray of matrix
    
    Regression introduced with 83f77ab0661df992f241e5f9ecb1aa8f8eaeafec.
    
    Interpreter errors are transported using NaN coded doubles, using simple
    setNan()/isNan() to flag and ignore non-numeric values skips all error
    values.
    
    Change-Id: I0d3cb30262bc5ba7ee77e53a2bc45e56569fbc4b
    (cherry picked from commit a288bebbcec0b16e1ced09a601de5ffbb6b1bbe0)
    Reviewed-on: https://gerrit.libreoffice.org/9768
    Reviewed-by: Kohei Yoshida <libreoff...@kohei.us>
    Tested-by: Kohei Yoshida <libreoff...@kohei.us>

diff --git a/include/formula/errorcodes.hxx b/include/formula/errorcodes.hxx
index d178aec..87dab2b 100644
--- a/include/formula/errorcodes.hxx
+++ b/include/formula/errorcodes.hxx
@@ -75,6 +75,10 @@ const sal_uInt16 errNotNumericString     = 534;
 // ScInterpreter internal:  jump matrix already has a result at this position,
 // do not overwrite in case of empty code path.
 const sal_uInt16 errJumpMatHasResult     = 535;
+// ScInterpreter internal:  (matrix) element is not a numeric value, i.e.
+// string or empty, to be distinguished from the general errNoValue NAN and not
+// to be used as result.
+const sal_uInt16 errElementNaN           = 536;
 
 // Interpreter: NA() not available condition, not a real error
 const sal_uInt16 NOTAVAILABLE            = 0x7fff;
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 758ce15..a834488 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -5615,7 +5615,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs 
eFunc )
                         continue;
 
                     fVal = *itMain;
-                    if (rtl::math::isNan(fVal))
+                    if (GetDoubleErrorValue(fVal) == errElementNaN)
                         continue;
 
                     ++fCount;
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index d8b97c03..6f1b9ba 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -1598,13 +1598,25 @@ namespace {
 class SumValues : std::unary_function<double, void>
 {
     double mfSum;
+    bool   mbError;
 public:
-    SumValues() : mfSum(0.0) {}
+    SumValues() : mfSum(0.0), mbError(false) {}
 
     void operator() (double f)
     {
-        if (!rtl::math::isNan(f))
+        if (mbError)
+            return;
+
+        sal_uInt16 nErr = GetDoubleErrorValue(f);
+        if (!nErr)
             mfSum += f;
+        else if (nErr != errElementNaN)
+        {
+            // Propagate the first error encountered, ignore "this is not a
+            // number" elements.
+            mfSum = f;
+            mbError = true;
+        }
     }
 
     double getValue() const { return mfSum; }
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 3b2c42c..4f210a8 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -1512,7 +1512,7 @@ public:
     ToDoubleArray( size_t nSize, bool bEmptyAsZero ) :
         maArray(nSize, 0.0), miPos(maArray.begin()), 
mbEmptyAsZero(bEmptyAsZero)
     {
-        rtl::math::setNan(&mfNaN);
+        mfNaN = CreateDoubleError( errElementNaN);
     }
 
     void operator() (const MatrixImplType::element_block_node_type& node)
@@ -1583,7 +1583,7 @@ class MergeDoubleArrayFunc : 
std::unary_function<MatrixImplType::element_block_t
 public:
     MergeDoubleArrayFunc(std::vector<double>& rArray) : mrArray(rArray), 
miPos(mrArray.begin())
     {
-        rtl::math::setNan(&mfNaN);
+        mfNaN = CreateDoubleError( errElementNaN);
     }
 
     void operator() (const MatrixImplType::element_block_node_type& node)
@@ -1599,7 +1599,7 @@ public:
                 numeric_element_block::const_iterator itEnd = 
numeric_element_block::end(*node.data);
                 for (; it != itEnd; ++it, ++miPos)
                 {
-                    if (rtl::math::isNan(*miPos))
+                    if (GetDoubleErrorValue(*miPos) == errElementNaN)
                         continue;
 
                     *miPos = op(*miPos, *it);
@@ -1612,7 +1612,7 @@ public:
                 boolean_element_block::const_iterator itEnd = 
boolean_element_block::end(*node.data);
                 for (; it != itEnd; ++it, ++miPos)
                 {
-                    if (rtl::math::isNan(*miPos))
+                    if (GetDoubleErrorValue(*miPos) == errElementNaN)
                         continue;
 
                     *miPos = op(*miPos, *it ? 1.0 : 0.0);
@@ -1630,7 +1630,7 @@ public:
                 // Empty element is equivalent of having a numeric value of 
0.0.
                 for (size_t i = 0; i < node.size; ++i, ++miPos)
                 {
-                    if (rtl::math::isNan(*miPos))
+                    if (GetDoubleErrorValue(*miPos) == errElementNaN)
                         continue;
 
                     *miPos = op(*miPos, 0.0);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to