You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ar...@apache.org on 2012/09/06 02:35:27 UTC

svn commit: r1381446 - in /incubator/ooo/trunk/main: formula/inc/formula/ formula/source/core/resource/ sc/inc/ sc/source/core/inc/ sc/source/core/tool/ sc/source/ui/src/

Author: arist
Date: Thu Sep  6 00:35:26 2012
New Revision: 1381446

URL: http://svn.apache.org/viewvc?rev=1381446&view=rev
Log:
calcishmakkica: #i114428# implement XOR

From: Eike Rathke <er...@apache.org>

Original Author: Marina Plakalovic <ma...@openoffice.org>
Original Committer: Eike Rathke [er] <ei...@oracle.com>

# HG changeset patch
# User Eike Rathke [er] <ei...@oracle.com>
# Date 1284060031 -7200
# Node ID 528da6bfd0daed4355d745590d5ac3a319b08fb4
# Parent  237cb91dd986ff11eb100cc631206cda102e91f7

Modified:
    incubator/ooo/trunk/main/formula/inc/formula/compiler.hrc
    incubator/ooo/trunk/main/formula/inc/formula/opcode.hxx
    incubator/ooo/trunk/main/formula/source/core/resource/core_resource.src
    incubator/ooo/trunk/main/sc/inc/helpids.h
    incubator/ooo/trunk/main/sc/inc/scmatrix.hxx
    incubator/ooo/trunk/main/sc/source/core/inc/interpre.hxx
    incubator/ooo/trunk/main/sc/source/core/tool/interpr1.cxx
    incubator/ooo/trunk/main/sc/source/core/tool/interpr4.cxx
    incubator/ooo/trunk/main/sc/source/core/tool/parclass.cxx
    incubator/ooo/trunk/main/sc/source/core/tool/scmatrix.cxx
    incubator/ooo/trunk/main/sc/source/ui/src/scfuncs.src

Modified: incubator/ooo/trunk/main/formula/inc/formula/compiler.hrc
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/formula/inc/formula/compiler.hrc?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/formula/inc/formula/compiler.hrc (original)
+++ incubator/ooo/trunk/main/formula/inc/formula/compiler.hrc Thu Sep  6 00:35:26 2012
@@ -389,9 +389,10 @@
 #define SC_OPCODE_CHISQ_DIST        393
 #define SC_OPCODE_CHISQ_INV         394
 #define SC_OPCODE_AVERAGE_IF        395
-#define SC_OPCODE_STOP_2_PAR        396
+#define SC_OPCODE_XOR               396
+#define SC_OPCODE_STOP_2_PAR        397
 
-#define SC_OPCODE_LAST_OPCODE_ID    395      /* last OpCode */
+#define SC_OPCODE_LAST_OPCODE_ID    396      /* last OpCode */
 
 /*** Interna ***/
 #define SC_OPCODE_INTERNAL_BEGIN   9999

Modified: incubator/ooo/trunk/main/formula/inc/formula/opcode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/formula/inc/formula/opcode.hxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/formula/inc/formula/opcode.hxx (original)
+++ incubator/ooo/trunk/main/formula/inc/formula/opcode.hxx Thu Sep  6 00:35:26 2012
@@ -385,6 +385,7 @@ enum OpCodeEnum
         ocGetPivotData      = SC_OPCODE_GET_PIVOT_DATA,
         ocEuroConvert       = SC_OPCODE_EUROCONVERT,
 		ocNumberValue		= SC_OPCODE_NUMBERVALUE,
+		ocXor               = SC_OPCODE_XOR,
 	// internal stuff
 		ocInternalBegin		= SC_OPCODE_INTERNAL_BEGIN,
 		ocTTT				= SC_OPCODE_TTT,

Modified: incubator/ooo/trunk/main/formula/source/core/resource/core_resource.src
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/formula/source/core/resource/core_resource.src?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/formula/source/core/resource/core_resource.src (original)
+++ incubator/ooo/trunk/main/formula/source/core/resource/core_resource.src Thu Sep  6 00:35:26 2012
@@ -52,6 +52,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGL
 	String SC_OPCODE_GREATER_EQUAL { Text = ">=" ; };
 	String SC_OPCODE_AND { Text = "AND" ; };
 	String SC_OPCODE_OR { Text = "OR" ; };
+	String SC_OPCODE_XOR { Text = "XOR" ; };
 	String SC_OPCODE_INTERSECT { Text = "!" ; };
 	String SC_OPCODE_UNION { Text = "~" ; };
 	String SC_OPCODE_RANGE { Text = ":" ; };
@@ -381,6 +382,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGL
 	String SC_OPCODE_GREATER_EQUAL { Text = ">=" ; };
 	String SC_OPCODE_AND { Text = "AND" ; };
 	String SC_OPCODE_OR { Text = "OR" ; };
+	String SC_OPCODE_XOR { Text = "XOR" ; };
 	String SC_OPCODE_INTERSECT { Text = "!" ; };
 	String SC_OPCODE_UNION { Text = "~" ; };
 	String SC_OPCODE_RANGE { Text = ":" ; };
@@ -719,6 +721,10 @@ Resource RID_STRLIST_FUNCTION_NAMES
 	{
 		Text [ en-US ] = "OR" ;
 	};
+	String SC_OPCODE_XOR
+	{
+		Text [ en-US ] = "XOR" ;
+	};
 	String SC_OPCODE_INTERSECT { Text = "!" ; };
 	String SC_OPCODE_UNION { Text = "~" ; };
 	String SC_OPCODE_RANGE { Text = ":" ; };

Modified: incubator/ooo/trunk/main/sc/inc/helpids.h
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/inc/helpids.h?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/inc/helpids.h (original)
+++ incubator/ooo/trunk/main/sc/inc/helpids.h Thu Sep  6 00:35:26 2012
@@ -486,6 +486,7 @@
 #define HID_FUNC_WENN                                           "SC_HID_FUNC_WENN"
 #define HID_FUNC_ODER                                           "SC_HID_FUNC_ODER"
 #define HID_FUNC_UND                                            "SC_HID_FUNC_UND"
+#define HID_FUNC_XOR                                            "SC_HID_FUNC_XOR"
 
 #define HID_FUNC_ABS                                            "SC_HID_FUNC_ABS"
 #define HID_FUNC_POTENZ                                         "SC_HID_FUNC_POTENZ"

Modified: incubator/ooo/trunk/main/sc/inc/scmatrix.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/inc/scmatrix.hxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/inc/scmatrix.hxx (original)
+++ incubator/ooo/trunk/main/sc/inc/scmatrix.hxx Thu Sep  6 00:35:26 2012
@@ -426,6 +426,7 @@ public:
 
     double And();       // logical AND of all matrix values, or NAN
     double Or();        // logical OR of all matrix values, or NAN
+    double Xor();       // logical XOR of all matrix values, or NAN
 
     // All other matrix functions  MatMult, MInv, ...  are in ScInterpreter
     // to be numerically safe.

Modified: incubator/ooo/trunk/main/sc/source/core/inc/interpre.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/core/inc/interpre.hxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/core/inc/interpre.hxx (original)
+++ incubator/ooo/trunk/main/sc/source/core/inc/interpre.hxx Thu Sep  6 00:35:26 2012
@@ -386,6 +386,7 @@ void ScLessEqual();
 void ScGreaterEqual();
 void ScAnd();
 void ScOr();
+void ScXor();
 void ScNot();
 void ScNeg();
 void ScPercentSign();

Modified: incubator/ooo/trunk/main/sc/source/core/tool/interpr1.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/core/tool/interpr1.cxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/core/tool/interpr1.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/core/tool/interpr1.cxx Thu Sep  6 00:35:26 2012
@@ -1332,6 +1332,106 @@ void ScInterpreter::ScOr()
     }
 }
 
+void ScInterpreter::ScXor()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "makkica", "ScInterpreter::ScXor" );
+    nFuncFmtType = NUMBERFORMAT_LOGICAL;
+    short nParamCount = GetByte();
+    if ( MustHaveParamCountMin( nParamCount, 1 ) )
+    {
+        bool bHaveValue = false;
+        short nRes = 0;
+        size_t nRefInList = 0;
+        while( nParamCount-- > 0)
+        {
+            if ( !nGlobalError )
+            {
+                switch ( GetStackType() )
+                {
+                    case svDouble :
+                        bHaveValue = true;
+                        nRes ^= ( PopDouble() != 0.0 );
+                        break;
+                    case svString :
+                        Pop();
+                        SetError( errNoValue );
+                        break;
+                    case svSingleRef :
+                        {
+                            ScAddress aAdr;
+                            PopSingleRef( aAdr );
+                            if ( !nGlobalError )
+                            {
+                                ScBaseCell* pCell = GetCell( aAdr );
+                                if ( HasCellValueData( pCell ) )
+                                {
+                                    bHaveValue = true;
+                                    nRes ^= ( GetCellValue( aAdr, pCell ) != 0.0 );
+                                }
+                                /* TODO: set error? Excel doesn't have XOR, but
+                                 * doesn't set an error in this case for AND and
+                                 * OR. */
+                            }
+                        }
+                        break;
+                    case svDoubleRef:
+                    case svRefList:
+                        {
+                            ScRange aRange;
+                            PopDoubleRef( aRange, nParamCount, nRefInList);
+                            if ( !nGlobalError )
+                            {
+                                double fVal;
+                                sal_uInt16 nErr = 0;
+                                ScValueIterator aValIter( pDok, aRange );
+                                if ( aValIter.GetFirst( fVal, nErr ) )
+                                {
+                                    bHaveValue = true;
+                                    do
+                                    {
+                                        nRes ^= ( fVal != 0.0 );
+                                    } while ( (nErr == 0) &&
+                                            aValIter.GetNext( fVal, nErr ) );
+                                }
+                                SetError( nErr );
+                            }
+                        }
+                        break;
+                    case svMatrix:
+                        {
+                            bHaveValue = true;
+                            ScMatrixRef pMat = GetMatrix();
+                            if ( pMat )
+                            {
+                                bHaveValue = true;
+                                double fVal = pMat->Xor();
+                                sal_uInt16 nErr = GetDoubleErrorValue( fVal );
+                                if ( nErr )
+                                {
+                                    SetError( nErr );
+                                    nRes = 0;
+                                }
+                                else
+                                    nRes ^= (fVal != 0.0);
+                            }
+                            // else: GetMatrix did set errIllegalParameter
+                        }
+                        break;
+                    default:
+                        Pop();
+                        SetError( errIllegalParameter);
+                }
+            }
+            else
+                Pop();
+        }
+        if ( bHaveValue )
+            PushInt( nRes );
+        else
+            PushNoValue();
+    }
+}
+
 
 void ScInterpreter::ScNeg()
 {

Modified: incubator/ooo/trunk/main/sc/source/core/tool/interpr4.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/core/tool/interpr4.cxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/core/tool/interpr4.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/core/tool/interpr4.cxx Thu Sep  6 00:35:26 2012
@@ -3446,6 +3446,7 @@ StackVar ScInterpreter::Interpret()
                 case ocGreaterEqual     : ScGreaterEqual();             break;
                 case ocAnd              : ScAnd();                      break;
                 case ocOr               : ScOr();                       break;
+                case ocXor              : ScXor();                      break;
                 case ocIntersect        : ScIntersect();                break;
                 case ocRange            : ScRangeFunc();                break;
                 case ocUnion            : ScUnionFunc();                break;

Modified: incubator/ooo/trunk/main/sc/source/core/tool/parclass.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/core/tool/parclass.cxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/core/tool/parclass.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/core/tool/parclass.cxx Thu Sep  6 00:35:26 2012
@@ -79,6 +79,7 @@ const ScParameterClassification::RawData
     { ocAveDev,          {{ Reference                                            }, true }},
     { ocAverage,         {{ Reference                                            }, true }},
     { ocAverageA,        {{ Reference                                            }, true }},
+    { ocAverageIf,       {{ Reference, Value, Reference                          }, false }},
     { ocCell,            {{ Value, Reference                                     }, false }},
     { ocColumn,          {{ Reference                                            }, false }},
     { ocColumns,         {{ Reference                                            }, true }},
@@ -173,7 +174,6 @@ const ScParameterClassification::RawData
     { ocSubTotal,        {{ Value, Reference                                     }, true }},
     { ocSum,             {{ Reference                                            }, true }},
     { ocSumIf,           {{ Reference, Value, Reference                          }, false }},
-    { ocAverageIf,       {{ Reference, Value, Reference                          }, false }},
     { ocSumProduct,      {{ ForceArray                                           }, true }},
     { ocSumSQ,           {{ Reference                                            }, true }},
     { ocSumX2MY2,        {{ ForceArray, ForceArray                               }, false }},
@@ -189,6 +189,7 @@ const ScParameterClassification::RawData
     { ocVarP,            {{ Reference                                            }, true }},
     { ocVarPA,           {{ Reference                                            }, true }},
     { ocVLookup,         {{ Value, Reference, Value, Value                       }, false }},
+    { ocXor,             {{ Reference                                            }, true }},
     { ocZTest,           {{ Reference, Value, Value                              }, false }},
     // Excel doubts:
     // ocT: Excel says (and handles) Reference, error? This means no position

Modified: incubator/ooo/trunk/main/sc/source/core/tool/scmatrix.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/core/tool/scmatrix.cxx?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/core/tool/scmatrix.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/core/tool/scmatrix.cxx Thu Sep  6 00:35:26 2012
@@ -852,3 +852,32 @@ double ScMatrix::Or()
 	}
 	return bOr;
 }
+
+// @Author Marina Plakalovic
+// Computes the logical XOR of elements
+double ScMatrix::Xor()
+{
+    SCSIZE n = nColCount * nRowCount;
+    bool bXor = false;
+    if ( mnValType )
+    {
+        for ( SCSIZE j=0; j<n; j++ )
+            if ( !IsValueType( mnValType[j]) )
+            {   // assuming a CompareMat this is an error
+                return CreateDoubleError( errIllegalArgument );
+            }
+            else if ( ::rtl::math::isFinite( pMat[j].fVal))
+                bXor ^= (pMat[j].fVal != 0.0);
+            else
+                return pMat[j].fVal;    // DoubleError
+    }
+    else
+    {
+        for ( SCSIZE j=0; j<n; j++ )
+            if ( ::rtl::math::isFinite( pMat[j].fVal))
+                bXor ^= (pMat[j].fVal != 0.0);
+            else
+                return pMat[j].fVal;    // DoubleError
+    }
+    return bXor;
+}

Modified: incubator/ooo/trunk/main/sc/source/ui/src/scfuncs.src
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/ui/src/scfuncs.src?rev=1381446&r1=1381445&r2=1381446&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/ui/src/scfuncs.src (original)
+++ incubator/ooo/trunk/main/sc/source/ui/src/scfuncs.src Thu Sep  6 00:35:26 2012
@@ -2656,6 +2656,31 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
 			Text [ en-US ] = "Logical value 1, logical value 2;...are 1 to 30 conditions to be tested and each returns either TRUE or FALSE." ;
 		};
 	};
+
+	// -=*# Resource for function XOR #*=-
+	Resource SC_OPCODE_XOR
+	{
+		String 1 // Description
+		{
+			Text [ en-US ] = "Returns TRUE if exactly one of the arguments is TRUE." ;
+		};
+		ExtraData =
+		{
+            0;
+			ID_FUNCTION_GRP_LOGIC;
+			U2S( HID_FUNC_XOR );
+			VAR_ARGS;	0;
+            0;
+		};
+		String 2 // Name of Parameter 1
+		{
+			Text [ en-US ] = "Logical value " ;
+		};
+		String 3 // Description of Parameter 1
+		{
+			Text [ en-US ] = "Logical value 1, logical value 2,... are 1 to 30 conditions to be tested and which return either TRUE or FALSE." ;
+		};
+	};
      // -=*# Resource for function ABS #*=-
 	Resource SC_OPCODE_ABS
 	{