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

Eike Rathke erack at redhat.com
Tue Mar 22 16:23:13 UTC 2016


 sc/source/core/data/formulacell.cxx |   47 +++++++++++++++++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

New commits:
commit d6b32653ad34f0879ad1ada421a3a2655dd766e1
Author: Eike Rathke <erack at redhat.com>
Date:   Tue Mar 22 17:16:07 2016 +0100

    Resolves: tdf#98642 comparing RPN insufficient in shared formula detection
    
    Change-Id: I78812c2d6fdb3464ccc2ebeee901a76f675effa4

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index f91dc21..4f602d6 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3914,7 +3914,7 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( ScFormulaCell& r
             break;
             case formula::svIndex:
             {
-                if(pThisTok->GetIndex() != pOtherTok->GetIndex())
+                if(pThisTok->GetIndex() != pOtherTok->GetIndex() || pThisTok->GetSheet() != pOtherTok->GetSheet())
                     return NotEqual;
             }
             break;
@@ -3938,6 +3938,51 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( ScFormulaCell& r
         }
     }
 
+    // If still the same, check lexical names as different names may result in
+    // identical RPN code.
+
+    pThis = pCode->GetArray();
+    nThisLen = pCode->GetLen();
+    pOther = rOther.pCode->GetArray();
+    nOtherLen = rOther.pCode->GetLen();
+
+    if ( !pThis || !pOther )
+    {
+        // Error: no code for cells !"
+        return NotEqual;
+    }
+
+    if ( nThisLen != nOtherLen )
+        return NotEqual;
+
+    for ( sal_uInt16 i = 0; i < nThisLen; i++ )
+    {
+        formula::FormulaToken *pThisTok = pThis[i];
+        formula::FormulaToken *pOtherTok = pOther[i];
+
+        if ( pThisTok->GetType() != pOtherTok->GetType() ||
+             pThisTok->GetOpCode() != pOtherTok->GetOpCode() ||
+             pThisTok->GetParamCount() != pOtherTok->GetParamCount() )
+        {
+            // Incompatible type, op-code or param counts.
+            return NotEqual;
+        }
+
+        switch (pThisTok->GetType())
+        {
+            // All index tokens are names. Different categories already had
+            // different OpCode values.
+            case formula::svIndex:
+                {
+                    if (pThisTok->GetIndex() != pOtherTok->GetIndex() || pThisTok->GetSheet() != pOtherTok->GetSheet())
+                        return NotEqual;
+                }
+                break;
+            default:
+                ;
+        }
+    }
+
     return bInvariant ? EqualInvariant : EqualRelativeRef;
 }
 


More information about the Libreoffice-commits mailing list