LCOV - code coverage report
Current view: top level - sc/source/filter/excel - excform.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 268 886 30.2 %
Date: 2014-11-03 Functions: 16 26 61.5 %
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        7094 : void ImportExcel::Formula25()
      46             : {
      47        7094 :     XclAddress aXclPos;
      48        7094 :     sal_uInt16  nXF = 0, nFormLen;
      49             :     double  fCurVal;
      50             :     sal_uInt8   nFlag0;
      51             :     bool    bShrFmla;
      52             : 
      53        7094 :     aIn >> aXclPos;
      54             : 
      55        7094 :     if( GetBiff() == EXC_BIFF2 )
      56             :     {//                     BIFF2
      57             :         sal_uInt8 nDummy;
      58             : 
      59           0 :         aIn.Ignore( 3 );
      60             : 
      61           0 :         aIn >> fCurVal;
      62           0 :         aIn.Ignore( 1 );
      63           0 :         aIn >> nDummy;
      64           0 :         nFormLen = nDummy;
      65           0 :         bShrFmla = false;
      66             :     }
      67             :     else
      68             :     {//                     BIFF5
      69        7094 :         aIn >> nXF >> fCurVal >> nFlag0;
      70        7094 :         aIn.Ignore( 5 );
      71             : 
      72        7094 :         aIn >> nFormLen;
      73             : 
      74        7094 :         bShrFmla = nFlag0 & 0x08;   // shared or not shared
      75             :     }
      76             : 
      77        7094 :     Formula( aXclPos, nXF, nFormLen, fCurVal, bShrFmla );
      78        7094 : }
      79             : 
      80           0 : void ImportExcel::Formula3()
      81             : {
      82           0 :     Formula4();
      83           0 : }
      84             : 
      85           0 : void ImportExcel::Formula4()
      86             : {
      87           0 :     XclAddress aXclPos;
      88             :     sal_uInt16  nXF, nFormLen;
      89             :     double  fCurVal;
      90             :     sal_uInt8   nFlag0;
      91             : 
      92           0 :     aIn >> aXclPos >> nXF >> fCurVal >> nFlag0;
      93           0 :     aIn.Ignore( 1 );
      94           0 :     aIn >> nFormLen;
      95             : 
      96           0 :     Formula( aXclPos, nXF, nFormLen, fCurVal, false );
      97           0 : }
      98             : 
      99        7094 : void ImportExcel::Formula(
     100             :     const XclAddress& rXclPos, sal_uInt16 nXF, sal_uInt16 nFormLen, double fCurVal, bool bShrFmla)
     101             : {
     102        7094 :     if (!nFormLen)
     103        1772 :         return;
     104             : 
     105        7094 :     ScAddress aScPos( ScAddress::UNINITIALIZED );
     106        7094 :     if (!GetAddressConverter().ConvertAddress(aScPos, rXclPos, GetCurrScTab(), true))
     107             :         // Conversion failed.
     108           0 :         return;
     109             : 
     110             :     // Formula will be read next, length in nFormLen
     111        7094 :     const ScTokenArray* pResult = NULL;
     112             : 
     113        7094 :     pFormConv->Reset( aScPos );
     114        7094 :     ScDocumentImport& rDoc = GetDocImport();
     115             : 
     116        7094 :     if (bShrFmla)
     117             :     {
     118             :         // This is a shared formula. Get the token array from the shared formula pool.
     119             :         SCCOL nSharedCol;
     120             :         SCROW nSharedRow;
     121        2268 :         if (pFormConv->ReadSharedFormulaPosition(maStrm, nSharedCol, nSharedRow))
     122             :         {
     123        1772 :             ScAddress aRefPos(nSharedCol, nSharedRow, GetCurrScTab());
     124        1772 :             const ScTokenArray* pSharedCode = pFormConv->GetSharedFormula(aRefPos);
     125        1772 :             if (pSharedCode)
     126             :             {
     127        1542 :                 ScFormulaCell* pCell = new ScFormulaCell(pD, aScPos, pSharedCode->Clone());
     128        1542 :                 pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
     129        1542 :                 rDoc.getDoc().EnsureTable(aScPos.Tab());
     130        1542 :                 rDoc.setFormulaCell(aScPos, pCell);
     131        1542 :                 pCell->SetNeedNumberFormat(false);
     132        1542 :                 if (!rtl::math::isNan(fCurVal))
     133        1508 :                     pCell->SetResultDouble(fCurVal);
     134             : 
     135        1542 :                 GetXFRangeBuffer().SetXF(aScPos, nXF);
     136        1542 :                 SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
     137             :             }
     138             :             else
     139             :             {
     140             :                 // Shared formula not found even though it's clearly a shared formula.
     141             :                 // The cell will be created in the following shared formula
     142             :                 // record.
     143         230 :                 SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, NULL);
     144             :             }
     145        1772 :             return;
     146             :         }
     147             :     }
     148             : 
     149        5322 :     ConvErr eErr = pFormConv->Convert( pResult, maStrm, nFormLen, true, FT_CellFormula);
     150             : 
     151        5322 :     ScFormulaCell* pCell = NULL;
     152             : 
     153        5322 :     if (pResult)
     154             :     {
     155        5208 :         pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, *pResult);
     156        5208 :         pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
     157        5208 :         rDoc.getDoc().EnsureTable(aScPos.Tab());
     158        5208 :         rDoc.setFormulaCell(aScPos, pCell);
     159        5208 :         SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
     160             :     }
     161             :     else
     162             :     {
     163         114 :         pCell = rDoc.getDoc().GetFormulaCell(aScPos);
     164         114 :         if (pCell)
     165         110 :             pCell->AddRecalcMode( RECALCMODE_ONLOAD_ONCE );
     166             :     }
     167             : 
     168        5322 :     if (pCell)
     169             :     {
     170        5318 :         pCell->SetNeedNumberFormat(false);
     171        5318 :         if( eErr != ConvOK )
     172           2 :             ExcelToSc::SetError( *pCell, eErr );
     173             : 
     174        5318 :         if (!rtl::math::isNan(fCurVal))
     175        5306 :             pCell->SetResultDouble(fCurVal);
     176             :     }
     177             : 
     178        5322 :     GetXFRangeBuffer().SetXF(aScPos, nXF);
     179             : }
     180             : 
     181         290 : ExcelToSc::ExcelToSc( XclImpRoot& rRoot ) :
     182         290 :     ExcelConverterBase(rRoot.GetDocImport().getDoc().GetSharedStringPool(), 512),
     183             :     XclImpRoot( rRoot ),
     184             :     bExternName( false ),
     185             :     maFuncProv( rRoot ),
     186         290 :     meBiff( rRoot.GetBiff() )
     187             : {
     188         290 : }
     189             : 
     190         434 : ExcelToSc::~ExcelToSc()
     191             : {
     192         434 : }
     193             : 
     194           0 : void ExcelToSc::GetDummy( const ScTokenArray*& pErgebnis )
     195             : {
     196           0 :     aPool.Store( OUString("Dummy()") );
     197           0 :     aPool >> aStack;
     198           0 :     pErgebnis = aPool[ aStack.Get() ];
     199           0 : }
     200             : 
     201             : // if bAllowArrays is false stream seeks to first byte after <nFormulaLen>
     202             : // otherwise it will seek to the first byte after the additional content (eg
     203             : // inline arrays) following <nFormulaLen>
     204          90 : ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, sal_Size nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT )
     205             : {
     206          90 :     RootData&       rR = GetOldRoot();
     207             :     sal_uInt8           nOp, nLen, nByte;
     208             :     sal_uInt16          nUINT16;
     209             :     sal_Int16           nINT16;
     210             :     double          fDouble;
     211          90 :     OUString        aString;
     212          90 :     bool            bError = false;
     213          90 :     bool            bArrayFormula = false;
     214          90 :     TokenId         nMerk0;
     215          90 :     const bool      bRangeName = eFT == FT_RangeName;
     216          90 :     const bool      bSharedFormula = eFT == FT_SharedFormula;
     217          90 :     const bool      bConditional = eFT == FT_CondFormat;
     218          90 :     const bool      bRNorSF = bRangeName || bSharedFormula || bConditional;
     219             : 
     220             :     ScSingleRefData     aSRD;
     221             :     ScComplexRefData        aCRD;
     222         180 :     ExtensionTypeVec    aExtensions;
     223             : 
     224          90 :     bExternName = false;
     225             : 
     226          90 :     if( eStatus != ConvOK )
     227             :     {
     228           0 :         aIn.Ignore( nFormulaLen );
     229           0 :         return eStatus;
     230             :     }
     231             : 
     232          90 :     if( nFormulaLen == 0 )
     233             :     {
     234           0 :         aPool.Store( OUString("-/-") );
     235           0 :         aPool >> aStack;
     236           0 :         pErgebnis = aPool[ aStack.Get() ];
     237           0 :         return ConvOK;
     238             :     }
     239             : 
     240          90 :     sal_Size nEndPos = aIn.GetRecPos() + nFormulaLen;
     241             : 
     242         442 :     while( (aIn.GetRecPos() < nEndPos) && !bError )
     243             :     {
     244         262 :         aIn >> nOp;
     245             : 
     246             :         // always reset flags
     247         262 :         aSRD.InitFlags();
     248         262 :         aCRD.InitFlags();
     249             : 
     250         262 :         switch( nOp )   //                              book page:
     251             :         {           //                                      SDK4 SDK5
     252             :             case 0x01: // Array Formula                         [325    ]
     253             :                        // Array Formula or Shared Formula       [    277]
     254             :             case 0x02: // Data Table                            [325 277]
     255           0 :                 nUINT16 = 3;
     256             : 
     257           0 :                 if( meBiff != EXC_BIFF2 )
     258           0 :                     nUINT16++;
     259             : 
     260           0 :                 aIn.Ignore( nUINT16 );
     261             : 
     262           0 :                 bArrayFormula = true;
     263           0 :                 break;
     264             :             case 0x03: // Addition                              [312 264]
     265          84 :                 aStack >> nMerk0;
     266          84 :                 aPool <<  aStack << ocAdd << nMerk0;
     267          84 :                 aPool >> aStack;
     268          84 :                 break;
     269             :             case 0x04: // Subtraction                           [313 264]
     270             :                 // SECOND-TOP minus TOP
     271           0 :                 aStack >> nMerk0;
     272           0 :                 aPool << aStack << ocSub << nMerk0;
     273           0 :                 aPool >> aStack;
     274           0 :                 break;
     275             :             case 0x05: // Multiplication                        [313 264]
     276           0 :                 aStack >> nMerk0;
     277           0 :                 aPool << aStack << ocMul << nMerk0;
     278           0 :                 aPool >> aStack;
     279           0 :                 break;
     280             :             case 0x06: // Division                              [313 264]
     281             :                 // divide TOP by SECOND-TOP
     282           0 :                 aStack >> nMerk0;
     283           0 :                 aPool << aStack << ocDiv << nMerk0;
     284           0 :                 aPool >> aStack;
     285           0 :                 break;
     286             :             case 0x07: // Exponentiation                            [313 265]
     287             :                 // raise SECOND-TOP to power of TOP
     288           0 :                 aStack >> nMerk0;
     289           0 :                 aPool << aStack << ocPow << nMerk0;
     290           0 :                 aPool >> aStack;
     291           0 :                 break;
     292             :             case 0x08: // Concatenation                         [313 265]
     293             :                 // append TOP to SECOND-TOP
     294           0 :                 aStack >> nMerk0;
     295           0 :                 aPool << aStack << ocAmpersand << nMerk0;
     296           0 :                 aPool >> aStack;
     297           0 :                 break;
     298             :             case 0x09: // Less Than                             [313 265]
     299             :                 // SECOND-TOP < TOP
     300           0 :                 aStack >> nMerk0;
     301           0 :                 aPool << aStack << ocLess << nMerk0;
     302           0 :                 aPool >> aStack;
     303           0 :                 break;
     304             :             case 0x0A: // Less Than or Equal                    [313 265]
     305             :                 // SECOND-TOP <= TOP
     306           0 :                 aStack >> nMerk0;
     307           0 :                 aPool << aStack << ocLessEqual << nMerk0;
     308           0 :                 aPool >> aStack;
     309           0 :                 break;
     310             :             case 0x0B: // Equal                                 [313 265]
     311             :                 // SECOND-TOP == TOP
     312           0 :                 aStack >> nMerk0;
     313           0 :                 aPool << aStack << ocEqual << nMerk0;
     314           0 :                 aPool >> aStack;
     315           0 :                 break;
     316             :             case 0x0C: // Greater Than or Equal                 [313 265]
     317             :                 // SECOND-TOP >= TOP
     318           0 :                 aStack >> nMerk0;
     319           0 :                 aPool << aStack << ocGreaterEqual << nMerk0;
     320           0 :                 aPool >> aStack;
     321           0 :                 break;
     322             :             case 0x0D: // Greater Than                          [313 265]
     323             :                 // SECOND-TOP > TOP
     324           0 :                 aStack >> nMerk0;
     325           0 :                 aPool << aStack << ocGreater << nMerk0;
     326           0 :                 aPool >> aStack;
     327           0 :                 break;
     328             :             case 0x0E: // Not Equal                             [313 265]
     329             :                 // SECOND-TOP != TOP
     330           0 :                 aStack >> nMerk0;
     331           0 :                 aPool << aStack << ocNotEqual << nMerk0;
     332           0 :                 aPool >> aStack;
     333           0 :                 break;
     334             :             case 0x0F: // Intersection                          [314 265]
     335           0 :                 aStack >> nMerk0;
     336           0 :                 aPool << aStack << ocIntersect << nMerk0;
     337           0 :                 aPool >> aStack;
     338           0 :                 break;
     339             :             case 0x10: // Union                                 [314 265]
     340             :                 // ocSep instead of 'ocUnion'
     341           0 :                 aStack >> nMerk0;
     342           0 :                 aPool << aStack << ocSep << nMerk0;
     343             :                     // doesn't fit exactly, but is more Excel-like
     344           0 :                 aPool >> aStack;
     345           0 :                 break;
     346             :             case 0x11: // Range                                 [314 265]
     347           0 :                 aStack >> nMerk0;
     348           0 :                 aPool << aStack << ocRange << nMerk0;
     349           0 :                 aPool >> aStack;
     350           0 :                 break;
     351             :             case 0x12: // Unary Plus                            [312 264]
     352           0 :                 aPool << ocAdd << aStack;
     353           0 :                 aPool >> aStack;
     354           0 :                 break;
     355             :             case 0x13: // Unary Minus                           [312 264]
     356           0 :                 aPool << ocNegSub << aStack;
     357           0 :                 aPool >> aStack;
     358           0 :                 break;
     359             :             case 0x14: // Percent Sign                          [312 264]
     360           0 :                 aPool << aStack << ocPercentSign;
     361           0 :                 aPool >> aStack;
     362           0 :                 break;
     363             :             case 0x15: // Parenthesis                           [326 278]
     364           0 :                 aPool << ocOpen << aStack << ocClose;
     365           0 :                 aPool >> aStack;
     366           0 :                 break;
     367             :             case 0x16: // Missing Argument                      [314 266]
     368           0 :                 aPool << ocMissing;
     369           0 :                 aPool >> aStack;
     370           0 :                 GetTracer().TraceFormulaMissingArg();
     371           0 :                 break;
     372             :             case 0x17: // String Constant                       [314 266]
     373           0 :                 aIn >> nLen;
     374           0 :                 aString = aIn.ReadRawByteString( nLen );
     375             : 
     376           0 :                 aStack << aPool.Store( aString );
     377           0 :                 break;
     378             :             case 0x19: // Special Attribute                     [327 279]
     379             :             {
     380           4 :                 sal_uInt16  nData(0), nFakt(0);
     381           4 :                 sal_uInt8   nOpt(0);
     382             : 
     383           4 :                 aIn >> nOpt;
     384             : 
     385           4 :                 if( meBiff == EXC_BIFF2 )
     386             :                 {
     387           0 :                     nData = aIn.ReaduInt8();
     388           0 :                     nFakt = 1;
     389             :                 }
     390             :                 else
     391             :                 {
     392           4 :                     aIn >> nData;
     393           4 :                     nFakt = 2;
     394             :                 }
     395             : 
     396           4 :                 if( nOpt & 0x04 )
     397             :                 {
     398             :                     // nFakt -> skip bytes or words    AttrChoose
     399           0 :                     ++nData;
     400           0 :                     aIn.Ignore(static_cast<sal_Size>(nData) * nFakt);
     401             :                 }
     402           4 :                 else if( nOpt & 0x10 )                      // AttrSum
     403           4 :                     DoMulArgs( ocSum, 1 );
     404             :             }
     405           4 :                 break;
     406             :             case 0x1A: // External Reference                    [330    ]
     407           0 :                 switch( meBiff )
     408             :                 {
     409           0 :                     case EXC_BIFF2: aIn.Ignore( 7 );    break;
     410             :                     case EXC_BIFF3:
     411           0 :                     case EXC_BIFF4: aIn.Ignore( 10 );   break;
     412             :                     case EXC_BIFF5:
     413             :                         DBG_WARNING( "-ExcelToSc::Convert(): 0x1A does not exist in Biff5!" );
     414             :                         //fall-through
     415             :                     default:
     416             :                         DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
     417             :                 }
     418           0 :                 break;
     419             :             case 0x1B: // End External Reference                [330    ]
     420           0 :                 switch( meBiff )
     421             :                 {
     422           0 :                     case EXC_BIFF2: aIn.Ignore( 3 );    break;
     423             :                     case EXC_BIFF3:
     424           0 :                     case EXC_BIFF4: aIn.Ignore( 4 );    break;
     425             :                     case EXC_BIFF5:
     426             :                         DBG_WARNING( "-ExcelToSc::Convert(): 0x1B does not exist in Biff5!" );
     427             :                         //fall-through
     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          40 :                 aIn >> nUINT16 >> nByte;
     547          40 :                 aSRD.SetAbsCol(static_cast<SCsCOL>(nByte));
     548          40 :                 aSRD.SetAbsRow(nUINT16 & 0x3FFF);
     549          40 :                 aSRD.SetRelTab(0);
     550          40 :                 aSRD.SetFlag3D( bRangeName );
     551             : 
     552          40 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName );
     553             : 
     554          40 :                 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          40 :                 aStack << aPool.Store( aSRD );
     565          40 :                 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           4 :                 ScSingleRefData&    rSRef1 = aCRD.Ref1;
     576           4 :                 ScSingleRefData&    rSRef2 = aCRD.Ref2;
     577             : 
     578           4 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
     579             : 
     580           4 :                 rSRef1.SetRelTab(0);
     581           4 :                 rSRef2.SetRelTab(0);
     582           4 :                 rSRef1.SetFlag3D( bRangeName );
     583           4 :                 rSRef2.SetFlag3D( bRangeName );
     584             : 
     585           4 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
     586           4 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
     587             : 
     588           4 :                 if( IsComplColRange( nColFirst, nColLast ) )
     589           0 :                     SetComplCol( aCRD );
     590           4 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
     591           0 :                     SetComplRow( aCRD );
     592             : 
     593           4 :                 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           4 :                 aStack << aPool.Store( aCRD );
     606             :             }
     607           4 :                 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         128 :                 aIn >> nUINT16 >> nByte;    // >> Attribute, Row >> Col
     628             : 
     629         128 :                 aSRD.SetRelTab(0);
     630         128 :                 aSRD.SetFlag3D( bRangeName );
     631             : 
     632         128 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF );
     633             : 
     634         128 :                 aStack << aPool.Store( aSRD );
     635             :             }
     636         128 :                 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           2 :                 aIn >> nExtSheet;
     790           2 :                 aIn.Ignore( 8 );
     791           2 :                 aIn >> nTabFirst >> nTabLast >> nRowFirst >> nRowLast
     792           2 :                     >> nColFirst >> nColLast;
     793             : 
     794           2 :                 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           2 :                 if( nExtSheet <= 0 )
     811             :                 {// in current Workbook
     812             :                     // first part of range
     813           2 :                     ScSingleRefData&    rR1 = aCRD.Ref1;
     814           2 :                     ScSingleRefData&    rR2 = aCRD.Ref2;
     815             : 
     816           2 :                     rR1.SetAbsTab(nTabFirst);
     817           2 :                     rR2.SetAbsTab(nTabLast);
     818           2 :                     rR1.SetFlag3D(true);
     819           2 :                     rR2.SetFlag3D( nTabFirst != nTabLast );
     820             : 
     821           2 :                     ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
     822           2 :                     ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
     823             : 
     824           2 :                     if( IsComplColRange( nColFirst, nColLast ) )
     825           0 :                         SetComplCol( aCRD );
     826           2 :                     else if( IsComplRowRange( nRowFirst, nRowLast ) )
     827           0 :                         SetComplRow( aCRD );
     828             : 
     829           2 :                     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           2 :                     if ( !ValidTab(static_cast<SCTAB>(nTabFirst)) )
     841           0 :                         rR1.SetTabDeleted( true );
     842           2 :                     if ( !ValidTab(static_cast<SCTAB>(nTabLast)) )
     843           0 :                         rR2.SetTabDeleted( true );
     844             : 
     845           2 :                     aStack << aPool.Store( aCRD );
     846             :                 }//END in current Workbook
     847             :             }
     848           2 :                 break;
     849           0 :             default: bError = true;
     850             :         }
     851         262 :         bError |= !aIn.IsValid();
     852             :     }
     853             : 
     854             :     ConvErr eRet;
     855             : 
     856          90 :     if( bError )
     857             :     {
     858           0 :         aPool << ocBad;
     859           0 :         aPool >> aStack;
     860           0 :         pErgebnis = aPool[ aStack.Get() ];
     861           0 :         eRet = ConvErrNi;
     862             :     }
     863          90 :     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          90 :     else if( bExternName )
     871             :     {
     872           0 :         pErgebnis = aPool[ aStack.Get() ];
     873           0 :         eRet = ConvErrExternal;
     874             :     }
     875          90 :     else if( bArrayFormula )
     876             :     {
     877           0 :         pErgebnis = NULL;
     878           0 :         eRet = ConvOK;
     879             :     }
     880             :     else
     881             :     {
     882          90 :         pErgebnis = aPool[ aStack.Get() ];
     883          90 :         eRet = ConvOK;
     884             :     }
     885             : 
     886          90 :     aIn.Seek( nEndPos );
     887             : 
     888          90 :     if( eRet == ConvOK )
     889          90 :         ReadExtensions( aExtensions, aIn );
     890             : 
     891         180 :     return eRet;
     892             : }
     893             : 
     894             : // stream seeks to first byte after <nFormulaLen>
     895           0 : ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal_Size nFormulaLen,
     896             :                             SCsTAB nTab, const FORMULA_TYPE eFT )
     897             : {
     898           0 :     RootData&       rR = GetOldRoot();
     899             :     sal_uInt8           nOp, nLen;
     900             :     sal_Size        nIgnore;
     901             :     sal_uInt16          nUINT16;
     902             :     sal_uInt8           nByte;
     903           0 :     bool            bError = false;
     904           0 :     const bool      bRangeName = eFT == FT_RangeName;
     905           0 :     const bool      bSharedFormula = eFT == FT_SharedFormula;
     906           0 :     const bool      bRNorSF = bRangeName || bSharedFormula;
     907             : 
     908             :     ScSingleRefData aSRD;
     909             :     ScComplexRefData    aCRD;
     910           0 :     aCRD.Ref1.SetAbsTab(aEingPos.Tab());
     911           0 :     aCRD.Ref2.SetAbsTab(aEingPos.Tab());
     912             : 
     913           0 :     bExternName = false;
     914             : 
     915           0 :     if( eStatus != ConvOK )
     916             :     {
     917           0 :         aIn.Ignore( nFormulaLen );
     918           0 :         return eStatus;
     919             :     }
     920             : 
     921           0 :     if( nFormulaLen == 0 )
     922           0 :         return ConvOK;
     923             : 
     924           0 :     sal_Size nEndPos = aIn.GetRecPos() + nFormulaLen;
     925             : 
     926           0 :     while( (aIn.GetRecPos() < nEndPos) && !bError )
     927             :     {
     928           0 :         aIn >> nOp;
     929           0 :         nIgnore = 0;
     930             : 
     931             :         // always reset flags
     932           0 :         aSRD.InitFlags();
     933           0 :         aCRD.InitFlags();
     934             : 
     935           0 :         switch( nOp )   //                              book page:
     936             :         {           //                                      SDK4 SDK5
     937             :             case 0x01: // Array Formula                         [325    ]
     938             :                        // Array Formula or Shared Formula       [    277]
     939           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 3 : 4;
     940           0 :                 break;
     941             :             case 0x02: // Data Table                            [325 277]
     942           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 3 : 4;
     943           0 :                 break;
     944             :             case 0x03: // Addition                              [312 264]
     945             :             case 0x04: // Subtraction                           [313 264]
     946             :             case 0x05: // Multiplication                        [313 264]
     947             :             case 0x06: // Division                              [313 264]
     948             :             case 0x07: // Exponetiation                         [313 265]
     949             :             case 0x08: // Concatenation                         [313 265]
     950             :             case 0x09: // Less Than                             [313 265]
     951             :             case 0x0A: // Less Than or Equal                    [313 265]
     952             :             case 0x0B: // Equal                                 [313 265]
     953             :             case 0x0C: // Greater Than or Equal                 [313 265]
     954             :             case 0x0D: // Greater Than                          [313 265]
     955             :             case 0x0E: // Not Equal                             [313 265]
     956             :             case 0x0F: // Intersection                          [314 265]
     957             :             case 0x10: // Union                                 [314 265]
     958             :             case 0x11: // Range                                 [314 265]
     959             :             case 0x12: // Unary Plus                            [312 264]
     960             :             case 0x13: // Unary Minus                           [312 264]
     961             :             case 0x14: // Percent Sign                          [312 264]
     962             :             case 0x15: // Parenthesis                           [326 278]
     963             :             case 0x16: // Missing Argument                      [314 266]
     964           0 :                 break;
     965             :             case 0x17: // String Constant                       [314 266]
     966           0 :                 aIn >> nLen;
     967           0 :                 nIgnore = nLen;
     968           0 :                 break;
     969             :             case 0x19: // Special Attribute                     [327 279]
     970             :             {
     971           0 :                 sal_uInt16 nData(0), nFakt(0);
     972           0 :                 sal_uInt8 nOpt(0);
     973             : 
     974           0 :                 aIn >> nOpt;
     975             : 
     976           0 :                 if( meBiff == EXC_BIFF2 )
     977             :                 {
     978           0 :                     nData = aIn.ReaduInt8();
     979           0 :                     nFakt = 1;
     980             :                 }
     981             :                 else
     982             :                 {
     983           0 :                     aIn >> nData;
     984           0 :                     nFakt = 2;
     985             :                 }
     986             : 
     987           0 :                 if( nOpt & 0x04 )
     988             :                 {
     989             :                     // nFakt -> skip bytes or words    AttrChoose
     990           0 :                     ++nData;
     991           0 :                     aIn.Ignore(static_cast<sal_Size>(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             :                                     //fall-through
    1003             :                     default:        DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
    1004             :                 }
    1005           0 :                 break;
    1006             :             case 0x1B: // End External Reference                [330    ]
    1007           0 :                 switch( meBiff )
    1008             :                 {
    1009           0 :                     case EXC_BIFF2: nIgnore = 3;        break;
    1010             :                     case EXC_BIFF3:
    1011           0 :                     case EXC_BIFF4: nIgnore = 4;        break;
    1012             :                     case EXC_BIFF5: DBG_WARNING( "-ExcelToSc::Convert(): 0x1B does not exist in Biff5!" );
    1013             :                                     //fall-through
    1014             :                     default:        DBG_WARNING( "-ExcelToSc::Convert(): A little oblivious?" );
    1015             :                 }
    1016           0 :                 break;
    1017             :             case 0x1C: // Error Value                           [314 266]
    1018             :             case 0x1D: // Boolean                               [315 266]
    1019           0 :                 nIgnore = 1;
    1020           0 :                 break;
    1021             :             case 0x1E: // Integer                               [315 266]
    1022           0 :                 nIgnore = 2;
    1023           0 :                 break;
    1024             :             case 0x1F: // Number                                [315 266]
    1025           0 :                 nIgnore = 8;
    1026           0 :                 break;
    1027             :             case 0x40:
    1028             :             case 0x60:
    1029             :             case 0x20: // Array Constant                        [317 268]
    1030           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 6 : 7;
    1031           0 :                 break;
    1032             :             case 0x41:
    1033             :             case 0x61:
    1034             :             case 0x21: // Function, Fixed Number of Arguments   [333 282]
    1035           0 :                 nIgnore = (meBiff <= EXC_BIFF3) ? 1 : 2;
    1036           0 :                 break;
    1037             :             case 0x42:
    1038             :             case 0x62:
    1039             :             case 0x22: // Function, Variable Number of Arg.     [333 283]
    1040           0 :                 nIgnore = (meBiff <= EXC_BIFF3) ? 2 : 3;
    1041           0 :                 break;
    1042             :             case 0x43:
    1043             :             case 0x63:
    1044             :             case 0x23: // Name                                  [318 269]
    1045           0 :                 switch( meBiff )
    1046             :                 {
    1047           0 :                     case EXC_BIFF2: nIgnore = 7;    break;
    1048             :                     case EXC_BIFF3:
    1049           0 :                     case EXC_BIFF4: nIgnore = 10;   break;
    1050           0 :                     case EXC_BIFF5: nIgnore = 14;   break;
    1051             :                     default:        OSL_FAIL( "-ExcelToSc::Convert(): A little oblivious?" );
    1052             :                 }
    1053           0 :                 break;
    1054             :             case 0x44:
    1055             :             case 0x64:
    1056             :             case 0x24: // Cell Reference                        [319 270]
    1057           0 :                 aIn >> nUINT16 >> nByte;
    1058           0 :                 aSRD.SetAbsCol(static_cast<SCsCOL>(nByte));
    1059           0 :                 aSRD.SetAbsRow(nUINT16 & 0x3FFF);
    1060           0 :                 aSRD.SetRelTab(0);
    1061           0 :                 aSRD.SetFlag3D( bRangeName );
    1062             : 
    1063           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName );
    1064             : 
    1065           0 :                 rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1066           0 :                 break;
    1067             :             case 0x45:
    1068             :             case 0x65:
    1069             :             case 0x25: // Area Reference                        [320 270]
    1070             :             {
    1071             :                 sal_uInt16          nRowFirst, nRowLast;
    1072             :                 sal_uInt8           nColFirst, nColLast;
    1073           0 :                 ScSingleRefData &rSRef1 = aCRD.Ref1;
    1074           0 :                 ScSingleRefData &rSRef2 = aCRD.Ref2;
    1075             : 
    1076           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
    1077             : 
    1078           0 :                 rSRef1.SetRelTab(0);
    1079           0 :                 rSRef2.SetRelTab(0);
    1080           0 :                 rSRef1.SetFlag3D( bRangeName );
    1081           0 :                 rSRef2.SetFlag3D( bRangeName );
    1082             : 
    1083           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
    1084           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
    1085             : 
    1086           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
    1087           0 :                     SetComplCol( aCRD );
    1088           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1089           0 :                     SetComplRow( aCRD );
    1090             : 
    1091           0 :                 rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1092             :             }
    1093           0 :                 break;
    1094             :             case 0x46:
    1095             :             case 0x66:
    1096             :             case 0x26: // Constant Reference Subexpression      [321 271]
    1097             :             case 0x47:
    1098             :             case 0x67:
    1099             :             case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
    1100             :             case 0x48:
    1101             :             case 0x68:
    1102             :             case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
    1103           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 4 : 6;
    1104           0 :                 break;
    1105             :             case 0x4A:
    1106             :             case 0x6A:
    1107             :             case 0x2A: // Deleted Cell Reference                [323 273]
    1108           0 :                 nIgnore = 3;
    1109           0 :                 break;
    1110             :             case 0x4B:
    1111             :             case 0x6B:
    1112             :             case 0x2B: // Deleted Area Refernce                 [323 273]
    1113           0 :                 nIgnore = 6;
    1114           0 :                 break;
    1115             :             case 0x4C:
    1116             :             case 0x6C:
    1117             :             case 0x2C: // Cell Reference Within a Name          [323    ]
    1118             :                        // Cell Reference Within a Shared Formula[    273]
    1119             :             {
    1120           0 :                 aIn >> nUINT16 >> nByte;    // >> Attribute, Row >> Col
    1121             : 
    1122           0 :                 aSRD.SetRelTab(0);
    1123           0 :                 aSRD.SetFlag3D( bRangeName );
    1124             : 
    1125           0 :                 ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF );
    1126             : 
    1127           0 :                 rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1128             :             }
    1129           0 :                 break;
    1130             :             case 0x4D:
    1131             :             case 0x6D:
    1132             :             case 0x2D: // Area Reference Within a Name          [324    ]
    1133             :             {      // Area Reference Within a Shared Formula[    274]
    1134             :                 sal_uInt16                  nRowFirst, nRowLast;
    1135             :                 sal_uInt8                   nColFirst, nColLast;
    1136             : 
    1137           0 :                 aCRD.Ref1.SetRelTab(0);
    1138           0 :                 aCRD.Ref2.SetRelTab(0);
    1139           0 :                 aCRD.Ref1.SetFlag3D( bRangeName );
    1140           0 :                 aCRD.Ref2.SetFlag3D( bRangeName );
    1141             : 
    1142           0 :                 aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
    1143             : 
    1144           0 :                 ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRNorSF );
    1145           0 :                 ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRNorSF );
    1146             : 
    1147           0 :                 if( IsComplColRange( nColFirst, nColLast ) )
    1148           0 :                     SetComplCol( aCRD );
    1149           0 :                 else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1150           0 :                     SetComplRow( aCRD );
    1151             : 
    1152           0 :                 rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1153             :             }
    1154           0 :                 break;
    1155             :             case 0x49:
    1156             :             case 0x69:
    1157             :             case 0x29: // Variable Reference Subexpression      [331 281]
    1158             :             case 0x4E:
    1159             :             case 0x6E:
    1160             :             case 0x2E: // Reference Subexpression Within a Name [332 282]
    1161             :             case 0x4F:
    1162             :             case 0x6F:
    1163             :             case 0x2F: // Incomplete Reference Subexpression... [332 282]
    1164           0 :                 nIgnore = (meBiff == EXC_BIFF2) ? 1 : 2;
    1165           0 :                 break;
    1166             :             case 0x58:
    1167             :             case 0x78:
    1168             :             case 0x38: // Command-Equivalent Function           [333    ]
    1169           0 :                 nIgnore = 2;
    1170           0 :                 break;
    1171             :             case 0x59:
    1172             :             case 0x79:
    1173             :             case 0x39: // Name or External Name                 [    275]
    1174           0 :                 nIgnore = 24;
    1175           0 :                 break;
    1176             :             case 0x5A:
    1177             :             case 0x7A:
    1178             :             case 0x3A: // 3-D Cell Reference                    [    275]
    1179             :             {
    1180             :                 sal_uInt16          nTabFirst, nTabLast, nRow;
    1181             :                 sal_Int16           nExtSheet;
    1182             :                 sal_uInt8           nCol;
    1183             : 
    1184           0 :                 aIn >> nExtSheet;
    1185           0 :                 aIn.Ignore( 8 );
    1186           0 :                 aIn >> nTabFirst >> nTabLast >> nRow >> nCol;
    1187             : 
    1188           0 :                 if( nExtSheet >= 0 )
    1189             :                     // from external
    1190             :                 {
    1191           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
    1192             :                     {
    1193           0 :                         nTabFirst = nTabLast;
    1194           0 :                         nExtSheet = 0;      // found
    1195             :                     }
    1196             :                     else
    1197             :                     {
    1198           0 :                         aPool << ocBad;
    1199           0 :                         aPool >> aStack;
    1200           0 :                         nExtSheet = 1;      // don't create a SingleRef
    1201             :                     }
    1202             :                 }
    1203             : 
    1204           0 :                 if( nExtSheet <= 0 )
    1205             :                 {// in current Workbook
    1206           0 :                     bool b3D = ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName;
    1207           0 :                     aSRD.SetAbsTab(nTabFirst);
    1208           0 :                     aSRD.SetFlag3D( b3D );
    1209             : 
    1210           0 :                     ExcRelToScRel( nRow, nCol, aSRD, bRangeName );
    1211             : 
    1212           0 :                     if( nTabLast != nTabFirst )
    1213             :                     {
    1214           0 :                         aCRD.Ref1 = aSRD;
    1215           0 :                         aCRD.Ref2 = aSRD;
    1216           0 :                         aCRD.Ref2.SetAbsTab(static_cast<SCTAB>(nTabLast));
    1217           0 :                         b3D = ( static_cast<SCTAB>(nTabLast) != aEingPos.Tab() );
    1218           0 :                         aCRD.Ref2.SetFlag3D( b3D );
    1219           0 :                         rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1220             :                     }
    1221             :                     else
    1222           0 :                         rRangeList.Append(aSRD.toAbs(aEingPos), nTab);
    1223             :                 }
    1224             :             }
    1225             : 
    1226           0 :                 break;
    1227             :             case 0x5B:
    1228             :             case 0x7B:
    1229             :             case 0x3B: // 3-D Area Reference                    [    276]
    1230             :             {
    1231             :                 sal_uInt16      nTabFirst, nTabLast, nRowFirst, nRowLast;
    1232             :                 sal_Int16       nExtSheet;
    1233             :                 sal_uInt8       nColFirst, nColLast;
    1234             : 
    1235           0 :                 aIn >> nExtSheet;
    1236           0 :                 aIn.Ignore( 8 );
    1237           0 :                 aIn >> nTabFirst >> nTabLast >> nRowFirst >> nRowLast
    1238           0 :                     >> nColFirst >> nColLast;
    1239             : 
    1240           0 :                 if( nExtSheet >= 0 )
    1241             :                     // from external
    1242             :                 {
    1243           0 :                     if( rR.pExtSheetBuff->GetScTabIndex( nExtSheet, nTabLast ) )
    1244             :                     {
    1245           0 :                         nTabFirst = nTabLast;
    1246           0 :                         nExtSheet = 0;      // found
    1247             :                     }
    1248             :                     else
    1249             :                     {
    1250           0 :                         aPool << ocBad;
    1251           0 :                         aPool >> aStack;
    1252           0 :                         nExtSheet = 1;      // don't create a CompleteRef
    1253             :                     }
    1254             :                 }
    1255             : 
    1256           0 :                 if( nExtSheet <= 0 )
    1257             :                 {// in current Workbook
    1258             :                     // first part of range
    1259           0 :                     ScSingleRefData &rR1 = aCRD.Ref1;
    1260           0 :                     ScSingleRefData &rR2 = aCRD.Ref2;
    1261             : 
    1262           0 :                     rR1.SetAbsTab(nTabFirst);
    1263           0 :                     rR2.SetAbsTab(nTabLast);
    1264           0 :                     rR1.SetFlag3D( ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName );
    1265           0 :                     rR2.SetFlag3D( ( static_cast<SCTAB>(nTabLast) != aEingPos.Tab() ) || bRangeName );
    1266             : 
    1267           0 :                     ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName );
    1268           0 :                     ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName );
    1269             : 
    1270           0 :                     if( IsComplColRange( nColFirst, nColLast ) )
    1271           0 :                         SetComplCol( aCRD );
    1272           0 :                     else if( IsComplRowRange( nRowFirst, nRowLast ) )
    1273           0 :                         SetComplRow( aCRD );
    1274             : 
    1275           0 :                     rRangeList.Append(aCRD.toAbs(aEingPos), nTab);
    1276             :                 }//END in current Workbook
    1277             :             }
    1278           0 :                 break;
    1279             :             case 0x5C:
    1280             :             case 0x7C:
    1281             :             case 0x3C: // Deleted 3-D Cell Reference            [    277]
    1282           0 :                 nIgnore = 17;
    1283           0 :                 break;
    1284             :             case 0x5D:
    1285             :             case 0x7D:
    1286             :             case 0x3D: // Deleted 3-D Area Reference            [    277]
    1287           0 :                 nIgnore = 20;
    1288           0 :                 break;
    1289           0 :             default: bError = true;
    1290             :         }
    1291           0 :         bError |= !aIn.IsValid();
    1292             : 
    1293           0 :         aIn.Ignore( nIgnore );
    1294             :     }
    1295             : 
    1296             :     ConvErr eRet;
    1297             : 
    1298           0 :     if( bError )
    1299           0 :         eRet = ConvErrNi;
    1300           0 :     else if( aIn.GetRecPos() != nEndPos )
    1301           0 :         eRet = ConvErrCount;
    1302           0 :     else if( bExternName )
    1303           0 :         eRet = ConvErrExternal;
    1304             :     else
    1305           0 :         eRet = ConvOK;
    1306             : 
    1307           0 :     aIn.Seek( nEndPos );
    1308           0 :     return eRet;
    1309             : }
    1310             : 
    1311           0 : ConvErr ExcelToSc::ConvertExternName( const ScTokenArray*& /*rpArray*/, XclImpStream& /*rStrm*/, sal_Size /*nFormulaLen*/,
    1312             :                                       const OUString& /*rUrl*/, const vector<OUString>& /*rTabNames*/ )
    1313             : {
    1314             :     // not implemented ...
    1315           0 :     return ConvErrNi;
    1316             : }
    1317             : 
    1318           0 : bool ExcelToSc::GetAbsRefs( ScRangeList& rRangeList, XclImpStream& rStrm, sal_Size nLen )
    1319             : {
    1320             :     OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF5 );
    1321           0 :     if( GetBiff() != EXC_BIFF5 )
    1322           0 :         return false;
    1323             : 
    1324             :     sal_uInt8 nOp;
    1325             :     sal_uInt16 nRow1, nRow2;
    1326             :     sal_uInt8 nCol1, nCol2;
    1327             :     SCTAB nTab1, nTab2;
    1328             :     sal_uInt16 nTabFirst, nTabLast;
    1329             :     sal_Int16 nRefIdx;
    1330             : 
    1331             :     sal_Size nSeek;
    1332           0 :     sal_Size nEndPos = rStrm.GetRecPos() + nLen;
    1333             : 
    1334           0 :     while( rStrm.IsValid() && (rStrm.GetRecPos() < nEndPos) )
    1335             :     {
    1336           0 :         rStrm >> nOp;
    1337           0 :         nSeek = 0;
    1338             : 
    1339           0 :         switch( nOp )
    1340             :         {
    1341             :             case 0x44:
    1342             :             case 0x64:
    1343             :             case 0x24: // Cell Reference                        [319 270]
    1344             :             case 0x4C:
    1345             :             case 0x6C:
    1346             :             case 0x2C: // Cell Reference Within a Name          [323    ]
    1347             :                        // Cell Reference Within a Shared Formula[    273]
    1348           0 :                 rStrm >> nRow1 >> nCol1;
    1349             : 
    1350           0 :                 nRow2 = nRow1;
    1351           0 :                 nCol2 = nCol1;
    1352           0 :                 nTab1 = nTab2 = GetCurrScTab();
    1353           0 :                 goto _common;
    1354             :             case 0x45:
    1355             :             case 0x65:
    1356             :             case 0x25: // Area Reference                        [320 270]
    1357             :             case 0x4D:
    1358             :             case 0x6D:
    1359             :             case 0x2D: // Area Reference Within a Name          [324    ]
    1360             :                        // Area Reference Within a Shared Formula[    274]
    1361           0 :                 rStrm >> nRow1 >> nRow2 >> nCol1 >> nCol2;
    1362             : 
    1363           0 :                 nTab1 = nTab2 = GetCurrScTab();
    1364           0 :                 goto _common;
    1365             :             case 0x5A:
    1366             :             case 0x7A:
    1367             :             case 0x3A: // 3-D Cell Reference                    [    275]
    1368           0 :                 rStrm >> nRefIdx;
    1369           0 :                 rStrm.Ignore( 8 );
    1370           0 :                 rStrm >> nTabFirst >> nTabLast >> nRow1 >> nCol1;
    1371             : 
    1372           0 :                 nRow2 = nRow1;
    1373           0 :                 nCol2 = nCol1;
    1374             : 
    1375           0 :                 goto _3d_common;
    1376             :             case 0x5B:
    1377             :             case 0x7B:
    1378             :             case 0x3B: // 3-D Area Reference                    [    276]
    1379           0 :                 rStrm >> nRefIdx;
    1380           0 :                 rStrm.Ignore( 8 );
    1381           0 :                 rStrm >> nTabFirst >> nTabLast >> nRow1 >> nRow2 >> nCol1 >> nCol2;
    1382             : 
    1383             :     _3d_common:
    1384           0 :                 nTab1 = static_cast< SCTAB >( nTabFirst );
    1385           0 :                 nTab2 = static_cast< SCTAB >( nTabLast );
    1386             : 
    1387             :                 // skip references to deleted sheets
    1388           0 :                 if( (nRefIdx >= 0) || !ValidTab( nTab1 ) || (nTab1 != nTab2) )
    1389           0 :                     break;
    1390             : 
    1391           0 :                 goto _common;
    1392             :     _common:
    1393             :                 // do not check abs/rel flags, linked controls have set them!
    1394             :                 {
    1395           0 :                     ScRange aScRange;
    1396           0 :                     nRow1 &= 0x3FFF;
    1397           0 :                     nRow2 &= 0x3FFF;
    1398           0 :                     if( GetAddressConverter().ConvertRange( aScRange, XclRange( nCol1, nRow1, nCol2, nRow2 ), nTab1, nTab2, true ) )
    1399           0 :                         rRangeList.Append( aScRange );
    1400             :                 }
    1401           0 :                 break;
    1402             : 
    1403             :             case 0x03: // Addition                              [312 264]
    1404             :             case 0x04: // Subtraction                           [313 264]
    1405             :             case 0x05: // Multiplication                        [313 264]
    1406             :             case 0x06: // Division                              [313 264]
    1407             :             case 0x07: // Exponetiation                         [313 265]
    1408             :             case 0x08: // Concatenation                         [313 265]
    1409             :             case 0x09: // Less Than                             [313 265]
    1410             :             case 0x0A: // Less Than or Equal                    [313 265]
    1411             :             case 0x0B: // Equal                                 [313 265]
    1412             :             case 0x0C: // Greater Than or Equal                 [313 265]
    1413             :             case 0x0D: // Greater Than                          [313 265]
    1414             :             case 0x0E: // Not Equal                             [313 265]
    1415             :             case 0x0F: // Intersection                          [314 265]
    1416             :             case 0x10: // Union                                 [314 265]
    1417             :             case 0x11: // Range                                 [314 265]
    1418             :             case 0x12: // Unary Plus                            [312 264]
    1419             :             case 0x13: // Unary Minus                           [312 264]
    1420             :             case 0x14: // Percent Sign                          [312 264]
    1421             :             case 0x15: // Parenthesis                           [326 278]
    1422             :             case 0x16: // Missing Argument                      [314 266]
    1423           0 :                 break;
    1424             :             case 0x1C: // Error Value                           [314 266]
    1425             :             case 0x1D: // Boolean                               [315 266]
    1426           0 :                 nSeek = 1;
    1427           0 :                 break;
    1428             :             case 0x1E: // Integer                               [315 266]
    1429             :             case 0x41:
    1430             :             case 0x61:
    1431             :             case 0x21: // Function, Fixed Number of Arguments   [333 282]
    1432             :             case 0x49:
    1433             :             case 0x69:
    1434             :             case 0x29: // Variable Reference Subexpression      [331 281]
    1435             :             case 0x4E:
    1436             :             case 0x6E:
    1437             :             case 0x2E: // Reference Subexpression Within a Name [332 282]
    1438             :             case 0x4F:
    1439             :             case 0x6F:
    1440             :             case 0x2F: // Incomplete Reference Subexpression... [332 282]
    1441             :             case 0x58:
    1442             :             case 0x78:
    1443             :             case 0x38: // Command-Equivalent Function           [333    ]
    1444           0 :                 nSeek = 2;
    1445           0 :                 break;
    1446             :             case 0x42:
    1447             :             case 0x62:
    1448             :             case 0x22: // Function, Variable Number of Arg.     [333 283]
    1449             :             case 0x4A:
    1450             :             case 0x6A:
    1451             :             case 0x2A: // Deleted Cell Reference                [323 273]
    1452           0 :                 nSeek = 3;
    1453           0 :                 break;
    1454             :             case 0x01: // Array Formula                         [325    ]
    1455             :                        // Array Formula or Shared Formula       [    277]
    1456             :             case 0x02: // Data Table                            [325 277]
    1457           0 :                 nSeek = 4;
    1458           0 :                 break;
    1459             :             case 0x46:
    1460             :             case 0x66:
    1461             :             case 0x26: // Constant Reference Subexpression      [321 271]
    1462             :             case 0x47:
    1463             :             case 0x67:
    1464             :             case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
    1465             :             case 0x48:
    1466             :             case 0x68:
    1467             :             case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
    1468             :             case 0x4B:
    1469             :             case 0x6B:
    1470             :             case 0x2B: // Deleted Area Refernce                 [323 273]
    1471           0 :                 nSeek = 6;
    1472           0 :                 break;
    1473             :             case 0x40:
    1474             :             case 0x60:
    1475             :             case 0x20: // Array Constant                        [317 268]
    1476           0 :                 nSeek = 7;
    1477           0 :                 break;
    1478             :             case 0x1F: // Number                                [315 266]
    1479           0 :                 nSeek = 8;
    1480           0 :                 break;
    1481             :             case 0x43:
    1482             :             case 0x63:
    1483             :             case 0x23: // Name                                  [318 269]
    1484           0 :                 nSeek = 14;
    1485           0 :                 break;
    1486             :             case 0x5C:
    1487             :             case 0x7C:
    1488             :             case 0x3C: // Deleted 3-D Cell Reference            [    277]
    1489           0 :                 nSeek = 17;
    1490           0 :                 break;
    1491             :             case 0x5D:
    1492             :             case 0x7D:
    1493             :             case 0x3D: // Deleted 3-D Area Reference            [    277]
    1494           0 :                 nSeek = 20;
    1495           0 :                 break;
    1496             :             case 0x59:
    1497             :             case 0x79:
    1498             :             case 0x39: // Name or External Name                 [    275]
    1499           0 :                 nSeek = 24;
    1500           0 :                 break;
    1501             :             case 0x17: // String Constant                       [314 266]
    1502           0 :                 nSeek = rStrm.ReaduInt8();
    1503           0 :                 break;
    1504             :             case 0x19: // Special Attribute                     [327 279]
    1505             :             {
    1506             :                 sal_uInt8 nOpt;
    1507             :                 sal_uInt16 nData;
    1508           0 :                 rStrm >> nOpt >> nData;
    1509           0 :                 if( nOpt & 0x04 )
    1510           0 :                     nSeek = nData * 2 + 2;
    1511             :             }
    1512           0 :                 break;
    1513             :         }
    1514             : 
    1515           0 :         rStrm.Ignore( nSeek );
    1516             :     }
    1517           0 :     rStrm.Seek( nEndPos );
    1518             : 
    1519           0 :     return !rRangeList.empty();
    1520             : }
    1521             : 
    1522        6776 : void ExcelToSc::DoMulArgs( DefTokenId eId, sal_uInt8 nAnz )
    1523             : {
    1524        6776 :     TokenId                 eParam[ 256 ];
    1525             :     sal_Int32                   nLauf;
    1526             : 
    1527        6776 :     if( eId == ocCeil || eId == ocFloor )
    1528             :     {
    1529           0 :         aStack << aPool.Store( 1.0 );   // default, because not present in Excel
    1530           0 :         nAnz++;
    1531             :     }
    1532             : 
    1533       20534 :     for( nLauf = 0; aStack.HasMoreTokens() && (nLauf < nAnz); nLauf++ )
    1534       13758 :         aStack >> eParam[ nLauf ];
    1535             :     // #i70925# reduce parameter count, if no more tokens available on token stack
    1536        6776 :     if( nLauf < nAnz )
    1537           0 :         nAnz = static_cast< sal_uInt8 >( nLauf );
    1538             : 
    1539        6776 :     if( nAnz > 0 && eId == ocExternal )
    1540             :     {
    1541         354 :         TokenId             n = eParam[ nAnz - 1 ];
    1542             : //##### GRUETZE FUER BASIC-FUNCS RICHTEN!
    1543         354 :         if( const OUString* pExt = aPool.GetExternal( n ) )
    1544             :         {
    1545         354 :             if( const XclFunctionInfo* pFuncInfo = maFuncProv.GetFuncInfoFromXclMacroName( *pExt ) )
    1546         352 :                 aPool << pFuncInfo->meOpCode;
    1547             :             else
    1548           2 :                 aPool << n;
    1549         354 :             nAnz--;
    1550             :         }
    1551             :         else
    1552           0 :             aPool << eId;
    1553             :     }
    1554             :     else
    1555        6422 :         aPool << eId;
    1556             : 
    1557        6776 :     aPool << ocOpen;
    1558             : 
    1559        6776 :     if( nAnz > 0 )
    1560             :     {
    1561             :         // attention: 0 = last parameter, nAnz-1 = first parameter
    1562        6760 :         sal_Int16 nSkipEnd = -1;    // skip all parameters <= nSkipEnd
    1563             : 
    1564        6760 :         sal_Int16 nLast = nAnz - 1;
    1565             : 
    1566             :         // functions for which parameters have to be skipped
    1567        6760 :         if( eId == ocPercentrank && nAnz == 3 )
    1568           0 :             nSkipEnd = 0;       // skip last parameter if necessary
    1569             : 
    1570             :         // Joost special cases
    1571        6760 :         else if( eId == ocIf )
    1572             :         {
    1573           8 :             sal_uInt16          nNullParam = 0;
    1574          28 :             for( nLauf = 0 ; nLauf < nAnz ; nLauf++ )
    1575             :             {
    1576          20 :                 if( aPool.IsSingleOp( eParam[ nLauf ], ocMissing ) )
    1577             :                 {
    1578           0 :                     if( !nNullParam )
    1579           0 :                         nNullParam = (sal_uInt16) aPool.Store( ( double ) 0.0 );
    1580           0 :                     eParam[ nLauf ] = nNullParam;
    1581             :                 }
    1582             :             }
    1583             :         }
    1584             : 
    1585             :         // [Parameter{;Parameter}]
    1586        6760 :         if( nLast > nSkipEnd )
    1587             :         {
    1588        6760 :             sal_Int16 nNull = -1;       // skip this parameter
    1589        6760 :             aPool << eParam[ nLast ];
    1590       13404 :             for( nLauf = nLast - 1 ; nLauf > nSkipEnd ; nLauf-- )
    1591             :             {
    1592        6644 :                 if( nLauf != nNull )
    1593        6644 :                     aPool << ocSep << eParam[ nLauf ];
    1594             :             }
    1595             :         }
    1596             :     }
    1597        6776 :     aPool << ocClose;
    1598             : 
    1599        6776 :     aPool >> aStack;
    1600        6776 : }
    1601             : 
    1602         180 : void ExcelToSc::ExcRelToScRel( sal_uInt16 nRow, sal_uInt8 nCol, ScSingleRefData &rSRD, const bool bName )
    1603             : {
    1604         180 :     if( bName )
    1605             :     {
    1606             :         // C O L
    1607         132 :         if( nRow & 0x4000 )
    1608         128 :             rSRD.SetRelCol(nCol);
    1609             :         else
    1610           4 :             rSRD.SetAbsCol(nCol);
    1611             : 
    1612             :         // R O W
    1613         132 :         if( nRow & 0x8000 )
    1614             :         {//                                                         rel Row
    1615         128 :             if( nRow & 0x2000 ) // Bit 13 set?
    1616             :                 // Row negative
    1617           0 :                 rSRD.SetRelRow(nRow | 0xC000);
    1618             :             else
    1619             :                 // Row positive
    1620         128 :                 rSRD.SetRelRow(nRow & nRowMask);
    1621             :         }
    1622             :         else
    1623             :         {//                                                         abs Row
    1624           4 :             rSRD.SetAbsRow(nRow & nRowMask);
    1625             :         }
    1626             : 
    1627             :         // T A B
    1628             :         // abs needed if rel in shared formula for ScCompiler UpdateNameReference
    1629         132 :         if ( rSRD.IsTabRel() && !rSRD.IsFlag3D() )
    1630         128 :             rSRD.SetAbsTab(GetCurrScTab());
    1631             :     }
    1632             :     else
    1633             :     {
    1634          48 :         bool bColRel = (nRow & 0x4000) > 0;
    1635          48 :         bool bRowRel = (nRow & 0x8000) > 0;
    1636             : 
    1637          48 :         if (bColRel)
    1638          48 :             rSRD.SetRelCol(nCol - aEingPos.Col());
    1639             :         else
    1640           0 :             rSRD.SetAbsCol(nCol);
    1641             : 
    1642          48 :         rSRD.SetAbsRow(nRow & nRowMask);
    1643          48 :         if (bRowRel)
    1644          48 :             rSRD.SetRelRow(rSRD.Row() - aEingPos.Row());
    1645             : 
    1646             :         // T A B
    1647             :         // #i10184# abs needed if rel in shared formula for ScCompiler UpdateNameReference
    1648          48 :         if ( rSRD.IsTabRel() && !rSRD.IsFlag3D() )
    1649          48 :             rSRD.SetAbsTab(GetCurrScTab() + rSRD.Tab());
    1650             :     }
    1651         180 : }
    1652             : 
    1653           2 : const ScTokenArray* ExcelToSc::GetBoolErr( XclBoolError eType )
    1654             : {
    1655             :     sal_uInt16                  nError;
    1656           2 :     aPool.Reset();
    1657           2 :     aStack.Reset();
    1658             : 
    1659             :     DefTokenId              eOc;
    1660             : 
    1661           2 :     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           2 :         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           2 :     aPool << eOc;
    1680           2 :     if( eOc != ocStop )
    1681           2 :         aPool << ocOpen << ocClose;
    1682             : 
    1683           2 :     aPool >> aStack;
    1684             : 
    1685           2 :     const ScTokenArray*     pErgebnis = aPool[ aStack.Get() ];
    1686           2 :     if( nError )
    1687           0 :         ( ( ScTokenArray* ) pErgebnis )->SetCodeError( nError );
    1688             : 
    1689           2 :     ( ( ScTokenArray* ) pErgebnis )->SetExclusiveRecalcModeNormal();
    1690             : 
    1691           2 :     return pErgebnis;
    1692             : }
    1693             : 
    1694        2268 : bool ExcelToSc::ReadSharedFormulaPosition( XclImpStream& rStrm, SCCOL& rCol, SCROW& rRow )
    1695             : {
    1696        2268 :     rStrm.PushPosition();
    1697             : 
    1698             :     sal_uInt8 nOp;
    1699        2268 :     rStrm >> nOp;
    1700             : 
    1701        2268 :     if (nOp != 0x01)   // must be PtgExp token.
    1702             :     {
    1703         496 :         rStrm.PopPosition();
    1704         496 :         return false;
    1705             :     }
    1706             : 
    1707             :     sal_uInt16 nRow, nCol;
    1708        1772 :     rStrm >> nRow >> nCol;
    1709        1772 :     rStrm.PopPosition();
    1710        1772 :     rCol = nCol;
    1711        1772 :     rRow = nRow;
    1712        1772 :     return true;
    1713             : }
    1714             : 
    1715        1772 : const ScTokenArray* ExcelToSc::GetSharedFormula( const ScAddress& rRefPos ) const
    1716             : {
    1717        1772 :     return GetOldRoot().pShrfmlaBuff->Find(rRefPos);
    1718             : }
    1719             : 
    1720           2 : void ExcelToSc::SetError( ScFormulaCell &rCell, const ConvErr eErr )
    1721             : {
    1722             :     sal_uInt16  nInd;
    1723             : 
    1724           2 :     switch( eErr )
    1725             :     {
    1726           2 :         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           2 :     rCell.SetErrCode( nInd );
    1734           2 : }
    1735             : 
    1736           0 : void ExcelToSc::SetComplCol( ScComplexRefData &rCRD )
    1737             : {
    1738           0 :     ScSingleRefData &rSRD = rCRD.Ref2;
    1739           0 :     if( rSRD.IsColRel() )
    1740           0 :         rSRD.SetRelCol(MAXCOL - aEingPos.Col());
    1741             :     else
    1742           0 :         rSRD.SetAbsCol(MAXCOL);
    1743           0 : }
    1744             : 
    1745           0 : void ExcelToSc::SetComplRow( ScComplexRefData &rCRD )
    1746             : {
    1747           0 :     ScSingleRefData &rSRD = rCRD.Ref2;
    1748           0 :     if( rSRD.IsRowRel() )
    1749           0 :         rSRD.SetRelRow(MAXROW - aEingPos.Row());
    1750             :     else
    1751           0 :         rSRD.SetAbsRow(MAXROW);
    1752           0 : }
    1753             : 
    1754          14 : void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn )
    1755             : {
    1756             :     sal_uInt8        nByte;
    1757             :     sal_uInt16      nUINT16;
    1758             :     double      fDouble;
    1759          14 :     OUString    aString;
    1760             :     ScMatrix*   pMatrix;
    1761             : 
    1762          14 :     aIn >> nByte >> nUINT16;
    1763             : 
    1764             :     SCSIZE nC, nCols;
    1765             :     SCSIZE nR, nRows;
    1766          14 :     if( GetBiff() == EXC_BIFF8 )
    1767             :     {
    1768          14 :         nCols = nByte + 1;
    1769          14 :         nRows = nUINT16 + 1;
    1770             :     }
    1771             :     else
    1772             :     {
    1773           0 :         nCols = nByte ? nByte : 256;
    1774           0 :         nRows = nUINT16;
    1775             :     }
    1776             : 
    1777          14 :     pMatrix = aPool.GetMatrix( n );
    1778             : 
    1779          14 :     if( NULL != pMatrix )
    1780             :     {
    1781          14 :         pMatrix->Resize(nCols, nRows);
    1782          14 :         pMatrix->GetDimensions( nC, nR);
    1783          14 :         if( nC != nCols || nR != nRows )
    1784             :         {
    1785             :             OSL_FAIL( "ExcelToSc::ReadExtensionArray - matrix size mismatch" );
    1786           0 :             pMatrix = NULL;
    1787             :         }
    1788             :     }
    1789             :     else
    1790             :     {
    1791             :         OSL_FAIL( "ExcelToSc::ReadExtensionArray - missing matrix" );
    1792             :     }
    1793             : 
    1794          14 :     svl::SharedStringPool& rPool = GetDoc().GetSharedStringPool();
    1795          46 :     for( nR = 0 ; nR < nRows; nR++ )
    1796             :     {
    1797         108 :         for( nC = 0 ; nC < nCols; nC++ )
    1798             :         {
    1799          76 :             aIn >> nByte;
    1800          76 :             switch( nByte )
    1801             :             {
    1802             :                 case EXC_CACHEDVAL_EMPTY:
    1803           0 :                     aIn.Ignore( 8 );
    1804           0 :                     if( NULL != pMatrix )
    1805             :                     {
    1806           0 :                         pMatrix->PutEmpty( nC, nR );
    1807             :                     }
    1808           0 :                     break;
    1809             : 
    1810             :                 case EXC_CACHEDVAL_DOUBLE:
    1811          76 :                     aIn >> fDouble;
    1812          76 :                     if( NULL != pMatrix )
    1813             :                     {
    1814          76 :                         pMatrix->PutDouble( fDouble, nC, nR );
    1815             :                     }
    1816          76 :                     break;
    1817             : 
    1818             :                 case EXC_CACHEDVAL_STRING:
    1819           0 :                     if( GetBiff() == EXC_BIFF8 )
    1820             :                     {
    1821           0 :                         aIn >> nUINT16;
    1822           0 :                         aString = aIn.ReadUniString( nUINT16 );
    1823             :                     }
    1824             :                     else
    1825             :                     {
    1826           0 :                         aIn >> nByte;
    1827           0 :                         aString = aIn.ReadRawByteString( nByte );
    1828             :                     }
    1829           0 :                     if( NULL != pMatrix )
    1830             :                     {
    1831           0 :                         pMatrix->PutString(rPool.intern(aString), nC, nR);
    1832             :                     }
    1833           0 :                     break;
    1834             : 
    1835             :                 case EXC_CACHEDVAL_BOOL:
    1836           0 :                     aIn >> nByte;
    1837           0 :                     aIn.Ignore( 7 );
    1838           0 :                     if( NULL != pMatrix )
    1839             :                     {
    1840           0 :                         pMatrix->PutBoolean( nByte != 0, nC, nR );
    1841             :                     }
    1842           0 :                     break;
    1843             : 
    1844             :                 case EXC_CACHEDVAL_ERROR:
    1845           0 :                     aIn >> nByte;
    1846           0 :                     aIn.Ignore( 7 );
    1847           0 :                     if( NULL != pMatrix )
    1848             :                     {
    1849           0 :                         pMatrix->PutError( XclTools::GetScErrorCode( nByte ), nC, nR );
    1850             :                     }
    1851           0 :                     break;
    1852             :             }
    1853             :         }
    1854          14 :     }
    1855          14 : }
    1856             : 
    1857           0 : void ExcelToSc::ReadExtensionNlr( XclImpStream& aIn )
    1858             : {
    1859             :     sal_uInt32 nFlags;
    1860           0 :     aIn >> nFlags;
    1861             : 
    1862           0 :     sal_uInt32 nCount = nFlags & EXC_TOK_NLR_ADDMASK;
    1863           0 :     aIn.Ignore( nCount * 4 ); // Drop the cell positions
    1864           0 : }
    1865             : 
    1866           0 : void ExcelToSc::ReadExtensionMemArea( XclImpStream& aIn )
    1867             : {
    1868           0 :     sal_uInt16 nCount(0);
    1869           0 :     aIn >> nCount;
    1870             : 
    1871           0 :     aIn.Ignore( static_cast<sal_Size>(nCount) * ((GetBiff() == EXC_BIFF8) ? 8 : 6) ); // drop the ranges
    1872           0 : }
    1873             : 
    1874        6088 : void ExcelToSc::ReadExtensions( const ExtensionTypeVec& rExtensions,
    1875             :                                 XclImpStream& aIn )
    1876             : {
    1877        6088 :     unsigned int nArray = 0;
    1878             : 
    1879        6102 :     for( unsigned int i = 0 ; i < rExtensions.size() ; i++ )
    1880             :     {
    1881          14 :         ExtensionType eType = rExtensions[i];
    1882             : 
    1883          14 :         switch( eType )
    1884             :         {
    1885             :             case EXTENSION_ARRAY:
    1886          14 :                 ReadExtensionArray( nArray++, aIn );
    1887          14 :                 break;
    1888             : 
    1889             :             case EXTENSION_NLR:
    1890           0 :                 ReadExtensionNlr( aIn );
    1891           0 :                 break;
    1892             : 
    1893             :             case EXTENSION_MEMAREA:
    1894           0 :                 ReadExtensionMemArea( aIn );
    1895           0 :                 break;
    1896             :         }
    1897             :     }
    1898        6136 : }
    1899             : 
    1900             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10