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