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

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "excform.hxx"
      21             : #include <osl/endian.h>
      22             : 
      23             : #include "formulacell.hxx"
      24             : #include "document.hxx"
      25             : #include "rangenam.hxx"
      26             : #include "global.hxx"
      27             : #include "scmatrix.hxx"
      28             : 
      29             : #include "formula/errorcodes.hxx"
      30             : #include "svl/sharedstringpool.hxx"
      31             : 
      32             : #include "imp_op.hxx"
      33             : #include "root.hxx"
      34             : #include "xltracer.hxx"
      35             : #include "xihelper.hxx"
      36             : #include "xilink.hxx"
      37             : #include "xiname.hxx"
      38             : #include "documentimport.hxx"
      39             : 
      40             : using ::std::vector;
      41             : 
      42             : const sal_uInt16 ExcelToSc::nRowMask = 0x3FFF;
      43             : const sal_uInt16 ExcelToSc::nLastInd = 399;
      44             : 
      45             : 
      46           0 : void ImportExcel::Formula25()
      47             : {
      48           0 :     XclAddress aXclPos;
      49           0 :     sal_uInt16  nXF = 0, nFormLen;
      50             :     double  fCurVal;
      51             :     sal_uInt8   nFlag0;
      52             :     sal_Bool    bShrFmla;
      53             : 
      54           0 :     aIn >> aXclPos;
      55             : 
      56           0 :     if( GetBiff() == EXC_BIFF2 )
      57             :     {//                     BIFF2
      58             :         sal_uInt8 nDummy;
      59             : 
      60           0 :         aIn.Ignore( 3 );
      61             : 
      62           0 :         aIn >> fCurVal;
      63           0 :         aIn.Ignore( 1 );
      64           0 :         aIn >> nDummy;
      65           0 :         nFormLen = nDummy;
      66           0 :         bShrFmla = false;
      67             :     }
      68             :     else
      69             :     {//                     BIFF5
      70           0 :         aIn >> nXF >> fCurVal >> nFlag0;
      71           0 :         aIn.Ignore( 5 );
      72             : 
      73           0 :         aIn >> nFormLen;
      74             : 
      75           0 :         bShrFmla = nFlag0 & 0x08;   // shared or not shared
      76             :     }
      77             : 
      78           0 :     Formula( aXclPos, nXF, nFormLen, fCurVal, bShrFmla );
      79           0 : }
      80             : 
      81             : 
      82           0 : void ImportExcel::Formula3()
      83             : {
      84           0 :     Formula4();
      85           0 : }
      86             : 
      87             : 
      88           0 : void ImportExcel::Formula4()
      89             : {
      90           0 :     XclAddress aXclPos;
      91             :     sal_uInt16  nXF, nFormLen;
      92             :     double  fCurVal;
      93             :     sal_uInt8   nFlag0;
      94             : 
      95           0 :     aIn >> aXclPos >> nXF >> fCurVal >> nFlag0;
      96           0 :     aIn.Ignore( 1 );
      97           0 :     aIn >> nFormLen;
      98             : 
      99           0 :     Formula( aXclPos, nXF, nFormLen, fCurVal, false );
     100           0 : }
     101             : 
     102             : 
     103           0 : void ImportExcel::Formula(
     104             :     const XclAddress& rXclPos, sal_uInt16 nXF, sal_uInt16 nFormLen, double fCurVal, bool bShrFmla)
     105             : {
     106           0 :     if (!nFormLen)
     107           0 :         return;
     108             : 
     109           0 :     ScAddress aScPos( ScAddress::UNINITIALIZED );
     110           0 :     if (!GetAddressConverter().ConvertAddress(aScPos, rXclPos, GetCurrScTab(), true))
     111             :         // Conversion failed.
     112           0 :         return;
     113             : 
     114             :     // Formula will be read next, length in nFormLen
     115           0 :     const ScTokenArray* pResult = NULL;
     116             : 
     117           0 :     pFormConv->Reset( aScPos );
     118           0 :     ScDocumentImport& rDoc = GetDocImport();
     119             : 
     120           0 :     if (bShrFmla)
     121             :     {
     122             :         // This is a shared formula. Get the token array from the shared formula pool.
     123             :         SCCOL nSharedCol;
     124             :         SCROW nSharedRow;
     125           0 :         if (pFormConv->ReadSharedFormulaPosition(maStrm, nSharedCol, nSharedRow))
     126             :         {
     127           0 :             ScAddress aRefPos(nSharedCol, nSharedRow, GetCurrScTab());
     128           0 :             const ScTokenArray* pSharedCode = pFormConv->GetSharedFormula(aRefPos);
     129           0 :             if (pSharedCode)
     130             :             {
     131           0 :                 ScFormulaCell* pCell = new ScFormulaCell(pD, aScPos, *pSharedCode);
     132           0 :                 rDoc.getDoc().EnsureTable(aScPos.Tab());
     133           0 :                 rDoc.setFormulaCell(aScPos, pCell);
     134           0 :                 pCell->SetNeedNumberFormat(false);
     135           0 :                 if (!rtl::math::isNan(fCurVal))
     136           0 :                     pCell->SetResultDouble(fCurVal);
     137             : 
     138           0 :                 GetXFRangeBuffer().SetXF(aScPos, nXF);
     139           0 :                 SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
     140             :             }
     141             :             else
     142             :             {
     143             :                 // Shared formula not found even though it's clearly a shared formula.
     144             :                 // The cell will be created in the following shared formula
     145             :                 // record.
     146           0 :                 SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, NULL);
     147             :             }
     148           0 :             return;
     149             :         }
     150             :     }
     151             : 
     152           0 :     ConvErr eErr = pFormConv->Convert( pResult, maStrm, nFormLen, true, FT_CellFormula);
     153             : 
     154           0 :     ScFormulaCell* pCell = NULL;
     155             : 
     156           0 :     if (pResult)
     157             :     {
     158           0 :         pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, *pResult);
     159           0 :         rDoc.getDoc().EnsureTable(aScPos.Tab());
     160           0 :         rDoc.setFormulaCell(aScPos, pCell);
     161           0 :         SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
     162             :     }
     163             :     else
     164             :     {
     165           0 :         pCell = rDoc.getDoc().GetFormulaCell(aScPos);
     166           0 :         if (pCell)
     167           0 :             pCell->AddRecalcMode( RECALCMODE_ONLOAD_ONCE );
     168             :     }
     169             : 
     170           0 :     if (pCell)
     171             :     {
     172           0 :         pCell->SetNeedNumberFormat(false);
     173           0 :         if( eErr != ConvOK )
     174           0 :             ExcelToSc::SetError( *pCell, eErr );
     175             : 
     176           0 :         if (!rtl::math::isNan(fCurVal))
     177           0 :             pCell->SetResultDouble(fCurVal);
     178             :     }
     179             : 
     180           0 :     GetXFRangeBuffer().SetXF(aScPos, nXF);
     181             : }
     182             : 
     183             : 
     184           0 : ExcelToSc::ExcelToSc( const XclImpRoot& rRoot ) :
     185             :     ExcelConverterBase( 512 ),
     186             :     XclImpRoot( rRoot ),
     187             :     maFuncProv( rRoot ),
     188           0 :     meBiff( rRoot.GetBiff() )
     189             : {
     190           0 : }
     191             : 
     192           0 : ExcelToSc::~ExcelToSc()
     193             : {
     194           0 : }
     195             : 
     196           0 : void ExcelToSc::GetDummy( const ScTokenArray*& pErgebnis )
     197             : {
     198           0 :     aPool.Store( OUString("Dummy()") );
     199           0 :     aPool >> aStack;
     200           0 :     pErgebnis = aPool[ aStack.Get() ];
     201           0 : }
     202             : 
     203             : 
     204             : // if bAllowArrays is false stream seeks to first byte after <nFormulaLen>
     205             : // otherwise it will seek to the first byte after the additional content (eg
     206             : // inline arrays) following <nFormulaLen>
     207           0 : ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, sal_Size nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT )
     208             : {
     209           0 :     RootData&       rR = GetOldRoot();
     210             :     sal_uInt8           nOp, nLen, nByte;
     211             :     sal_uInt16          nUINT16;
     212             :     sal_Int16           nINT16;
     213             :     double          fDouble;
     214           0 :     OUString        aString;
     215           0 :     bool            bError = false;
     216           0 :     sal_Bool            bArrayFormula = false;
     217           0 :     TokenId         nMerk0;
     218           0 :     const sal_Bool      bRangeName = eFT == FT_RangeName;
     219           0 :     const sal_Bool      bSharedFormula = eFT == FT_SharedFormula;
     220           0 :     const sal_Bool      bConditional = eFT == FT_CondFormat;
     221           0 :     const sal_Bool      bRNorSF = bRangeName || bSharedFormula || bConditional;
     222             : 
     223             :     ScSingleRefData     aSRD;
     224             :     ScComplexRefData        aCRD;
     225           0 :     ExtensionTypeVec    aExtensions;
     226             : 
     227           0 :     bExternName = false;
     228             : 
     229           0 :     if( eStatus != ConvOK )
     230             :     {
     231           0 :         aIn.Ignore( nFormulaLen );
     232           0 :         return eStatus;
     233             :     }
     234             : 
     235           0 :     if( nFormulaLen == 0 )
     236             :     {
     237           0 :         aPool.Store( OUString("-/-") );
     238           0 :         aPool >> aStack;
     239           0 :         pErgebnis = aPool[ aStack.Get() ];
     240           0 :         return ConvOK;
     241             :     }
     242             : 
     243           0 :     sal_Size nEndPos = aIn.GetRecPos() + nFormulaLen;
     244             : 
     245           0 :     while( (aIn.GetRecPos() < nEndPos) && !bError )
     246             :     {
     247           0 :         aIn >> nOp;
     248             : 
     249             :         // always reset flags
     250           0 :         aSRD.InitFlags();
     251           0 :         aCRD.InitFlags();
     252             : 
     253           0 :         switch( nOp )   //                              book page:
     254             :         {           //                                      SDK4 SDK5
     255             :             case 0x01: // Array Formula                         [325    ]
     256             :                        // Array Formula or Shared Formula       [    277]
     257             :             case 0x02: // Data Table                            [325 277]
     258           0 :                 nUINT16 = 3;
     259             : 
     260           0 :                 if( meBiff != EXC_BIFF2 )
     261           0 :                     nUINT16++;
     262             : 
     263           0 :                 aIn.Ignore( nUINT16 );
     264             : 
     265           0 :                 bArrayFormula = sal_True;
     266           0 :                 break;
     267             :             case 0x03: // Addition                              [312 264]
     268           0 :                 aStack >> nMerk0;
     269           0 :                 aPool <<  aStack << ocAdd << nMerk0;
     270           0 :                 aPool >> aStack;
     271           0 :                 break;
     272             :             case 0x04: // Subtraction                           [313 264]
     273             :                 // SECOND-TOP minus TOP
     274           0 :                 aStack >> nMerk0;
     275           0 :                 aPool << aStack << ocSub << nMerk0;
     276           0 :                 aPool >> aStack;
     277           0 :                 break;
     278             :             case 0x05: // Multiplication                        [313 264]
     279           0 :                 aStack >> nMerk0;
     280           0 :                 aPool << aStack << ocMul << nMerk0;
     281           0 :                 aPool >> aStack;
     282           0 :                 break;
     283             :             case 0x06: // Division                              [313 264]
     284             :                 // divide TOP by SECOND-TOP
     285           0 :                 aStack >> nMerk0;
     286           0 :                 aPool << aStack << ocDiv << nMerk0;
     287           0 :                 aPool >> aStack;
     288           0 :                 break;
     289             :             case 0x07: // Exponentiation                            [313 265]
     290             :                 // raise SECOND-TOP to power of TOP
     291           0 :                 aStack >> nMerk0;
     292           0 :                 aPool << aStack << ocPow << nMerk0;
     293           0 :                 aPool >> aStack;
     294           0 :                 break;
     295             :             case 0x08: // Concatenation                         [313 265]
     296             :                 // append TOP to SECOND-TOP
     297           0 :                 aStack >> nMerk0;
     298           0 :                 aPool << aStack << ocAmpersand << nMerk0;
     299           0 :                 aPool >> aStack;
     300           0 :                 break;
     301             :             case 0x09: // Less Than                             [313 265]
     302             :                 // SECOND-TOP < TOP
     303           0 :                 aStack >> nMerk0;
     304           0 :                 aPool << aStack << ocLess << nMerk0;
     305           0 :                 aPool >> aStack;
     306           0 :                 break;
     307             :             case 0x0A: // Less Than or Equal                    [313 265]
     308             :                 // SECOND-TOP <= TOP
     309           0 :                 aStack >> nMerk0;
     310           0 :                 aPool << aStack << ocLessEqual << nMerk0;
     311           0 :                 aPool >> aStack;
     312           0 :                 break;
     313             :             case 0x0B: // Equal                                 [313 265]
     314             :                 // SECOND-TOP == TOP
     315           0 :                 aStack >> nMerk0;
     316           0 :                 aPool << aStack << ocEqual << nMerk0;
     317           0 :                 aPool >> aStack;
     318           0 :                 break;
     319             :             case 0x0C: // Greater Than or Equal                 [313 265]
     320             :                 // SECOND-TOP >= TOP
     321           0 :                 aStack >> nMerk0;
     322           0 :                 aPool << aStack << ocGreaterEqual << nMerk0;
     323           0 :                 aPool >> aStack;
     324           0 :                 break;
     325             :             case 0x0D: // Greater Than                          [313 265]
     326             :                 // SECOND-TOP > TOP
     327           0 :                 aStack >> nMerk0;
     328           0 :                 aPool << aStack << ocGreater << nMerk0;
     329           0 :                 aPool >> aStack;
     330           0 :                 break;
     331             :             case 0x0E: // Not Equal                             [313 265]
     332             :                 // SECOND-TOP != TOP
     333           0 :                 aStack >> nMerk0;
     334           0 :                 aPool << aStack << ocNotEqual << nMerk0;
     335           0 :                 aPool >> aStack;
     336           0 :                 break;
     337             :             case 0x0F: // Intersection                          [314 265]
     338           0 :                 aStack >> nMerk0;
     339           0 :                 aPool << aStack << ocIntersect << nMerk0;
     340           0 :                 aPool >> aStack;
     341           0 :                 break;
     342             :             case 0x10: // Union                                 [314 265]
     343             :                 // ocSep instead of 'ocUnion'
     344           0 :                 aStack >> nMerk0;
     345           0 :                 aPool << aStack << ocSep << nMerk0;
     346             :                     // doesn't fit exactly, but is more Excel-like
     347           0 :                 aPool >> aStack;
     348           0 :                 break;
     349             :             case 0x11: // Range                                 [314 265]
     350           0 :                 aStack >> nMerk0;
     351           0 :                 aPool << aStack << ocRange << nMerk0;
     352           0 :                 aPool >> aStack;
     353           0 :                 break;
     354             :             case 0x12: // Unary Plus                            [312 264]
     355           0 :                 aPool << ocAdd << aStack;
     356           0 :                 aPool >> aStack;
     357           0 :                 break;
     358             :             case 0x13: // Unary Minus                           [312 264]
     359           0 :                 aPool << ocNegSub << aStack;
     360           0 :                 aPool >> aStack;
     361           0 :                 break;
     362             :             case 0x14: // Percent Sign                          [312 264]
     363           0 :                 aPool << aStack << ocPercentSign;
     364           0 :                 aPool >> aStack;
     365           0 :                 break;
     366             :             case 0x15: // Parenthesis                           [326 278]
     367           0 :                 aPool << ocOpen << aStack << ocClose;
     368           0 :                 aPool >> aStack;
     369           0 :                 break;
     370             :             case 0x16: // Missing Argument                      [314 266]
     371           0 :                 aPool << ocMissing;
     372           0 :                 aPool >> aStack;
     373           0 :                 GetTracer().TraceFormulaMissingArg();
     374           0 :                 break;
     375             :             case 0x17: // String Constant                       [314 266]
     376           0 :                 aIn >> nLen;
     377           0 :                 aString = aIn.ReadRawByteString( nLen );
     378             : 
     379           0 :                 aStack << aPool.Store( aString );
     380           0 :                 break;
     381             :             case 0x19: // Special Attribute                     [327 279]
     382             :             {
     383             :                 sal_uInt16  nData, nFakt;
     384             :                 sal_uInt8   nOpt;
     385             : 
     386           0 :                 aIn >> nOpt;
     387             : 
     388           0 :                 if( meBiff == EXC_BIFF2 )
     389             :                 {
     390           0 :                     nData = aIn.ReaduInt8();
     391           0 :                     nFakt = 1;
     392             :                 }
     393             :                 else
     394             :                 {
     395           0 :                     aIn >> nData;
     396           0 :                     nFakt = 2;
     397             :                 }
     398             : 
     399           0 :                 if( nOpt & 0x04 )
     400             :                 {// nFakt -> skip bytes or words    AttrChoose
     401           0 :                     nData++;
     402           0 :                     aIn.Ignore( nData * nFakt );
     403             :                 }
     404           0 :                 else if( nOpt & 0x10 )                      // AttrSum
     405           0 :                     DoMulArgs( ocSum, 1 );
     406             :             }
     407           0 :                 break;
     408             :             case 0x1A: // External Reference                    [330    ]
     409           0 :                 switch( meBiff )
     410             :                 {
     411           0 :                     case EXC_BIFF2: aIn.Ignore( 7 );    break;
     412             :                     case EXC_BIFF3:
     413           0 :                     case EXC_BIFF4: aIn.Ignore( 10 );   break;
     414             :                     case EXC_BIFF5:
     415             :                         DBG_WARNING( "-ExcelToSc::Convert(): 0x1A does not exist in Biff5!" );
     416             :                     default:
     417             :                         DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
     418             :                 }
     419           0 :                 break;
     420             :             case 0x1B: // End External Reference                [330    ]
     421           0 :                 switch( meBiff )
     422             :                 {
     423           0 :                     case EXC_BIFF2: aIn.Ignore( 3 );    break;
     424             :                     case EXC_BIFF3:
     425           0 :                     case EXC_BIFF4: aIn.Ignore( 4 );    break;
     426             :                     case EXC_BIFF5:
     427             :                         DBG_WARNING( "-ExcelToSc::Convert(): 0x1B does not exist in Biff5!" );
     428             :                     default:
     429             :                         DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
     430             :                 }
     431           0 :                 break;
     432             :             case 0x1C: // Error Value                           [314 266]
     433             :             {
     434           0 :                 aIn >> nByte;
     435             :                 DefTokenId          eOc;
     436           0 :                 switch( nByte )
     437             :                 {
     438             :                     case EXC_ERR_NULL:
     439             :                     case EXC_ERR_DIV0:
     440             :                     case EXC_ERR_VALUE:
     441             :                     case EXC_ERR_REF:
     442             :                     case EXC_ERR_NAME:
     443           0 :                     case EXC_ERR_NUM:   eOc = ocStop;       break;
     444           0 :                     case EXC_ERR_NA:    eOc = ocNotAvail;   break;
     445           0 :                     default:            eOc = ocNoName;
     446             :                 }
     447           0 :                 aPool << eOc;
     448           0 :                 if( eOc != ocStop )
     449           0 :                     aPool << ocOpen << ocClose;
     450           0 :                 aPool >> aStack;
     451             :             }
     452           0 :                 break;
     453             :             case 0x1D: // Boolean                               [315 266]
     454           0 :                 aIn >> nByte;
     455           0 :                 if( nByte == 0 )
     456           0 :                     aPool << ocFalse << ocOpen << ocClose;
     457             :                 else
     458           0 :                     aPool << ocTrue << ocOpen << ocClose;
     459           0 :                 aPool >> aStack;
     460           0 :                 break;
     461             :             case 0x1E: // Integer                               [315 266]
     462           0 :                 aIn >> nUINT16;
     463           0 :                 aStack << aPool.Store( ( double ) nUINT16 );
     464           0 :                 break;
     465             :             case 0x1F: // Number                                [315 266]
     466           0 :                 aIn >> fDouble;
     467           0 :                 aStack << aPool.Store( fDouble );
     468           0 :                 break;
     469             :             case 0x40:
     470             :             case 0x60:
     471             :             case 0x20: // Array Constant                        [317 268]
     472           0 :                 aIn >> nByte >> nUINT16;
     473           0 :                 aIn.Ignore( (meBiff == EXC_BIFF2) ? 3 : 4 );
     474           0 :                 if( bAllowArrays )
     475             :                 {
     476           0 :                     aStack << aPool.StoreMatrix();
     477           0 :                     aExtensions.push_back( EXTENSION_ARRAY );
     478             :                 }
     479             :                 else
     480             :                 {
     481           0 :                     aPool << ocBad;
     482           0 :                     aPool >> aStack;
     483             :                 }
     484           0 :                 break;
     485             :             case 0x41:
     486             :             case 0x61:
     487             :             case 0x21: // Function, Fixed Number of Arguments   [333 282]
     488             :             {
     489             :                 sal_uInt16 nXclFunc;
     490           0 :                 if( meBiff <= EXC_BIFF3 )
     491           0 :                     nXclFunc = aIn.ReaduInt8();
     492             :                 else
     493           0 :                     aIn >> nXclFunc;
     494           0 :                 if( const XclFunctionInfo* pFuncInfo = maFuncProv.GetFuncInfoFromXclFunc( nXclFunc ) )
     495           0 :                     DoMulArgs( pFuncInfo->meOpCode, pFuncInfo->mnMaxParamCount );
     496             :                 else
     497           0 :                     DoMulArgs( ocNoName, 0 );
     498             :             }
     499           0 :             break;
     500             :             case 0x42:
     501             :             case 0x62:
     502             :             case 0x22: // Function, Variable Number of Arg.     [333 283]
     503             :             {
     504             :                 sal_uInt16 nXclFunc;
     505             :                 sal_uInt8 nParamCount;
     506           0 :                 aIn >> nParamCount;
     507           0 :                 nParamCount &= 0x7F;
     508           0 :                 if( meBiff <= EXC_BIFF3 )
     509           0 :                     nXclFunc = aIn.ReaduInt8();
     510             :                 else
     511           0 :                     aIn >> nXclFunc;
     512           0 :                 if( const XclFunctionInfo* pFuncInfo = maFuncProv.GetFuncInfoFromXclFunc( nXclFunc ) )
     513           0 :                     DoMulArgs( pFuncInfo->meOpCode, nParamCount );
     514             :                 else
     515           0 :                     DoMulArgs( ocNoName, 0 );
     516             :             }
     517           0 :             break;
     518             :             case 0x43:
     519             :             case 0x63:
     520             :             case 0x23: // Name                                  [318 269]
     521             :             {
     522           0 :                 aIn >> nUINT16;
     523           0 :                 switch( meBiff )
     524             :                 {
     525           0 :                     case EXC_BIFF2: aIn.Ignore( 5 );    break;
     526             :                     case EXC_BIFF3:
     527           0 :                     case EXC_BIFF4: aIn.Ignore( 8 );    break;
     528           0 :                     case EXC_BIFF5: aIn.Ignore( 12 );   break;
     529             :                     default:
     530             :                         OSL_FAIL(
     531             :                         "-ExcelToSc::Convert(): A little oblivious?" );
     532             :                 }
     533           0 :                 const XclImpName* pName = GetNameManager().GetName( nUINT16 );
     534           0 :                 if(pName && !pName->GetScRangeData())
     535           0 :                     aStack << aPool.Store( ocMacro, pName->GetXclName() );
     536             :                 else
     537           0 :                     aStack << aPool.StoreName(nUINT16, true);
     538             :             }
     539           0 :                 break;
     540             :             case 0x44:
     541             :             case 0x64:
     542             :             case 0x24: // Cell Reference                        [319 270]
     543             :             case 0x4A:
     544             :             case 0x6A:
     545             :             case 0x2A: // Deleted Cell Reference                [323 273]
     546           0 :                 aIn >> nUINT16 >> nByte;
     547           0 :                 aSRD.SetAbsCol(static_cast<SCsCOL>(nByte));
     548           0 :                 aSRD.SetAbsRow(nUINT16 & 0x3FFF);
     549           0 :                 aSRD.SetRelTab(0);
     550           0 :                 aSRD.SetFlag3D( bRangeName );
     551             : 
     552           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName );
     553             : 
     554           0 :                 switch ( nOp )
     555             :                 {
     556             :                     case 0x4A:
     557             :                     case 0x6A:
     558             :                     case 0x2A: // Deleted Cell Reference        [323 273]
     559             :                         // no information which part is deleted, set both
     560           0 :                         aSRD.SetColDeleted( true );
     561           0 :                         aSRD.SetRowDeleted( true );
     562             :                 }
     563             : 
     564           0 :                 aStack << aPool.Store( aSRD );
     565           0 :                 break;
     566             :             case 0x45:
     567             :             case 0x65:
     568             :             case 0x25: // Area Reference                        [320 270]
     569             :             case 0x4B:
     570             :             case 0x6B:
     571             :             case 0x2B: // Deleted Area Refernce                 [323 273]
     572             :             {
     573             :                 sal_uInt16          nRowFirst, nRowLast;
     574             :                 sal_uInt8           nColFirst, nColLast;
     575           0 :                 ScSingleRefData&    rSRef1 = aCRD.Ref1;
     576           0 :                 ScSingleRefData&    rSRef2 = aCRD.Ref2;
     577             : 
     578           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
     579             : 
     580           0 :                 rSRef1.SetRelTab(0);
     581           0 :                 rSRef2.SetRelTab(0);
     582           0 :                 rSRef1.SetFlag3D( bRangeName );
     583           0 :                 rSRef2.SetFlag3D( bRangeName );
     584             : 
     585           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
     586           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
     587             : 
     588           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
     589           0 :                     SetComplCol( aCRD );
     590           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
     591           0 :                     SetComplRow( aCRD );
     592             : 
     593           0 :                 switch ( nOp )
     594             :                 {
     595             :                     case 0x4B:
     596             :                     case 0x6B:
     597             :                     case 0x2B: // Deleted Area Refernce         [323 273]
     598             :                         // no information which part is deleted, set all
     599           0 :                         rSRef1.SetColDeleted( true );
     600           0 :                         rSRef1.SetRowDeleted( true );
     601           0 :                         rSRef2.SetColDeleted( true );
     602           0 :                         rSRef2.SetRowDeleted( true );
     603             :                 }
     604             : 
     605           0 :                 aStack << aPool.Store( aCRD );
     606             :             }
     607           0 :                 break;
     608             :             case 0x46:
     609             :             case 0x66:
     610             :             case 0x26: // Constant Reference Subexpression      [321 271]
     611           0 :                 aExtensions.push_back( EXTENSION_MEMAREA );
     612             :                 // fall through
     613             : 
     614             :             case 0x47:
     615             :             case 0x67:
     616             :             case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
     617             :             case 0x48:
     618             :             case 0x68:
     619             :             case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
     620           0 :                 aIn.Ignore( (meBiff == EXC_BIFF2) ? 4 : 6 );
     621           0 :                 break;
     622             :             case 0x4C:
     623             :             case 0x6C:
     624             :             case 0x2C: // Cell Reference Within a Name          [323    ]
     625             :                        // Cell Reference Within a Shared Formula[    273]
     626             :             {
     627           0 :                 aIn >> nUINT16 >> nByte;    // >> Attribute, Row >> Col
     628             : 
     629           0 :                 aSRD.SetRelTab(0);
     630           0 :                 aSRD.SetFlag3D( bRangeName );
     631             : 
     632           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF );
     633             : 
     634           0 :                 aStack << aPool.Store( aSRD );
     635             :             }
     636           0 :                 break;
     637             :             case 0x4D:
     638             :             case 0x6D:
     639             :             case 0x2D: // Area Reference Within a Name          [324    ]
     640             :             {      // Area Reference Within a Shared Formula[    274]
     641             :                 sal_uInt16                  nRowFirst, nRowLast;
     642             :                 sal_uInt8                   nColFirst, nColLast;
     643             : 
     644           0 :                 aCRD.Ref1.SetRelTab(0);
     645           0 :                 aCRD.Ref2.SetRelTab(0);
     646           0 :                 aCRD.Ref1.SetFlag3D( bRangeName );
     647           0 :                 aCRD.Ref2.SetFlag3D( bRangeName );
     648             : 
     649           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
     650             : 
     651           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRNorSF );
     652           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRNorSF );
     653             : 
     654           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
     655           0 :                     SetComplCol( aCRD );
     656           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
     657           0 :                     SetComplRow( aCRD );
     658             : 
     659           0 :                 aStack << aPool.Store( aCRD );
     660             :             }
     661           0 :                 break;
     662             :             case 0x49:
     663             :             case 0x69:
     664             :             case 0x29: // Variable Reference Subexpression      [331 281]
     665             :             case 0x4E:
     666             :             case 0x6E:
     667             :             case 0x2E: // Reference Subexpression Within a Name [332 282]
     668             :             case 0x4F:
     669             :             case 0x6F:
     670             :             case 0x2F: // Incomplete Reference Subexpression... [332 282]
     671           0 :                 aIn.Ignore( (meBiff == EXC_BIFF2) ? 1 : 2 );
     672           0 :                 break;
     673             :             case 0x58:
     674             :             case 0x78:
     675             :             case 0x38: // Command-Equivalent Function           [333    ]
     676           0 :                 aString = "COMM_EQU_FUNC";
     677           0 :                 aIn >> nByte;
     678           0 :                 aString += OUString::number( nByte );
     679           0 :                 aIn >> nByte;
     680           0 :                 aStack << aPool.Store( aString );
     681           0 :                 DoMulArgs( ocPush, nByte + 1 );
     682           0 :                 break;
     683             :             case 0x59:
     684             :             case 0x79:
     685             :             case 0x39: // Name or External Name                 [    275]
     686           0 :                 aIn >> nINT16;
     687           0 :                 aIn.Ignore( 8 );
     688           0 :                 aIn >> nUINT16;
     689           0 :                 if( nINT16 >= 0 )
     690             :                 {
     691           0 :                     const ExtName* pExtName = rR.pExtNameBuff->GetNameByIndex( nINT16, nUINT16 );
     692           0 :                     if( pExtName && pExtName->IsDDE() &&
     693           0 :                         rR.pExtSheetBuff->IsLink( ( sal_uInt16 ) nINT16 ) )
     694             :                     {
     695           0 :                         OUString        aAppl, aExtDoc;
     696           0 :                         TokenId         nPar1, nPar2;
     697             : 
     698           0 :                         rR.pExtSheetBuff->GetLink( ( sal_uInt16 ) nINT16 , aAppl, aExtDoc );
     699           0 :                         nPar1 = aPool.Store( aAppl );
     700           0 :                         nPar2 = aPool.Store( aExtDoc );
     701           0 :                         nMerk0 = aPool.Store( pExtName->aName );
     702           0 :                         aPool   << ocDde << ocOpen << nPar1 << ocSep << nPar2 << ocSep
     703           0 :                                 << nMerk0 << ocClose;
     704             : 
     705           0 :                         GetDoc().CreateDdeLink( aAppl, aExtDoc, pExtName->aName, SC_DDE_DEFAULT, ScMatrixRef() );
     706             :                     }
     707             :                     else
     708           0 :                         aPool << ocBad;
     709             : 
     710           0 :                     aPool >> aStack;
     711             :                 }
     712             :                 else
     713           0 :                     aStack << aPool.StoreName( nUINT16, true );
     714           0 :                 aIn.Ignore( 12 );
     715           0 :                 break;
     716             :             case 0x5A:
     717             :             case 0x7A:
     718             :             case 0x3A: // 3-D Cell Reference                    [    275]
     719             :             case 0x5C:
     720             :             case 0x7C:
     721             :             case 0x3C: // Deleted 3-D Cell Reference            [    277]
     722             :             {
     723             :                 sal_uInt16          nTabFirst, nTabLast, nRow;
     724             :                 sal_Int16           nExtSheet;
     725             :                 sal_uInt8           nCol;
     726             : 
     727           0 :                 aIn >> nExtSheet;
     728           0 :                 aIn.Ignore( 8 );
     729           0 :                 aIn >> nTabFirst >> nTabLast >> nRow >> nCol;
     730             : 
     731           0 :                 if( nExtSheet >= 0 )
     732             :                 {   // from external
     733           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
     734             :                     {
     735           0 :                         nTabFirst = nTabLast;
     736           0 :                         nExtSheet = 0;      // found
     737             :                     }
     738             :                     else
     739             :                     {
     740           0 :                         aPool << ocBad;
     741           0 :                         aPool >> aStack;
     742           0 :                         nExtSheet = 1;      // don't create a SingleRef
     743             :                     }
     744             :                 }
     745             : 
     746           0 :                 if( nExtSheet <= 0 )
     747             :                 {   // in current Workbook
     748           0 :                     aSRD.SetAbsTab(nTabFirst);
     749           0 :                     aSRD.SetFlag3D(true);
     750             : 
     751           0 :                     ExcRelToScRel( nRow, nCol, aSRD, bRangeName );
     752             : 
     753           0 :                     switch ( nOp )
     754             :                     {
     755             :                         case 0x5C:
     756             :                         case 0x7C:
     757             :                         case 0x3C: // Deleted 3-D Cell Reference    [    277]
     758             :                             // no information which part is deleted, set both
     759           0 :                             aSRD.SetColDeleted( true );
     760           0 :                             aSRD.SetRowDeleted( true );
     761             :                     }
     762           0 :                     if ( !ValidTab(static_cast<SCTAB>(nTabFirst)) )
     763           0 :                         aSRD.SetTabDeleted( true );
     764             : 
     765           0 :                     if( nTabLast != nTabFirst )
     766             :                     {
     767           0 :                         aCRD.Ref1 = aCRD.Ref2 = aSRD;
     768           0 :                         aCRD.Ref2.SetAbsTab(nTabLast);
     769           0 :                         aCRD.Ref2.SetTabDeleted( !ValidTab(static_cast<SCTAB>(nTabLast)) );
     770           0 :                         aStack << aPool.Store( aCRD );
     771             :                     }
     772             :                     else
     773           0 :                         aStack << aPool.Store( aSRD );
     774             :                 }
     775             :             }
     776             : 
     777           0 :                 break;
     778             :             case 0x5B:
     779             :             case 0x7B:
     780             :             case 0x3B: // 3-D Area Reference                    [    276]
     781             :             case 0x5D:
     782             :             case 0x7D:
     783             :             case 0x3D: // Deleted 3-D Area Reference            [    277]
     784             :             {
     785             :                 sal_uInt16      nTabFirst, nTabLast, nRowFirst, nRowLast;
     786             :                 sal_Int16       nExtSheet;
     787             :                 sal_uInt8       nColFirst, nColLast;
     788             : 
     789           0 :                 aIn >> nExtSheet;
     790           0 :                 aIn.Ignore( 8 );
     791           0 :                 aIn >> nTabFirst >> nTabLast >> nRowFirst >> nRowLast
     792           0 :                     >> nColFirst >> nColLast;
     793             : 
     794           0 :                 if( nExtSheet >= 0 )
     795             :                     // von extern
     796             :                 {
     797           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
     798             :                     {
     799           0 :                         nTabFirst = nTabLast;
     800           0 :                         nExtSheet = 0;      // found
     801             :                     }
     802             :                     else
     803             :                     {
     804           0 :                         aPool << ocBad;
     805           0 :                         aPool >> aStack;
     806           0 :                         nExtSheet = 1;      // don't create a CompleteRef
     807             :                     }
     808             :                 }
     809             : 
     810           0 :                 if( nExtSheet <= 0 )
     811             :                 {// in current Workbook
     812             :                     // first part of range
     813           0 :                     ScSingleRefData&    rR1 = aCRD.Ref1;
     814           0 :                     ScSingleRefData&    rR2 = aCRD.Ref2;
     815             : 
     816           0 :                     rR1.SetAbsTab(nTabFirst);
     817           0 :                     rR2.SetAbsTab(nTabLast);
     818           0 :                     rR1.SetFlag3D(true);
     819           0 :                     rR2.SetFlag3D( nTabFirst != nTabLast );
     820             : 
     821           0 :                     ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
     822           0 :                     ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
     823             : 
     824           0 :                     if( IsComplColRange( nColFirst, nColLast ) )
     825           0 :                         SetComplCol( aCRD );
     826           0 :                     else if( IsComplRowRange( nRowFirst, nRowLast ) )
     827           0 :                         SetComplRow( aCRD );
     828             : 
     829           0 :                     switch ( nOp )
     830             :                     {
     831             :                         case 0x5D:
     832             :                         case 0x7D:
     833             :                         case 0x3D: // Deleted 3-D Area Reference    [    277]
     834             :                                // no information which part is deleted, set all
     835           0 :                             rR1.SetColDeleted( true );
     836           0 :                             rR1.SetRowDeleted( true );
     837           0 :                             rR2.SetColDeleted( true );
     838           0 :                             rR2.SetRowDeleted( true );
     839             :                     }
     840           0 :                     if ( !ValidTab(static_cast<SCTAB>(nTabFirst)) )
     841           0 :                         rR1.SetTabDeleted( true );
     842           0 :                     if ( !ValidTab(static_cast<SCTAB>(nTabLast)) )
     843           0 :                         rR2.SetTabDeleted( true );
     844             : 
     845           0 :                     aStack << aPool.Store( aCRD );
     846             :                 }//END in current Workbook
     847             :             }
     848           0 :                 break;
     849           0 :             default: bError = true;
     850             :         }
     851           0 :         bError |= !aIn.IsValid();
     852             :     }
     853             : 
     854             :     ConvErr eRet;
     855             : 
     856           0 :     if( bError )
     857             :     {
     858           0 :         aPool << ocBad;
     859           0 :         aPool >> aStack;
     860           0 :         pErgebnis = aPool[ aStack.Get() ];
     861           0 :         eRet = ConvErrNi;
     862             :     }
     863           0 :     else if( aIn.GetRecPos() != nEndPos )
     864             :     {
     865           0 :         aPool << ocBad;
     866           0 :         aPool >> aStack;
     867           0 :         pErgebnis = aPool[ aStack.Get() ];
     868           0 :         eRet = ConvErrCount;
     869             :     }
     870           0 :     else if( bExternName )
     871             :     {
     872           0 :         pErgebnis = aPool[ aStack.Get() ];
     873           0 :         eRet = ConvErrExternal;
     874             :     }
     875           0 :     else if( bArrayFormula )
     876             :     {
     877           0 :         pErgebnis = NULL;
     878           0 :         eRet = ConvOK;
     879             :     }
     880             :     else
     881             :     {
     882           0 :         pErgebnis = aPool[ aStack.Get() ];
     883           0 :         eRet = ConvOK;
     884             :     }
     885             : 
     886           0 :     aIn.Seek( nEndPos );
     887             : 
     888           0 :     if( eRet == ConvOK )
     889           0 :         ReadExtensions( aExtensions, aIn );
     890             : 
     891           0 :     return eRet;
     892             : }
     893             : 
     894             : 
     895             : // stream seeks to first byte after <nFormulaLen>
     896           0 : ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal_Size nFormulaLen,
     897             :                             SCsTAB nTab, const FORMULA_TYPE eFT )
     898             : {
     899           0 :     RootData&       rR = GetOldRoot();
     900             :     sal_uInt8           nOp, nLen;
     901             :     sal_Size        nIgnore;
     902             :     sal_uInt16          nUINT16;
     903             :     sal_uInt8           nByte;
     904           0 :     bool            bError = false;
     905           0 :     const sal_Bool      bRangeName = eFT == FT_RangeName;
     906           0 :     const sal_Bool      bSharedFormula = eFT == FT_SharedFormula;
     907           0 :     const sal_Bool      bRNorSF = bRangeName || bSharedFormula;
     908             : 
     909             :     ScSingleRefData aSRD;
     910             :     ScComplexRefData    aCRD;
     911           0 :     aCRD.Ref1.SetAbsTab(aEingPos.Tab());
     912           0 :     aCRD.Ref2.SetAbsTab(aEingPos.Tab());
     913             : 
     914           0 :     bExternName = false;
     915             : 
     916           0 :     if( eStatus != ConvOK )
     917             :     {
     918           0 :         aIn.Ignore( nFormulaLen );
     919           0 :         return eStatus;
     920             :     }
     921             : 
     922           0 :     if( nFormulaLen == 0 )
     923           0 :         return ConvOK;
     924             : 
     925           0 :     sal_Size nEndPos = aIn.GetRecPos() + nFormulaLen;
     926             : 
     927           0 :     while( (aIn.GetRecPos() < nEndPos) && !bError )
     928             :     {
     929           0 :         aIn >> nOp;
     930           0 :         nIgnore = 0;
     931             : 
     932             :         // always reset flags
     933           0 :         aSRD.InitFlags();
     934           0 :         aCRD.InitFlags();
     935             : 
     936           0 :         switch( nOp )   //                              book page:
     937             :         {           //                                      SDK4 SDK5
     938             :             case 0x01: // Array Formula                         [325    ]
     939             :                        // Array Formula or Shared Formula       [    277]
     940           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 3 : 4;
     941           0 :                 break;
     942             :             case 0x02: // Data Table                            [325 277]
     943           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 3 : 4;
     944           0 :                 break;
     945             :             case 0x03: // Addition                              [312 264]
     946             :             case 0x04: // Subtraction                           [313 264]
     947             :             case 0x05: // Multiplication                        [313 264]
     948             :             case 0x06: // Division                              [313 264]
     949             :             case 0x07: // Exponetiation                         [313 265]
     950             :             case 0x08: // Concatenation                         [313 265]
     951             :             case 0x09: // Less Than                             [313 265]
     952             :             case 0x0A: // Less Than or Equal                    [313 265]
     953             :             case 0x0B: // Equal                                 [313 265]
     954             :             case 0x0C: // Greater Than or Equal                 [313 265]
     955             :             case 0x0D: // Greater Than                          [313 265]
     956             :             case 0x0E: // Not Equal                             [313 265]
     957             :             case 0x0F: // Intersection                          [314 265]
     958             :             case 0x10: // Union                                 [314 265]
     959             :             case 0x11: // Range                                 [314 265]
     960             :             case 0x12: // Unary Plus                            [312 264]
     961             :             case 0x13: // Unary Minus                           [312 264]
     962             :             case 0x14: // Percent Sign                          [312 264]
     963             :             case 0x15: // Parenthesis                           [326 278]
     964             :             case 0x16: // Missing Argument                      [314 266]
     965           0 :                 break;
     966             :             case 0x17: // String Constant                       [314 266]
     967           0 :                 aIn >> nLen;
     968           0 :                 nIgnore = nLen;
     969           0 :                 break;
     970             :             case 0x19: // Special Attribute                     [327 279]
     971             :             {
     972             :                 sal_uInt16 nData, nFakt;
     973             :                 sal_uInt8 nOpt;
     974             : 
     975           0 :                 aIn >> nOpt;
     976             : 
     977           0 :                 if( meBiff == EXC_BIFF2 )
     978             :                 {
     979           0 :                     nData = aIn.ReaduInt8();
     980           0 :                     nFakt = 1;
     981             :                 }
     982             :                 else
     983             :                 {
     984           0 :                     aIn >> nData;
     985           0 :                     nFakt = 2;
     986             :                 }
     987             : 
     988           0 :                 if( nOpt & 0x04 )
     989             :                 {// nFakt -> skip bytes or words    AttrChoose
     990           0 :                     nData++;
     991           0 :                     aIn.Ignore( nData * nFakt );
     992             :                 }
     993             :             }
     994           0 :                 break;
     995             :             case 0x1A: // External Reference                    [330    ]
     996           0 :                 switch( meBiff )
     997             :                 {
     998           0 :                     case EXC_BIFF2: nIgnore = 7;    break;
     999             :                     case EXC_BIFF3:
    1000           0 :                     case EXC_BIFF4: nIgnore = 10;   break;
    1001             :                     case EXC_BIFF5: DBG_WARNING( "-ExcelToSc::Convert(): 0x1A does not exist in Biff5!" );
    1002             :                     default:        DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
    1003             :                 }
    1004           0 :                 break;
    1005             :             case 0x1B: // End External Reference                [330    ]
    1006           0 :                 switch( meBiff )
    1007             :                 {
    1008           0 :                     case EXC_BIFF2: nIgnore = 3;        break;
    1009             :                     case EXC_BIFF3:
    1010           0 :                     case EXC_BIFF4: nIgnore = 4;        break;
    1011             :                     case EXC_BIFF5: DBG_WARNING( "-ExcelToSc::Convert(): 0x1B does not exist in Biff5!" );
    1012             :                     default:        DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
    1013             :                 }
    1014           0 :                 break;
    1015             :             case 0x1C: // Error Value                           [314 266]
    1016             :             case 0x1D: // Boolean                               [315 266]
    1017           0 :                 nIgnore = 1;
    1018           0 :                 break;
    1019             :             case 0x1E: // Integer                               [315 266]
    1020           0 :                 nIgnore = 2;
    1021           0 :                 break;
    1022             :             case 0x1F: // Number                                [315 266]
    1023           0 :                 nIgnore = 8;
    1024           0 :                 break;
    1025             :             case 0x40:
    1026             :             case 0x60:
    1027             :             case 0x20: // Array Constant                        [317 268]
    1028           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 6 : 7;
    1029           0 :                 break;
    1030             :             case 0x41:
    1031             :             case 0x61:
    1032             :             case 0x21: // Function, Fixed Number of Arguments   [333 282]
    1033           0 :                 nIgnore = (meBiff <= EXC_BIFF3) ? 1 : 2;
    1034           0 :                 break;
    1035             :             case 0x42:
    1036             :             case 0x62:
    1037             :             case 0x22: // Function, Variable Number of Arg.     [333 283]
    1038           0 :                 nIgnore = (meBiff <= EXC_BIFF3) ? 2 : 3;
    1039           0 :                 break;
    1040             :             case 0x43:
    1041             :             case 0x63:
    1042             :             case 0x23: // Name                                  [318 269]
    1043           0 :                 switch( meBiff )
    1044             :                 {
    1045           0 :                     case EXC_BIFF2: nIgnore = 7;    break;
    1046             :                     case EXC_BIFF3:
    1047           0 :                     case EXC_BIFF4: nIgnore = 10;   break;
    1048           0 :                     case EXC_BIFF5: nIgnore = 14;   break;
    1049             :                     default:        OSL_FAIL( "-ExcelToSc::Convert(): A little oblivious?" );
    1050             :                 }
    1051           0 :                 break;
    1052             :             case 0x44:
    1053             :             case 0x64:
    1054             :             case 0x24: // Cell Reference                        [319 270]
    1055           0 :                 aIn >> nUINT16 >> nByte;
    1056           0 :                 aSRD.SetAbsCol(static_cast<SCsCOL>(nByte));
    1057           0 :                 aSRD.SetAbsRow(nUINT16 & 0x3FFF);
    1058           0 :                 aSRD.SetRelTab(0);
    1059           0 :                 aSRD.SetFlag3D( bRangeName );
    1060             : 
    1061           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName );
    1062             : 
    1063           0 :                 rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1064           0 :                 break;
    1065             :             case 0x45:
    1066             :             case 0x65:
    1067             :             case 0x25: // Area Reference                        [320 270]
    1068             :             {
    1069             :                 sal_uInt16          nRowFirst, nRowLast;
    1070             :                 sal_uInt8           nColFirst, nColLast;
    1071           0 :                 ScSingleRefData &rSRef1 = aCRD.Ref1;
    1072           0 :                 ScSingleRefData &rSRef2 = aCRD.Ref2;
    1073             : 
    1074           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
    1075             : 
    1076           0 :                 rSRef1.SetRelTab(0);
    1077           0 :                 rSRef2.SetRelTab(0);
    1078           0 :                 rSRef1.SetFlag3D( bRangeName );
    1079           0 :                 rSRef2.SetFlag3D( bRangeName );
    1080             : 
    1081           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
    1082           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
    1083             : 
    1084           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
    1085           0 :                     SetComplCol( aCRD );
    1086           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1087           0 :                     SetComplRow( aCRD );
    1088             : 
    1089           0 :                 rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1090             :             }
    1091           0 :                 break;
    1092             :             case 0x46:
    1093             :             case 0x66:
    1094             :             case 0x26: // Constant Reference Subexpression      [321 271]
    1095             :             case 0x47:
    1096             :             case 0x67:
    1097             :             case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
    1098             :             case 0x48:
    1099             :             case 0x68:
    1100             :             case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
    1101           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 4 : 6;
    1102           0 :                 break;
    1103             :             case 0x4A:
    1104             :             case 0x6A:
    1105             :             case 0x2A: // Deleted Cell Reference                [323 273]
    1106           0 :                 nIgnore = 3;
    1107           0 :                 break;
    1108             :             case 0x4B:
    1109             :             case 0x6B:
    1110             :             case 0x2B: // Deleted Area Refernce                 [323 273]
    1111           0 :                 nIgnore = 6;
    1112           0 :                 break;
    1113             :             case 0x4C:
    1114             :             case 0x6C:
    1115             :             case 0x2C: // Cell Reference Within a Name          [323    ]
    1116             :                        // Cell Reference Within a Shared Formula[    273]
    1117             :             {
    1118           0 :                 aIn >> nUINT16 >> nByte;    // >> Attribute, Row >> Col
    1119             : 
    1120           0 :                 aSRD.SetRelTab(0);
    1121           0 :                 aSRD.SetFlag3D( bRangeName );
    1122             : 
    1123           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF );
    1124             : 
    1125           0 :                 rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1126             :             }
    1127           0 :                 break;
    1128             :             case 0x4D:
    1129             :             case 0x6D:
    1130             :             case 0x2D: // Area Reference Within a Name          [324    ]
    1131             :             {      // Area Reference Within a Shared Formula[    274]
    1132             :                 sal_uInt16                  nRowFirst, nRowLast;
    1133             :                 sal_uInt8                   nColFirst, nColLast;
    1134             : 
    1135           0 :                 aCRD.Ref1.SetRelTab(0);
    1136           0 :                 aCRD.Ref2.SetRelTab(0);
    1137           0 :                 aCRD.Ref1.SetFlag3D( bRangeName );
    1138           0 :                 aCRD.Ref2.SetFlag3D( bRangeName );
    1139             : 
    1140           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
    1141             : 
    1142           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRNorSF );
    1143           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRNorSF );
    1144             : 
    1145           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
    1146           0 :                     SetComplCol( aCRD );
    1147           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1148           0 :                     SetComplRow( aCRD );
    1149             : 
    1150           0 :                 rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1151             :             }
    1152           0 :                 break;
    1153             :             case 0x49:
    1154             :             case 0x69:
    1155             :             case 0x29: // Variable Reference Subexpression      [331 281]
    1156             :             case 0x4E:
    1157             :             case 0x6E:
    1158             :             case 0x2E: // Reference Subexpression Within a Name [332 282]
    1159             :             case 0x4F:
    1160             :             case 0x6F:
    1161             :             case 0x2F: // Incomplete Reference Subexpression... [332 282]
    1162           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 1 : 2;
    1163           0 :                 break;
    1164             :             case 0x58:
    1165             :             case 0x78:
    1166             :             case 0x38: // Command-Equivalent Function           [333    ]
    1167           0 :                 nIgnore = 2;
    1168           0 :                 break;
    1169             :             case 0x59:
    1170             :             case 0x79:
    1171             :             case 0x39: // Name or External Name                 [    275]
    1172           0 :                 nIgnore = 24;
    1173           0 :                 break;
    1174             :             case 0x5A:
    1175             :             case 0x7A:
    1176             :             case 0x3A: // 3-D Cell Reference                    [    275]
    1177             :             {
    1178             :                 sal_uInt16          nTabFirst, nTabLast, nRow;
    1179             :                 sal_Int16           nExtSheet;
    1180             :                 sal_uInt8           nCol;
    1181             : 
    1182           0 :                 aIn >> nExtSheet;
    1183           0 :                 aIn.Ignore( 8 );
    1184           0 :                 aIn >> nTabFirst >> nTabLast >> nRow >> nCol;
    1185             : 
    1186           0 :                 if( nExtSheet >= 0 )
    1187             :                     // from external
    1188             :                 {
    1189           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
    1190             :                     {
    1191           0 :                         nTabFirst = nTabLast;
    1192           0 :                         nExtSheet = 0;      // found
    1193             :                     }
    1194             :                     else
    1195             :                     {
    1196           0 :                         aPool << ocBad;
    1197           0 :                         aPool >> aStack;
    1198           0 :                         nExtSheet = 1;      // don't create a SingleRef
    1199             :                     }
    1200             :                 }
    1201             : 
    1202           0 :                 if( nExtSheet <= 0 )
    1203             :                 {// in current Workbook
    1204           0 :                     bool b3D = ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName;
    1205           0 :                     aSRD.SetAbsTab(nTabFirst);
    1206           0 :                     aSRD.SetFlag3D( b3D );
    1207             : 
    1208           0 :                     ExcRelToScRel( nRow, nCol, aSRD, bRangeName );
    1209             : 
    1210           0 :                     if( nTabLast != nTabFirst )
    1211             :                     {
    1212           0 :                         aCRD.Ref1 = aSRD;
    1213           0 :                         aCRD.Ref2 = aSRD;
    1214           0 :                         aCRD.Ref2.SetAbsTab(static_cast<SCTAB>(nTabLast));
    1215           0 :                         b3D = ( static_cast<SCTAB>(nTabLast) != aEingPos.Tab() );
    1216           0 :                         aCRD.Ref2.SetFlag3D( b3D );
    1217           0 :                         rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1218             :                     }
    1219             :                     else
    1220           0 :                         rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1221             :                 }
    1222             :             }
    1223             : 
    1224           0 :                 break;
    1225             :             case 0x5B:
    1226             :             case 0x7B:
    1227             :             case 0x3B: // 3-D Area Reference                    [    276]
    1228             :             {
    1229             :                 sal_uInt16      nTabFirst, nTabLast, nRowFirst, nRowLast;
    1230             :                 sal_Int16       nExtSheet;
    1231             :                 sal_uInt8       nColFirst, nColLast;
    1232             : 
    1233           0 :                 aIn >> nExtSheet;
    1234           0 :                 aIn.Ignore( 8 );
    1235           0 :                 aIn >> nTabFirst >> nTabLast >> nRowFirst >> nRowLast
    1236           0 :                     >> nColFirst >> nColLast;
    1237             : 
    1238           0 :                 if( nExtSheet >= 0 )
    1239             :                     // from external
    1240             :                 {
    1241           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
    1242             :                     {
    1243           0 :                         nTabFirst = nTabLast;
    1244           0 :                         nExtSheet = 0;      // found
    1245             :                     }
    1246             :                     else
    1247             :                     {
    1248           0 :                         aPool << ocBad;
    1249           0 :                         aPool >> aStack;
    1250           0 :                         nExtSheet = 1;      // don't create a CompleteRef
    1251             :                     }
    1252             :                 }
    1253             : 
    1254           0 :                 if( nExtSheet <= 0 )
    1255             :                 {// in current Workbook
    1256             :                     // first part of range
    1257           0 :                     ScSingleRefData &rR1 = aCRD.Ref1;
    1258           0 :                     ScSingleRefData &rR2 = aCRD.Ref2;
    1259             : 
    1260           0 :                     rR1.SetAbsTab(nTabFirst);
    1261           0 :                     rR2.SetAbsTab(nTabLast);
    1262           0 :                     rR1.SetFlag3D( ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName );
    1263           0 :                     rR2.SetFlag3D( ( static_cast<SCTAB>(nTabLast) != aEingPos.Tab() ) || bRangeName );
    1264             : 
    1265           0 :                     ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
    1266           0 :                     ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
    1267             : 
    1268           0 :                     if( IsComplColRange( nColFirst, nColLast ) )
    1269           0 :                         SetComplCol( aCRD );
    1270           0 :                     else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1271           0 :                         SetComplRow( aCRD );
    1272             : 
    1273           0 :                     rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1274             :                 }//END in current Workbook
    1275             :             }
    1276           0 :                 break;
    1277             :             case 0x5C:
    1278             :             case 0x7C:
    1279             :             case 0x3C: // Deleted 3-D Cell Reference            [    277]
    1280           0 :                 nIgnore = 17;
    1281           0 :                 break;
    1282             :             case 0x5D:
    1283             :             case 0x7D:
    1284             :             case 0x3D: // Deleted 3-D Area Reference            [    277]
    1285           0 :                 nIgnore = 20;
    1286           0 :                 break;
    1287           0 :             default: bError = true;
    1288             :         }
    1289           0 :         bError |= !aIn.IsValid();
    1290             : 
    1291           0 :         aIn.Ignore( nIgnore );
    1292             :     }
    1293             : 
    1294             :     ConvErr eRet;
    1295             : 
    1296           0 :     if( bError )
    1297           0 :         eRet = ConvErrNi;
    1298           0 :     else if( aIn.GetRecPos() != nEndPos )
    1299           0 :         eRet = ConvErrCount;
    1300           0 :     else if( bExternName )
    1301           0 :         eRet = ConvErrExternal;
    1302             :     else
    1303           0 :         eRet = ConvOK;
    1304             : 
    1305           0 :     aIn.Seek( nEndPos );
    1306           0 :     return eRet;
    1307             : }
    1308             : 
    1309           0 : ConvErr ExcelToSc::ConvertExternName( const ScTokenArray*& /*rpArray*/, XclImpStream& /*rStrm*/, sal_Size /*nFormulaLen*/,
    1310             :                                       const OUString& /*rUrl*/, const vector<OUString>& /*rTabNames*/ )
    1311             : {
    1312             :     // not implemented ...
    1313           0 :     return ConvErrNi;
    1314             : }
    1315             : 
    1316           0 : bool ExcelToSc::GetAbsRefs( ScRangeList& rRangeList, XclImpStream& rStrm, sal_Size nLen )
    1317             : {
    1318             :     OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF5 );
    1319           0 :     if( GetBiff() != EXC_BIFF5 )
    1320           0 :         return false;
    1321             : 
    1322             :     sal_uInt8 nOp;
    1323             :     sal_uInt16 nRow1, nRow2;
    1324             :     sal_uInt8 nCol1, nCol2;
    1325             :     SCTAB nTab1, nTab2;
    1326             :     sal_uInt16 nTabFirst, nTabLast;
    1327             :     sal_Int16 nRefIdx;
    1328             : 
    1329             :     sal_Size nSeek;
    1330           0 :     sal_Size nEndPos = rStrm.GetRecPos() + nLen;
    1331             : 
    1332           0 :     while( rStrm.IsValid() && (rStrm.GetRecPos() < nEndPos) )
    1333             :     {
    1334           0 :         rStrm >> nOp;
    1335           0 :         nSeek = 0;
    1336             : 
    1337           0 :         switch( nOp )
    1338             :         {
    1339             :             case 0x44:
    1340             :             case 0x64:
    1341             :             case 0x24: // Cell Reference                        [319 270]
    1342             :             case 0x4C:
    1343             :             case 0x6C:
    1344             :             case 0x2C: // Cell Reference Within a Name          [323    ]
    1345             :                        // Cell Reference Within a Shared Formula[    273]
    1346           0 :                 rStrm >> nRow1 >> nCol1;
    1347             : 
    1348           0 :                 nRow2 = nRow1;
    1349           0 :                 nCol2 = nCol1;
    1350           0 :                 nTab1 = nTab2 = GetCurrScTab();
    1351           0 :                 goto _common;
    1352             :             case 0x45:
    1353             :             case 0x65:
    1354             :             case 0x25: // Area Reference                        [320 270]
    1355             :             case 0x4D:
    1356             :             case 0x6D:
    1357             :             case 0x2D: // Area Reference Within a Name          [324    ]
    1358             :                        // Area Reference Within a Shared Formula[    274]
    1359           0 :                 rStrm >> nRow1 >> nRow2 >> nCol1 >> nCol2;
    1360             : 
    1361           0 :                 nTab1 = nTab2 = GetCurrScTab();
    1362           0 :                 goto _common;
    1363             :             case 0x5A:
    1364             :             case 0x7A:
    1365             :             case 0x3A: // 3-D Cell Reference                    [    275]
    1366           0 :                 rStrm >> nRefIdx;
    1367           0 :                 rStrm.Ignore( 8 );
    1368           0 :                 rStrm >> nTabFirst >> nTabLast >> nRow1 >> nCol1;
    1369             : 
    1370           0 :                 nRow2 = nRow1;
    1371           0 :                 nCol2 = nCol1;
    1372             : 
    1373           0 :                 goto _3d_common;
    1374             :             case 0x5B:
    1375             :             case 0x7B:
    1376             :             case 0x3B: // 3-D Area Reference                    [    276]
    1377           0 :                 rStrm >> nRefIdx;
    1378           0 :                 rStrm.Ignore( 8 );
    1379           0 :                 rStrm >> nTabFirst >> nTabLast >> nRow1 >> nRow2 >> nCol1 >> nCol2;
    1380             : 
    1381             :     _3d_common:
    1382           0 :                 nTab1 = static_cast< SCTAB >( nTabFirst );
    1383           0 :                 nTab2 = static_cast< SCTAB >( nTabLast );
    1384             : 
    1385             :                 // skip references to deleted sheets
    1386           0 :                 if( (nRefIdx >= 0) || !ValidTab( nTab1 ) || (nTab1 != nTab2) )
    1387           0 :                     break;
    1388             : 
    1389           0 :                 goto _common;
    1390             :     _common:
    1391             :                 // do not check abs/rel flags, linked controls have set them!
    1392             :                 {
    1393           0 :                     ScRange aScRange;
    1394           0 :                     nRow1 &= 0x3FFF;
    1395           0 :                     nRow2 &= 0x3FFF;
    1396           0 :                     if( GetAddressConverter().ConvertRange( aScRange, XclRange( nCol1, nRow1, nCol2, nRow2 ), nTab1, nTab2, true ) )
    1397           0 :                         rRangeList.Append( aScRange );
    1398             :                 }
    1399           0 :                 break;
    1400             : 
    1401             :             case 0x03: // Addition                              [312 264]
    1402             :             case 0x04: // Subtraction                           [313 264]
    1403             :             case 0x05: // Multiplication                        [313 264]
    1404             :             case 0x06: // Division                              [313 264]
    1405             :             case 0x07: // Exponetiation                         [313 265]
    1406             :             case 0x08: // Concatenation                         [313 265]
    1407             :             case 0x09: // Less Than                             [313 265]
    1408             :             case 0x0A: // Less Than or Equal                    [313 265]
    1409             :             case 0x0B: // Equal                                 [313 265]
    1410             :             case 0x0C: // Greater Than or Equal                 [313 265]
    1411             :             case 0x0D: // Greater Than                          [313 265]
    1412             :             case 0x0E: // Not Equal                             [313 265]
    1413             :             case 0x0F: // Intersection                          [314 265]
    1414             :             case 0x10: // Union                                 [314 265]
    1415             :             case 0x11: // Range                                 [314 265]
    1416             :             case 0x12: // Unary Plus                            [312 264]
    1417             :             case 0x13: // Unary Minus                           [312 264]
    1418             :             case 0x14: // Percent Sign                          [312 264]
    1419             :             case 0x15: // Parenthesis                           [326 278]
    1420             :             case 0x16: // Missing Argument                      [314 266]
    1421           0 :                 break;
    1422             :             case 0x1C: // Error Value                           [314 266]
    1423             :             case 0x1D: // Boolean                               [315 266]
    1424           0 :                 nSeek = 1;
    1425           0 :                 break;
    1426             :             case 0x1E: // Integer                               [315 266]
    1427             :             case 0x41:
    1428             :             case 0x61:
    1429             :             case 0x21: // Function, Fixed Number of Arguments   [333 282]
    1430             :             case 0x49:
    1431             :             case 0x69:
    1432             :             case 0x29: // Variable Reference Subexpression      [331 281]
    1433             :             case 0x4E:
    1434             :             case 0x6E:
    1435             :             case 0x2E: // Reference Subexpression Within a Name [332 282]
    1436             :             case 0x4F:
    1437             :             case 0x6F:
    1438             :             case 0x2F: // Incomplete Reference Subexpression... [332 282]
    1439             :             case 0x58:
    1440             :             case 0x78:
    1441             :             case 0x38: // Command-Equivalent Function           [333    ]
    1442           0 :                 nSeek = 2;
    1443           0 :                 break;
    1444             :             case 0x42:
    1445             :             case 0x62:
    1446             :             case 0x22: // Function, Variable Number of Arg.     [333 283]
    1447             :             case 0x4A:
    1448             :             case 0x6A:
    1449             :             case 0x2A: // Deleted Cell Reference                [323 273]
    1450           0 :                 nSeek = 3;
    1451           0 :                 break;
    1452             :             case 0x01: // Array Formula                         [325    ]
    1453             :                        // Array Formula or Shared Formula       [    277]
    1454             :             case 0x02: // Data Table                            [325 277]
    1455           0 :                 nSeek = 4;
    1456           0 :                 break;
    1457             :             case 0x46:
    1458             :             case 0x66:
    1459             :             case 0x26: // Constant Reference Subexpression      [321 271]
    1460             :             case 0x47:
    1461             :             case 0x67:
    1462             :             case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
    1463             :             case 0x48:
    1464             :             case 0x68:
    1465             :             case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
    1466             :             case 0x4B:
    1467             :             case 0x6B:
    1468             :             case 0x2B: // Deleted Area Refernce                 [323 273]
    1469           0 :                 nSeek = 6;
    1470           0 :                 break;
    1471             :             case 0x40:
    1472             :             case 0x60:
    1473             :             case 0x20: // Array Constant                        [317 268]
    1474           0 :                 nSeek = 7;
    1475           0 :                 break;
    1476             :             case 0x1F: // Number                                [315 266]
    1477           0 :                 nSeek = 8;
    1478           0 :                 break;
    1479             :             case 0x43:
    1480             :             case 0x63:
    1481             :             case 0x23: // Name                                  [318 269]
    1482           0 :                 nSeek = 14;
    1483           0 :                 break;
    1484             :             case 0x5C:
    1485             :             case 0x7C:
    1486             :             case 0x3C: // Deleted 3-D Cell Reference            [    277]
    1487           0 :                 nSeek = 17;
    1488           0 :                 break;
    1489             :             case 0x5D:
    1490             :             case 0x7D:
    1491             :             case 0x3D: // Deleted 3-D Area Reference            [    277]
    1492           0 :                 nSeek = 20;
    1493           0 :                 break;
    1494             :             case 0x59:
    1495             :             case 0x79:
    1496             :             case 0x39: // Name or External Name                 [    275]
    1497           0 :                 nSeek = 24;
    1498           0 :                 break;
    1499             :             case 0x17: // String Constant                       [314 266]
    1500           0 :                 nSeek = rStrm.ReaduInt8();
    1501           0 :                 break;
    1502             :             case 0x19: // Special Attribute                     [327 279]
    1503             :             {
    1504             :                 sal_uInt8 nOpt;
    1505             :                 sal_uInt16 nData;
    1506           0 :                 rStrm >> nOpt >> nData;
    1507           0 :                 if( nOpt & 0x04 )
    1508           0 :                     nSeek = nData * 2 + 2;
    1509             :             }
    1510           0 :                 break;
    1511             :         }
    1512             : 
    1513           0 :         rStrm.Ignore( nSeek );
    1514             :     }
    1515           0 :     rStrm.Seek( nEndPos );
    1516             : 
    1517           0 :     return !rRangeList.empty();
    1518             : }
    1519             : 
    1520           0 : void ExcelToSc::DoMulArgs( DefTokenId eId, sal_uInt8 nAnz )
    1521             : {
    1522           0 :     TokenId                 eParam[ 256 ];
    1523             :     sal_Int32                   nLauf;
    1524             : 
    1525           0 :     if( eId == ocCeil || eId == ocFloor )
    1526             :     {
    1527           0 :         aStack << aPool.Store( 1.0 );   // default, because not present in Excel
    1528           0 :         nAnz++;
    1529             :     }
    1530             : 
    1531           0 :     for( nLauf = 0; aStack.HasMoreTokens() && (nLauf < nAnz); nLauf++ )
    1532           0 :         aStack >> eParam[ nLauf ];
    1533             :     // #i70925# reduce parameter count, if no more tokens available on token stack
    1534           0 :     if( nLauf < nAnz )
    1535           0 :         nAnz = static_cast< sal_uInt8 >( nLauf );
    1536             : 
    1537           0 :     if( nAnz > 0 && eId == ocExternal )
    1538             :     {
    1539           0 :         TokenId             n = eParam[ nAnz - 1 ];
    1540             : //##### GRUETZE FUER BASIC-FUNCS RICHTEN!
    1541           0 :         if( const OUString* pExt = aPool.GetExternal( n ) )
    1542             :         {
    1543           0 :             if( const XclFunctionInfo* pFuncInfo = maFuncProv.GetFuncInfoFromXclMacroName( *pExt ) )
    1544           0 :                 aPool << pFuncInfo->meOpCode;
    1545             :             else
    1546           0 :                 aPool << n;
    1547           0 :             nAnz--;
    1548             :         }
    1549             :         else
    1550           0 :             aPool << eId;
    1551             :     }
    1552             :     else
    1553           0 :         aPool << eId;
    1554             : 
    1555           0 :     aPool << ocOpen;
    1556             : 
    1557           0 :     if( nAnz > 0 )
    1558             :     {
    1559             :         // attention: 0 = last parameter, nAnz-1 = first parameter
    1560           0 :         sal_Int16 nSkipEnd = -1;    // skip all parameters <= nSkipEnd
    1561             : 
    1562           0 :         sal_Int16 nLast = nAnz - 1;
    1563             : 
    1564             :         // functions for which parameters have to be skipped
    1565           0 :         if( eId == ocPercentrank && nAnz == 3 )
    1566           0 :             nSkipEnd = 0;       // skip last parameter if necessary
    1567             : 
    1568             :         // Joost special cases
    1569           0 :         else if( eId == ocIf )
    1570             :         {
    1571           0 :             sal_uInt16          nNullParam = 0;
    1572           0 :             for( nLauf = 0 ; nLauf < nAnz ; nLauf++ )
    1573             :             {
    1574           0 :                 if( aPool.IsSingleOp( eParam[ nLauf ], ocMissing ) )
    1575             :                 {
    1576           0 :                     if( !nNullParam )
    1577           0 :                         nNullParam = (sal_uInt16) aPool.Store( ( double ) 0.0 );
    1578           0 :                     eParam[ nLauf ] = nNullParam;
    1579             :                 }
    1580             :             }
    1581             :         }
    1582             : 
    1583             :         // [Parameter{;Parameter}]
    1584           0 :         if( nLast > nSkipEnd )
    1585             :         {
    1586           0 :             sal_Int16 nNull = -1;       // skip this parameter
    1587           0 :             aPool << eParam[ nLast ];
    1588           0 :             for( nLauf = nLast - 1 ; nLauf > nSkipEnd ; nLauf-- )
    1589             :             {
    1590           0 :                 if( nLauf != nNull )
    1591           0 :                     aPool << ocSep << eParam[ nLauf ];
    1592             :             }
    1593             :         }
    1594             :     }
    1595           0 :     aPool << ocClose;
    1596             : 
    1597           0 :     aPool >> aStack;
    1598           0 : }
    1599             : 
    1600             : 
    1601           0 : void ExcelToSc::ExcRelToScRel( sal_uInt16 nRow, sal_uInt8 nCol, ScSingleRefData &rSRD, const bool bName )
    1602             : {
    1603           0 :     if( bName )
    1604             :     {
    1605             :         // C O L
    1606           0 :         if( nRow & 0x4000 )
    1607           0 :             rSRD.SetRelCol(nCol);
    1608             :         else
    1609           0 :             rSRD.SetAbsCol(nCol);
    1610             : 
    1611             :         // R O W
    1612           0 :         if( nRow & 0x8000 )
    1613             :         {//                                                         rel Row
    1614           0 :             if( nRow & 0x2000 ) // Bit 13 set?
    1615             :                 // Row negative
    1616           0 :                 rSRD.SetRelRow(nRow | 0xC000);
    1617             :             else
    1618             :                 // Row positive
    1619           0 :                 rSRD.SetRelRow(nRow & nRowMask);
    1620             :         }
    1621             :         else
    1622             :         {//                                                         abs Row
    1623           0 :             rSRD.SetAbsRow(nRow & nRowMask);
    1624             :         }
    1625             : 
    1626             :         // T A B
    1627             :         // abs needed if rel in shared formula for ScCompiler UpdateNameReference
    1628           0 :         if ( rSRD.IsTabRel() && !rSRD.IsFlag3D() )
    1629           0 :             rSRD.SetAbsTab(GetCurrScTab());
    1630             :     }
    1631             :     else
    1632             :     {
    1633           0 :         bool bColRel = (nRow & 0x4000) > 0;
    1634           0 :         bool bRowRel = (nRow & 0x8000) > 0;
    1635             : 
    1636           0 :         if (bColRel)
    1637           0 :             rSRD.SetRelCol(nCol - aEingPos.Col());
    1638             :         else
    1639           0 :             rSRD.SetAbsCol(nCol);
    1640             : 
    1641           0 :         rSRD.SetAbsRow(nRow & nRowMask);
    1642           0 :         if (bRowRel)
    1643           0 :             rSRD.SetRelRow(rSRD.Row() - aEingPos.Row());
    1644             : 
    1645             :         // T A B
    1646             :         // #i10184# abs needed if rel in shared formula for ScCompiler UpdateNameReference
    1647           0 :         if ( rSRD.IsTabRel() && !rSRD.IsFlag3D() )
    1648           0 :             rSRD.SetAbsTab(GetCurrScTab() + rSRD.Tab());
    1649             :     }
    1650           0 : }
    1651             : 
    1652             : 
    1653           0 : const ScTokenArray* ExcelToSc::GetBoolErr( XclBoolError eType )
    1654             : {
    1655             :     sal_uInt16                  nError;
    1656           0 :     aPool.Reset();
    1657           0 :     aStack.Reset();
    1658             : 
    1659             :     DefTokenId              eOc;
    1660             : 
    1661           0 :     switch( eType )
    1662             :     {
    1663           0 :         case xlErrNull:     eOc = ocStop;       nError = errNoCode;             break;
    1664           0 :         case xlErrDiv0:     eOc = ocStop;       nError = errDivisionByZero;     break;
    1665           0 :         case xlErrValue:    eOc = ocStop;       nError = errNoValue;            break;
    1666           0 :         case xlErrRef:      eOc = ocStop;       nError = errNoRef;              break;
    1667           0 :         case xlErrName:     eOc = ocStop;       nError = errNoName;             break;
    1668           0 :         case xlErrNum:      eOc = ocStop;       nError = errIllegalFPOperation; break;
    1669           0 :         case xlErrNA:       eOc = ocNotAvail;   nError = NOTAVAILABLE;          break;
    1670           0 :         case xlErrTrue:     eOc = ocTrue;       nError = 0;                     break;
    1671           0 :         case xlErrFalse:    eOc = ocFalse;      nError = 0;                     break;
    1672           0 :         case xlErrUnknown:  eOc = ocStop;       nError = errUnknownState;       break;
    1673             :         default:
    1674             :             OSL_FAIL( "ExcelToSc::GetBoolErr - wrong enum!" );
    1675           0 :             eOc = ocNoName;
    1676           0 :             nError = errUnknownState;
    1677             :     }
    1678             : 
    1679           0 :     aPool << eOc;
    1680           0 :     if( eOc != ocStop )
    1681           0 :         aPool << ocOpen << ocClose;
    1682             : 
    1683           0 :     aPool >> aStack;
    1684             : 
    1685           0 :     const ScTokenArray*     pErgebnis = aPool[ aStack.Get() ];
    1686           0 :     if( nError )
    1687           0 :         ( ( ScTokenArray* ) pErgebnis )->SetCodeError( nError );
    1688             : 
    1689           0 :     ( ( ScTokenArray* ) pErgebnis )->SetExclusiveRecalcModeNormal();
    1690             : 
    1691           0 :     return pErgebnis;
    1692             : }
    1693             : 
    1694           0 : bool ExcelToSc::ReadSharedFormulaPosition( XclImpStream& rStrm, SCCOL& rCol, SCROW& rRow )
    1695             : {
    1696           0 :     rStrm.PushPosition();
    1697             : 
    1698             :     sal_uInt8 nOp;
    1699           0 :     rStrm >> nOp;
    1700             : 
    1701           0 :     if (nOp != 0x01)   // must be PtgExp token.
    1702             :     {
    1703           0 :         rStrm.PopPosition();
    1704           0 :         return false;
    1705             :     }
    1706             : 
    1707             :     sal_uInt16 nRow, nCol;
    1708           0 :     rStrm >> nRow >> nCol;
    1709           0 :     rStrm.PopPosition();
    1710           0 :     rCol = nCol;
    1711           0 :     rRow = nRow;
    1712           0 :     return true;
    1713             : }
    1714             : 
    1715           0 : const ScTokenArray* ExcelToSc::GetSharedFormula( const ScAddress& rRefPos ) const
    1716             : {
    1717           0 :     return GetOldRoot().pShrfmlaBuff->Find(rRefPos);
    1718             : }
    1719             : 
    1720           0 : void ExcelToSc::SetError( ScFormulaCell &rCell, const ConvErr eErr )
    1721             : {
    1722             :     sal_uInt16  nInd;
    1723             : 
    1724           0 :     switch( eErr )
    1725             :     {
    1726           0 :         case ConvErrNi:         nInd = errUnknownToken; break;
    1727           0 :         case ConvErrNoMem:      nInd = errCodeOverflow; break;
    1728           0 :         case ConvErrExternal:   nInd = errNoName; break;
    1729           0 :         case ConvErrCount:      nInd = errCodeOverflow; break;
    1730           0 :         default:                nInd = errNoCode;   // I had no better idea
    1731             :     }
    1732             : 
    1733           0 :     rCell.SetErrCode( nInd );
    1734           0 : }
    1735             : 
    1736             : 
    1737           0 : void ExcelToSc::SetComplCol( ScComplexRefData &rCRD )
    1738             : {
    1739           0 :     ScSingleRefData &rSRD = rCRD.Ref2;
    1740           0 :     if( rSRD.IsColRel() )
    1741           0 :         rSRD.SetRelCol(MAXCOL - aEingPos.Col());
    1742             :     else
    1743           0 :         rSRD.SetAbsCol(MAXCOL);
    1744           0 : }
    1745             : 
    1746             : 
    1747           0 : void ExcelToSc::SetComplRow( ScComplexRefData &rCRD )
    1748             : {
    1749           0 :     ScSingleRefData &rSRD = rCRD.Ref2;
    1750           0 :     if( rSRD.IsRowRel() )
    1751           0 :         rSRD.SetRelRow(MAXROW - aEingPos.Row());
    1752             :     else
    1753           0 :         rSRD.SetAbsRow(MAXROW);
    1754           0 : }
    1755             : 
    1756           0 : void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn )
    1757             : {
    1758             :     sal_uInt8        nByte;
    1759             :     sal_uInt16      nUINT16;
    1760             :     double      fDouble;
    1761           0 :     OUString    aString;
    1762             :     ScMatrix*   pMatrix;
    1763             : 
    1764           0 :     aIn >> nByte >> nUINT16;
    1765             : 
    1766             :     SCSIZE nC, nCols;
    1767             :     SCSIZE nR, nRows;
    1768           0 :     if( GetBiff() == EXC_BIFF8 )
    1769             :     {
    1770           0 :         nCols = nByte + 1;
    1771           0 :         nRows = nUINT16 + 1;
    1772             :     }
    1773             :     else
    1774             :     {
    1775           0 :         nCols = nByte ? nByte : 256;
    1776           0 :         nRows = nUINT16;
    1777             :     }
    1778             : 
    1779           0 :     pMatrix = aPool.GetMatrix( n );
    1780             : 
    1781           0 :     if( NULL != pMatrix )
    1782             :     {
    1783           0 :         pMatrix->Resize(nCols, nRows);
    1784           0 :         pMatrix->GetDimensions( nC, nR);
    1785           0 :         if( nC != nCols || nR != nRows )
    1786             :         {
    1787             :             OSL_FAIL( "ExcelToSc::ReadExtensionArray - matrix size mismatch" );
    1788           0 :             pMatrix = NULL;
    1789             :         }
    1790             :     }
    1791             :     else
    1792             :     {
    1793             :         OSL_FAIL( "ExcelToSc::ReadExtensionArray - missing matrix" );
    1794             :     }
    1795             : 
    1796           0 :     svl::SharedStringPool& rPool = GetDoc().GetSharedStringPool();
    1797           0 :     for( nR = 0 ; nR < nRows; nR++ )
    1798             :     {
    1799           0 :         for( nC = 0 ; nC < nCols; nC++ )
    1800             :         {
    1801           0 :             aIn >> nByte;
    1802           0 :             switch( nByte )
    1803             :             {
    1804             :                 case EXC_CACHEDVAL_EMPTY:
    1805           0 :                     aIn.Ignore( 8 );
    1806           0 :                     if( NULL != pMatrix )
    1807             :                     {
    1808           0 :                         pMatrix->PutEmpty( nC, nR );
    1809             :                     }
    1810           0 :                     break;
    1811             : 
    1812             :                 case EXC_CACHEDVAL_DOUBLE:
    1813           0 :                     aIn >> fDouble;
    1814           0 :                     if( NULL != pMatrix )
    1815             :                     {
    1816           0 :                         pMatrix->PutDouble( fDouble, nC, nR );
    1817             :                     }
    1818           0 :                     break;
    1819             : 
    1820             :                 case EXC_CACHEDVAL_STRING:
    1821           0 :                     if( GetBiff() == EXC_BIFF8 )
    1822             :                     {
    1823           0 :                         aIn >> nUINT16;
    1824           0 :                         aString = aIn.ReadUniString( nUINT16 );
    1825             :                     }
    1826             :                     else
    1827             :                     {
    1828           0 :                         aIn >> nByte;
    1829           0 :                         aString = aIn.ReadRawByteString( nByte );
    1830             :                     }
    1831           0 :                     if( NULL != pMatrix )
    1832             :                     {
    1833           0 :                         pMatrix->PutString(rPool.intern(aString), nC, nR);
    1834             :                     }
    1835           0 :                     break;
    1836             : 
    1837             :                 case EXC_CACHEDVAL_BOOL:
    1838           0 :                     aIn >> nByte;
    1839           0 :                     aIn.Ignore( 7 );
    1840           0 :                     if( NULL != pMatrix )
    1841             :                     {
    1842           0 :                         pMatrix->PutBoolean( nByte != 0, nC, nR );
    1843             :                     }
    1844           0 :                     break;
    1845             : 
    1846             :                 case EXC_CACHEDVAL_ERROR:
    1847           0 :                     aIn >> nByte;
    1848           0 :                     aIn.Ignore( 7 );
    1849           0 :                     if( NULL != pMatrix )
    1850             :                     {
    1851           0 :                         pMatrix->PutError( XclTools::GetScErrorCode( nByte ), nC, nR );
    1852             :                     }
    1853           0 :                     break;
    1854             :             }
    1855             :         }
    1856           0 :     }
    1857           0 : }
    1858             : 
    1859           0 : void ExcelToSc::ReadExtensionNlr( XclImpStream& aIn )
    1860             : {
    1861             :     sal_uInt32 nFlags;
    1862           0 :     aIn >> nFlags;
    1863             : 
    1864           0 :     sal_uInt32 nCount = nFlags & EXC_TOK_NLR_ADDMASK;
    1865           0 :     aIn.Ignore( nCount * 4 ); // Drop the cell positions
    1866           0 : }
    1867             : 
    1868           0 : void ExcelToSc::ReadExtensionMemArea( XclImpStream& aIn )
    1869             : {
    1870             :     sal_uInt16 nCount;
    1871           0 :     aIn >> nCount;
    1872             : 
    1873           0 :     aIn.Ignore( nCount * ((GetBiff() == EXC_BIFF8) ? 8 : 6) ); // drop the ranges
    1874           0 : }
    1875             : 
    1876           0 : void ExcelToSc::ReadExtensions( const ExtensionTypeVec& rExtensions,
    1877             :                                 XclImpStream& aIn )
    1878             : {
    1879           0 :     unsigned int nArray = 0;
    1880             : 
    1881           0 :     for( unsigned int i = 0 ; i < rExtensions.size() ; i++ )
    1882             :     {
    1883           0 :         ExtensionType eType = rExtensions[i];
    1884             : 
    1885           0 :         switch( eType )
    1886             :         {
    1887             :             case EXTENSION_ARRAY:
    1888           0 :                 ReadExtensionArray( nArray++, aIn );
    1889           0 :                 break;
    1890             : 
    1891             :             case EXTENSION_NLR:
    1892           0 :                 ReadExtensionNlr( aIn );
    1893           0 :                 break;
    1894             : 
    1895             :             case EXTENSION_MEMAREA:
    1896           0 :                 ReadExtensionMemArea( aIn );
    1897           0 :                 break;
    1898             :         }
    1899             :     }
    1900           0 : }
    1901             : 
    1902             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10