    /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
    /*
     * This file is part of the LibreOffice project.
     *
     * This Source Code Form is subject to the terms of the Mozilla Public
     * License, v. 2.0. If a copy of the MPL was not distributed with this
     * file, You can obtain one at http://mozilla.org/MPL/2.0/.
     *
     * This file incorporates work covered by the following license notice:
     *
     *   Licensed to the Apache Software Foundation (ASF) under one or more
     *   contributor license agreements. See the NOTICE file distributed
     *   with this work for additional information regarding copyright
     *   ownership. The ASF licenses this file to you under the Apache
     *   License, Version 2.0 (the "License"); you may not use this file
     *   except in compliance with the License. You may obtain a copy of
     *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
     */

    #include <decl.h>
    #include <lotform.hxx>
    #include <compiler.hxx>
    #include "lotfilter.hxx"
    #include <lotrange.hxx>
    #include <namebuff.hxx>
    #include <root.hxx>
    #include <ftools.hxx>
    #include <tool.h>

    #include <math.h>
    #include <comphelper/string.hxx>
    #include <sal/log.hxx>
    #include <memory>

    static const sal_Char*      GetAddInName( const sal_uInt8 nIndex );

    static DefTokenId           lcl_KnownAddIn(const OString& rTest);

    void LotusToSc::DoFunc( DefTokenId eOc, sal_uInt8 nCnt, const sal_Char* pExtString )
    {
        TokenId                     eParam[ 256 ];
        sal_Int32                       nLauf;
        TokenId                     nMerk0, nMerk1;

        bool                        bAddIn = false;

        SAL_WARN_IF( nCnt > 128, "sc.filter", "-LotusToSc::DoFunc(): Too many (128)!" );

        if( eOc == ocNoName )
        {
            OString t;
            if( pExtString )
            {
                const OString s("@<<@123>>");

                t = pExtString;

                sal_Int32 n = t.indexOf(s);
                if( n != -1 )
                    t = t.copy(n + s.getLength());

                t = comphelper::string::stripEnd(t, '(');

                eOc = lcl_KnownAddIn( t );

                if( eOc == ocNoName )
                    t = OString("L123_") + t;
            }
            else
                t = "#UNKNOWN FUNC NAME#";

            if( eOc == ocNoName )
            {
                bAddIn = true;
                nMerk0 = aPool.Store(eOc, OStringToOUString(t, eSrcChar));

                aPool << nMerk0;
            }
        }

        for( nLauf = 0 ; nLauf < nCnt && aStack.HasMoreTokens() ; nLauf++ )
            aStack >> eParam[ nLauf ];

        if (nLauf < nCnt)
            // Adapt count to reality. All sort of binary crap is possible.
            nCnt = static_cast<sal_uInt8>(nLauf);

        // special cases...
        switch( eOc )
        {
            case ocIndex:
                SAL_WARN_IF( nCnt < 2, "sc.filter", "+LotusToSc::DoFunc(): ocIndex needs at least 2 parameters!" );
                nMerk0 = eParam[ 0 ];
                eParam[ 0 ] = eParam[ 1 ];
                eParam[ 1 ] = nMerk0;
                IncToken( eParam[ 0 ] );
                IncToken( eParam[ 1 ] );
                break;
            case ocIRR:
            {
                SAL_WARN_IF( nCnt != 2, "sc.filter", "+LotusToSc::DoFunc(): ocIRR needs 2 parameters!" );
                nMerk0 = eParam[ 0 ];
                eParam[ 0 ] = eParam[ 1 ];
                eParam[ 1 ] = nMerk0;
            }
                break;
            case ocGetYear:
            {
                nMerk0 = aPool.Store( 1900.0 );
                aPool << ocOpen;
            }
                break;
            case ocChoose:
            {// 1. Parameter ++
                if (nCnt >= 1)
                    IncToken( eParam[ nCnt - 1 ] );
            }
                break;
            case ocFind:
            case ocHLookup:
            case ocVLookup:
            {// last parameter ++
                IncToken( eParam[ 0 ] );
            }
                break;
            case ocMid:
            case ocReplace:
            {// 2. Parameter ++
                if (nCnt >= 2)
                    IncToken( eParam[ nCnt - 2 ] );
            }
                break;
            case ocRate:
            {
                // new quantity = 4!
                SAL_WARN_IF( nCnt != 3, "sc.filter",
                    "*LotusToSc::DoFunc(): ZINS() needs 3 parameters!" );
                nCnt = 4;
                eParam[ 3 ] = eParam[ 0 ];  // 3. -> 1.
                eParam[ 0 ] = eParam[ 2 ];  // 1. -> 4.
                NegToken( eParam[ 1 ] );    // 2. -> -2. (+ 2. -> 3.)
                eParam[ 2 ] = n0Token;      //    -> 2. as Default
            }
                break;
            case ocNper:
            {
                SAL_WARN_IF( nCnt != 3, "sc.filter",
                    "*LotusToSc::DoFunc(): TERM() or CTERM() need 3 parameters!" );
                nCnt = 4;
                if ( OString(pExtString) == "TERM" )
                {
                    // @TERM(pmt,int,fv) -> NPER(int,-pmt,pv=0,fv)
                    NegToken( eParam[ 2 ] );
                    eParam[ 3 ] = eParam[ 1 ];
                    eParam[ 1 ] = aPool.Store( 0.0 );
                }
                else //CTERM()
                {
                    // @CTERM(int,fv,pv) -> NPER(int,pmt=0,-pv,fv)
                    NegToken( eParam[ 0 ] );
                    nMerk0 = eParam[ 1 ];
                    eParam[ 1 ] = eParam[ 0 ];
                    eParam[ 0 ] = nMerk0;
                    eParam[ 3 ] = eParam[ 2 ];
                    eParam[ 2 ] = aPool.Store( 0.0 );
                }
            }
                break;
            case ocRoundUp:
            case ocRoundDown:
            {
                // omit optional 3rd parameter
                if ( nCnt == 3 )
                {
                    eParam[ 0 ] = eParam[ 1 ];
                    eParam[ 1 ] = eParam[ 2 ];
                    nCnt = 2;
                }

            }
                break;
            default:;
        }

        if( !bAddIn )
            aPool << eOc;

        aPool << ocOpen;

        if( nCnt > 0 )
        {
                // ATTENTION: 0 is the last parameter, nCnt-1 the first one

            sal_Int16 nLast = nCnt - 1;

            if( eOc == ocPMT )
            {   // special case ocPMT, negate last parameter!
                // additionally: 1. -> 3., 3. -> 2., 2. -> 1.
                SAL_WARN_IF( nCnt != 3, "sc.filter", "+LotusToSc::DoFunc(): ocPMT needs 3 parameters!" );
                // There should be at least 3 arguments, but with binary crap may not..
                switch (nCnt)
                {
                    case 1:
                        aPool << eParam[ 1 ];
                    break;
                    case 2:
                        aPool << eParam[ 1 ] << ocSep << eParam[ 0 ];
                    break;
                    default:
                    case 3:
                        aPool << eParam[ 1 ] << ocSep << eParam[ 0 ] << ocSep << ocNegSub << eParam[ 2 ];
                    break;
                }
            }
            else
            {   // default
                // [Parameter{;Parameter}]
                aPool << eParam[ nLast ];

                for( nLauf = nLast - 1 ; nLauf >= 0 ; nLauf-- )
                {
                    if( nLauf != -1 ) // lists the parameter to be excluded
                        aPool << ocSep << eParam[ nLauf ];
                }
            }
        }

        // special cases ...
        if( eOc == ocGetYear )
        {
            aPool << ocClose << ocSub << nMerk0;
        }
        else if( eOc == ocFixed )
        {
            aPool << ocSep << ocTrue << ocOpen << ocClose;
        }
        else if( eOc == ocFind )
        {
            nMerk1 = aPool.Store();
            DecToken( nMerk1 );
            aPool << nMerk1;
        }

        aPool << ocClose;

        aPool >> aStack;
    }

    void LotusToSc::LotusRelToScRel( sal_uInt16 nCol, sal_uInt16 nRow, ScSingleRefData& rSRD )
    {
        // Column
        if( nCol & 0x8000 )
        {
            if( nCol & 0x0080 )
                nCol |= 0xFF00;
            else
                nCol &= 0x00FF;
            // #i36252# first cast unsigned 16-bit to signed 16-bit, and then to SCCOL
            rSRD.SetRelCol(static_cast<SCCOL>(static_cast<sal_Int16>(nCol)));
        }
        else
        {
            rSRD.SetAbsCol(static_cast<SCCOL>(nCol & 0x00FF));
        }

        // Row
        if( nRow & 0x8000 )
        {
            rSRD.SetRowRel(true);
            // sign correct extension
            switch (m_rContext.eTyp)
            {
                // 5432 1098 7654 3210
                // 8421 8421 8421 8421
                //       xxx xxxx xxxx
                case eWK_1:
                    if( nRow & 0x0400 )
                        nRow |= 0xF800;
                    else
                        nRow &= 0x07FF;
                    break;
                // 8421 8421 8421 8421
                //    x xxxx xxxx xxxx
                case eWK_2:
                    if( nRow & 0x1000 )
                        nRow |= 0xE000;
                    else
                        nRow &= 0x1FFF;
                    break;
                default:
                    SAL_WARN( "sc.filter", "*LotusToSc::LotusRelToScRel(): unhandled case? " << m_rContext.eTyp );
            }
        }
        else
        {
            rSRD.SetRowRel(false);
            switch (m_rContext.eTyp)
            {
                // 5432 1098 7654 3210
                // 8421 8421 8421 8421
                //       xxx xxxx xxxx
                case eWK_1:
                    nRow &= 0x07FF;
                    break;
                // 8421 8421 8421 8421
                //   xx xxxx xxxx xxxx
                case eWK_2:
                    nRow &= 0x3FFF;
                    break;
                default:
                    SAL_WARN( "sc.filter", "*LotusToSc::LotusRelToScRel(): unhandled case? " << m_rContext.eTyp );
            }
        }

        if( rSRD.IsRowRel() )
            // #i36252# first cast unsigned 16-bit to signed 16-bit, and then to SCROW
            rSRD.SetRelRow(static_cast<SCROW>(static_cast<sal_Int16>(nRow)));
        else
            rSRD.SetAbsRow(static_cast<SCROW>(nRow));
    }

    void LotusToSc::ReadSRD( ScSingleRefData& rSRD, sal_uInt8 nRelBit )
    {
        sal_uInt8           nTab, nCol;
        sal_uInt16          nRow;

        Read( nRow );
        Read( nTab );
        Read( nCol );

        bool b3D = (static_cast<SCTAB>(nTab) != aEingPos.Tab());

        rSRD.SetColRel( ( nRelBit & 0x01 ) != 0 );
        rSRD.SetRowRel( ( nRelBit & 0x02 ) != 0 );
        rSRD.SetTabRel( ( ( nRelBit & 0x04) != 0 ) || !b3D );
        rSRD.SetFlag3D( b3D );

        rSRD.SetAddress(ScAddress(nCol, nRow, nTab), aEingPos);
    }

    void LotusToSc::IncToken( TokenId &rParam )
    {
        aPool << ocOpen << rParam << nAddToken;
        rParam = aPool.Store();
    }

    void LotusToSc::DecToken( TokenId &rParam )
    {
        aPool << ocOpen << rParam << nSubToken;
        rParam = aPool.Store();
    }

    void LotusToSc::NegToken( TokenId &rParam )
    {
        aPool << ocNegSub << ocOpen << rParam << ocClose;
        rParam = aPool.Store();
    }

    void LotusToSc::Reset( const ScAddress& rEingPos )
    {
        LotusConverterBase::Reset( rEingPos );

        TokenId nEins = aPool.Store( 1.0 );

        aPool << ocClose << ocAdd << nEins;
        nAddToken = aPool.Store();

        aPool << ocClose << ocSub << nEins;
        nSubToken = aPool.Store();

        n0Token = aPool.Store( 0.0 );
    }

    LotusToSc::LotusToSc(LotusContext &rContext, SvStream &rStream, svl::SharedStringPool& rSPool,
        rtl_TextEncoding e, bool b)
        : LotusConverterBase(rStream, rSPool)
        , m_rContext(rContext)
    {
        eSrcChar = e;
        bWK3 = false;
        bWK123 = b;
    }

    typedef FUNC_TYPE ( FuncType1 ) ( sal_uInt8 );
    typedef DefTokenId ( FuncType2 ) ( sal_uInt8 );

    void LotusToSc::Convert( const ScTokenArray*& rpErg, sal_Int32& rRest )
    {
        sal_uInt8               nOc;
        sal_uInt8               nCnt;
        sal_uInt8               nRelBits;
        sal_uInt16              nStrLen;
        sal_uInt16              nRngIndex;
        FUNC_TYPE           eType = FT_NOP;
        TokenId             nMerk0;
        DefTokenId          eOc;
        const sal_Char*     pExtName = nullptr;
        RangeNameBufferWK3& rRangeNameBufferWK3 = *m_rContext.pLotusRoot->pRngNmBffWK3;

        ScComplexRefData        aCRD;
        aCRD.InitFlags();
        ScSingleRefData&        rR = aCRD.Ref1;

        LR_ID               nId;
        TokenId             nNewId;

        LotusRangeList&     rRangeList = m_rContext.pLotusRoot->maRangeNames;

        FuncType1*          pIndexToType;
        FuncType2*          pIndexToToken;

        if( bWK3 )
        {   // for > WK3
            pIndexToType = IndexToTypeWK123;
            pIndexToToken = IndexToTokenWK123;
        }
        else if( bWK123 )
        {
            pIndexToType = IndexToTypeWK123;
            pIndexToToken = IndexToTokenWK123;
        }
        else
        {
            pIndexToType = IndexToType;
            pIndexToToken = IndexToToken;

            rR.SetRelTab(0);
            rR.SetFlag3D( false );
        }

        aCRD.Ref2 = rR;

        nBytesLeft = rRest;

        while( eType )      // != FT_Return (==0)
        {
            Read( nOc );

            if( nBytesLeft < 0 )
            {
                rpErg = aPool[ aStack.Get() ];
                return;
            }

            eType = pIndexToType( nOc );
            eOc   = pIndexToToken( nOc );
            if( eOc == ocNoName )
                pExtName = GetAddInName( nOc );

            switch( eType )
            {
                case FT_Return:
                    if( bWK3 || bWK123 )
                        nBytesLeft = 0; // not used for >= WK3

                    rRest = nBytesLeft;
                    break;
                case FT_NotImpl:
                case FT_FuncFix0:   DoFunc( eOc, 0, pExtName ); break;
                case FT_FuncFix1:   DoFunc( eOc, 1, pExtName ); break;
                case FT_FuncFix2:   DoFunc( eOc, 2, pExtName ); break;
                case FT_FuncFix3:   DoFunc( eOc, 3, pExtName ); break;
                case FT_FuncFix4:   DoFunc( eOc, 4, pExtName ); break;
                    case FT_FuncVar:
                    Read( nCnt );
                    DoFunc( eOc, nCnt, pExtName );
                    break;
                case FT_Neg:
                    aPool << ocOpen << ocNegSub << aStack << ocClose;
                    aPool >> aStack;
                    break;
                case FT_Op:
                    aStack >> nMerk0;
                    aPool << aStack << eOc << nMerk0;
                    aPool >> aStack;
                    break;
                case FT_ConstFloat:
                {
                    double  fDouble;
                    Read( fDouble );
                    aStack << aPool.Store( fDouble );
                }
                    break;
                case FT_Variable:
                {
                    sal_uInt16  nCol, nRow;
                    Read( nCol );
                    Read( nRow );

                    LotusRelToScRel( nCol, nRow, rR );

                    if( bWK3 )
                        nNewId = aPool.Store( rR );
                    else
                    {
                        nId = rRangeList.GetIndex(rR.Col(), rR.Row());

                        if( nId == ID_FAIL )
                            // missing range
                            nNewId = aPool.Store( rR );
                        else
                            nNewId = aPool.Store( static_cast<sal_uInt16>(nId) );
                    }

                    aStack << nNewId;
                }
                    break;
                case FT_Range:
                {
                    sal_uInt16  nColS, nRowS, nColE, nRowE;
                    Read( nColS );
                    Read( nRowS );
                    Read( nColE );
                    Read( nRowE );

                    LotusRelToScRel( nColS, nRowS, rR );
                    LotusRelToScRel( nColE, nRowE, aCRD.Ref2 );

                    if( bWK3 )
                        nNewId = aPool.Store( aCRD );
                    else
                    {
                        nId = rRangeList.GetIndex(rR.Col(), rR.Row(), aCRD.Ref2.Col(), aCRD.Ref2.Row());

                        if( nId == ID_FAIL )
                            // missing range
                            nNewId = aPool.Store( aCRD );
                        else
                            nNewId = aPool.Store( static_cast<sal_uInt16>(nId) );
                    }

                    aStack << nNewId;
                }
                    break;
                case FT_Braces:
                    aPool << ocOpen << aStack << ocClose;
                    aPool >> aStack;
                    break;
                case FT_ConstInt:
                {
                    sal_Int16   nVal;
                    Read( nVal );
                    aStack << aPool.Store( static_cast<double>(nVal) );
                }
                    break;
                case FT_ConstString:
                {
                    OUString  aTmp(ScfTools::read_zeroTerminated_uInt8s_ToOUString(aIn, nBytesLeft, eSrcChar));
                    aStack << aPool.Store( aTmp );
                }
                    break;
                case FT_NOP:
                    break;
                // for > WK3
                case FT_Cref:
                    Read( nRelBits );
                    ReadSRD( rR, nRelBits );
                    aStack << aPool.Store( rR );
                    break;
                case FT_Rref:
                    Read( nRelBits );
                    ReadCRD( aCRD, nRelBits );
                    aStack << aPool.Store( aCRD );
                    break;
                case FT_Nrref:
                {
                    OUString  aTmp(ScfTools::read_zeroTerminated_uInt8s_ToOUString(aIn, nBytesLeft, eSrcChar));
                    if( rRangeNameBufferWK3.FindRel( aTmp, nRngIndex ) )
                        aStack << aPool.Store( nRngIndex );
                    else
                {
                        OUString  aText( "NRREF ");
                        aText += aTmp;
                        aStack << aPool.Store( aText );
                }
                }
                    break;
                case FT_Absnref:
                {
                    OUString aTmp(ScfTools::read_zeroTerminated_uInt8s_ToOUString(aIn, nBytesLeft, eSrcChar));
                    if( rRangeNameBufferWK3.FindAbs( aTmp, nRngIndex ) )
                        aStack << aPool.Store( nRngIndex );
                    else
                    {
                        OUString  aText( "ABSNREF " );
                        aText += aTmp;
                        aStack << aPool.Store( aText );
                    }
                }
                    break;
                case FT_Erref:
                    Ignore( 4 );
                    aPool << ocBad;
                    aPool >> aStack;
                    break;
                case FT_Ecref:
                    Ignore( 5 );
                    aPool << ocBad;
                    aPool >> aStack;
                    break;
                case FT_Econstant:
                    Ignore( 10 );
                    aPool << ocBad;
                    aPool >> aStack;
                    break;
                case FT_Splfunc:
                {
                    Read( nCnt );
                    Read( nStrLen );

                    const size_t nMaxEntries = aIn.remainingSize();
                    if (nStrLen > nMaxEntries)
                        nStrLen = nMaxEntries;

                    if( nStrLen )
                    {
                        std::unique_ptr<sal_Char[]> p(new (::std::nothrow) sal_Char[ nStrLen + 1 ]);
                        if (p)
                        {
                            aIn.ReadBytes(p.get(), nStrLen);
                            p[ nStrLen ] = 0x00;

                            DoFunc( ocNoName, nCnt, p.get() );
                        }
                        else
                            DoFunc( ocNoName, nCnt, nullptr );
                    }
                    else
                        DoFunc( ocNoName, nCnt, nullptr );
                }
                    break;
                case FT_Const10Float:
                        if ( bWK123 )
                        {
                                double fValue;
                                Read( fValue );
                                aStack << aPool.Store( fValue );
                        }
                        else aStack << aPool.Store( ScfTools::ReadLongDouble( aIn ) );
                        break;
                case FT_Snum:
                        if ( bWK123 )
                    {
                             sal_uInt32   nValue;

                             Read( nValue );
                         double  fValue = Snum32ToDouble( nValue );
                         aStack << aPool.Store( fValue );
                    }
                    else
                    {
                            sal_Int16 nVal;
                            Read( nVal );
                            aStack << aPool.Store( SnumToDouble( nVal ) );
                    }
                    break;
                    default:
                        SAL_WARN( "sc.filter", "*LotusToSc::Convert(): unknown enum!" );
            }
        }

        rpErg = aPool[ aStack.Get() ];

        SAL_WARN_IF( nBytesLeft < 0, "sc.filter", "*LotusToSc::Convert(): processed too much!");
        SAL_WARN_IF( nBytesLeft > 0, "sc.filter", "*LotusToSc::Convert(): what happens with the rest?" );

        if( rRest )
            aIn.SeekRel( nBytesLeft );  // Correct any remainder/overflow

        rRest = 0;
    }

    FUNC_TYPE LotusToSc::IndexToType( sal_uInt8 nIndex )
    {
        static const FUNC_TYPE pType[ 256 ] =
        {                       // Code Description
            FT_ConstFloat,      //    0 8-Byte-IEEE-Float
            FT_Variable,        //    1 Variable
            FT_Range,           //    2 Range
            FT_Return,          //    3 return
            FT_Braces,          //    4 Braces
            FT_ConstInt,        //    5 2-Byte integer
            FT_ConstString,     //    6 ASCII string
            FT_NOP,             //    7 NOP
            FT_Neg,             //    8 Negation
            FT_Op,              //    9 Addition
            FT_Op,              //   10 Subtraction
            FT_Op,              //   11 Multiplication
            FT_Op,              //   12 Division
            FT_Op,              //   13 Power of
            FT_Op,              //   14 equal
            FT_Op,              //   15 unequal
            FT_Op,              //   16 <=
            FT_Op,              //   17 >=
            FT_Op,              //   18 <
            FT_Op,              //   19 >
            FT_Op,              //   20 And (logic)
            FT_Op,              //   21 Or (logic)
            FT_FuncFix1,        //   22 Not (logic)
            FT_NOP,             //   23 unary Plus
            FT_NotImpl,         //   24
            FT_NotImpl,         //   25
            FT_NotImpl,         //   26
            FT_NotImpl,         //   27
            FT_NotImpl,         //   28
            FT_NotImpl,         //   29
            FT_NotImpl,         //   30
            FT_FuncFix0,        //   31 Not applicable
            FT_FuncFix0,        //   32 Error
            FT_FuncFix1,        //   33 Absolute value ABS()
            FT_FuncFix1,        //   34 Integer INT()
            FT_FuncFix1,        //   35 Square Root
            FT_FuncFix1,        //   36 Log10
            FT_FuncFix1,        //   37 Natural Logarithm
            FT_FuncFix0,        //   38 PI
            FT_FuncFix1,        //   39 Sine
            FT_FuncFix1,        //   40 Cosine
            FT_FuncFix1,        //   41 Tangens
            FT_FuncFix2,        //   42 Arctangens 2 (4.Quadrant) <- TODO: correct?
            FT_FuncFix1,        //   43 Arctangens (2.Quadrant)
            FT_FuncFix1,        //   44 Arcsine
            FT_FuncFix1,        //   45 Arccosine
            FT_FuncFix1,        //   46 Exponential function
            FT_FuncFix2,        //   47 Modulo
            FT_FuncVar,         //   48 Selection
            FT_FuncFix1,        //   49 Is not applicable?
            FT_FuncFix1,        //   50 Is Error?
            FT_FuncFix0,        //   51 FALSE
            FT_FuncFix0,        //   52 TRUE
            FT_FuncFix0,        //   53 Random number
            FT_FuncFix3,        //   54 Date
            FT_FuncFix0,        //   55 Today
            FT_FuncFix3,        //   56 Payment
            FT_FuncFix3,        //   57 Present Value
            FT_FuncFix3,        //   58 Future Value
            FT_FuncFix3,        //   59 If ... then ... else ...
            FT_FuncFix1,        //   60 Day of month
            FT_FuncFix1,        //   61 Month
            FT_FuncFix1,        //   62 Year
            FT_FuncFix2,        //   63 Round
            FT_FuncFix3,        //   64 Time
            FT_FuncFix1,        //   65 Hour
            FT_FuncFix1,        //   66 Minute
            FT_FuncFix1,        //   67 Second
            FT_FuncFix1,        //   68 Is Number?
            FT_FuncFix1,        //   69 Is Text?
            FT_FuncFix1,        //   70 Len()
            FT_FuncFix1,        //   71 Val()
            FT_FuncFix2,        //   72 String()
            FT_FuncFix3,        //   73 Mid()
            FT_FuncFix1,        //   74 Char()
            FT_FuncFix1,        //   75 Ascii()
            FT_FuncFix3,        //   76 Find()
            FT_FuncFix1,        //   77 Datevalue
            FT_FuncFix1,        //   78 Timevalue
            FT_FuncFix1,        //   79 Cellpointer
            FT_FuncVar,         //   80 Sum()
            FT_FuncVar,         //   81 Avg()
            FT_FuncVar,         //   82 Cnt()
            FT_FuncVar,         //   83 Min()
            FT_FuncVar,         //   84 Max()
            FT_FuncFix3,        //   85 Vlookup()
            FT_FuncFix2,        //   86 Npv()
            FT_FuncVar,         //   87 Var()
            FT_FuncVar,         //   88 Std()
            FT_FuncFix2,        //   89 Irr()
            FT_FuncFix3,        //   90 Hlookup()
            FT_FuncFix3,        //   91 ?
            FT_FuncFix3,        //   92 ?
            FT_FuncFix3,        //   93 ?
            FT_FuncFix3,        //   94 ?
            FT_FuncFix3,        //   95 ?
            FT_FuncFix3,        //   96 ?
            FT_FuncFix3,        //   97 ?
            FT_FuncFix3,        //   98 Index() <- TODO: correct?
            FT_FuncFix1,        //   99 Columns()
            FT_FuncFix1,        //  100 Rows()
            FT_FuncFix2,        //  101 Repeat()
            FT_FuncFix1,        //  102 Upper()
            FT_FuncFix1,        //  103 Lower()
            FT_FuncFix2,        //  104 Left()
            FT_FuncFix2,        //  105 Right()
            FT_FuncFix4,        //  106 Replace()
            FT_FuncFix1,        //  107 Proper()
            FT_FuncFix2,        //  108 Cell()
            FT_FuncFix1,        //  109 Trim()
            FT_FuncFix1,        //  110 Clean()
            FT_FuncFix1,        //  111 F()
            FT_FuncFix1,        //  112 W()
            FT_FuncFix2,        //  113 Exact()
            FT_NotImpl,         //  114 Call()
            FT_FuncFix1,        //  115 @@()
            FT_FuncFix3,        //  116 Rate()
            FT_FuncFix3,        //  117 Term()
            FT_FuncFix3,        //  118 Cterm()
            FT_FuncFix3,        //  119 Sln()
            FT_FuncFix4,        //  120 Syd(), Soy()
            FT_FuncFix4,        //  121 Ddb()
            FT_NotImpl,         //  122
            FT_NotImpl,         //  123
            FT_NotImpl,         //  124
            FT_NotImpl,         //  125
            FT_NotImpl,         //  126
            FT_NotImpl,         //  127
            FT_NotImpl,         //  128
            FT_NotImpl,         //  129
            FT_NotImpl,         //  130
            FT_NotImpl,         //  131
            FT_NotImpl,         //  132
            FT_NotImpl,         //  133
            FT_NotImpl,         //  134
            FT_NotImpl,         //  135
            FT_NotImpl,         //  136
            FT_NotImpl,         //  137
            FT_NotImpl,         //  138
            FT_NotImpl,         //  139
            FT_NotImpl,         //  140
            FT_NotImpl,         //  141
            FT_NotImpl,         //  142
            FT_NotImpl,         //  143
            FT_NotImpl,         //  144
            FT_NotImpl,         //  145
            FT_NotImpl,         //  146
            FT_NotImpl,         //  147
            FT_NotImpl,         //  148
            FT_NotImpl,         //  149
            FT_NotImpl,         //  150
            FT_NotImpl,         //  151
            FT_NotImpl,         //  152
            FT_NotImpl,         //  153
            FT_NotImpl,         //  154
            FT_NotImpl,         //  155
            FT_FuncVar,         //  156 TODO: ?
            FT_NotImpl,         //  157
            FT_NotImpl,         //  158
            FT_NotImpl,         //  159
            FT_NotImpl,         //  160
            FT_NotImpl,         //  161
            FT_NotImpl,         //  162
            FT_NotImpl,         //  163
            FT_NotImpl,         //  164
            FT_NotImpl,         //  165
            FT_NotImpl,         //  166
            FT_NotImpl,         //  167
            FT_NotImpl,         //  168
            FT_NotImpl,         //  169
            FT_NotImpl,         //  170
            FT_NotImpl,         //  171
            FT_NotImpl,         //  172
            FT_NotImpl,         //  173
            FT_NotImpl,         //  174
            FT_NotImpl,         //  175
            FT_NotImpl,         //  176
            FT_NotImpl,         //  177
            FT_NotImpl,         //  178
            FT_NotImpl,         //  179
            FT_NotImpl,         //  180
            FT_NotImpl,         //  181
            FT_NotImpl,         //  182
            FT_NotImpl,         //  183
            FT_NotImpl,         //  184
            FT_NotImpl,         //  185
            FT_NotImpl,         //  186
            FT_NotImpl,         //  187
            FT_NotImpl,         //  188
            FT_NotImpl,         //  189
            FT_NotImpl,         //  190
            FT_NotImpl,         //  191
            FT_NotImpl,         //  192
            FT_NotImpl,         //  193
            FT_NotImpl,         //  194
            FT_NotImpl,         //  195
            FT_NotImpl,         //  196
            FT_NotImpl,         //  197
            FT_NotImpl,         //  198
            FT_NotImpl,         //  199
            FT_NotImpl,         //  200
            FT_NotImpl,         //  201
            FT_NotImpl,         //  202
            FT_NotImpl,         //  203
            FT_NotImpl,         //  204
            FT_NotImpl,         //  205
            FT_FuncVar,         //  206 TODO: ?
            FT_NotImpl,         //  207
            FT_NotImpl,         //  208
            FT_NotImpl,         //  209
            FT_NotImpl,         //  210
            FT_NotImpl,         //  211
            FT_NotImpl,         //  212
            FT_NotImpl,         //  213
            FT_NotImpl,         //  214
            FT_NotImpl,         //  215
            FT_NotImpl,         //  216
            FT_NotImpl,         //  217
            FT_NotImpl,         //  218
            FT_NotImpl,         //  219
            FT_NotImpl,         //  220
            FT_NotImpl,         //  221
            FT_NotImpl,         //  222
            FT_NotImpl,         //  223
            FT_NotImpl,         //  224
            FT_NotImpl,         //  225
            FT_NotImpl,         //  226
            FT_NotImpl,         //  227
            FT_NotImpl,         //  228
            FT_NotImpl,         //  229
            FT_NotImpl,         //  230
            FT_NotImpl,         //  231
            FT_NotImpl,         //  232
            FT_NotImpl,         //  233
            FT_NotImpl,         //  234
            FT_NotImpl,         //  235
            FT_NotImpl,         //  236
            FT_NotImpl,         //  237
            FT_NotImpl,         //  238
            FT_NotImpl,         //  239
            FT_NotImpl,         //  240
            FT_NotImpl,         //  241
            FT_NotImpl,         //  242
            FT_NotImpl,         //  243
            FT_NotImpl,         //  244
            FT_NotImpl,         //  245
            FT_NotImpl,         //  246
            FT_NotImpl,         //  247
            FT_NotImpl,         //  248
            FT_NotImpl,         //  249
            FT_NotImpl,         //  250
            FT_NotImpl,         //  251
            FT_NotImpl,         //  252
            FT_NotImpl,         //  253
            FT_NotImpl,         //  254
            FT_FuncVar,         //  255 TODO: ?
        };
        return pType[ nIndex ];
    }

    DefTokenId LotusToSc::IndexToToken( sal_uInt8 nIndex )
    {
        static const DefTokenId pToken[ 256 ] =
        {                       // Code Description
            ocPush,             //    0 8-Byte-IEEE-Float
            ocPush,             //    1 Variable
            ocPush,             //    2 Range
            ocPush,             //    3 return
            ocPush,             //    4 Braces
            ocPush,             //    5 2-Byte integer
            ocPush,             //    6 ASCII string
            ocPush,             //    7 NOP
            ocNegSub,           //    8 Negation
            ocAdd,              //    9 Addition
            ocSub,              //   10 Subtraction
            ocMul,              //   11 Multiplication
            ocDiv,              //   12 Division
            ocPow,              //   13 Power of
            ocEqual,            //   14 equal
            ocNotEqual,         //   15 unequal
            ocLessEqual,        //   16 <=
            ocGreaterEqual,     //   17 >=
            ocLess,             //   18 <
            ocGreater,          //   19 >
            ocAnd,              //   20 And (logic)
            ocOr,               //   21 Or (logic)
            ocNot,              //   22 Not (logic)
            ocPush,             //   23 unary Plus
            ocNoName,           //   24
            ocNoName,           //   25
            ocNoName,           //   26
            ocNoName,           //   27
            ocNoName,           //   28
            ocNoName,           //   29
            ocNoName,           //   30
            ocNotAvail,         //   31 Not available
            ocNoName,           //   32 Error
            ocAbs,              //   33 Absolute value ABS()
            ocInt,              //   34 Integer INT()
            ocSqrt,             //   35 Square Root
            ocLog10,            //   36 Log10
            ocLn,               //   37 Natural Logarithm
            ocPi,               //   38 PI
            ocSin,              //   39 Sine
            ocCos,              //   40 Cosine
            ocTan,              //   41 Tangens
            ocArcTan2,          //   42 Arctangens 2 (4.Quadrant)
            ocArcTan,           //   43 Arctangens (2.Quadrant)
            ocArcSin,           //   44 Arcsine
            ocArcCos,           //   45 Arccosine
            ocExp,              //   46 Exponential function
            ocMod,              //   47 Modulo
            ocChoose,           //   48 Selection
            ocIsNA,             //   49 Is not available?
            ocIsError,          //   50 Is Error?
            ocFalse,            //   51 FALSE
            ocTrue,             //   52 TRUE
            ocRandom,           //   53 Random number
            ocGetDate,          //   54 Date
            ocGetActDate,       //   55 Today
            ocPMT,              //   56 Payment
            ocPV,               //   57 Present Value
            ocFV,               //   58 Future Value
            ocIf,               //   59 If ... then ... else ...
            ocGetDay,           //   60 Day of month
            ocGetMonth,         //   61 Month
            ocGetYear,          //   62 Year
            ocRound,            //   63 Round
            ocGetTime,          //   64 Time
            ocGetHour,          //   65 Hour
            ocGetMin,           //   66 Minute
            ocGetSec,           //   67 Second
            ocIsValue,          //   68 Is Number?
            ocIsString,         //   69 Is Text?
            ocLen,              //   70 Len()
            ocValue,            //   71 Val()
            ocFixed,            //   72 String()    ocFixed replacement + special case
            ocMid,              //   73 Mid()
            ocChar,             //   74 Char()
            ocCode,             //   75 Ascii()
            ocFind,             //   76 Find()
            ocGetDateValue,     //   77 Datevalue
            ocGetTimeValue,     //   78 Timevalue
            ocNoName,           //   79 Cellpointer
            ocSum,              //   80 Sum()
            ocAverageA,         //   81 Avg()
            ocCount2,           //   82 Cnt()
            ocMinA,             //   83 Min()
            ocMaxA,             //   84 Max()
            ocVLookup,          //   85 Vlookup()
            ocNPV,              //   86 Npv()
            ocVarPA,            //   87 Var()
            ocStDevPA,          //   88 Std()
            ocIRR,              //   89 Irr()
            ocHLookup,          //   90 Hlookup()
            ocDBSum,            //   91 XlfDsum
            ocDBAverage,        //   92 XlfDaverage
            ocDBCount2,         //   93 XlfDcount
            ocDBMin,            //   94 XlfDmin
            ocDBMax,            //   95 XlfDmax
            ocDBVarP,           //   96 XlfDvar
            ocDBStdDevP,        //   97 XlfDstdev
            ocIndex,            //   98 Index()
            ocColumns,          //   99 Columns()
            ocRows,             //  100 Rows()
            ocRept,             //  101 Repeat()
            ocUpper,            //  102 Upper()
            ocLower,            //  103 Lower()
            ocLeft,             //  104 Left()
            ocRight,            //  105 Right()
            ocReplace,          //  106 Replace()
            ocProper,           //  107 Proper()
            ocNoName,           //  108 Cell()
            ocTrim,             //  109 Trim()
            ocClean,            //  110 Clean()
            ocFalse,            //  111 F()
            ocTrue,             //  112 W()
            ocExact,            //  113 Exact()
            ocNoName,           //  114 Call()
            ocIndirect,         //  115 @@()
            ocRate,             //  116 Rate()
            ocNoName,           //  117 Term()
            ocNoName,           //  118 Cterm()
            ocSLN,              //  119 Sln()
            ocSYD,              //  120 Syd(), Soy()
            ocDDB,              //  121 Ddb()
            ocNoName,           //  122
            ocNoName,           //  123
            ocNoName,           //  124
            ocNoName,           //  125
            ocNoName,           //  126
            ocNoName,           //  127
            ocNoName,           //  128
            ocNoName,           //  129
            ocNoName,           //  130
            ocNoName,           //  131
            ocNoName,           //  132
            ocNoName,           //  133
            ocNoName,           //  134
            ocNoName,           //  135
            ocNoName,           //  136
            ocNoName,           //  137
            ocNoName,           //  138
            ocNoName,           //  139
            ocNoName,           //  140
            ocNoName,           //  141
            ocNoName,           //  142
            ocNoName,           //  143
            ocNoName,           //  144
            ocNoName,           //  145
            ocNoName,           //  146
            ocNoName,           //  147
            ocNoName,           //  148
            ocNoName,           //  149
            ocNoName,           //  150
            ocNoName,           //  151
            ocNoName,           //  152
            ocNoName,           //  153
            ocNoName,           //  154
            ocNoName,           //  155
            ocNoName,           //  156 TODO: ?
            ocNoName,           //  157
            ocNoName,           //  158
            ocNoName,           //  159
            ocNoName,           //  160
            ocNoName,           //  161
            ocNoName,           //  162
            ocNoName,           //  163
            ocNoName,           //  164
            ocNoName,           //  165
            ocNoName,           //  166
            ocNoName,           //  167
            ocNoName,           //  168
            ocNoName,           //  169
            ocNoName,           //  170
            ocNoName,           //  171
            ocNoName,           //  172
            ocNoName,           //  173
            ocNoName,           //  174
            ocNoName,           //  175
            ocNoName,           //  176
            ocNoName,           //  177
            ocNoName,           //  178
            ocNoName,           //  179
            ocNoName,           //  180
            ocNoName,           //  181
            ocNoName,           //  182
            ocNoName,           //  183
            ocNoName,           //  184
            ocNoName,           //  185
            ocNoName,           //  186
            ocNoName,           //  187
            ocNoName,           //  188
            ocNoName,           //  189
            ocNoName,           //  190
            ocNoName,           //  191
            ocNoName,           //  192
            ocNoName,           //  193
            ocNoName,           //  194
            ocNoName,           //  195
            ocNoName,           //  196
            ocNoName,           //  197
            ocNoName,           //  198
            ocNoName,           //  199
            ocNoName,           //  200
            ocNoName,           //  201
            ocNoName,           //  202
            ocNoName,           //  203
            ocNoName,           //  204
            ocNoName,           //  205
            ocNoName,           //  206 TODO: ?
            ocNoName,           //  207
            ocNoName,           //  208
            ocNoName,           //  209
            ocNoName,           //  210
            ocNoName,           //  211
            ocNoName,           //  212
            ocNoName,           //  213
            ocNoName,           //  214
            ocNoName,           //  215
            ocNoName,           //  216
            ocNoName,           //  217
            ocNoName,           //  218
            ocNoName,           //  219
            ocNoName,           //  220
            ocNoName,           //  221
            ocNoName,           //  222
            ocNoName,           //  223
            ocNoName,           //  224
            ocNoName,           //  225
            ocNoName,           //  226
            ocNoName,           //  227
            ocNoName,           //  228
            ocNoName,           //  229
            ocNoName,           //  230
            ocNoName,           //  231
            ocNoName,           //  232
            ocNoName,           //  233
            ocNoName,           //  234
            ocNoName,           //  235
            ocNoName,           //  236
            ocNoName,           //  237
            ocNoName,           //  238
            ocNoName,           //  239
            ocNoName,           //  240
            ocNoName,           //  241
            ocNoName,           //  242
            ocNoName,           //  243
            ocNoName,           //  244
            ocNoName,           //  245
            ocNoName,           //  246
            ocNoName,           //  247
            ocNoName,           //  248
            ocNoName,           //  249
            ocNoName,           //  250
            ocNoName,           //  251
            ocNoName,           //  252
            ocNoName,           //  253
            ocNoName,           //  254
            ocNoName            //  255 TODO: ?
        };

        return pToken[ nIndex ];
    }

    FUNC_TYPE LotusToSc::IndexToTypeWK123( sal_uInt8 nIndex )
    {
        static const FUNC_TYPE pType[ 256 ] =
        {                       // Code Description
            FT_Const10Float,    //    0 8-Byte-IEEE-Long-Number
            FT_Cref,            //    1 Cell Reference
            FT_Rref,            //    2 Area Reference
            FT_Return,          //    3 return
            FT_Braces,          //    4 Braces
            FT_Snum,            //    5 Short number
            FT_ConstString,     //    6 ASCII string
            FT_Nrref,           //    7 Named range reference
            FT_Absnref,         //    8 Absolute named range
            FT_Erref,           //    9 Err range reference
            FT_Ecref,           //   10 Err cell reference
            FT_Econstant,       //   11 Err constant
            FT_NotImpl,         //   12
            FT_NotImpl,         //   13
            FT_Neg,             //   14 Negation
            FT_Op,              //   15 Addition
            FT_Op,              //   16 Subtraction
            FT_Op,              //   17 Multiplication
            FT_Op,              //   18 Division
            FT_Op,              //   19 Power of
            FT_Op,              //   20 equal
            FT_Op,              //   21 unequal
            FT_Op,              //   22 <=
            FT_Op,              //   23 >=
            FT_Op,              //   24 <
            FT_Op,              //   25 >
            FT_Op,              //   26 And (logical)
            FT_Op,              //   27 Or (logical)
            FT_FuncFix1,        //   28 Not (logical)
            FT_NOP,             //   29 unary plus
            FT_Op,              //   30 Concatenation
            FT_FuncFix0,        //   31 Not applicable
            FT_FuncFix0,        //   32 Error
            FT_FuncFix1,        //   33 Absolute value ABS()
            FT_FuncFix1,        //   34 Integer INT()
            FT_FuncFix1,        //   35 Square root
            FT_FuncFix1,        //   36 Log10
            FT_FuncFix1,        //   37 Natural Logarithm
            FT_FuncFix0,        //   38 PI
            FT_FuncFix1,        //   39 Sine
            FT_FuncFix1,        //   40 Cosine
            FT_FuncFix1,        //   41 Tangens
            FT_FuncFix2,        //   42 Arctangens 2 (4.Quadrant)
            FT_FuncFix1,        //   43 Arctangens (2.Quadrant)
            FT_FuncFix1,        //   44 Arcsine
            FT_FuncFix1,        //   45 Arccosine
            FT_FuncFix1,        //   46 Exponential function
            FT_FuncFix2,        //   47 Modulo
            FT_FuncVar,         //   48 Selection
            FT_FuncFix1,        //   49 Is not applicable?
            FT_FuncFix1,        //   50 Is Error?
            FT_FuncFix0,        //   51 FALSE
            FT_FuncFix0,        //   52 TRUE
            FT_FuncFix0,        //   53 Random number
            FT_FuncFix3,        //   54 Date
            FT_FuncFix0,        //   55 Today
            FT_FuncFix3,        //   56 Payment
            FT_FuncFix3,        //   57 Present Value
            FT_FuncFix3,        //   58 Future Value
            FT_FuncFix3,        //   59 If ... then ... else ...
            FT_FuncFix1,        //   60 Day of Month
            FT_FuncFix1,        //   61 Month
            FT_FuncFix1,        //   62 Year
            FT_FuncFix2,        //   63 Round
            FT_FuncFix3,        //   64 Time
            FT_FuncFix1,        //   65 Hour
            FT_FuncFix1,        //   66 Minute
            FT_FuncFix1,        //   67 Second
            FT_FuncFix1,        //   68 Is Number?
            FT_FuncFix1,        //   69 Is Text?
            FT_FuncFix1,        //   70 Len()
            FT_FuncFix1,        //   71 Val()
            FT_FuncFix2,        //   72 String()
            FT_FuncFix3,        //   73 Mid()
            FT_FuncFix1,        //   74 Char()
            FT_FuncFix1,        //   75 Ascii()
            FT_FuncFix3,        //   76 Find()
            FT_FuncFix1,        //   77 Datevalue
            FT_FuncFix1,        //   78 Timevalue
            FT_FuncFix1,        //   79 Cellpointer
            FT_FuncVar,         //   80 Sum()
            FT_FuncVar,         //   81 Avg()
            FT_FuncVar,         //   82 Cnt()
            FT_FuncVar,         //   83 Min()
            FT_FuncVar,         //   84 Max()
            FT_FuncFix3,        //   85 Vlookup()
            FT_FuncFix2,        //   86 Npv()
            FT_FuncVar,         //   87 Var()
            FT_FuncVar,         //   88 Std()
            FT_FuncFix2,        //   89 Irr()
            FT_FuncFix3,        //   90 Hlookup()
            FT_FuncVar,         //   91 Dsum                 <- new
            FT_FuncVar,         //   92 Davg                 <- new
            FT_FuncVar,         //   93 Dcnt                 <- new
            FT_FuncVar,         //   94 Dmin                 <- new
            FT_FuncVar,         //   95 Dmax                 <- new
            FT_FuncVar,         //   96 Dvar                 <- new
            FT_FuncVar,         //   97 Dstd                 <- new
            FT_FuncVar,         //   98 Index()              <- change!
            FT_FuncFix1,        //   99 Columns()             <- new
            FT_FuncFix1,        //  100 Rows()               <- new
            FT_FuncFix2,        //  101 Repeat()             <- new
            FT_FuncFix1,        //  102 Upper()              <- new
            FT_FuncFix1,        //  103 Lower()              <- new
            FT_FuncFix2,        //  104 Left()               <- new
            FT_FuncFix2,        //  105 Right()              <- new
            FT_FuncFix4,        //  106 Replace()            <- new
            FT_FuncFix1,        //  107 Proper()             <- new
            FT_FuncFix2,        //  108 Cell()               <- new
            FT_FuncFix1,        //  109 Trim()               <- new
            FT_FuncFix1,        //  110 Clean()              <- new
            FT_FuncFix1,        //  111 S()                  <- change in name
            FT_FuncFix1,        //  112 N()                  <- change in name
            FT_FuncFix2,        //  113 Exact()              <- new
            FT_NotImpl,         //  114 App                  <- change in name
            FT_FuncFix1,        //  115 @@()                 <- new
            FT_FuncFix3,        //  116 Rate()               <- new
            FT_FuncFix3,        //  117 Term()
            FT_FuncFix3,        //  118 Cterm()
            FT_FuncFix3,        //  119 Sln()                <- new
            FT_FuncFix4,        //  120 Syd()                <- new
            FT_FuncFix4,        //  121 Ddb()                <- new
            FT_Splfunc,         //  122 Splfunc              <- new
            FT_FuncFix1,        //  123 Sheets               <- new
            FT_FuncFix1,        //  124 Info                 <- new
            FT_FuncVar,         //  125 Sumproduct           <- new
            FT_FuncFix1,        //  126 Isrange              <- new
            FT_FuncVar,         //  127 Dget                 <- new
            FT_FuncVar,         //  128 Dquery               <- new
            FT_FuncFix4,        //  129 Coord                <- new
            FT_NOP,             //  130 Reserved (internal)  <- new
            FT_FuncFix0,        //  131 Today                <- new
            FT_FuncVar,         //  132 Vdb                  <- new
            FT_FuncVar,         //  133 Dvars                <- new
            FT_FuncVar,         //  134 Dstds                <- new
            FT_FuncVar,         //  135 Vars                 <- new
            FT_FuncVar,         //  136 Stds                 <- new
            FT_FuncFix2,        //  137 D360                 <- new
            FT_NOP,             //  138 Reserved (internal)  <- new
            FT_FuncFix0,        //  139 Isapp                <- new quantity ?
            FT_FuncVar,         //  140 Isaaf                <- new quantity ?
            FT_FuncFix1,        //  141 Weekday              <- new
            FT_FuncFix3,        //  142 Datedif              <- new
            FT_FuncVar,         //  143 Rank                 <- new
            FT_FuncFix2,        //  144 Numberstring         <- new
            FT_FuncFix1,        //  145 Datestring           <- new
            FT_FuncFix1,        //  146 Decimal              <- new
            FT_FuncFix1,        //  147 Hex                  <- new
            FT_FuncFix4,        //  148 Db                   <- new
            FT_FuncFix4,        //  149 Pmti                 <- new
            FT_FuncFix4,        //  150 Spi                  <- new
            FT_FuncFix1,        //  151 Fullp                <- new
            FT_FuncFix1,        //  152 Halfp                <- new
            FT_FuncVar,         //  153 Pureavg              <- new
            FT_FuncVar,         //  154 Purecount            <- new
            FT_FuncVar,         //  155 Puremax              <- new
            FT_FuncVar,         //  156 Puremin              <- new
            FT_FuncVar,         //  157 Purestd              <- new
            FT_FuncVar,         //  158 Purevar              <- new
            FT_FuncVar,         //  159 Purestds             <- new
            FT_FuncVar,         //  160 Purevars             <- new
            FT_FuncFix3,        //  161 Pmt2                 <- new
            FT_FuncFix3,        //  162 Pv2                  <- new
            FT_FuncFix3,        //  163 Fv2                  <- new
            FT_FuncFix3,        //  164 Term2                <- new
            FT_NotImpl,         //  165--                    <- new quantity ?
            FT_FuncFix2,        //  166 D360 (US-Version)
            FT_NotImpl,         //  167
            FT_NotImpl,         //  168
            FT_NotImpl,         //  169
            FT_NotImpl,         //  170
            FT_NotImpl,         //  171
            FT_NotImpl,         //  172
            FT_NotImpl,         //  173
            FT_NotImpl,         //  174
            FT_NotImpl,         //  175
            FT_NotImpl,         //  176
            FT_NotImpl,         //  177
            FT_NotImpl,         //  178
            FT_NotImpl,         //  179
            FT_NotImpl,         //  180
            FT_NotImpl,         //  181
            FT_NotImpl,         //  182
            FT_NotImpl,         //  183
            FT_NotImpl,         //  184
            FT_NotImpl,         //  185
            FT_FuncVar,         //  186 Solver               <- new
            FT_NotImpl,         //  187
            FT_NotImpl,         //  188
            FT_NotImpl,         //  189
            FT_NotImpl,         //  190
            FT_NotImpl,         //  191
            FT_NotImpl,         //  192
            FT_NotImpl,         //  193
            FT_NotImpl,         //  194
            FT_NotImpl,         //  195
            FT_NotImpl,         //  196
            FT_NotImpl,         //  197
            FT_NotImpl,         //  198
            FT_NotImpl,         //  199
            FT_NotImpl,         //  200
            FT_NotImpl,         //  201
            FT_NotImpl,         //  202
            FT_NotImpl,         //  203
            FT_NotImpl,         //  204
            FT_NotImpl,         //  205
            FT_NotImpl,         //  206
            FT_NotImpl,         //  207
            FT_NotImpl,         //  208
            FT_NotImpl,         //  209
            FT_NotImpl,         //  210
            FT_NotImpl,         //  211
            FT_NotImpl,         //  212
            FT_NotImpl,         //  213
            FT_NotImpl,         //  214
            FT_NotImpl,         //  215
            FT_NotImpl,         //  216
            FT_NotImpl,         //  217
            FT_NotImpl,         //  218
            FT_NotImpl,         //  219
            FT_NotImpl,         //  220
            FT_NotImpl,         //  221
            FT_NotImpl,         //  222
            FT_NotImpl,         //  223
            FT_NotImpl,         //  224
            FT_NotImpl,         //  225
            FT_NotImpl,         //  226
            FT_NotImpl,         //  227
            FT_NotImpl,         //  228
            FT_NotImpl,         //  229
            FT_NotImpl,         //  230
            FT_NotImpl,         //  231
            FT_NotImpl,         //  232
            FT_NotImpl,         //  233
            FT_NotImpl,         //  234
            FT_NotImpl,         //  235
            FT_NotImpl,         //  236
            FT_NotImpl,         //  237
            FT_NotImpl,         //  238
            FT_NotImpl,         //  239
            FT_NotImpl,         //  240
            FT_NotImpl,         //  241
            FT_NotImpl,         //  242
            FT_NotImpl,         //  243
            FT_NotImpl,         //  244
            FT_NotImpl,         //  245
            FT_NotImpl,         //  246
            FT_NotImpl,         //  247
            FT_NotImpl,         //  248
            FT_NotImpl,         //  249
            FT_NotImpl,         //  250
            FT_NotImpl,         //  251
            FT_NotImpl,         //  252
            FT_NotImpl,         //  253
            FT_NotImpl,         //  254
            FT_NotImpl,         //  255
        };
        return pType[ nIndex ];
    }

    DefTokenId LotusToSc::IndexToTokenWK123( sal_uInt8 nIndex )
    {
        static const DefTokenId pToken[ 256 ] =
        {                       // Code Description
            ocPush,             //    0 8-Byte-IEEE-Long-Numbers
            ocPush,             //    1 Variable
            ocPush,             //    2 Range
            ocPush,             //    3 return
            ocPush,             //    4 Braces
            ocPush,             //    5 Numbers
            ocPush,             //    6 ASCII string
            ocPush,             //    7 Named range reference
            ocPush,             //    8 Absolute named range
            ocPush,             //    9 Err range reference
            ocPush,             //   10 Err cell reference
            ocPush,             //   11 Err constant
            ocPush,             //   12
            ocPush,             //   13
            ocNegSub,           //   14 Negation
            ocAdd,              //   15 Addition
            ocSub,              //   16 Subtraction
            ocMul,              //   17 Multiplication
            ocDiv,              //   18 Division
            ocPow,              //   19 Power of
            ocEqual,            //   20 Equality
            ocNotEqual,         //   21 Inequality
            ocLessEqual,        //   22 <=
            ocGreaterEqual,     //   23 >=
            ocLess,             //   24 <
            ocGreater,          //   25 >
            ocAnd,              //   26 And (logic)
            ocOr,               //   27 Or (logic)
            ocNot,              //   28 Not (logic)
            ocPush,             //   29 unary Plus
            ocAmpersand,        //   30 Concatenation
            ocNotAvail,         //   31 Not available
            ocNoName,           //   32 Error
            ocAbs,              //   33 Absolute Value ABS()
            ocInt,              //   34 Integer INT()
            ocSqrt,             //   35 Square Root
            ocLog10,            //   36 log10
            ocLn,               //   37 Natural logarithm
            ocPi,               //   38 Pi
            ocSin,              //   39 Sine
            ocCos,              //   40 Cosine
            ocTan,              //   41 Tangens
            ocArcTan2,          //   42 Arctangens 2 (4.Quadrant)
            ocArcTan,           //   43 Arctangens (2.Quadrant)
            ocArcSin,           //   44 Arcsine
            ocArcCos,           //   45 Arccosine
            ocExp,              //   46 Exponential function
            ocMod,              //   47 Modulo
            ocChoose,           //   48 Selection
            ocIsNA,             //   49 Is not available?
            ocIsError,          //   50 Is Error?
            ocFalse,            //   51 FALSE
            ocTrue,             //   52 TRUE
            ocRandom,           //   53 Random number
            ocGetDate,          //   54 Date
            ocGetActDate,       //   55 Today
            ocPMT,              //   56 Payment
            ocPV,               //   57 Present Value
            ocFV,               //   58 Future Value
            ocIf,               //   59 If... then... else...
            ocGetDay,           //   60 Day of Month
            ocGetMonth,         //   61 Month
            ocGetYear,          //   62 Year
            ocRound,            //   63 Round
            ocGetTime,          //   64 Time
            ocGetHour,          //   65 Hour
            ocGetMin,           //   66 Minute
            ocGetSec,           //   67 Second
            ocIsValue,          //   68 Is number?
            ocIsString,         //   69 Is text?
            ocLen,              //   70 Len()
            ocValue,            //   71 Val()
            ocFixed,            //   72 String()    ocFixed alternatively + special case
            ocMid,              //   73 Mid()
            ocChar,             //   74 Char()
            ocCode,             //   75 Ascii()
            ocFind,             //   76 Find()
            ocGetDateValue,     //   77 Datevalue
            ocGetTimeValue,     //   78 Timevalue
            ocNoName,           //   79 Cellpointer
            ocSum,              //   80 Sum()
            ocAverageA,         //   81 Avg()
            ocCount2,           //   82 Cnt()
            ocMinA,             //   83 Min()
            ocMaxA,             //   84 Max()
            ocVLookup,          //   85 Vlookup()
            ocNPV,              //   86 Npv()
            ocVarPA,            //   87 Var()
            ocStDevPA,          //   88 Std()
            ocIRR,              //   89 Irr()
            ocHLookup,          //   90 Hlookup()
            ocDBSum,            //   91 XlfDsum
            ocDBAverage,        //   92 XlfDaverage
            ocDBCount2,         //   93 XlfDcount
            ocDBMin,            //   94 XlfDmin
            ocDBMax,            //   95 XlfDmax
            ocDBVarP,           //   96 XlfDvar
            ocDBStdDevP,        //   97 XlfDstdev
            ocIndex,            //   98 Index()
            ocColumns,          //   99 Cols()
            ocRows,             //  100 Rows()
            ocRept,             //  101 Repeat()
            ocUpper,            //  102 Upper()
            ocLower,            //  103 Lower()
            ocLeft,             //  104 Left()
            ocRight,            //  105 Right()
            ocReplace,          //  106 Replace()
            ocProper,           //  107 Proper()
            ocNoName,           //  108 Cell()
            ocTrim,             //  109 Trim()
            ocClean,            //  110 Clean()
            ocNoName,           //  111 F()     (Excel: T()?)
            ocNoName,           //  112 W()
            ocExact,            //  113 Exact()
            ocNoName,           //  114 Call()
            ocIndirect,         //  115 @@()
            ocRate,             //  116 Rate()
            ocNoName,           //  117 Term()
            ocNoName,           //  118 Cterm()
            ocSLN,              //  119 Sln()
            ocSYD,              //  120 Syd(), Soy()
            ocDDB,              //  121 Ddb()
            ocNoName,           //  122 Splfunc
            ocNoName,           //  123 Sheets
            ocNoName,           //  124 Info
            ocSumProduct,       //  125 Sumproduct
            ocNoName,           //  126 Isrange
            ocDBGet,            //  127 Dget
            ocNoName,           //  128 Dquery
            ocNoName,           //  129 Coord
            ocNoName,           //  130 Reserved (internal)
            ocGetActDate,       //  131 Today
            ocNoName,           //  132 Vdb
            ocDBVar,            //  133 Dvars
            ocDBStdDev,         //  134 Dstds
            ocVarA,             //  135 Vars
            ocStDevA,           //  136 Stds
            ocGetDiffDate360,   //  137 D360
            ocNoName,           //  138 Reserved (internal)
            ocNoName,           //  139 Isapp
            ocNoName,           //  140 Isaaf
            ocGetDayOfWeek,     //  141 Weekday
            ocGetDiffDate,      //  142 Datedif
            ocRank,             //  143 Rank
            ocNoName,           //  144 Numberstring
            ocNoName,           //  145 Datestring
            ocNoName,           //  146 Decimal
            ocNoName,           //  147 Hex
            ocNoName,           //  148 Db
            ocNoName,           //  149 Pmti
            ocNoName,           //  150 Spi
            ocNoName,           //  151 Fullp
            ocNoName,           //  152 Halfp
            ocAverage,          //  153 Pureavg
            ocCount,            //  154 Purecount
            ocMax,              //  155 Puremax
            ocMin,              //  156 Puremin
            ocStDevP,           //  157 Purestd
            ocVarP,             //  158 Purevar
            ocStDev,            //  159 Purestds
            ocVar,              //  160 Purevars
            ocNoName,           //  161 Pmt2
            ocNoName,           //  162 Pv2
            ocNoName,           //  163 Fv2
            ocNoName,           //  164 Term2
            ocNoName,           //  165--                  <- new quantity ?
            ocGetDiffDate360,   //  166 D360 (US-Version, alternatively as other D360 function)
            ocNoName,           //  167
            ocNoName,           //  168
            ocNoName,           //  169
            ocNoName,           //  170
            ocNoName,           //  171
            ocNoName,           //  172
            ocNoName,           //  173
            ocNoName,           //  174
            ocNoName,           //  175
            ocNoName,           //  176
            ocNoName,           //  177
            ocNoName,           //  178
            ocNoName,           //  179
            ocNoName,           //  180
            ocNoName,           //  181
            ocNoName,           //  182
            ocNoName,           //  183
            ocNoName,           //  184
            ocNoName,           //  185
            ocNoName,           //  186
            ocNoName,           //  187
            ocNoName,           //  188
            ocNoName,           //  189
            ocNoName,           //  190
            ocNoName,           //  191
            ocNoName,           //  192
            ocNoName,           //  193
            ocNoName,           //  194
            ocNoName,           //  195
            ocNoName,           //  196
            ocNoName,           //  197
            ocNoName,           //  198
            ocNoName,           //  199
            ocNoName,           //  200
            ocNoName,           //  201
            ocNoName,           //  202
            ocNoName,           //  203
            ocNoName,           //  204
            ocNoName,           //  205
            ocNoName,           //  206 ?
            ocNoName,           //  207
            ocNoName,           //  208
            ocNoName,           //  209
            ocNoName,           //  210
            ocNoName,           //  211
            ocNoName,           //  212
            ocNoName,           //  213
            ocNoName,           //  214
            ocNoName,           //  215
            ocNoName,           //  216
            ocNoName,           //  217
            ocNoName,           //  218
            ocNoName,           //  219
            ocNoName,           //  220
            ocNoName,           //  221
            ocNoName,           //  222
            ocNoName,           //  223
            ocNoName,           //  224
            ocNoName,           //  225
            ocNoName,           //  226
            ocNoName,           //  227
            ocNoName,           //  228
            ocNoName,           //  229
            ocNoName,           //  230
            ocNoName,           //  231
            ocNoName,           //  232
            ocNoName,           //  233
            ocNoName,           //  234
            ocNoName,           //  235
            ocNoName,           //  236
            ocNoName,           //  237
            ocNoName,           //  238
            ocNoName,           //  239
            ocNoName,           //  240
            ocNoName,           //  241
            ocNoName,           //  242
            ocNoName,           //  243
            ocNoName,           //  244
            ocNoName,           //  245
            ocNoName,           //  246
            ocNoName,           //  247
            ocNoName,           //  248
            ocNoName,           //  249
            ocNoName,           //  250
            ocNoName,           //  251
            ocNoName,           //  252
            ocNoName,           //  253
            ocNoName,           //  254
            ocNoName            //  255 ?
        };

        return pToken[ nIndex ];
    }

    const sal_Char* GetAddInName( const sal_uInt8 n )
    {
        static const sal_Char*  pNames[ 256 ] =
        {
            nullptr,                       //    0 8-Byte-IEEE-Float
            nullptr,                       //    1 Variable
            nullptr,                       //    2 Range
            nullptr,                       //    3 return
            nullptr,                       //    4 Braces
            nullptr,                       //    5 2-Byte integer
            nullptr,                       //    6 ASCII string
            nullptr,                       //    7 Named range reference
            nullptr,                       //    8 Absolute named range
            nullptr,                       //    9 Err range reference
            nullptr,                       //   10 Err cell reference
            nullptr,                       //   11 Err constant
            nullptr,                       //   12
            nullptr,                       //   13
            nullptr,                       //   14 Negation
            nullptr,                       //   15 Addition
            nullptr,                       //   16 Subtraction
            nullptr,                       //   17 Multiplication
            nullptr,                       //   18 Division
            nullptr,                       //   19 Power of
            nullptr,                       //   20 equal
            nullptr,                       //   21 unequal
            nullptr,                       //   22 <=
            nullptr,                       //   23 >=
            nullptr,                       //   24 <
            nullptr,                       //   25 >
            nullptr,                       //   26 And (logic)
            nullptr,                       //   27 Or (logic)
            nullptr,                       //   28 Not (logic)
            nullptr,                       //   29 unary Plus
            nullptr,                       //   30 Concatenation
            nullptr,                       //   31 Not applicable
            nullptr,                       //   32 Error
            nullptr,                       //   33 Absolute Value ABS()
            nullptr,                       //   34 Integer INT()
            nullptr,                       //   35 Square Root
            nullptr,                       //   36 log10
            nullptr,                       //   37 Natural logarithm
            nullptr,                       //   38 PI
            nullptr,                       //   39 Sine
            nullptr,                       //   40 Cosine
            nullptr,                       //   41 Tangens
            nullptr,                       //   42 Arctangens 2 (4.Quadrant)
            nullptr,                       //   43 Arctangens (2.Quadrant)
            nullptr,                       //   44 Arcsine
            nullptr,                       //   45 Arccosine
            nullptr,                       //   46 Exponential function
            nullptr,                       //   47 Modulo
            nullptr,                       //   48 Selection
            nullptr,                       //   49 Is not applicable?
            nullptr,                       //   50 Is Error?
            nullptr,                       //   51 FALSE
            nullptr,                       //   52 TRUE
            nullptr,                       //   53 Random number
            nullptr,                       //   54 Date
            nullptr,                       //   55 Today
            nullptr,                       //   56 Payment
            nullptr,                       //   57 Present Value
            nullptr,                       //   58 Future Value
            nullptr,                       //   59 If ... then ... else ...
            nullptr,                       //   60 Day of Month
            nullptr,                       //   61 Month
            nullptr,                       //   62 Year
            nullptr,                       //   63 Round
            nullptr,                       //   64 Time
            nullptr,                       //   65 Hour
            nullptr,                       //   66 Minute
            nullptr,                       //   67 Second
            nullptr,                       //   68 Is Number?
            nullptr,                       //   69 Is Text?
            nullptr,                       //   70 Len()
            nullptr,                       //   71 Val()
            nullptr,                       //   72 String()    ocFixed as substitute + special case
            nullptr,                       //   73 Mid()
            nullptr,                       //   74 Char()
            nullptr,                       //   75 Ascii()
            nullptr,                       //   76 Find()
            nullptr,                       //   77 Datevalue
            nullptr,                       //   78 Timevalue
            "ZELLZEIGER",               //   79 Cellpointer
            nullptr,                       //   80 Sum()
            nullptr,                       //   81 Avg()
            nullptr,                       //   82 Cnt()
            nullptr,                       //   83 Min()
            nullptr,                       //   84 Max()
            nullptr,                       //   85 Vlookup()
            nullptr,                       //   86 Npv()
            nullptr,                       //   87 Var()
            nullptr,                       //   88 Std()
            nullptr,                       //   89 Irr()
            nullptr,                       //   90 Hlookup()
            nullptr,                       //   91 XlfDsum
            nullptr,                       //   92 XlfDaverage
            nullptr,                       //   93 XlfDcount
            nullptr,                       //   94 XlfDmin
            nullptr,                       //   95 XlfDmax
            nullptr,                       //   96 XlfDvar
            nullptr,                       //   97 XlfDstdev
            nullptr,                       //   98 Index()
            nullptr,                       //   99 Cols()
            nullptr,                       //  100 Rows()
            nullptr,                       //  101 Repeat()
            nullptr,                       //  102 Upper()
            nullptr,                       //  103 Lower()
            nullptr,                       //  104 Left()
            nullptr,                       //  105 Right()
            nullptr,                       //  106 Replace()
            nullptr,                       //  107 Proper()
            "ZELLE",                    //  108 Cell()
            nullptr,                       //  109 Trim()
            nullptr,                       //  110 Clean()
            "F",                        //  111 F()     (Excel: T()?)
            "W",                        //  112 W()
            nullptr,                       //  113 Exact()
            nullptr,                       //  114 Call()
            nullptr,                       //  115 @@()
            nullptr,                       //  116 Rate()
            "TERM",                     //  117 Term()
            "CTERM",                    //  118 Cterm()
            nullptr,                       //  119 Sln()
            nullptr,                       //  120 Syd(), Soy()
            nullptr,                       //  121 Ddb()
            "SplFunc",                  //  122 Splfunc
            "BLAETTER",                 //  123 Sheets
            "INFO",                     //  124 Info
            nullptr,                       //  125 Sumproduct
            "ISTBEREICH",               //  126 Isrange
            nullptr,                       //  127 Dget
            "DABFRAGE",                 //  128 Dquery
            "KOORD",                    //  129 Coord
            nullptr,                       //  130 Reserved (internal)
            nullptr,                       //  131 Today
            nullptr,                       //  132 Vdb
            nullptr,                       //  133 Dvars
            nullptr,                       //  134 Dstds
            nullptr,                       //  135 Vars
            nullptr,                       //  136 Stds
            nullptr,                       //  137 D360
            nullptr,                       //  138 Reserved (internal)
            nullptr,                       //  139 Isapp
            "ISTDEFZUS",                //  140 Isaaf
            nullptr,                       //  141 Weekday
            nullptr,                       //  142 Datedif
            nullptr,                       //  143 Rank
            nullptr,                       //  144 Numberstring
            "DATUMFOLGE",               //  145 Datestring
            "DEZIMAL",                  //  146 Decimal
            "HEX",                      //  147 Hex
            nullptr,                       //  148 Db
            nullptr,                       //  149 Pmti
            nullptr,                       //  150 Spi
            nullptr,                       //  151 Fullp
            nullptr,                       //  152 Halfp
            "PURMITTELWERT",            //  153 Pureavg
            "PURquantity",                //  154 Purecount
            "PURMAX",                   //  155 Puremax
            "PURMIN",                   //  156 Puremin
            "PURSTDABW",                //  157 Purestd
            "PURVAR",                   //  158 Purevar
            "PURSTDABWP",               //  159 Purestds
            "PURVARP",                  //  160 Purevars
            nullptr,                       //  161 Pmt2
            nullptr,                       //  162 Pv2
            nullptr,                       //  163 Fv2
            nullptr,                       //  164 Term2
            nullptr,                       //  165--                  <- new quantity ?
            nullptr,                       //  166 D360 (US-Version, alternatively as in D360-function)
            nullptr,                       //  167
            nullptr,                       //  168
            nullptr,                       //  169
            nullptr,                       //  170
            nullptr,                       //  171
            nullptr,                       //  172
            nullptr,                       //  173
            nullptr,                       //  174
            nullptr,                       //  175
            nullptr,                       //  176
            nullptr,                       //  177
            nullptr,                       //  178
            nullptr,                       //  179
            nullptr,                       //  180
            nullptr,                       //  181
            nullptr,                       //  182
            nullptr,                       //  183
            nullptr,                       //  184
            nullptr,                       //  185
            nullptr,                       //  186
            nullptr,                       //  187
            nullptr,                       //  188
            nullptr,                       //  189
            nullptr,                       //  190
            nullptr,                       //  191
            nullptr,                       //  192
            nullptr,                       //  193
            nullptr,                       //  194
            nullptr,                       //  195
            nullptr,                       //  196
            nullptr,                       //  197
            nullptr,                       //  198
            nullptr,                       //  199
            nullptr,                       //  200
            nullptr,                       //  201
            nullptr,                       //  202
            nullptr,                       //  203
            nullptr,                       //  204
            nullptr,                       //  205
            nullptr,                       //  206 TODO: ?
            nullptr,                       //  207
            nullptr,                       //  208
            nullptr,                       //  209
            nullptr,                       //  210
            nullptr,                       //  211
            nullptr,                       //  212
            nullptr,                       //  213
            nullptr,                       //  214
            nullptr,                       //  215
            nullptr,                       //  216
            nullptr,                       //  217
            nullptr,                       //  218
            nullptr,                       //  219
            nullptr,                       //  220
            nullptr,                       //  221
            nullptr,                       //  222
            nullptr,                       //  223
            nullptr,                       //  224
            nullptr,                       //  225
            nullptr,                       //  226
            nullptr,                       //  227
            nullptr,                       //  228
            nullptr,                       //  229
            nullptr,                       //  230
            nullptr,                       //  231
            nullptr,                       //  232
            nullptr,                       //  233
            nullptr,                       //  234
            nullptr,                       //  235
            nullptr,                       //  236
            nullptr,                       //  237
            nullptr,                       //  238
            nullptr,                       //  239
            nullptr,                       //  240
            nullptr,                       //  241
            nullptr,                       //  242
            nullptr,                       //  243
            nullptr,                       //  244
            nullptr,                       //  245
            nullptr,                       //  246
            nullptr,                       //  247
            nullptr,                       //  248
            nullptr,                       //  249
            nullptr,                       //  250
            nullptr,                       //  251
            nullptr,                       //  252
            nullptr,                       //  253
            nullptr,                       //  254
            nullptr                        //  255 TODO: ?
        };

        return pNames[ n ];
    }

    static DefTokenId lcl_KnownAddIn( const OString& rTest )
    {
        DefTokenId  eId = ocNoName;

        if (rTest == "FACT")
                eId = ocFact;
        else if (rTest == "ISEMPTY")
                eId=ocIsEmpty;
        else if (rTest == "DEGTORAD")
                eId=ocRad;
        else if (rTest == "RADTODEG")
                eId=ocDeg;
        else if (rTest == "SIGN")
                eId=ocPlusMinus;
        else if (rTest == "ACOSH")
                eId=ocArcCosHyp;
        else if (rTest == "ACOTH")
                eId=ocArcCotHyp;
        else if (rTest == "ASINH")
                eId=ocArcSinHyp;
        else if (rTest == "ATANH")
                eId=ocArcTanHyp;
        else if (rTest == "COSH")
                eId=ocCosHyp;
        else if (rTest == "COTH")
                eId=ocCotHyp;
        else if (rTest == "SINH")
                eId=ocSinHyp;
        else if (rTest == "TANH")
                eId=ocTanHyp;
        else if (rTest == "EVEN")
                eId=ocEven;
        else if (rTest == "ODD")
                eId=ocOdd;
        else if (rTest == "ACOT")
                eId=ocArcCot;
        else if (rTest == "COT")
                eId=ocCot;
        else if (rTest == "TRUNC")
                eId=ocTrunc;
        else if (rTest == "GEOMEAN")
                eId=ocGeoMean;
        else if (rTest == "HARMEAN")
                eId=ocHarMean;
        else if (rTest == "CORREL")
                eId=ocCorrel;
        else if (rTest == "MEDIAN")
                eId=ocMedian;
        else if (rTest == "COV")
                eId=ocCovar;
        else if (rTest == "SKEWNESS")
                eId=ocSkew;
        else if (rTest == "CHITEST")
                eId=ocChiTest;
        else if (rTest == "FTEST")
                eId=ocFTest;
        else if (rTest == "AVEDEV")
                eId=ocAveDev;
        else if (rTest == "PRODUCT")
                eId=ocProduct;
        else if (rTest == "PERMUT")
                eId=ocPermut;
        else if (rTest == "GAMMALN")
                eId=ocGammaLn;
        else if (rTest =="POISSON")
                eId=ocPoissonDist;
        else if (rTest == "NORMAL")
                eId=ocNormDist;
        else if (rTest == "CRITBINOMIAL")
                eId=ocCritBinom;
        else if (rTest == "TERM")
                eId=ocNper;
        else if (rTest == "CTERM")
                eId=ocNper;
        else if (rTest == "SUMIF")
                eId=ocSumIf;
        else if (rTest == "COUNTIF")
                eId=ocCountIf;
        else if (rTest == "DPURECOUNT")
                eId=ocDBCount;
        else if (rTest == "CSC")
                eId=ocCosecant;
        else if (rTest == "CSCH")
                eId=ocCosecantHyp;
        else if (rTest == "LARGE")
                eId=ocLarge;
        else if (rTest == "SMALL")
                eId=ocSmall;
        else if (rTest == "MODULO")
                eId=ocMod;
        else if (rTest == "ROUNDDOWN")
                eId=ocRoundDown;
        else if (rTest == "ROUNDUP")
                eId=ocRoundUp;
        else if (rTest == "SEC")
                eId=ocSecant;
        else if (rTest == "SECH")
                eId=ocSecantHyp;
        return eId;
    }

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

↑ V547 Expression 'nLauf != - 1' is always true.

↑ V768 The variable 'eType' is of enum type. It is odd that it is used as a variable of a Boolean-type.