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

Generated by: LCOV version 1.11