[Libreoffice-commits] core.git: formula/source include/formula sc/inc sc/qa sc/source

Winfried Donkers winfrieddonkers at libreoffice.org
Wed Jan 14 07:17:39 PST 2015


 formula/source/core/resource/core_resource.src |    7 ++
 include/formula/compiler.hrc                   |    3 -
 include/formula/opcode.hxx                     |    1 
 sc/inc/helpids.h                               |    1 
 sc/qa/unit/ucalc.cxx                           |    1 
 sc/source/core/inc/interpre.hxx                |    2 
 sc/source/core/tool/interpr1.cxx               |   66 ++++++++++++++++++++++++-
 sc/source/core/tool/interpr4.cxx               |    4 +
 sc/source/filter/excel/xlformula.cxx           |    3 -
 sc/source/filter/oox/formulabase.cxx           |    3 -
 sc/source/ui/src/scfuncs.src                   |   24 +++++++++
 11 files changed, 109 insertions(+), 6 deletions(-)

New commits:
commit 7eec8e5c7146a231e9d67bd96eaff30018488c39
Author: Winfried Donkers <winfrieddonkers at libreoffice.org>
Date:   Mon Nov 24 13:52:48 2014 +0100

    add ODF1.2 function ERROR.TYPE to Calc
    
    Also, improve exchange between Calc and Excel2013.
    
    Change-Id: I491f9e2100a9a2c38e23cf55dd1eda4b5e96db96
    Reviewed-on: https://gerrit.libreoffice.org/13101
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/formula/source/core/resource/core_resource.src b/formula/source/core/resource/core_resource.src
index 1e76de2..8a90a9c 100644
--- a/formula/source/core/resource/core_resource.src
+++ b/formula/source/core/resource/core_resource.src
@@ -145,6 +145,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF
     String SC_OPCODE_GAMMA_LN { Text = "GAMMALN" ; };
     String SC_OPCODE_GAMMA_LN_MS { Text = "COM.MICROSOFT.GAMMALN.PRECISE" ; };
     String SC_OPCODE_ERROR_TYPE { Text = "ORG.OPENOFFICE.ERRORTYPE" ; };
+    String SC_OPCODE_ERROR_TYPE_ODF { Text = "ERROR.TYPE" ; };
     String SC_OPCODE_FORMULA { Text = "FORMULA"; };
     String SC_OPCODE_ARC_TAN_2 { Text = "ATAN2" ; };
     String SC_OPCODE_CEIL { Text = "CEILING" ; };
@@ -552,6 +553,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_OOXML
     String SC_OPCODE_GAMMA_LN { Text = "GAMMALN" ; };
     String SC_OPCODE_GAMMA_LN_MS { Text = "_xlfn.GAMMALN.PRECISE" ; };
     String SC_OPCODE_ERROR_TYPE { Text = "ERRORTYPE" ; };
+    String SC_OPCODE_ERROR_TYPE_ODF { Text = "ERROR.TYPE" ; };
     String SC_OPCODE_FORMULA { Text = "_xlfn.FORMULATEXT"; };
     String SC_OPCODE_ARC_TAN_2 { Text = "ATAN2" ; };
     String SC_OPCODE_CEIL { Text = "CEILING" ; };
@@ -961,6 +963,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH
     String SC_OPCODE_GAMMA_LN { Text = "GAMMALN" ; };
     String SC_OPCODE_GAMMA_LN_MS { Text = "GAMMALN.PRECISE" ; };
     String SC_OPCODE_ERROR_TYPE { Text = "ERRORTYPE" ; };
+    String SC_OPCODE_ERROR_TYPE_ODF { Text = "ERROR.TYPE" ; };
     String SC_OPCODE_FORMULA { Text = "FORMULA"; };
     String SC_OPCODE_ARC_TAN_2 { Text = "ATAN2" ; };
     String SC_OPCODE_CEIL { Text = "CEILING" ; };
@@ -1659,6 +1662,10 @@ Resource RID_STRLIST_FUNCTION_NAMES
     {
         Text [ en-US ] = "ERRORTYPE" ;
     };
+    String SC_OPCODE_ERROR_TYPE_ODF
+    {
+        Text [ en-US ] = "ERROR.TYPE" ;
+    };
     String SC_OPCODE_FORMULA
     {
         Text [ en-US ] = "FORMULA" ;
diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc
index 5686a8b..1d6b901 100644
--- a/include/formula/compiler.hrc
+++ b/include/formula/compiler.hrc
@@ -194,7 +194,8 @@
 #define SC_OPCODE_GAMMA_LN_MS       162
 #define SC_OPCODE_ERF_MS            163
 #define SC_OPCODE_ERFC_MS           164
-#define SC_OPCODE_STOP_1_PAR        165
+#define SC_OPCODE_ERROR_TYPE_ODF    165
+#define SC_OPCODE_STOP_1_PAR        166
 
 /*** Functions with more than one parameters ***/
 #define SC_OPCODE_START_2_PAR       201
diff --git a/include/formula/opcode.hxx b/include/formula/opcode.hxx
index c9e105d..33cf54c 100644
--- a/include/formula/opcode.hxx
+++ b/include/formula/opcode.hxx
@@ -178,6 +178,7 @@ enum OpCode : sal_uInt16
         ocGammaLn_MS        = SC_OPCODE_GAMMA_LN_MS,
         ocGamma             = SC_OPCODE_GAMMA,
         ocErrorType         = SC_OPCODE_ERROR_TYPE,
+        ocErrorType_ODF     = SC_OPCODE_ERROR_TYPE_ODF,
         ocFormula           = SC_OPCODE_FORMULA,
         ocArabic            = SC_OPCODE_ARABIC,
         ocInfo              = SC_OPCODE_INFO,
diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index 1e82021..9768806 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -624,5 +624,6 @@
 #define HID_FUNC_ERF_MS                                         "SC_HID_FUNC_ERF_MS"
 #define HID_FUNC_ERFC_MS                                        "SC_HID_FUNC_ERFC_MS"
 #define HID_FUNC_AGGREGATE                                      "SC_HID_FUNC_AGGREGATE"
+#define HID_FUNC_ERROR_TYPE_ODF                                 "SC_HID_FUNC_ERROR_TYPE_ODF"
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index e5cb050..cb9dda9 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -2638,6 +2638,7 @@ void Test::testFunctionLists()
         "COLUMN",
         "COLUMNS",
         "DDE",
+        "ERROR.TYPE",
         "ERRORTYPE",
         "GETPIVOTDATA",
         "HLOOKUP",
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 9904cbc..d7710ed 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -571,7 +571,9 @@ void ScMissing();
 void ScMacro();
 bool SetSbxVariable( SbxVariable* pVar, const ScAddress& );
 bool SetSbxVariable( SbxVariable* pVar, SCCOL nCol, SCROW nRow, SCTAB nTab );
+sal_uInt16 GetErrorType();
 void ScErrorType();
+void ScErrorType_ODF();
 void ScDBArea();
 void ScColRowNameAuto();
 void ScGetPivotData();
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 9f620ec..7d5975d 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -8242,7 +8242,7 @@ void ScInterpreter::ScConcat()
     PushString( aRes );
 }
 
-void ScInterpreter::ScErrorType()
+sal_uInt16 ScInterpreter::GetErrorType()
 {
     sal_uInt16 nErr;
     sal_uInt16 nOldError = nGlobalError;
@@ -8310,6 +8310,13 @@ void ScInterpreter::ScErrorType()
             PopError();
             nErr = nGlobalError;
     }
+    nGlobalError = nOldError;
+    return nErr;
+}
+
+void ScInterpreter::ScErrorType()
+{
+    sal_uInt16 nErr = GetErrorType();
     if ( nErr )
     {
         nGlobalError = 0;
@@ -8317,11 +8324,66 @@ void ScInterpreter::ScErrorType()
     }
     else
     {
-        nGlobalError = nOldError;
         PushNA();
     }
 }
 
+void ScInterpreter::ScErrorType_ODF()
+{
+    sal_uInt16 nErr = GetErrorType();
+    sal_uInt16 nErrType;
+
+    switch ( nErr )
+    {
+        case errParameterExpected :  // #NULL!
+            nErrType = 1;
+            break;
+        case errDivisionByZero :     // #DIV/0!
+            nErrType = 2;
+            break;
+        case errNoValue :            // #VALUE!
+            nErrType = 3;
+            break;
+        case errNoRef :              // #REF!
+            nErrType = 4;
+            break;
+        case errNoName :             // #NAME?
+            nErrType = 5;
+            break;
+        case errIllegalFPOperation : // #NUM!
+            nErrType = 6;
+            break;
+        case NOTAVAILABLE :          // #N/A
+            nErrType = 7;
+            break;
+        /*
+        #GETTING_DATA is a message that can appear in Excel when a large or
+        complex worksheet is being calculated. In Excel 2007 and newer,
+        operations are grouped so more complicated cells may finish after
+        earlier ones do. While the calculations are still processing, the
+        unfinished cells may display #GETTING_DATA.
+        Because the message is temporary and disappears when the calculations
+        complete, this isn’t a true error.
+        No calc error code known (yet).
+
+        case :                       // GETTING_DATA
+            nErrType = 8;
+            break;
+        */
+        default :
+            nErrType = 0;
+            break;
+    }
+
+    if ( nErrType )
+    {
+        nGlobalError = 0;
+        PushDouble( nErrType );
+    }
+    else
+        PushNA();
+}
+
 bool ScInterpreter::MayBeRegExp( const OUString& rStr, const ScDocument* pDoc  )
 {
     if ( pDoc && !pDoc->GetDocOptions().IsFormulaRegexEnabled() )
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 8e66eaf..b276bf9 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -4222,6 +4222,7 @@ StackVar ScInterpreter::Interpret()
                 case ocTableOp          : ScTableOp();                  break;
                 case ocStop :                                           break;
                 case ocErrorType        : ScErrorType();                break;
+                case ocErrorType_ODF    : ScErrorType_ODF();            break;
                 case ocCurrent          : ScCurrent();                  break;
                 case ocStyle            : ScStyle();                    break;
                 case ocDde              : ScDde();                      break;
@@ -4328,7 +4329,8 @@ StackVar ScInterpreter::Interpret()
     case ocN : \
     case ocType : \
     case ocIfError : \
-    case ocIfNA :
+    case ocIfNA : \
+    case ocErrorType_ODF :
 
         switch ( eOp )
         {
diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx
index 31b70a4..e4d2849 100644
--- a/sc/source/filter/excel/xlformula.cxx
+++ b/sc/source/filter/excel/xlformula.cxx
@@ -566,7 +566,8 @@ static const XclFunctionInfo saFuncTable_2013[] =
     EXC_FUNCENTRY_V_VR(         ocUnichar,       1,  1,  0,  "UNICHAR" ),
     EXC_FUNCENTRY_V_VR(         ocUnicode,       1,  1,  0,  "UNICODE" ),
     EXC_FUNCENTRY_V_VR(         ocWebservice,    1,  1,  0,  "WEBSERVICE" ),
-    EXC_FUNCENTRY_V_RX(         ocXor,           1,  MX, 0,  "XOR" )
+    EXC_FUNCENTRY_V_RX(         ocXor,           1,  MX, 0,  "XOR" ),
+    EXC_FUNCENTRY_V_VR(         ocErrorType_ODF, 1,  1,  0,  "ERROR.TYPE" )
 };
 
 #define EXC_FUNCENTRY_ODF( opcode, minparam, maxparam, flags, asciiname ) \
diff --git a/sc/source/filter/oox/formulabase.cxx b/sc/source/filter/oox/formulabase.cxx
index 8319313..2936189 100644
--- a/sc/source/filter/oox/formulabase.cxx
+++ b/sc/source/filter/oox/formulabase.cxx
@@ -896,7 +896,8 @@ static const FunctionData saFuncTable2013[] =
     { "UNICHAR",                "UNICHAR",              NOID,   NOID,   1,  1,  V, { VR }, FUNCFLAG_MACROCALL_NEW },
     { "UNICODE",                "UNICODE",              NOID,   NOID,   1,  1,  V, { VR }, FUNCFLAG_MACROCALL_NEW },
     { "COM.MICROSOFT.WEBSERVICE","WEBSERVICE",          NOID,   NOID,   1,  1,  V, { VR }, FUNCFLAG_MACROCALL_NEW },
-    { "XOR",                    "XOR",                  NOID,   NOID,   1,  MX, V, { RX }, FUNCFLAG_MACROCALL_NEW }
+    { "XOR",                    "XOR",                  NOID,   NOID,   1,  MX, V, { RX }, FUNCFLAG_MACROCALL_NEW },
+    { "ERROR.TYPE",             "ERROR.TYPE",           NOID,   NOID,   1,  1,  V, { VR }, FUNCFLAG_MACROCALL_NEW }
 };
 
 /** Functions defined by OpenFormula, but not supported by Calc or by Excel. */
diff --git a/sc/source/ui/src/scfuncs.src b/sc/source/ui/src/scfuncs.src
index 6757a62..d6950dc 100644
--- a/sc/source/ui/src/scfuncs.src
+++ b/sc/source/ui/src/scfuncs.src
@@ -10410,6 +10410,30 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS2
             Text [ en-US ] = "The reference (cell) in which the error occurred." ;
         };
     };
+     // -=*# Resource for function ERROR.TYPE #*=-
+    Resource SC_OPCODE_ERROR_TYPE_ODF
+    {
+        String 1 // Description
+        {
+            Text [ en-US ] = "Returns a number corresponding to one of the error values or #N/A if no error exists" ;
+        };
+        ExtraData =
+        {
+            0;
+            ID_FUNCTION_GRP_TABLE;
+            U2S( HID_FUNC_ERROR_TYPE_ODF );
+            1;  0;
+            0;
+        };
+        String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "expression" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "The error value whose identifying number you want to find. Can be the actual error value or a reference to a cell that you want to test." ;
+        };
+    };
      // -=*# Resource for function VORLAGE #*=-
     Resource SC_OPCODE_STYLE
     {


More information about the Libreoffice-commits mailing list