LCOV - code coverage report
Current view: top level - sc/source/filter/excel - xlformula.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 217 0.0 %
Date: 2014-04-14 Functions: 0 37 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "xlformula.hxx"
      21             : 
      22             : #include "compiler.hxx"
      23             : #include "rangenam.hxx"
      24             : #include "token.hxx"
      25             : #include "tokenarray.hxx"
      26             : #include "xestream.hxx"
      27             : #include "xistream.hxx"
      28             : #include "xlroot.hxx"
      29             : 
      30             : #include <comphelper/string.hxx>
      31             : 
      32             : using namespace ::formula;
      33             : 
      34             : // Function data ==============================================================
      35             : 
      36           0 : OUString XclFunctionInfo::GetMacroFuncName() const
      37             : {
      38           0 :     if( IsMacroFunc() )
      39           0 :         return OUString( mpcMacroName, strlen(mpcMacroName), RTL_TEXTENCODING_UTF8 );
      40           0 :     return OUString();
      41             : }
      42             : 
      43           0 : OUString XclFunctionInfo::GetAddInEquivalentFuncName() const
      44             : {
      45           0 :     if( IsAddInEquivalent() )
      46           0 :         return OUString( mpcMacroName, strlen(mpcMacroName), RTL_TEXTENCODING_UTF8 );
      47           0 :     return OUString();
      48             : }
      49             : 
      50             : // abbreviations for function return token class
      51             : const sal_uInt8 R = EXC_TOKCLASS_REF;
      52             : const sal_uInt8 V = EXC_TOKCLASS_VAL;
      53             : const sal_uInt8 A = EXC_TOKCLASS_ARR;
      54             : 
      55             : // abbreviations for parameter infos
      56             : #define RO   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_ORG, false }
      57             : #define RA   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_ARR, false }
      58             : #define RR   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_RPT, false }
      59             : #define RX   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_RPX, false }
      60             : #define VO   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_ORG, true  }
      61             : #define VV   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_VAL, true  }
      62             : #define VA   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_ARR, true  }
      63             : #define VR   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_RPT, true  }
      64             : #define VX   { EXC_PARAM_REGULAR,   EXC_PARAMCONV_RPX, true  }
      65             : #define RO_E { EXC_PARAM_EXCELONLY, EXC_PARAMCONV_ORG, false }
      66             : #define VR_E { EXC_PARAM_EXCELONLY, EXC_PARAMCONV_RPT, true  }
      67             : #define C    { EXC_PARAM_CALCONLY,  EXC_PARAMCONV_ORG, false }
      68             : 
      69             : const sal_uInt16 NOID = SAL_MAX_UINT16;     /// No BIFF/OOBIN function identifier available.
      70             : const sal_uInt8 MX    = 30;                 /// Maximum parameter count.
      71             : 
      72             : #define EXC_FUNCNAME( ascii )       "_xlfn." ascii
      73             : #define EXC_FUNCNAME_ODF( ascii )   "_xlfnodf." ascii
      74             : #define EXC_FUNCNAME_ADDIN( ascii )   "com.sun.star.sheet.addin." ascii
      75             : 
      76             : /** Functions new in BIFF2. */
      77             : static const XclFunctionInfo saFuncTable_2[] =
      78             : {
      79             :     { ocCount,              0,      0,  MX, V, { RX }, 0, 0 },
      80             :     { ocIf,                 1,      2,  3,  R, { VO, RO }, 0, 0 },
      81             :     { ocIsNA,               2,      1,  1,  V, { VR }, 0, 0 },
      82             :     { ocIsError,            3,      1,  1,  V, { VR }, 0, 0 },
      83             :     { ocSum,                4,      0,  MX, V, { RX }, 0, 0 },
      84             :     { ocAverage,            5,      1,  MX, V, { RX }, 0, 0 },
      85             :     { ocMin,                6,      1,  MX, V, { RX }, 0, 0 },
      86             :     { ocMax,                7,      1,  MX, V, { RX }, 0, 0 },
      87             :     { ocRow,                8,      0,  1,  V, { RO }, 0, 0 },
      88             :     { ocColumn,             9,      0,  1,  V, { RO }, 0, 0 },
      89             :     { ocNotAvail,           10,     0,  0,  V, {}, 0, 0 },
      90             :     { ocNPV,                11,     2,  MX, V, { VR, RX }, 0, 0 },
      91             :     { ocStDev,              12,     1,  MX, V, { RX }, 0, 0 },
      92             :     { ocCurrency,           13,     1,  2,  V, { VR }, 0, 0 },
      93             :     { ocFixed,              14,     1,  2,  V, { VR, VR, C }, 0, 0 },
      94             :     { ocSin,                15,     1,  1,  V, { VR }, 0, 0 },
      95             :     { ocCosecant,           15,     1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
      96             :     { ocCos,                16,     1,  1,  V, { VR }, 0, 0 },
      97             :     { ocSecant,             16,     1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
      98             :     { ocTan,                17,     1,  1,  V, { VR }, 0, 0 },
      99             :     { ocCot,                17,     1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     100             :     { ocArcTan,             18,     1,  1,  V, { VR }, 0, 0 },
     101             :     { ocArcCot,             18,     1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     102             :     { ocPi,                 19,     0,  0,  V, {}, 0, 0 },
     103             :     { ocSqrt,               20,     1,  1,  V, { VR }, 0, 0 },
     104             :     { ocExp,                21,     1,  1,  V, { VR }, 0, 0 },
     105             :     { ocLn,                 22,     1,  1,  V, { VR }, 0, 0 },
     106             :     { ocLog10,              23,     1,  1,  V, { VR }, 0, 0 },
     107             :     { ocAbs,                24,     1,  1,  V, { VR }, 0, 0 },
     108             :     { ocInt,                25,     1,  1,  V, { VR }, 0, 0 },
     109             :     { ocPlusMinus,          26,     1,  1,  V, { VR }, 0, 0 },
     110             :     { ocRound,              27,     2,  2,  V, { VR }, 0, 0 },
     111             :     { ocLookup,             28,     2,  3,  V, { VR, RA }, 0, 0 },
     112             :     { ocIndex,              29,     2,  4,  R, { RA, VV }, 0, 0 },
     113             :     { ocRept,               30,     2,  2,  V, { VR }, 0, 0 },
     114             :     { ocMid,                31,     3,  3,  V, { VR }, 0, 0 },
     115             :     { ocLen,                32,     1,  1,  V, { VR }, 0, 0 },
     116             :     { ocValue,              33,     1,  1,  V, { VR }, 0, 0 },
     117             :     { ocTrue,               34,     0,  0,  V, {}, 0, 0 },
     118             :     { ocFalse,              35,     0,  0,  V, {}, 0, 0 },
     119             :     { ocAnd,                36,     1,  MX, V, { RX }, 0, 0 },
     120             :     { ocOr,                 37,     1,  MX, V, { RX }, 0, 0 },
     121             :     { ocNot,                38,     1,  1,  V, { VR }, 0, 0 },
     122             :     { ocMod,                39,     2,  2,  V, { VR }, 0, 0 },
     123             :     { ocDBCount,            40,     3,  3,  V, { RO, RR }, 0, 0 },
     124             :     { ocDBSum,              41,     3,  3,  V, { RO, RR }, 0, 0 },
     125             :     { ocDBAverage,          42,     3,  3,  V, { RO, RR }, 0, 0 },
     126             :     { ocDBMin,              43,     3,  3,  V, { RO, RR }, 0, 0 },
     127             :     { ocDBMax,              44,     3,  3,  V, { RO, RR }, 0, 0 },
     128             :     { ocDBStdDev,           45,     3,  3,  V, { RO, RR }, 0, 0 },
     129             :     { ocVar,                46,     1,  MX, V, { RX }, 0, 0 },
     130             :     { ocDBVar,              47,     3,  3,  V, { RO, RR }, 0, 0 },
     131             :     { ocText,               48,     2,  2,  V, { VR }, 0, 0 },
     132             :     { ocRGP,                49,     1,  2,  A, { RA, RA, C, C }, 0, 0 },
     133             :     { ocTrend,              50,     1,  3,  A, { RA, RA, RA, C }, 0, 0 },
     134             :     { ocRKP,                51,     1,  2,  A, { RA, RA, C, C }, 0, 0 },
     135             :     { ocGrowth,             52,     1,  3,  A, { RA, RA, RA, C }, 0, 0 },
     136             :     { ocBW,                 56,     3,  5,  V, { VR }, 0, 0 },
     137             :     { ocZW,                 57,     3,  5,  V, { VR }, 0, 0 },
     138             :     { ocZZR,                58,     3,  5,  V, { VR }, 0, 0 },
     139             :     { ocRMZ,                59,     3,  5,  V, { VR }, 0, 0 },
     140             :     { ocZins,               60,     3,  6,  V, { VR }, 0, 0 },
     141             :     { ocMIRR,               61,     3,  3,  V, { RA, VR }, 0, 0 },
     142             :     { ocIRR,                62,     1,  2,  V, { RA, VR }, 0, 0 },
     143             :     { ocRandom,             63,     0,  0,  V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
     144             :     { ocMatch,              64,     2,  3,  V, { VR, RX, RR }, 0, 0 },
     145             :     { ocGetDate,            65,     3,  3,  V, { VR }, 0, 0 },
     146             :     { ocGetTime,            66,     3,  3,  V, { VR }, 0, 0 },
     147             :     { ocGetDay,             67,     1,  1,  V, { VR }, 0, 0 },
     148             :     { ocGetMonth,           68,     1,  1,  V, { VR }, 0, 0 },
     149             :     { ocGetYear,            69,     1,  1,  V, { VR }, 0, 0 },
     150             :     { ocGetDayOfWeek,       70,     1,  1,  V, { VR, C }, 0, 0 },
     151             :     { ocGetHour,            71,     1,  1,  V, { VR }, 0, 0 },
     152             :     { ocGetMin,             72,     1,  1,  V, { VR }, 0, 0 },
     153             :     { ocGetSec,             73,     1,  1,  V, { VR }, 0, 0 },
     154             :     { ocGetActTime,         74,     0,  0,  V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
     155             :     { ocAreas,              75,     1,  1,  V, { RO }, 0, 0 },
     156             :     { ocRows,               76,     1,  1,  V, { RO }, 0, 0 },
     157             :     { ocColumns,            77,     1,  1,  V, { RO }, 0, 0 },
     158             :     { ocOffset,             78,     3,  5,  R, { RO, VR }, EXC_FUNCFLAG_VOLATILE, 0 },
     159             :     { ocSearch,             82,     2,  3,  V, { VR }, 0, 0 },
     160             :     { ocMatTrans,           83,     1,  1,  A, { VO }, 0, 0 },
     161             :     { ocType,               86,     1,  1,  V, { VX }, 0, 0 },
     162             :     { ocArcTan2,            97,     2,  2,  V, { VR }, 0, 0 },
     163             :     { ocArcSin,             98,     1,  1,  V, { VR }, 0, 0 },
     164             :     { ocArcCos,             99,     1,  1,  V, { VR }, 0, 0 },
     165             :     { ocChose,              100,    2,  MX, R, { VO, RO }, 0, 0 },
     166             :     { ocHLookup,            101,    3,  3,  V, { VV, RO, RO, C }, 0, 0 },
     167             :     { ocVLookup,            102,    3,  3,  V, { VV, RO, RO, C }, 0, 0 },
     168             :     { ocIsRef,              105,    1,  1,  V, { RX }, 0, 0 },
     169             :     { ocLog,                109,    1,  2,  V, { VR }, 0, 0 },
     170             :     { ocChar,               111,    1,  1,  V, { VR }, 0, 0 },
     171             :     { ocLower,              112,    1,  1,  V, { VR }, 0, 0 },
     172             :     { ocUpper,              113,    1,  1,  V, { VR }, 0, 0 },
     173             :     { ocPropper,            114,    1,  1,  V, { VR }, 0, 0 },
     174             :     { ocLeft,               115,    1,  2,  V, { VR }, 0, 0 },
     175             :     { ocRight,              116,    1,  2,  V, { VR }, 0, 0 },
     176             :     { ocExact,              117,    2,  2,  V, { VR }, 0, 0 },
     177             :     { ocTrim,               118,    1,  1,  V, { VR }, 0, 0 },
     178             :     { ocReplace,            119,    4,  4,  V, { VR }, 0, 0 },
     179             :     { ocSubstitute,         120,    3,  4,  V, { VR }, 0, 0 },
     180             :     { ocCode,               121,    1,  1,  V, { VR }, 0, 0 },
     181             :     { ocFind,               124,    2,  3,  V, { VR }, 0, 0 },
     182             :     { ocCell,               125,    1,  2,  V, { VV, RO }, EXC_FUNCFLAG_VOLATILE, 0 },
     183             :     { ocIsErr,              126,    1,  1,  V, { VR }, 0, 0 },
     184             :     { ocIsString,           127,    1,  1,  V, { VR }, 0, 0 },
     185             :     { ocIsValue,            128,    1,  1,  V, { VR }, 0, 0 },
     186             :     { ocIsEmpty,            129,    1,  1,  V, { VR }, 0, 0 },
     187             :     { ocT,                  130,    1,  1,  V, { RO }, 0, 0 },
     188             :     { ocN,                  131,    1,  1,  V, { RO }, 0, 0 },
     189             :     { ocGetDateValue,       140,    1,  1,  V, { VR }, 0, 0 },
     190             :     { ocGetTimeValue,       141,    1,  1,  V, { VR }, 0, 0 },
     191             :     { ocLIA,                142,    3,  3,  V, { VR }, 0, 0 },
     192             :     { ocDIA,                143,    4,  4,  V, { VR }, 0, 0 },
     193             :     { ocGDA,                144,    4,  5,  V, { VR }, 0, 0 },
     194             :     { ocIndirect,           148,    1,  2,  R, { VR }, EXC_FUNCFLAG_VOLATILE, 0 },
     195             :     { ocClean,              162,    1,  1,  V, { VR }, 0, 0 },
     196             :     { ocMatDet,             163,    1,  1,  V, { VA }, 0, 0 },
     197             :     { ocMatInv,             164,    1,  1,  A, { VA }, 0, 0 },
     198             :     { ocMatMult,            165,    2,  2,  A, { VA }, 0, 0 },
     199             :     { ocZinsZ,              167,    4,  6,  V, { VR }, 0, 0 },
     200             :     { ocKapz,               168,    4,  6,  V, { VR }, 0, 0 },
     201             :     { ocCount2,             169,    0,  MX, V, { RX }, 0, 0 },
     202             :     { ocProduct,            183,    0,  MX, V, { RX }, 0, 0 },
     203             :     { ocFact,               184,    1,  1,  V, { VR }, 0, 0 },
     204             :     { ocDBProduct,          189,    3,  3,  V, { RO, RR }, 0, 0 },
     205             :     { ocIsNonString,        190,    1,  1,  V, { VR }, 0, 0 },
     206             :     { ocStDevP,             193,    1,  MX, V, { RX }, 0, 0 },
     207             :     { ocVarP,               194,    1,  MX, V, { RX }, 0, 0 },
     208             :     { ocDBStdDevP,          195,    3,  3,  V, { RO, RR }, 0, 0 },
     209             :     { ocDBVarP,             196,    3,  3,  V, { RO, RR }, 0, 0 },
     210             :     { ocTrunc,              197,    1,  1,  V, { VR, C }, 0, 0 },
     211             :     { ocIsLogical,          198,    1,  1,  V, { VR }, 0, 0 },
     212             :     { ocDBCount2,           199,    3,  3,  V, { RO, RR }, 0, 0 },
     213             :     { ocCurrency,           204,    1,  2,  V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 },
     214             :     { ocLeftB,              208,    1,  2,  V, { VR }, 0, 0 },
     215             :     { ocRightB,             209,    1,  2,  V, { VR }, 0, 0 },
     216             :     { ocMidB,               210,    3,  3,  V, { VR }, 0, 0 },
     217             :     { ocLenB,               211,    1,  1,  V, { VR }, 0, 0 },
     218             :     { ocRoundUp,            212,    2,  2,  V, { VR }, 0, 0 },
     219             :     { ocRoundDown,          213,    2,  2,  V, { VR }, 0, 0 },
     220             :     { ocExternal,           255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_IMPORTONLY, 0 }
     221             : };
     222             : 
     223             : /** Functions new in BIFF3. */
     224             : static const XclFunctionInfo saFuncTable_3[] =
     225             : {
     226             :     { ocRGP,                49,     1,  4,  A, { RA, RA, VV }, 0, 0 },          // BIFF2: 1-2, BIFF3: 1-4
     227             :     { ocTrend,              50,     1,  4,  A, { RA, RA, RA, VV }, 0, 0 },      // BIFF2: 1-3, BIFF3: 1-4
     228             :     { ocRKP,                51,     1,  4,  A, { RA, RA, VV }, 0, 0 },          // BIFF2: 1-2, BIFF3: 1-4
     229             :     { ocGrowth,             52,     1,  4,  A, { RA, RA, RA, VV }, 0, 0 },      // BIFF2: 1-3, BIFF3: 1-4
     230             :     { ocTrunc,              197,    1,  2,  V, { VR }, 0, 0 },                  // BIFF2: 1,   BIFF3: 1-2
     231             :     { ocAddress,            219,    2,  5,  V, { VR }, 0, 0 },
     232             :     { ocGetDiffDate360,     220,    2,  2,  V, { VR, VR, C }, 0, 0 },
     233             :     { ocGetActDate,         221,    0,  0,  V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
     234             :     { ocVBD,                222,    5,  7,  V, { VR }, 0, 0 },
     235             :     { ocMedian,             227,    1,  MX, V, { RX }, 0, 0 },
     236             :     { ocSumProduct,         228,    1,  MX, V, { VA }, 0, 0 },
     237             :     { ocSinHyp,             229,    1,  1,  V, { VR }, 0, 0 },
     238             :     { ocCosecantHyp,        229,    1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     239             :     { ocCosHyp,             230,    1,  1,  V, { VR }, 0, 0 },
     240             :     { ocSecantHyp,          230,    1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     241             :     { ocTanHyp,             231,    1,  1,  V, { VR }, 0, 0 },
     242             :     { ocCotHyp,             231,    1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     243             :     { ocArcSinHyp,          232,    1,  1,  V, { VR }, 0, 0 },
     244             :     { ocArcCosHyp,          233,    1,  1,  V, { VR }, 0, 0 },
     245             :     { ocArcTanHyp,          234,    1,  1,  V, { VR }, 0, 0 },
     246             :     { ocArcCotHyp,          234,    1,  1,  V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     247             :     { ocDBGet,              235,    3,  3,  V, { RO, RR }, 0, 0 },
     248             :     { ocInfo,               244,    1,  1,  V, { VR }, EXC_FUNCFLAG_VOLATILE, 0 }
     249             : };
     250             : 
     251             : /** Functions new in BIFF4. */
     252             : static const XclFunctionInfo saFuncTable_4[] =
     253             : {
     254             :     { ocFixed,              14,     1,  3,  V, { VR }, 0, 0 },                  // BIFF2-3: 1-2, BIFF4: 1-3
     255             :     { ocAsc,                214,    1,  1,  V, { VR }, 0, 0 },
     256             :     { ocJis,                215,    1,  1,  V, { VR }, 0, 0 },
     257             :     { ocRank,               216,    2,  3,  V, { VR, RO, VR }, 0, 0 },
     258             :     { ocGDA2,               247,    4,  5,  V, { VR }, 0, 0 },
     259             :     { ocFrequency,          252,    2,  2,  A, { RA }, 0, 0 },
     260             :     { ocErrorType,          261,    1,  1,  V, { VR }, 0, 0 },
     261             :     { ocAveDev,             269,    1,  MX, V, { RX }, 0, 0 },
     262             :     { ocBetaDist,           270,    3,  5,  V, { VR }, 0, 0 },
     263             :     { ocGammaLn,            271,    1,  1,  V, { VR }, 0, 0 },
     264             :     { ocBetaInv,            272,    3,  5,  V, { VR }, 0, 0 },
     265             :     { ocBinomDist,          273,    4,  4,  V, { VR }, 0, 0 },
     266             :     { ocChiDist,            274,    2,  2,  V, { VR }, 0, 0 },
     267             :     { ocChiInv,             275,    2,  2,  V, { VR }, 0, 0 },
     268             :     { ocKombin,             276,    2,  2,  V, { VR }, 0, 0 },
     269             :     { ocConfidence,         277,    3,  3,  V, { VR }, 0, 0 },
     270             :     { ocKritBinom,          278,    3,  3,  V, { VR }, 0, 0 },
     271             :     { ocEven,               279,    1,  1,  V, { VR }, 0, 0 },
     272             :     { ocExpDist,            280,    3,  3,  V, { VR }, 0, 0 },
     273             :     { ocFDist,              281,    3,  3,  V, { VR }, 0, 0 },
     274             :     { ocFInv,               282,    3,  3,  V, { VR }, 0, 0 },
     275             :     { ocFisher,             283,    1,  1,  V, { VR }, 0, 0 },
     276             :     { ocFisherInv,          284,    1,  1,  V, { VR }, 0, 0 },
     277             :     { ocFloor,              285,    2,  2,  V, { VR, VR, C }, 0, 0 },
     278             :     { ocGammaDist,          286,    4,  4,  V, { VR }, 0, 0 },
     279             :     { ocGammaInv,           287,    3,  3,  V, { VR }, 0, 0 },
     280             :     { ocCeil,               288,    2,  2,  V, { VR, VR, C }, 0, 0 },
     281             :     { ocHypGeomDist,        289,    4,  4,  V, { VR }, 0, 0 },
     282             :     { ocLogNormDist,        290,    3,  3,  V, { VR }, 0, 0 },
     283             :     { ocLogInv,             291,    3,  3,  V, { VR }, 0, 0 },
     284             :     { ocNegBinomVert,       292,    3,  3,  V, { VR }, 0, 0 },
     285             :     { ocNormDist,           293,    4,  4,  V, { VR }, 0, 0 },
     286             :     { ocStdNormDist,        294,    1,  1,  V, { VR }, 0, 0 },
     287             :     { ocNormInv,            295,    3,  3,  V, { VR }, 0, 0 },
     288             :     { ocSNormInv,           296,    1,  1,  V, { VR }, 0, 0 },
     289             :     { ocStandard,           297,    3,  3,  V, { VR }, 0, 0 },
     290             :     { ocOdd,                298,    1,  1,  V, { VR }, 0, 0 },
     291             :     { ocVariationen,        299,    2,  2,  V, { VR }, 0, 0 },
     292             :     { ocPoissonDist,        300,    3,  3,  V, { VR }, 0, 0 },
     293             :     { ocTDist,              301,    3,  3,  V, { VR }, 0, 0 },
     294             :     { ocWeibull,            302,    4,  4,  V, { VR }, 0, 0 },
     295             :     { ocSumXMY2,            303,    2,  2,  V, { VA }, 0, 0 },
     296             :     { ocSumX2MY2,           304,    2,  2,  V, { VA }, 0, 0 },
     297             :     { ocSumX2DY2,           305,    2,  2,  V, { VA }, 0, 0 },
     298             :     { ocChiTest,            306,    2,  2,  V, { VA }, 0, 0 },
     299             :     { ocCorrel,             307,    2,  2,  V, { VA }, 0, 0 },
     300             :     { ocCovar,              308,    2,  2,  V, { VA }, 0, 0 },
     301             :     { ocForecast,           309,    3,  3,  V, { VR, VA }, 0, 0 },
     302             :     { ocFTest,              310,    2,  2,  V, { VA }, 0, 0 },
     303             :     { ocIntercept,          311,    2,  2,  V, { VA }, 0, 0 },
     304             :     { ocPearson,            312,    2,  2,  V, { VA }, 0, 0 },
     305             :     { ocRSQ,                313,    2,  2,  V, { VA }, 0, 0 },
     306             :     { ocSTEYX,              314,    2,  2,  V, { VA }, 0, 0 },
     307             :     { ocSlope,              315,    2,  2,  V, { VA }, 0, 0 },
     308             :     { ocTTest,              316,    4,  4,  V, { VA, VA, VR }, 0, 0 },
     309             :     { ocProb,               317,    3,  4,  V, { VA, VA, VR }, 0, 0 },
     310             :     { ocDevSq,              318,    1,  MX, V, { RX }, 0, 0 },
     311             :     { ocGeoMean,            319,    1,  MX, V, { RX }, 0, 0 },
     312             :     { ocHarMean,            320,    1,  MX, V, { RX }, 0, 0 },
     313             :     { ocSumSQ,              321,    0,  MX, V, { RX }, 0, 0 },
     314             :     { ocKurt,               322,    1,  MX, V, { RX }, 0, 0 },
     315             :     { ocSchiefe,            323,    1,  MX, V, { RX }, 0, 0 },
     316             :     { ocZTest,              324,    2,  3,  V, { RX, VR }, 0, 0 },
     317             :     { ocLarge,              325,    2,  2,  V, { RX, VR }, 0, 0 },
     318             :     { ocSmall,              326,    2,  2,  V, { RX, VR }, 0, 0 },
     319             :     { ocQuartile,           327,    2,  2,  V, { RX, VR }, 0, 0 },
     320             :     { ocPercentile,         328,    2,  2,  V, { RX, VR }, 0, 0 },
     321             :     { ocPercentrank,        329,    2,  3,  V, { RX, VR, VR_E }, 0, 0 },
     322             :     { ocModalValue,         330,    1,  MX, V, { VA }, 0, 0 },
     323             :     { ocTrimMean,           331,    2,  2,  V, { RX, VR }, 0, 0 },
     324             :     { ocTInv,               332,    2,  2,  V, { VR }, 0, 0 },
     325             :     // Functions equivalent to add-in functions, use same parameters as
     326             :     // ocExternal but add programmatical function name (here without
     327             :     // "com.sun.star.sheet.addin.") so it can be looked up and stored as
     328             :     // add-in, as older Excel versions only know them as add-in.
     329             :     // These are the functions flagged as AddInMap::bMapDupToInternal=true in
     330             :     // sc/source/core/tool/odffmap.cxx
     331             :     { ocIsEven,             255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getIseven" ) },
     332             :     { ocIsOdd,              255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getIsodd" ) },
     333             :     { ocGCD,                255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getGcd" ) },
     334             :     { ocLCM,                255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getLcm" ) },
     335             :     { ocEffektiv,           255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getEffect" ) },
     336             :     { ocKumKapZ,            255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumprinc" ) },
     337             :     { ocKumZinsZ,           255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumipmt" ) },
     338             :     { ocNominal,            255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getNominal" ) }
     339             : };
     340             : 
     341             : /** Functions new in BIFF5/BIFF7. Unsupported functions: DATESTRING, NUMBERSTRING. */
     342             : static const XclFunctionInfo saFuncTable_5[] =
     343             : {
     344             :     { ocGetDayOfWeek,       70,     1,  2,  V, { VR }, 0, 0 },                  // BIFF2-4: 1, BIFF5: 1-2
     345             :     { ocHLookup,            101,    3,  4,  V, { VV, RO, RO, VV }, 0, 0 },      // BIFF2-4: 3, BIFF5: 3-4
     346             :     { ocVLookup,            102,    3,  4,  V, { VV, RO, RO, VV }, 0, 0 },      // BIFF2-4: 3, BIFF5: 3-4
     347             :     { ocGetDiffDate360,     220,    2,  3,  V, { VR }, 0, 0 },                  // BIFF3-4: 2, BIFF5: 2-3
     348             :     { ocMacro,              255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     349             :     { ocExternal,           255,    1,  MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, 0 },
     350             :     { ocConcat,             336,    0,  MX, V, { VR }, 0, 0 },
     351             :     { ocPower,              337,    2,  2,  V, { VR }, 0, 0 },
     352             :     { ocRad,                342,    1,  1,  V, { VR }, 0, 0 },
     353             :     { ocDeg,                343,    1,  1,  V, { VR }, 0, 0 },
     354             :     { ocSubTotal,           344,    2,  MX, V, { VR, RO }, 0, 0 },
     355             :     { ocSumIf,              345,    2,  3,  V, { RO, VR, RO }, 0, 0 },
     356             :     { ocCountIf,            346,    2,  2,  V, { RO, VR }, 0, 0 },
     357             :     { ocCountEmptyCells,    347,    1,  1,  V, { RO }, 0, 0 },
     358             :     { ocISPMT,              350,    4,  4,  V, { VR }, 0, 0 },
     359             :     { ocGetDateDif,         351,    3,  3,  V, { VR }, 0, 0 },
     360             :     { ocNoName,             352,    1,  1,  V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 },    // DATESTRING
     361             :     { ocNoName,             353,    2,  2,  V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 },    // NUMBERSTRING
     362             :     { ocRoman,              354,    1,  2,  V, { VR }, 0, 0 }
     363             : };
     364             : 
     365             : /** Functions new in BIFF8. Unsupported functions: PHONETIC. */
     366             : static const XclFunctionInfo saFuncTable_8[] =
     367             : {
     368             :     { ocGetPivotData,       358,    2,  MX, V, { RR, RR, VR }, 0, 0 },
     369             :     { ocHyperLink,          359,    1,  2,  V, { VV, VO }, 0, 0 },
     370             :     { ocNoName,             360,    1,  1,  V, { RO }, EXC_FUNCFLAG_IMPORTONLY, 0 },    // PHONETIC
     371             :     { ocAverageA,           361,    1,  MX, V, { RX }, 0, 0 },
     372             :     { ocMaxA,               362,    1,  MX, V, { RX }, 0, 0 },
     373             :     { ocMinA,               363,    1,  MX, V, { RX }, 0, 0 },
     374             :     { ocStDevPA,            364,    1,  MX, V, { RX }, 0, 0 },
     375             :     { ocVarPA,              365,    1,  MX, V, { RX }, 0, 0 },
     376             :     { ocStDevA,             366,    1,  MX, V, { RX }, 0, 0 },
     377             :     { ocVarA,               367,    1,  MX, V, { RX }, 0, 0 },
     378             :     { ocBahtText,           368,    1,  1,  V, { VR }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "BAHTTEXT" ) },
     379             :     { ocBahtText,           255,    2,  2,  V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "BAHTTEXT" ) },
     380             :     { ocEuroConvert,        255,    4,  6,  V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, "EUROCONVERT" }
     381             : };
     382             : 
     383             : 
     384             : #define EXC_FUNCENTRY_V_VR( opcode, minparam, maxparam, flags, asciiname ) \
     385             :     { opcode, NOID, minparam,     maxparam,     V, { VR },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     386             :     { opcode,  255, (minparam)+1, (maxparam)+1, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     387             : 
     388             : /** Functions new in OOXML. */
     389             : static const XclFunctionInfo saFuncTable_Oox[] =
     390             : {
     391             :     { ocCountIfs,           NOID,   2,  MX, V, { RO, VR }, EXC_FUNCFLAG_IMPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "COUNTIFS" ) },
     392             :     { ocCountIfs,           255,    3,  MX, V, { RO_E, RO, VR }, EXC_FUNCFLAG_EXPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "COUNTIFS" ) },
     393             :     { ocSumIfs,             NOID,   3,  MX, V, { RO, RO, VR }, EXC_FUNCFLAG_IMPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "SUMIFS" ) },
     394             :     { ocSumIfs,             255,    4,  MX, V, { RO_E, RO, RO, VR }, EXC_FUNCFLAG_EXPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "SUMIFS" ) },
     395             :     { ocAverageIf,          NOID,   2,  3,  V, { RO, VR, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "AVERAGEIF" ) },
     396             :     { ocAverageIf,          255,    3,  4,  V, { RO_E, RO, VR, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "AVERAGEIF" ) },
     397             :     { ocAverageIfs,         NOID,   3,  MX, V, { RO, RO, VR }, EXC_FUNCFLAG_IMPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "AVERAGEIFS" ) },
     398             :     { ocAverageIfs,         255,    4,  MX, V, { RO_E, RO, RO, VR }, EXC_FUNCFLAG_EXPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "AVERAGEIFS" ) },
     399             :     { ocIfError,            NOID,   2,  2,  V, { VO, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "IFERROR" ) },
     400             :     { ocIfError,            255,    3,  3,  V, { RO_E, VO, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "IFERROR" ) },
     401             :     { ocNetWorkdays_MS,     NOID,   2,  4,  V, { VR, VR, VR, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
     402             :     { ocNetWorkdays_MS,     255,    3,  5,  V, { RO_E, VR, VR, VR, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
     403             :     { ocWorkday_MS,         NOID,   2,  4,  V, { VR, VR, VR, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "WORKDAY.INTL" ) },
     404             :     { ocWorkday_MS,         255,    3,  5,  V, { RO_E, VR, VR, VR, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "WORKDAY.INTL" ) },
     405             :     EXC_FUNCENTRY_V_VR( ocCeil_ISO,         2,  2,  0,  "ISO.CEILING" )
     406             : };
     407             : 
     408             : 
     409             : #define EXC_FUNCENTRY_V_VR_IMPORT( opcode, minparam, maxparam, flags, asciiname ) \
     410             :     { opcode, NOID, minparam,     maxparam,     V, { VR },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     411             : 
     412             : #define EXC_FUNCENTRY_A_VR( opcode, minparam, maxparam, flags, asciiname ) \
     413             :     { opcode, NOID, minparam,     maxparam,     A, { VR },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     414             :     { opcode,  255, (minparam)+1, (maxparam)+1, A, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     415             : 
     416             : #define EXC_FUNCENTRY_V_RO( opcode, minparam, maxparam, flags, asciiname ) \
     417             :     { opcode, NOID, minparam,     maxparam,     V, { RO },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     418             :     { opcode,  255, (minparam)+1, (maxparam)+1, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     419             : 
     420             : // implicit maxparam=MX
     421             : #define EXC_FUNCENTRY_V_RX( opcode, minparam, maxparam, flags, asciiname ) \
     422             :     { opcode, NOID, minparam,     MX,           V, { RX },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     423             :     { opcode,  255, (minparam)+1, MX,           V, { RO_E, RX }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     424             : 
     425             : #define EXC_FUNCENTRY_V_VA( opcode, minparam, maxparam, flags, asciiname ) \
     426             :     { opcode, NOID, minparam,     maxparam,     V, { VA },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     427             :     { opcode,  255, (minparam)+1, (maxparam)+1, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     428             : 
     429             : /** Functions new in Excel 2010.
     430             : 
     431             :     See http://office.microsoft.com/en-us/excel-help/what-s-new-changes-made-to-excel-functions-HA010355760.aspx
     432             :     A lot of statistical functions have been renamed (the 'old' function names still exist).
     433             : 
     434             :     @See sc/source/filter/oox/formulabase.cxx saFuncTable2010 for V,VR,RO,...
     435             :  */
     436             : static const XclFunctionInfo saFuncTable_2010[] =
     437             : {
     438             :     EXC_FUNCENTRY_V_VA( ocCovarianceP,      2,  2,  0,  "COVARIANCE.P" ),
     439             :     EXC_FUNCENTRY_V_VA( ocCovarianceS,      2,  2,  0,  "COVARIANCE.S" ),
     440             :     EXC_FUNCENTRY_V_RX( ocStDevP_MS,        1, MX,  0,  "STDEV.P" ),
     441             :     EXC_FUNCENTRY_V_RX( ocStDevS,           1, MX,  0,  "STDEV.S" ),
     442             :     EXC_FUNCENTRY_V_RX( ocVarP_MS,          1, MX,  0,  "VAR.P" ),
     443             :     EXC_FUNCENTRY_V_RX( ocVarS,             1, MX,  0,  "VAR.S" ),
     444             :     EXC_FUNCENTRY_V_VR( ocBetaDist_MS,      4,  6,  0,  "BETA.DIST" ),
     445             :     EXC_FUNCENTRY_V_VR( ocBetaInv_MS,       3,  5,  0,  "BETA.INV" ),
     446             :     EXC_FUNCENTRY_V_VR( ocBinomDist_MS,     4,  4,  0,  "BINOM.DIST" ),
     447             :     EXC_FUNCENTRY_V_VR( ocBinomInv,         3,  3,  0,  "BINOM.INV" ),
     448             :     EXC_FUNCENTRY_V_VR( ocChiSqDist_MS,     3,  3,  0,  "CHISQ.DIST" ),
     449             :     EXC_FUNCENTRY_V_VR( ocChiSqInv_MS,      2,  2,  0,  "CHISQ.INV" ),
     450             :     EXC_FUNCENTRY_V_VR( ocChiDist_MS,       2,  2,  0,  "CHISQ.DIST.RT" ),
     451             :     EXC_FUNCENTRY_V_VR( ocChiInv_MS,        2,  2,  0,  "CHISQ.INV.RT" ),
     452             :     EXC_FUNCENTRY_V_VR( ocChiTest_MS,       2,  2,  0,  "CHISQ.TEST" ),
     453             :     EXC_FUNCENTRY_V_VR( ocConfidence_N,     3,  3,  0,  "CONFIDENCE.NORM" ),
     454             :     EXC_FUNCENTRY_V_VR( ocConfidence_T,     3,  3,  0,  "CONFIDENCE.T" ),
     455             :     EXC_FUNCENTRY_V_VR( ocFDist_LT,         4,  4,  0,  "F.DIST" ),
     456             :     EXC_FUNCENTRY_V_VR( ocFDist_RT,         3,  3,  0,  "F.DIST.RT" ),
     457             :     EXC_FUNCENTRY_V_VR( ocFInv_LT,          3,  3,  0,  "F.INV" ),
     458             :     EXC_FUNCENTRY_V_VR( ocFInv_RT,          3,  3,  0,  "F.INV.RT" ),
     459             :     EXC_FUNCENTRY_V_VR( ocFTest_MS,         2,  2,  0,  "F.TEST" ),
     460             :     EXC_FUNCENTRY_V_VR( ocExpDist_MS,       3,  3,  0,  "EXPON.DIST" ),
     461             :     EXC_FUNCENTRY_V_VR( ocHypGeomDist_MS,   5,  5,  0,  "HYPGEOM.DIST" ),
     462             :     EXC_FUNCENTRY_V_VR( ocPoissonDist_MS,   3,  3,  0,  "POISSON.DIST" ),
     463             :     EXC_FUNCENTRY_V_VR( ocWeibull_MS,       4,  4,  0,  "WEIBULL.DIST" ),
     464             :     EXC_FUNCENTRY_V_VR( ocGammaDist_MS,     4,  4,  0,  "GAMMA.DIST" ),
     465             :     EXC_FUNCENTRY_V_VR( ocGammaInv_MS,      3,  3,  0,  "GAMMA.INV" ),
     466             :     EXC_FUNCENTRY_V_VR( ocGammaLn_MS,       1,  1,  0,  "GAMMALN.PRECISE" ),
     467             :     EXC_FUNCENTRY_V_VR( ocLogNormDist_MS,   4,  4,  0,  "LOGNORM.DIST" ),
     468             :     EXC_FUNCENTRY_V_VR( ocLogInv_MS,        3,  3,  0,  "LOGNORM.INV" ),
     469             :     EXC_FUNCENTRY_V_VR( ocNormDist_MS,      4,  4,  0,  "NORM.DIST" ),
     470             :     EXC_FUNCENTRY_V_VR( ocNormInv_MS,       3,  3,  0,  "NORM.INV" ),
     471             :     EXC_FUNCENTRY_V_VR( ocStdNormDist_MS,   2,  2,  0,  "NORM.S.DIST" ),
     472             :     EXC_FUNCENTRY_V_VR( ocSNormInv_MS,      1,  1,  0,  "NORM.S.INV" ),
     473             :     EXC_FUNCENTRY_V_VR( ocTDist_2T,         2,  2,  0,  "T.DIST.2T" ),
     474             :     EXC_FUNCENTRY_V_VR( ocTDist_MS,         3,  3,  0,  "T.DIST" ),
     475             :     EXC_FUNCENTRY_V_VR( ocTDist_RT,         2,  2,  0,  "T.DIST.RT" ),
     476             :     EXC_FUNCENTRY_V_VR( ocTInv_2T,          2,  2,  0,  "T.INV.2T" ),
     477             :     EXC_FUNCENTRY_V_VR( ocTInv_MS,          2,  2,  0,  "T.INV" ),
     478             :     EXC_FUNCENTRY_V_VR( ocTTest_MS,         4,  4,  0,  "T.TEST" ),
     479             :     EXC_FUNCENTRY_V_VR( ocPercentile_Inc,   2,  2,  0,  "PERCENTILE.INC" ),
     480             :     EXC_FUNCENTRY_V_VR( ocPercentrank_Inc,  2,  3,  0,  "PERCENTRANK.INC" ),
     481             :     EXC_FUNCENTRY_V_VR( ocQuartile_Inc,     2,  2,  0,  "QUARTILE.INC" ),
     482             :     EXC_FUNCENTRY_V_VR( ocRank_Eq,          2,  3,  0,  "RANK.EQ" ),
     483             :     EXC_FUNCENTRY_V_VR( ocPercentile_Exc,   2,  2,  0,  "PERCENTILE.EXC" ),
     484             :     EXC_FUNCENTRY_V_VR( ocPercentrank_Exc,  2,  3,  0,  "PERCENTRANK.EXC" ),
     485             :     EXC_FUNCENTRY_V_VR( ocQuartile_Exc,     2,  2,  0,  "QUARTILE.EXC" ),
     486             :     EXC_FUNCENTRY_V_VR( ocRank_Avg,         2,  3,  0,  "RANK.AVG" ),
     487             :     EXC_FUNCENTRY_V_RX( ocModalValue_MS,    1, MX,  0,  "MODE.SNGL" ),
     488             :     EXC_FUNCENTRY_V_RX( ocModalValue_Multi, 1, MX,  0,  "MODE.MULT" ),
     489             :     EXC_FUNCENTRY_V_VR( ocNegBinomDist_MS,  4,  4,  0,  "NEGBINOM.DIST" ),
     490             :     EXC_FUNCENTRY_V_VR( ocZTest_MS,         2,  3,  0,  "Z.TEST" ),
     491             :     EXC_FUNCENTRY_V_VR( ocCeil_MS,          2,  2,  0,  "CEILING.PRECISE" ),
     492             :     EXC_FUNCENTRY_V_VR( ocFloor_MS,         2,  2,  0,  "FLOOR.PRECISE" ),
     493             :     EXC_FUNCENTRY_V_VR( ocErf_MS,           1,  1,  0,  "ERF.PRECISE" ),
     494             :     EXC_FUNCENTRY_V_VR( ocErfc_MS,          1,  1,  0,  "ERFC.PRECISE" ),
     495             : };
     496             : 
     497             : /** Functions new in Excel 2013.
     498             : 
     499             :     See http://office.microsoft.com/en-us/excel-help/new-functions-in-excel-2013-HA103980604.aspx
     500             :     Most functions apparently were added for ODF1.2 ODFF / OpenFormula
     501             :     compatibility.
     502             : 
     503             :     Functions with EXC_FUNCENTRY_V_VR_IMPORT are rewritten in
     504             :     sc/source/filter/excel/xeformula.cxx during export for BIFF, OOXML export
     505             :     uses a different mapping but still uses this mapping here to determine the
     506             :     feature set.
     507             : 
     508             :     FIXME: either have the exporter determine the feature set from the active
     509             :     mapping, preferred, or enhance this mapping here such that for OOXML the
     510             :     rewrite can be overridden.
     511             : 
     512             :     @See sc/source/filter/oox/formulabase.cxx saFuncTable2013 for V,VR,RO,...
     513             :  */
     514             : static const XclFunctionInfo saFuncTable_2013[] =
     515             : {
     516             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocArcCot,        1,  1,  0,  "ACOT" ),
     517             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocArcCotHyp,     1,  1,  0,  "ACOTH" ),
     518             :     EXC_FUNCENTRY_V_VR(         ocArabic,        1,  1,  0,  "ARABIC" ),
     519             :     EXC_FUNCENTRY_V_VR(         ocBase,          2,  3,  0,  "BASE" ),
     520             :     EXC_FUNCENTRY_V_VR(         ocB,             3,  4,  0,  "BINOM.DIST.RANGE" ),
     521             :     EXC_FUNCENTRY_V_VR(         ocBitAnd,        2,  2,  0,  "BITAND" ),
     522             :     EXC_FUNCENTRY_V_VR(         ocBitLshift,     2,  2,  0,  "BITLSHIFT" ),
     523             :     EXC_FUNCENTRY_V_VR(         ocBitOr,         2,  2,  0,  "BITOR" ),
     524             :     EXC_FUNCENTRY_V_VR(         ocBitRshift,     2,  2,  0,  "BITRSHIFT" ),
     525             :     EXC_FUNCENTRY_V_VR(         ocBitXor,        2,  2,  0,  "BITXOR" ),
     526             :     /* FIXME: CEILING.MATH is our/ODFF CEILING, but we have special handling
     527             :      * for the weird Excel CEILING behavior, check that and unify or diversify.
     528             :      * */
     529             :     EXC_FUNCENTRY_V_VR(         ocNoName,        1,  3,  0,  "CEILING.MATH" ),
     530             :     EXC_FUNCENTRY_V_VR(         ocKombin2,       2,  2,  0,  "COMBINA" ),
     531             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocCot,           1,  1,  0,  "COT" ),
     532             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocCotHyp,        1,  1,  0,  "COTH" ),
     533             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocCosecant,      1,  1,  0,  "CSC" ),
     534             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocCosecantHyp,   1,  1,  0,  "CSCH" ),
     535             :     EXC_FUNCENTRY_V_VR(         ocGetDiffDate,   2,  2,  0,  "DAYS" ),
     536             :     EXC_FUNCENTRY_V_VR(         ocDecimal,       2,  2,  0,  "DECIMAL" ),
     537             :     EXC_FUNCENTRY_V_VR(         ocNoName,        1,  1,  0,  "ENCODEURL" ),
     538             :     // NOTE: this FDIST is not our LEGACY.FDIST
     539             :     EXC_FUNCENTRY_V_VR(         ocNoName,        3,  4,  0,  "FDIST" ),
     540             :     // NOTE: this FINV is not our LEGACY.FINV
     541             :     EXC_FUNCENTRY_V_VR(         ocNoName,        3,  3,  0,  "FINV" ),
     542             :     EXC_FUNCENTRY_V_VR(         ocFilterXML,     2,  2,  0,  "FILTERXML" ),
     543             :     /* FIXME: FLOOR.MATH is our/ODFF FLOOR, but we have special handling for
     544             :      * the weird Excel FLOOR behavior, check that and unify or diversify. */
     545             :     EXC_FUNCENTRY_V_VR(         ocNoName,        1,  3,  0,  "FLOOR.MATH" ),
     546             :     EXC_FUNCENTRY_V_RO(         ocFormula,       1,  1,  0,  "FORMULATEXT" ),
     547             :     EXC_FUNCENTRY_V_VR(         ocGamma,         1,  1,  0,  "GAMMA" ),
     548             :     EXC_FUNCENTRY_V_VR(         ocGauss,         1,  1,  0,  "GAUSS" ),
     549             :     {                           ocIfNA,       NOID,  2,  2,  V, { VO, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "IFNA" ) },
     550             :     {                           ocIfNA,        255,  3,  3,  V, { RO_E, VO, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "IFNA" ) },
     551             :     // IMCOSH, IMCOT, IMCSC, IMCSCH, IMSEC, IMSECH, IMSINH and IMTAN are
     552             :     // implemented in the Analysis Add-In.
     553             :     EXC_FUNCENTRY_V_RO(         ocIsFormula,     1,  1,  0,  "ISFORMULA" ),
     554             :     EXC_FUNCENTRY_V_VR(         ocWeek,          1,  2,  0,  "ISOWEEKNUM" ),
     555             :     EXC_FUNCENTRY_A_VR(         ocMatrixUnit,    1,  1,  0,  "MUNIT" ),
     556             :     EXC_FUNCENTRY_V_VR(         ocNumberValue,   1,  3,  0,  "NUMBERVALUE" ),
     557             :     EXC_FUNCENTRY_V_VR(         ocLaufz,         3,  3,  0,  "PDURATION" ),
     558             :     EXC_FUNCENTRY_V_VR(         ocVariationen2,  2,  2,  0,  "PERMUTATIONA" ),
     559             :     EXC_FUNCENTRY_V_VR(         ocPhi,           1,  1,  0,  "PHI" ),
     560             :     EXC_FUNCENTRY_V_VR(         ocZGZ,           3,  3,  0,  "RRI" ),
     561             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocSecant,        1,  1,  0,  "SEC" ),
     562             :     EXC_FUNCENTRY_V_VR_IMPORT(  ocSecantHyp,     1,  1,  0,  "SECH" ),
     563             :     EXC_FUNCENTRY_V_RO(         ocTable,         0,  1,  0,  "SHEET" ),
     564             :     EXC_FUNCENTRY_V_RO(         ocTables,        0,  1,  0,  "SHEETS" ),
     565             :     EXC_FUNCENTRY_V_RX(         ocSkewp,         1,  MX, 0,  "SKEW.P" ),
     566             :     EXC_FUNCENTRY_V_VR(         ocUnichar,       1,  1,  0,  "UNICHAR" ),
     567             :     EXC_FUNCENTRY_V_VR(         ocUnicode,       1,  1,  0,  "UNICODE" ),
     568             :     EXC_FUNCENTRY_V_VR(         ocWebservice,    1,  1,  0,  "WEBSERVICE" ),
     569             :     EXC_FUNCENTRY_V_RX(         ocXor,           1,  MX, 0,  "XOR" )
     570             : };
     571             : 
     572             : 
     573             : #define EXC_FUNCENTRY_ODF( opcode, minparam, maxparam, flags, asciiname ) \
     574             :     { opcode, NOID, minparam,     maxparam,     V, { VR },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME_ODF( asciiname ) }, \
     575             :     { opcode,  255, (minparam)+1, (maxparam)+1, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME_ODF( asciiname ) }
     576             : 
     577             : /** Functions defined by OpenFormula, but not supported by Calc (ocNoName) or by Excel (defined op-code). */
     578             : static const XclFunctionInfo saFuncTable_Odf[] =
     579             : {
     580             :     EXC_FUNCENTRY_ODF( ocChiSqDist,     2,  3,  0,  "CHISQDIST" ),
     581             :     EXC_FUNCENTRY_ODF( ocChiSqInv,      2,  2,  0,  "CHISQINV" )
     582             : };
     583             : 
     584             : #undef EXC_FUNCENTRY_ODF
     585             : 
     586             : 
     587             : #define EXC_FUNCENTRY_OOO( opcode, minparam, maxparam, flags, asciiname ) \
     588             :     { opcode, NOID, minparam,     maxparam,     V, { VR },       EXC_FUNCFLAG_IMPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }, \
     589             :     { opcode,  255, (minparam)+1, (maxparam)+1, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY|(flags), EXC_FUNCNAME( asciiname ) }
     590             : 
     591             : /** Functions defined by Calc, but not in OpenFormula nor supported by Excel. */
     592             : static const XclFunctionInfo saFuncTable_OOoLO[] =
     593             : {
     594             :     EXC_FUNCENTRY_OOO( ocConvert,       3,  3,  0,  "ORG.OPENOFFICE.CONVERT" )
     595             : };
     596             : 
     597             : #undef EXC_FUNCENTRY_OOO
     598             : 
     599           0 : XclFunctionProvider::XclFunctionProvider( const XclRoot& rRoot )
     600             : {
     601             :     void (XclFunctionProvider::*pFillFunc)( const XclFunctionInfo*, const XclFunctionInfo* ) =
     602           0 :         rRoot.IsImport() ? &XclFunctionProvider::FillXclFuncMap : &XclFunctionProvider::FillScFuncMap;
     603             : 
     604             :     /*  Only read/write functions supported in the current BIFF version.
     605             :         Function tables from later BIFF versions may overwrite single functions
     606             :         from earlier tables. */
     607           0 :     XclBiff eBiff = rRoot.GetBiff();
     608           0 :     if( eBiff >= EXC_BIFF2 )
     609           0 :         (this->*pFillFunc)( saFuncTable_2, STATIC_ARRAY_END( saFuncTable_2 ) );
     610           0 :     if( eBiff >= EXC_BIFF3 )
     611           0 :         (this->*pFillFunc)( saFuncTable_3, STATIC_ARRAY_END( saFuncTable_3 ) );
     612           0 :     if( eBiff >= EXC_BIFF4 )
     613           0 :         (this->*pFillFunc)( saFuncTable_4, STATIC_ARRAY_END( saFuncTable_4 ) );
     614           0 :     if( eBiff >= EXC_BIFF5 )
     615           0 :         (this->*pFillFunc)( saFuncTable_5, STATIC_ARRAY_END( saFuncTable_5 ) );
     616           0 :     if( eBiff >= EXC_BIFF8 )
     617           0 :         (this->*pFillFunc)( saFuncTable_8, STATIC_ARRAY_END( saFuncTable_8 ) );
     618           0 :     (this->*pFillFunc)( saFuncTable_Oox, STATIC_ARRAY_END( saFuncTable_Oox ) );
     619           0 :     (this->*pFillFunc)( saFuncTable_2010, STATIC_ARRAY_END( saFuncTable_2010 ) );
     620           0 :     (this->*pFillFunc)( saFuncTable_2013, STATIC_ARRAY_END( saFuncTable_2013 ) );
     621           0 :     (this->*pFillFunc)( saFuncTable_Odf, STATIC_ARRAY_END( saFuncTable_Odf ) );
     622           0 :     (this->*pFillFunc)( saFuncTable_OOoLO, STATIC_ARRAY_END( saFuncTable_OOoLO ) );
     623           0 : }
     624             : 
     625           0 : const XclFunctionInfo* XclFunctionProvider::GetFuncInfoFromXclFunc( sal_uInt16 nXclFunc ) const
     626             : {
     627             :     // only in import filter allowed
     628             :     OSL_ENSURE( !maXclFuncMap.empty(), "XclFunctionProvider::GetFuncInfoFromXclFunc - wrong filter" );
     629           0 :     XclFuncMap::const_iterator aIt = maXclFuncMap.find( nXclFunc );
     630           0 :     return (aIt == maXclFuncMap.end()) ? 0 : aIt->second;
     631             : }
     632             : 
     633           0 : const XclFunctionInfo* XclFunctionProvider::GetFuncInfoFromXclMacroName( const OUString& rXclMacroName ) const
     634             : {
     635             :     // only in import filter allowed, but do not test maXclMacroNameMap, it may be empty for old BIFF versions
     636             :     OSL_ENSURE( !maXclFuncMap.empty(), "XclFunctionProvider::GetFuncInfoFromXclMacroName - wrong filter" );
     637           0 :     XclMacroNameMap::const_iterator aIt = maXclMacroNameMap.find( rXclMacroName );
     638           0 :     return (aIt == maXclMacroNameMap.end()) ? 0 : aIt->second;
     639             : }
     640             : 
     641           0 : const XclFunctionInfo* XclFunctionProvider::GetFuncInfoFromOpCode( OpCode eOpCode ) const
     642             : {
     643             :     // only in export filter allowed
     644             :     OSL_ENSURE( !maScFuncMap.empty(), "XclFunctionProvider::GetFuncInfoFromOpCode - wrong filter" );
     645           0 :     ScFuncMap::const_iterator aIt = maScFuncMap.find( eOpCode );
     646           0 :     return (aIt == maScFuncMap.end()) ? 0 : aIt->second;
     647             : }
     648             : 
     649           0 : void XclFunctionProvider::FillXclFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd )
     650             : {
     651           0 :     for( const XclFunctionInfo* pIt = pBeg; pIt != pEnd; ++pIt )
     652             :     {
     653           0 :         if( !::get_flag( pIt->mnFlags, EXC_FUNCFLAG_EXPORTONLY ) )
     654             :         {
     655           0 :             if( pIt->mnXclFunc != NOID )
     656           0 :                 maXclFuncMap[ pIt->mnXclFunc ] = pIt;
     657           0 :             if( pIt->IsMacroFunc() )
     658           0 :                 maXclMacroNameMap[ pIt->GetMacroFuncName() ] = pIt;
     659             :         }
     660             :     }
     661           0 : }
     662             : 
     663           0 : void XclFunctionProvider::FillScFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd )
     664             : {
     665           0 :     for( const XclFunctionInfo* pIt = pBeg; pIt != pEnd; ++pIt )
     666           0 :         if( !::get_flag( pIt->mnFlags, EXC_FUNCFLAG_IMPORTONLY ) )
     667           0 :             maScFuncMap[ pIt->meOpCode ] = pIt;
     668           0 : }
     669             : 
     670             : // Token array ================================================================
     671             : 
     672           0 : XclTokenArray::XclTokenArray( bool bVolatile ) :
     673           0 :     mbVolatile( bVolatile )
     674             : {
     675           0 : }
     676             : 
     677           0 : XclTokenArray::XclTokenArray( ScfUInt8Vec& rTokVec, ScfUInt8Vec& rExtDataVec, bool bVolatile ) :
     678           0 :     mbVolatile( bVolatile )
     679             : {
     680           0 :     maTokVec.swap( rTokVec );
     681           0 :     maExtDataVec.swap( rExtDataVec );
     682           0 : }
     683             : 
     684           0 : sal_uInt16 XclTokenArray::GetSize() const
     685             : {
     686             :     OSL_ENSURE( maTokVec.size() <= 0xFFFF, "XclTokenArray::GetSize - array too long" );
     687           0 :     return limit_cast< sal_uInt16 >( maTokVec.size() );
     688             : }
     689             : 
     690           0 : void XclTokenArray::ReadSize( XclImpStream& rStrm )
     691             : {
     692             :     sal_uInt16 nSize;
     693           0 :     rStrm >> nSize;
     694           0 :     maTokVec.resize( nSize );
     695           0 : }
     696             : 
     697           0 : void XclTokenArray::ReadArray( XclImpStream& rStrm )
     698             : {
     699           0 :     if( !maTokVec.empty() )
     700           0 :         rStrm.Read( &maTokVec.front(), GetSize() );
     701           0 : }
     702             : 
     703           0 : void XclTokenArray::Read( XclImpStream& rStrm )
     704             : {
     705           0 :     ReadSize( rStrm );
     706           0 :     ReadArray( rStrm );
     707           0 : }
     708             : 
     709           0 : void XclTokenArray::WriteSize( XclExpStream& rStrm ) const
     710             : {
     711           0 :     rStrm << GetSize();
     712           0 : }
     713             : 
     714           0 : void XclTokenArray::WriteArray( XclExpStream& rStrm ) const
     715             : {
     716           0 :     if( !maTokVec.empty() )
     717           0 :         rStrm.Write( &maTokVec.front(), GetSize() );
     718           0 :     if( !maExtDataVec.empty() )
     719           0 :         rStrm.Write( &maExtDataVec.front(), maExtDataVec.size() );
     720           0 : }
     721             : 
     722           0 : void XclTokenArray::Write( XclExpStream& rStrm ) const
     723             : {
     724           0 :     WriteSize( rStrm );
     725           0 :     WriteArray( rStrm );
     726           0 : }
     727             : 
     728           0 : bool XclTokenArray::operator==( const XclTokenArray& rTokArr ) const
     729             : {
     730           0 :     return (mbVolatile == rTokArr.mbVolatile) && (maTokVec == rTokArr.maTokVec) && (maExtDataVec == rTokArr.maExtDataVec);
     731             : }
     732             : 
     733           0 : XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArray& rTokArr )
     734             : {
     735           0 :     rTokArr.Read( rStrm );
     736           0 :     return rStrm;
     737             : }
     738             : 
     739           0 : XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArrayRef& rxTokArr )
     740             : {
     741           0 :     if( !rxTokArr )
     742           0 :         rxTokArr.reset( new XclTokenArray );
     743           0 :     rxTokArr->Read( rStrm );
     744           0 :     return rStrm;
     745             : }
     746             : 
     747           0 : XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArray& rTokArr )
     748             : {
     749           0 :     rTokArr.Write( rStrm );
     750           0 :     return rStrm;
     751             : }
     752             : 
     753           0 : XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArrayRef& rxTokArr )
     754             : {
     755           0 :     if( rxTokArr )
     756           0 :         rxTokArr->Write( rStrm );
     757             :     else
     758           0 :         rStrm << sal_uInt16( 0 );
     759           0 :     return rStrm;
     760             : }
     761             : 
     762           0 : XclTokenArrayIterator::XclTokenArrayIterator() :
     763             :     mppScTokenBeg( 0 ),
     764             :     mppScTokenEnd( 0 ),
     765             :     mppScToken( 0 ),
     766           0 :     mbSkipSpaces( false )
     767             : {
     768           0 : }
     769             : 
     770           0 : XclTokenArrayIterator::XclTokenArrayIterator( const ScTokenArray& rScTokArr, bool bSkipSpaces )
     771             : {
     772           0 :     Init( rScTokArr, bSkipSpaces );
     773           0 : }
     774             : 
     775           0 : XclTokenArrayIterator::XclTokenArrayIterator( const XclTokenArrayIterator& rTokArrIt, bool bSkipSpaces ) :
     776             :     mppScTokenBeg( rTokArrIt.mppScTokenBeg ),
     777             :     mppScTokenEnd( rTokArrIt.mppScTokenEnd ),
     778             :     mppScToken( rTokArrIt.mppScToken ),
     779           0 :     mbSkipSpaces( bSkipSpaces )
     780             : {
     781           0 :     SkipSpaces();
     782           0 : }
     783             : 
     784           0 : void XclTokenArrayIterator::Init( const ScTokenArray& rScTokArr, bool bSkipSpaces )
     785             : {
     786           0 :     sal_uInt16 nTokArrLen = rScTokArr.GetLen();
     787           0 :     mppScTokenBeg = static_cast< const FormulaToken* const* >( nTokArrLen ? rScTokArr.GetArray() : 0 );
     788           0 :     mppScTokenEnd = mppScTokenBeg ? (mppScTokenBeg + nTokArrLen) : 0;
     789           0 :     mppScToken = (mppScTokenBeg != mppScTokenEnd) ? mppScTokenBeg : 0;
     790           0 :     mbSkipSpaces = bSkipSpaces;
     791           0 :     SkipSpaces();
     792           0 : }
     793             : 
     794           0 : XclTokenArrayIterator& XclTokenArrayIterator::operator++()
     795             : {
     796           0 :     NextRawToken();
     797           0 :     SkipSpaces();
     798           0 :     return *this;
     799             : }
     800             : 
     801           0 : void XclTokenArrayIterator::NextRawToken()
     802             : {
     803           0 :     if( mppScToken )
     804           0 :         if( (++mppScToken == mppScTokenEnd) || !*mppScToken )
     805           0 :             mppScToken = 0;
     806           0 : }
     807             : 
     808           0 : void XclTokenArrayIterator::SkipSpaces()
     809             : {
     810           0 :     if( mbSkipSpaces )
     811           0 :         while( Is() && ((*this)->GetOpCode() == ocSpaces) )
     812           0 :             NextRawToken();
     813           0 : }
     814             : 
     815             : // strings and string lists ---------------------------------------------------
     816             : 
     817           0 : bool XclTokenArrayHelper::GetTokenString( OUString& rString, const FormulaToken& rScToken )
     818             : {
     819           0 :     bool bIsStr = (rScToken.GetType() == svString) && (rScToken.GetOpCode() == ocPush);
     820           0 :     if( bIsStr ) rString = rScToken.GetString().getString();
     821           0 :     return bIsStr;
     822             : }
     823             : 
     824           0 : bool XclTokenArrayHelper::GetString( OUString& rString, const ScTokenArray& rScTokArr )
     825             : {
     826           0 :     XclTokenArrayIterator aIt( rScTokArr, true );
     827             :     // something is following the string token -> error
     828           0 :     return aIt.Is() && GetTokenString( rString, *aIt ) && !++aIt;
     829             : }
     830             : 
     831           0 : bool XclTokenArrayHelper::GetStringList( OUString& rStringList, const ScTokenArray& rScTokArr, sal_Unicode cSep )
     832             : {
     833           0 :     bool bRet = true;
     834           0 :     OUString aString;
     835           0 :     XclTokenArrayIterator aIt( rScTokArr, true );
     836           0 :     enum { STATE_START, STATE_STR, STATE_SEP, STATE_END } eState = STATE_START;
     837           0 :     while( eState != STATE_END ) switch( eState )
     838             :     {
     839             :         case STATE_START:
     840           0 :             eState = aIt.Is() ? STATE_STR : STATE_END;
     841           0 :         break;
     842             :         case STATE_STR:
     843           0 :             bRet = GetTokenString( aString, *aIt );
     844           0 :             if( bRet ) rStringList += aString ;
     845           0 :             eState = (bRet && (++aIt).Is()) ? STATE_SEP : STATE_END;
     846           0 :         break;
     847             :         case STATE_SEP:
     848           0 :             bRet = aIt->GetOpCode() == ocSep;
     849           0 :             if( bRet ) rStringList += OUString(cSep);
     850           0 :             eState = (bRet && (++aIt).Is()) ? STATE_STR : STATE_END;
     851           0 :         break;
     852             :         default:;
     853             :     }
     854           0 :     return bRet;
     855             : }
     856             : 
     857           0 : void XclTokenArrayHelper::ConvertStringToList( ScTokenArray& rScTokArr, sal_Unicode cStringSep, bool bTrimLeadingSpaces )
     858             : {
     859           0 :     OUString aString;
     860           0 :     if( GetString( aString, rScTokArr ) )
     861             :     {
     862           0 :         rScTokArr.Clear();
     863           0 :         sal_Int32 nTokenCnt = comphelper::string::getTokenCount(aString, cStringSep);
     864           0 :         sal_Int32 nStringIx = 0;
     865           0 :         for( sal_Int32 nToken = 0; nToken < nTokenCnt; ++nToken )
     866             :         {
     867           0 :             OUString aToken( aString.getToken( 0, cStringSep, nStringIx ) );
     868           0 :             if( bTrimLeadingSpaces )
     869           0 :                 aToken = comphelper::string::stripStart(aToken, ' ');
     870           0 :             if( nToken > 0 )
     871           0 :                 rScTokArr.AddOpCode( ocSep );
     872           0 :             rScTokArr.AddString( aToken );
     873           0 :         }
     874           0 :     }
     875           0 : }
     876             : 
     877             : // multiple operations --------------------------------------------------------
     878             : 
     879             : namespace {
     880             : 
     881           0 : inline bool lclGetAddress( ScAddress& rAddress, const FormulaToken& rToken, const ScAddress& rPos )
     882             : {
     883           0 :     OpCode eOpCode = rToken.GetOpCode();
     884           0 :     bool bIsSingleRef = (eOpCode == ocPush) && (rToken.GetType() == svSingleRef);
     885           0 :     if( bIsSingleRef )
     886             :     {
     887           0 :         const ScSingleRefData& rRef = static_cast<const ScToken&>(rToken).GetSingleRef();
     888           0 :         rAddress = rRef.toAbs(rPos);
     889           0 :         bIsSingleRef = !rRef.IsDeleted();
     890             :     }
     891           0 :     return bIsSingleRef;
     892             : }
     893             : 
     894             : } // namespace
     895             : 
     896           0 : bool XclTokenArrayHelper::GetMultipleOpRefs(
     897             :     XclMultipleOpRefs& rRefs, const ScTokenArray& rScTokArr, const ScAddress& rScPos )
     898             : {
     899           0 :     rRefs.mbDblRefMode = false;
     900             :     enum
     901             :     {
     902             :         stBegin, stTableOp, stOpen, stFormula, stFormulaSep,
     903             :         stColFirst, stColFirstSep, stColRel, stColRelSep,
     904             :         stRowFirst, stRowFirstSep, stRowRel, stClose, stError
     905           0 :     } eState = stBegin;     // last read token
     906           0 :     for( XclTokenArrayIterator aIt( rScTokArr, true ); aIt.Is() && (eState != stError); ++aIt )
     907             :     {
     908           0 :         OpCode eOpCode = aIt->GetOpCode();
     909           0 :         bool bIsSep = eOpCode == ocSep;
     910           0 :         switch( eState )
     911             :         {
     912             :             case stBegin:
     913           0 :                 eState = (eOpCode == ocTableOp) ? stTableOp : stError;
     914           0 :             break;
     915             :             case stTableOp:
     916           0 :                 eState = (eOpCode == ocOpen) ? stOpen : stError;
     917           0 :             break;
     918             :             case stOpen:
     919           0 :                 eState = lclGetAddress(rRefs.maFmlaScPos, *aIt, rScPos) ? stFormula : stError;
     920           0 :             break;
     921             :             case stFormula:
     922           0 :                 eState = bIsSep ? stFormulaSep : stError;
     923           0 :             break;
     924             :             case stFormulaSep:
     925           0 :                 eState = lclGetAddress(rRefs.maColFirstScPos, *aIt, rScPos) ? stColFirst : stError;
     926           0 :             break;
     927             :             case stColFirst:
     928           0 :                 eState = bIsSep ? stColFirstSep : stError;
     929           0 :             break;
     930             :             case stColFirstSep:
     931           0 :                 eState = lclGetAddress(rRefs.maColRelScPos, *aIt, rScPos) ? stColRel : stError;
     932           0 :             break;
     933             :             case stColRel:
     934           0 :                 eState = bIsSep ? stColRelSep : ((eOpCode == ocClose) ? stClose : stError);
     935           0 :             break;
     936             :             case stColRelSep:
     937           0 :                 eState = lclGetAddress(rRefs.maRowFirstScPos, *aIt, rScPos) ? stRowFirst : stError;
     938           0 :                 rRefs.mbDblRefMode = true;
     939           0 :             break;
     940             :             case stRowFirst:
     941           0 :                 eState = bIsSep ? stRowFirstSep : stError;
     942           0 :             break;
     943             :             case stRowFirstSep:
     944           0 :                 eState = lclGetAddress(rRefs.maRowRelScPos, *aIt, rScPos) ? stRowRel : stError;
     945           0 :             break;
     946             :             case stRowRel:
     947           0 :                 eState = (eOpCode == ocClose) ? stClose : stError;
     948           0 :             break;
     949             :             default:
     950           0 :                 eState = stError;
     951             :         }
     952             :     }
     953           0 :     return eState == stClose;
     954           0 : }
     955             : 
     956             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10