xref: /trunk/main/sc/source/filter/excel/tokstack.cxx (revision b77af630)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scfilt.hxx"
26 
27 
28 #ifndef PCH
29 #include <string.h>
30 #endif
31 
32 #include "compiler.hxx"
33 #include "tokstack.hxx"
34 #include "global.hxx"
35 #include "scmatrix.hxx"
36 
37 #include <stdio.h> // printf
38 
39 const sal_uInt16	TokenPool::nScTokenOff = 8192;
40 
41 
TokenStack(sal_uInt16 nNewSize)42 TokenStack::TokenStack( sal_uInt16 nNewSize )
43 {
44 	pStack = new TokenId[ nNewSize ];
45 
46 	Reset();
47 	nSize = nNewSize;
48 }
49 
50 
~TokenStack()51 TokenStack::~TokenStack()
52 {
53 	delete[] pStack;
54 }
55 
56 
57 
58 
59 //------------------------------------------------------------------------
60 
61 // !ACHTUNG!: nach Aussen hin beginnt die Nummerierung mit 1!
62 // !ACHTUNG!: SC-Token werden mit einem Offset nScTokenOff abgelegt
63 //				-> Unterscheidung von anderen Token
64 
65 
TokenPool(void)66 TokenPool::TokenPool( void )
67 {
68 	sal_uInt16	nLauf = nScTokenOff;
69 
70 	// Sammelstelle fuer Id-Folgen
71 	nP_Id = 256;
72 	pP_Id = new sal_uInt16[ nP_Id ];
73 
74 	// Sammelstelle fuer Ids
75 	nElement = 32;
76 	pElement = new sal_uInt16[ nElement ];
77 	pType = new E_TYPE[ nElement ];
78 	pSize = new sal_uInt16[ nElement ];
79 	nP_IdLast = 0;
80 
81 	// Sammelstelle fuer Strings
82 	nP_Str = 4;
83 	ppP_Str = new String *[ nP_Str ];
84 	for( nLauf = 0 ; nLauf < nP_Str ; nLauf++ )
85 		ppP_Str[ nLauf ] = NULL;
86 
87 	// Sammelstelle fuer double
88 	nP_Dbl = 8;
89 	pP_Dbl = new double[ nP_Dbl ];
90 
91     // Sammelstelle fuer error codes
92     nP_Err = 8;
93     pP_Err = new sal_uInt16[ nP_Err ];
94 
95 	// Sammelstellen fuer Referenzen
96 	nP_RefTr = 32;
97 	ppP_RefTr = new ScSingleRefData *[ nP_RefTr ];
98 	for( nLauf = 0 ; nLauf < nP_RefTr ; nLauf++ )
99 		ppP_RefTr[ nLauf ] = NULL;
100 
101 	nP_Ext = 32;
102 	ppP_Ext = new EXTCONT*[ nP_Ext ];
103 	memset( ppP_Ext, 0, sizeof( EXTCONT* ) * nP_Ext );
104 
105     nP_Nlf = 16;
106 	ppP_Nlf = new NLFCONT*[ nP_Nlf ];
107 	memset( ppP_Nlf, 0, sizeof( NLFCONT* ) * nP_Nlf );
108 
109     nP_Matrix = 16;
110     ppP_Matrix = new ScMatrix*[ nP_Matrix ];
111     memset( ppP_Matrix, 0, sizeof( ScMatrix* ) * nP_Matrix );
112 
113 	pScToken = new ScTokenArray;
114 
115 	Reset();
116 }
117 
118 
~TokenPool()119 TokenPool::~TokenPool()
120 {
121     sal_uInt16	n;
122 
123     delete[] pP_Id;
124     delete[] pElement;
125     delete[] pType;
126     delete[] pSize;
127     delete[] pP_Dbl;
128     delete[] pP_Err;
129 
130     for( n = 0 ; n < nP_RefTr ; n++ )
131         delete ppP_RefTr[ n ];
132     delete[] ppP_RefTr;
133 
134     for( n = 0 ; n < nP_Str ; n++ )
135         delete ppP_Str[ n ];
136     delete[] ppP_Str;
137 
138     for( n = 0 ; n < nP_Ext ; n++ )
139         delete ppP_Ext[ n ];
140     delete[] ppP_Ext;
141 
142     for( n = 0 ; n < nP_Nlf ; n++ )
143         delete ppP_Nlf[ n ];
144     delete[] ppP_Nlf;
145 
146     for( n = 0 ; n < nP_Matrix ; n++ )
147     {
148         if( ppP_Matrix[ n ] )
149             ppP_Matrix[ n ]->DecRef( );
150     }
151     delete[] ppP_Matrix;
152 
153     delete pScToken;
154 }
155 
156 
157 /** Returns the new number of elements, or 0 if overflow. */
lcl_canGrow(sal_uInt16 nOld,sal_uInt16 nByMin=1)158 static sal_uInt16 lcl_canGrow( sal_uInt16 nOld, sal_uInt16 nByMin = 1 )
159 {
160     if (!nOld)
161         return nByMin ? nByMin : 1;
162     if (nOld == SAL_MAX_UINT16)
163         return 0;
164     sal_uInt32 nNew = ::std::max( static_cast<sal_uInt32>(nOld) * 2,
165             static_cast<sal_uInt32>(nOld) + nByMin);
166     if (nNew > SAL_MAX_UINT16)
167         nNew = SAL_MAX_UINT16;
168     if (nNew - nByMin < nOld)
169         nNew = 0;
170     return static_cast<sal_uInt16>(nNew);
171 }
172 
173 
GrowString(void)174 bool TokenPool::GrowString( void )
175 {
176     sal_uInt16 nP_StrNew = lcl_canGrow( nP_Str);
177     if (!nP_StrNew)
178         return false;
179 
180 	sal_uInt16		nL;
181 
182 	String**	ppP_StrNew = new (::std::nothrow) String *[ nP_StrNew ];
183     if (!ppP_StrNew)
184         return false;
185 
186 	for( nL = 0 ; nL < nP_Str ; nL++ )
187 		ppP_StrNew[ nL ] = ppP_Str[ nL ];
188 	for( nL = nP_Str ; nL < nP_StrNew ; nL++ )
189 		ppP_StrNew[ nL ] = NULL;
190 
191 	nP_Str = nP_StrNew;
192 
193 	delete[]	ppP_Str;
194 	ppP_Str = ppP_StrNew;
195     return true;
196 }
197 
198 
GrowDouble(void)199 bool TokenPool::GrowDouble( void )
200 {
201     sal_uInt16 nP_DblNew = lcl_canGrow( nP_Dbl);
202     if (!nP_DblNew)
203         return false;
204 
205 
206 	double*		pP_DblNew = new (::std::nothrow) double[ nP_DblNew ];
207     if (!pP_DblNew)
208         return false;
209 
210 	for( sal_uInt16 nL = 0 ; nL < nP_Dbl ; nL++ )
211 		pP_DblNew[ nL ] = pP_Dbl[ nL ];
212 
213 	nP_Dbl = nP_DblNew;
214 
215 	delete[] pP_Dbl;
216 	pP_Dbl = pP_DblNew;
217     return true;
218 }
219 
220 
221 /* TODO: in case we had FormulaTokenArray::AddError() */
222 #if 0
223 void TokenPool::GrowError( void )
224 {
225     sal_uInt16 nP_ErrNew = lcl_canGrow( nP_Err);
226     if (!nP_ErrNew)
227         return false;
228 
229 
230     sal_uInt16*     pP_ErrNew = new (::std::nothrow) sal_uInt16[ nP_ErrNew ];
231     if (!pP_ErrNew)
232         return false;
233 
234     for( sal_uInt16 nL = 0 ; nL < nP_Err ; nL++ )
235         pP_ErrNew[ nL ] = pP_Err[ nL ];
236 
237     nP_Err = nP_ErrNew;
238 
239     delete[] pP_Err;
240     pP_Err = pP_ErrNew;
241     return true;
242 }
243 #endif
244 
245 
GrowTripel(sal_uInt16 nByMin)246 bool TokenPool::GrowTripel( sal_uInt16 nByMin )
247 {
248     sal_uInt16 nP_RefTrNew = lcl_canGrow( nP_RefTr, nByMin);
249     if (!nP_RefTrNew)
250         return false;
251 
252 	sal_uInt16			nL;
253 
254 	ScSingleRefData**	ppP_RefTrNew = new (::std::nothrow) ScSingleRefData *[ nP_RefTrNew ];
255     if (!ppP_RefTrNew)
256         return false;
257 
258 	for( nL = 0 ; nL < nP_RefTr ; nL++ )
259 		ppP_RefTrNew[ nL ] = ppP_RefTr[ nL ];
260 	for( nL = nP_RefTr ; nL < nP_RefTrNew ; nL++ )
261 		ppP_RefTrNew[ nL ] = NULL;
262 
263 	nP_RefTr = nP_RefTrNew;
264 
265 	delete[] ppP_RefTr;
266 	ppP_RefTr = ppP_RefTrNew;
267     return true;
268 }
269 
270 
GrowId(void)271 bool TokenPool::GrowId( void )
272 {
273     sal_uInt16 nP_IdNew = lcl_canGrow( nP_Id);
274     if (!nP_IdNew)
275         return false;
276 
277 
278 	sal_uInt16*	pP_IdNew = new (::std::nothrow) sal_uInt16[ nP_IdNew ];
279     if (!pP_IdNew)
280         return false;
281 
282 	for( sal_uInt16 nL = 0 ; nL < nP_Id ; nL++ )
283 		pP_IdNew[ nL ] = pP_Id[ nL ];
284 
285 	nP_Id = nP_IdNew;
286 
287 	delete[] pP_Id;
288 	pP_Id = pP_IdNew;
289     return true;
290 }
291 
292 
GrowElement(void)293 bool TokenPool::GrowElement( void )
294 {
295     sal_uInt16 nElementNew = lcl_canGrow( nElement);
296     if (!nElementNew)
297         return false;
298 
299 
300 	sal_uInt16*	pElementNew = new (::std::nothrow) sal_uInt16[ nElementNew ];
301 	E_TYPE*	pTypeNew = new (::std::nothrow) E_TYPE[ nElementNew ];
302 	sal_uInt16*	pSizeNew = new (::std::nothrow) sal_uInt16[ nElementNew ];
303     if (!pElementNew || !pTypeNew || !pSizeNew)
304     {
305         delete [] pElementNew;
306         delete [] pTypeNew;
307         delete [] pSizeNew;
308         return false;
309     }
310 
311 	for( sal_uInt16 nL = 0 ; nL < nElement ; nL++ )
312 	{
313 		pElementNew[ nL ] = pElement[ nL ];
314 		pTypeNew[ nL ] = pType[ nL ];
315 		pSizeNew[ nL ] = pSize[ nL ];
316 	}
317 
318 	nElement = nElementNew;
319 
320 	delete[] pElement;
321 	delete[] pType;
322 	delete[] pSize;
323 	pElement = pElementNew;
324 	pType = pTypeNew;
325 	pSize = pSizeNew;
326     return true;
327 }
328 
329 
GrowExt(void)330 bool TokenPool::GrowExt( void )
331 {
332     sal_uInt16 nNewSize = lcl_canGrow( nP_Ext);
333     if (!nNewSize)
334         return false;
335 
336 	EXTCONT**	ppNew = new (::std::nothrow) EXTCONT*[ nNewSize ];
337     if (!ppNew)
338         return false;
339 
340     memset( ppNew, 0, sizeof( EXTCONT* ) * nNewSize );
341 	memcpy( ppNew, ppP_Ext, sizeof( EXTCONT* ) * nP_Ext );
342 
343 	delete[] ppP_Ext;
344 	ppP_Ext = ppNew;
345 	nP_Ext = nNewSize;
346     return true;
347 }
348 
349 
GrowNlf(void)350 bool TokenPool::GrowNlf( void )
351 {
352     sal_uInt16 nNewSize = lcl_canGrow( nP_Nlf);
353     if (!nNewSize)
354         return false;
355 
356 	NLFCONT**	ppNew = new (::std::nothrow) NLFCONT*[ nNewSize ];
357     if (!ppNew)
358         return false;
359 
360     memset( ppNew, 0, sizeof( NLFCONT* ) * nNewSize );
361 	memcpy( ppNew, ppP_Nlf, sizeof( NLFCONT* ) * nP_Nlf );
362 
363 	delete[] ppP_Nlf;
364     ppP_Nlf = ppNew;
365 	nP_Nlf = nNewSize;
366     return true;
367 }
368 
369 
GrowMatrix(void)370 bool TokenPool::GrowMatrix( void )
371 {
372     sal_uInt16 nNewSize = lcl_canGrow( nP_Matrix);
373     if (!nNewSize)
374         return false;
375 
376     ScMatrix**  ppNew = new (::std::nothrow) ScMatrix*[ nNewSize ];
377     if (!ppNew)
378         return false;
379 
380     memset( ppNew, 0, sizeof( ScMatrix* ) * nNewSize );
381     memcpy( ppNew, ppP_Matrix, sizeof( ScMatrix* ) * nP_Matrix );
382 
383     delete[] ppP_Matrix;
384     ppP_Matrix = ppNew;
385     nP_Matrix = nNewSize;
386     return true;
387 }
388 
GetElement(const sal_uInt16 nId)389 bool TokenPool::GetElement( const sal_uInt16 nId )
390 {
391 	DBG_ASSERT( nId < nElementAkt, "*TokenPool::GetElement(): Id too large!?" );
392     if (nId >= nElementAkt)
393         return false;
394 
395     bool bRet = true;
396 	if( pType[ nId ] == T_Id )
397 		bRet = GetElementRek( nId );
398 	else
399 	{
400 		switch( pType[ nId ] )
401 		{
402 			case T_Str:
403                 {
404                     sal_uInt16 n = pElement[ nId ];
405                     String* p = ( n < nP_Str )? ppP_Str[ n ] : NULL;
406                     if (p)
407                         pScToken->AddString( *p );
408                     else
409                         bRet = false;
410                 }
411 				break;
412 			case T_D:
413                 {
414                     sal_uInt16 n = pElement[ nId ];
415                     if (n < nP_Dbl)
416                         pScToken->AddDouble( pP_Dbl[ n ] );
417                     else
418                         bRet = false;
419                 }
420 				break;
421             case T_Err:
422 /* TODO: in case we had FormulaTokenArray::AddError() */
423 #if 0
424                 {
425                     sal_uInt16 n = pElement[ nId ];
426                     if (n < nP_Err)
427                         pScToken->AddError( pP_Err[ n ] );
428                     else
429                         bRet = false;
430                 }
431 #endif
432                 break;
433 			case T_RefC:
434                 {
435                     sal_uInt16 n = pElement[ nId ];
436                     ScSingleRefData* p = ( n < nP_RefTr )? ppP_RefTr[ n ] : NULL;
437                     if (p)
438                         pScToken->AddSingleReference( *p );
439                     else
440                         bRet = false;
441                 }
442 				break;
443 			case T_RefA:
444 				{
445                     sal_uInt16 n = pElement[ nId ];
446                     if (n < nP_RefTr && ppP_RefTr[ n ] && n+1 < nP_RefTr && ppP_RefTr[ n + 1 ])
447                     {
448                         ScComplexRefData	aScComplexRefData;
449                         aScComplexRefData.Ref1 = *ppP_RefTr[ n ];
450                         aScComplexRefData.Ref2 = *ppP_RefTr[ n + 1 ];
451                         pScToken->AddDoubleReference( aScComplexRefData );
452                     }
453                     else
454                         bRet = false;
455 				}
456 				break;
457 			case T_RN:
458 				pScToken->AddName( pElement[ nId ] );
459 				break;
460 			case T_Ext:
461                 {
462                     sal_uInt16			n = pElement[ nId ];
463                     EXTCONT*		p = ( n < nP_Ext )? ppP_Ext[ n ] : NULL;
464 
465                     if( p )
466                     {
467                         if( p->eId == ocEuroConvert )
468                             pScToken->AddOpCode( p->eId );
469                         else
470                             pScToken->AddExternal( p->aText, p->eId );
471                     }
472                     else
473                         bRet = false;
474                 }
475 				break;
476 			case T_Nlf:
477                 {
478                     sal_uInt16			n = pElement[ nId ];
479                     NLFCONT*		p = ( n < nP_Nlf )? ppP_Nlf[ n ] : NULL;
480 
481                     if( p )
482                         pScToken->AddColRowName( p->aRef );
483                     else
484                         bRet = false;
485                 }
486 				break;
487             case T_Matrix:
488                 {
489                     sal_uInt16          n = pElement[ nId ];
490                     ScMatrix*       p = ( n < nP_Matrix )? ppP_Matrix[ n ] : NULL;
491 
492                     if( p )
493                         pScToken->AddMatrix( p );
494                     else
495                         bRet = false;
496                 }
497                 break;
498             case T_ExtName:
499                 {
500                     sal_uInt16 n = pElement[nId];
501                     if (n < maExtNames.size())
502                     {
503                         const ExtName& r = maExtNames[n];
504                         pScToken->AddExternalName(r.mnFileId, r.maName);
505                     }
506                     else
507                         bRet = false;
508                 }
509                 break;
510             case T_ExtRefC:
511                 {
512                     sal_uInt16 n = pElement[nId];
513                     if (n < maExtCellRefs.size())
514                     {
515                         const ExtCellRef& r = maExtCellRefs[n];
516                         pScToken->AddExternalSingleReference(r.mnFileId, r.maTabName, r.maRef);
517                     }
518                     else
519                         bRet = false;
520                 }
521                 break;
522             case T_ExtRefA:
523                 {
524                     sal_uInt16 n = pElement[nId];
525                     if (n < maExtAreaRefs.size())
526                     {
527                         const ExtAreaRef& r = maExtAreaRefs[n];
528                         pScToken->AddExternalDoubleReference(r.mnFileId, r.maTabName, r.maRef);
529                     }
530                     else
531                         bRet = false;
532                 }
533                 break;
534 			default:
535 				DBG_ERROR("-TokenPool::GetElement(): undefined state!?");
536                 bRet = false;
537 		}
538 	}
539     return bRet;
540 }
541 
542 
GetElementRek(const sal_uInt16 nId)543 bool TokenPool::GetElementRek( const sal_uInt16 nId )
544 {
545 #ifdef DBG_UTIL
546 	nRek++;
547 	DBG_ASSERT( nRek <= nP_Id, "*TokenPool::GetElement(): recursion loops" );
548 #endif
549 
550     if (nId >= nElementAkt)
551     {
552         DBG_ERRORFILE( "*TokenPool::GetElementRek(): nId >= nElementAkt" );
553 #ifdef DBG_UTIL
554         nRek--;
555 #endif
556         return false;
557     }
558 
559     if (pType[ nId ] != T_Id)
560     {
561         DBG_ERRORFILE( "-TokenPool::GetElementRek(): pType[ nId ] != T_Id" );
562 #ifdef DBG_UTIL
563         nRek--;
564 #endif
565         return false;
566     }
567 
568 
569     bool bRet = true;
570 	sal_uInt16 nAnz = pSize[ nId ];
571     sal_uInt16 nFirstId = pElement[ nId ];
572     if (nFirstId >= nP_Id)
573     {
574         DBG_ERRORFILE( "TokenPool::GetElementRek: nFirstId >= nP_Id");
575         nAnz = 0;
576         bRet = false;
577     }
578 	sal_uInt16* pAkt = nAnz ? &pP_Id[ nFirstId ] : NULL;
579     if (nAnz > nP_Id - nFirstId)
580     {
581         DBG_ERRORFILE( "TokenPool::GetElementRek: nAnz > nP_Id - nFirstId");
582         nAnz = nP_Id - nFirstId;
583         bRet = false;
584     }
585 	for( ; nAnz > 0 ; nAnz--, pAkt++ )
586 	{
587 		if( *pAkt < nScTokenOff )
588 		{// Rekursion oder nicht?
589             if (*pAkt >= nElementAkt)
590             {
591                 DBG_ERRORFILE( "TokenPool::GetElementRek: *pAkt >= nElementAkt");
592                 bRet = false;
593             }
594             else
595             {
596                 if (pType[ *pAkt ] == T_Id)
597                     bRet = GetElementRek( *pAkt );
598                 else
599                     bRet = GetElement( *pAkt );
600             }
601 		}
602 		else	// elementarer SC_Token
603 			pScToken->AddOpCode( ( DefTokenId ) ( *pAkt - nScTokenOff ) );
604 	}
605 
606 #ifdef DBG_UTIL
607 	nRek--;
608 #endif
609     return bRet;
610 }
611 
612 
operator >>(TokenId & rId)613 void TokenPool::operator >>( TokenId& rId )
614 {
615 	rId = ( TokenId ) ( nElementAkt + 1 );
616 
617 	if( nElementAkt >= nElement )
618 		if (!GrowElement())
619             return;
620 
621 	pElement[ nElementAkt ] = nP_IdLast;	// Start der Token-Folge
622 	pType[ nElementAkt ] = T_Id;			// Typinfo eintragen
623 	pSize[ nElementAkt ] = nP_IdAkt - nP_IdLast;
624 		// von nP_IdLast bis nP_IdAkt-1 geschrieben -> Laenge der Folge
625 
626 	nElementAkt++;			// Startwerte fuer naechste Folge
627 	nP_IdLast = nP_IdAkt;
628 }
629 
630 
Store(const double & rDouble)631 const TokenId TokenPool::Store( const double& rDouble )
632 {
633 	if( nElementAkt >= nElement )
634 		if (!GrowElement())
635             return (const TokenId) nElementAkt+1;
636 
637 	if( nP_DblAkt >= nP_Dbl )
638 		if (!GrowDouble())
639             return (const TokenId) nElementAkt+1;
640 
641 	pElement[ nElementAkt ] = nP_DblAkt;	// Index in Double-Array
642 	pType[ nElementAkt ] = T_D;				// Typinfo Double eintragen
643 
644 	pP_Dbl[ nP_DblAkt ] = rDouble;
645 
646 	pSize[ nElementAkt ] = 1;			// eigentlich Banane
647 
648 	nElementAkt++;
649 	nP_DblAkt++;
650 
651 	return ( const TokenId ) nElementAkt; // Ausgabe von altem Wert + 1!
652 }
653 
654 
Store(const sal_uInt16 nIndex)655 const TokenId TokenPool::Store( const sal_uInt16 nIndex )
656 {
657 	if( nElementAkt >= nElement )
658 		if (!GrowElement())
659             return (const TokenId) nElementAkt+1;
660 
661 	pElement[ nElementAkt ] = nIndex;			// Daten direkt im Index!
662 	pType[ nElementAkt ] = T_RN;				// Typinfo Range Name eintragen
663 
664 	nElementAkt++;
665 	return ( const TokenId ) nElementAkt;				// Ausgabe von altem Wert + 1!
666 }
667 
668 
Store(const String & rString)669 const TokenId TokenPool::Store( const String& rString )
670 {
671 	// weitgehend nach Store( const sal_Char* ) kopiert, zur Vermeidung
672 	//  eines temporaeren Strings in "
673 	if( nElementAkt >= nElement )
674 		if (!GrowElement())
675             return (const TokenId) nElementAkt+1;
676 
677 	if( nP_StrAkt >= nP_Str )
678 		if (!GrowString())
679             return (const TokenId) nElementAkt+1;
680 
681 	pElement[ nElementAkt ] = nP_StrAkt;	// Index in String-Array
682 	pType[ nElementAkt ] = T_Str;			// Typinfo String eintragen
683 
684 	// String anlegen
685 	if( !ppP_Str[ nP_StrAkt ] )
686 		//...aber nur, wenn noch nicht vorhanden
687 		ppP_Str[ nP_StrAkt ] = new (::std::nothrow) String( rString );
688 	else
689 		//...ansonsten nur kopieren
690 		*ppP_Str[ nP_StrAkt ] = rString;
691 
692     if (ppP_Str[ nP_StrAkt ])
693     {
694         DBG_ASSERT( sizeof( xub_StrLen ) <= 2, "*TokenPool::Store(): StrLen doesn't match!" );
695         pSize[ nElementAkt ] = ( sal_uInt16 ) ppP_Str[ nP_StrAkt ]->Len();
696     }
697 
698 	nElementAkt++;
699 	nP_StrAkt++;
700 
701 	return ( const TokenId ) nElementAkt; // Ausgabe von altem Wert + 1!
702 }
703 
704 
Store(const ScSingleRefData & rTr)705 const TokenId TokenPool::Store( const ScSingleRefData& rTr )
706 {
707 	if( nElementAkt >= nElement )
708 		if (!GrowElement())
709             return (const TokenId) nElementAkt+1;
710 
711 	if( nP_RefTrAkt >= nP_RefTr )
712 		if (!GrowTripel())
713             return (const TokenId) nElementAkt+1;
714 
715 	pElement[ nElementAkt ] = nP_RefTrAkt;
716 	pType[ nElementAkt ] = T_RefC;			// Typinfo Cell-Reff eintragen
717 
718 	if( !ppP_RefTr[ nP_RefTrAkt ] )
719 		ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr );
720 	else
721 		*ppP_RefTr[ nP_RefTrAkt ] = rTr;
722 
723 	nElementAkt++;
724 	nP_RefTrAkt++;
725 
726 	return ( const TokenId ) nElementAkt; // Ausgabe von altem Wert + 1!
727 }
728 
729 
Store(const ScComplexRefData & rTr)730 const TokenId TokenPool::Store( const ScComplexRefData& rTr )
731 {
732 	if( nElementAkt >= nElement )
733 		if (!GrowElement())
734             return (const TokenId) nElementAkt+1;
735 
736 	if( nP_RefTrAkt + 1 >= nP_RefTr )
737 		if (!GrowTripel( 2))
738             return (const TokenId) nElementAkt+1;
739 
740 	pElement[ nElementAkt ] = nP_RefTrAkt;
741 	pType[ nElementAkt ] = T_RefA;			// Typinfo Area-Reff eintragen
742 
743 	if( !ppP_RefTr[ nP_RefTrAkt ] )
744 		ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr.Ref1 );
745 	else
746 		*ppP_RefTr[ nP_RefTrAkt ] = rTr.Ref1;
747 	nP_RefTrAkt++;
748 
749 	if( !ppP_RefTr[ nP_RefTrAkt ] )
750 		ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr.Ref2 );
751 	else
752 		*ppP_RefTr[ nP_RefTrAkt ] = rTr.Ref2;
753 	nP_RefTrAkt++;
754 
755 	nElementAkt++;
756 
757 	return ( const TokenId ) nElementAkt; // Ausgabe von altem Wert + 1!
758 }
759 
760 
Store(const DefTokenId e,const String & r)761 const TokenId TokenPool::Store( const DefTokenId e, const String& r )
762 {
763 	if( nElementAkt >= nElement )
764 		if (!GrowElement())
765             return (const TokenId) nElementAkt+1;
766 
767 	if( nP_ExtAkt >= nP_Ext )
768         if (!GrowExt())
769             return (const TokenId) nElementAkt+1;
770 
771 	pElement[ nElementAkt ] = nP_ExtAkt;
772 	pType[ nElementAkt ] = T_Ext;			// Typinfo String eintragen
773 
774 	if( ppP_Ext[ nP_ExtAkt ] )
775 	{
776 		ppP_Ext[ nP_ExtAkt ]->eId = e;
777 		ppP_Ext[ nP_ExtAkt ]->aText = r;
778 	}
779 	else
780 		ppP_Ext[ nP_ExtAkt ] = new EXTCONT( e, r );
781 
782 	nElementAkt++;
783 	nP_ExtAkt++;
784 
785 	return ( const TokenId ) nElementAkt; // Ausgabe von altem Wert + 1!
786 }
787 
788 
StoreNlf(const ScSingleRefData & rTr)789 const TokenId TokenPool::StoreNlf( const ScSingleRefData& rTr )
790 {
791 	if( nElementAkt >= nElement )
792 		if (!GrowElement())
793             return (const TokenId) nElementAkt+1;
794 
795 	if( nP_NlfAkt >= nP_Nlf )
796 		if (!GrowNlf())
797             return (const TokenId) nElementAkt+1;
798 
799 	pElement[ nElementAkt ] = nP_NlfAkt;
800 	pType[ nElementAkt ] = T_Nlf;
801 
802 	if( ppP_Nlf[ nP_NlfAkt ] )
803 	{
804 		ppP_Nlf[ nP_NlfAkt ]->aRef = rTr;
805 	}
806 	else
807 		ppP_Nlf[ nP_NlfAkt ] = new NLFCONT( rTr );
808 
809 	nElementAkt++;
810 	nP_NlfAkt++;
811 
812 	return ( const TokenId ) nElementAkt;
813 }
814 
StoreMatrix()815 const TokenId TokenPool::StoreMatrix()
816 {
817     ScMatrix* pM;
818 
819     if( nElementAkt >= nElement )
820 		if (!GrowElement())
821             return (const TokenId) nElementAkt+1;
822 
823     if( nP_MatrixAkt >= nP_Matrix )
824         if (!GrowMatrix())
825             return (const TokenId) nElementAkt+1;
826 
827     pElement[ nElementAkt ] = nP_MatrixAkt;
828     pType[ nElementAkt ] = T_Matrix;
829 
830     pM = new ScMatrix( 0, 0 );
831     pM->IncRef( );
832     ppP_Matrix[ nP_MatrixAkt ] = pM;
833 
834     nElementAkt++;
835     nP_MatrixAkt++;
836 
837     return ( const TokenId ) nElementAkt;
838 }
839 
StoreExtName(sal_uInt16 nFileId,const String & rName)840 const TokenId TokenPool::StoreExtName( sal_uInt16 nFileId, const String& rName )
841 {
842     if ( nElementAkt >= nElement )
843 		if (!GrowElement())
844             return (const TokenId) nElementAkt+1;
845 
846     pElement[nElementAkt] = static_cast<sal_uInt16>(maExtNames.size());
847     pType[nElementAkt] = T_ExtName;
848 
849     maExtNames.push_back(ExtName());
850     ExtName& r = maExtNames.back();
851     r.mnFileId = nFileId;
852     r.maName = rName;
853 
854     ++nElementAkt;
855 
856     return static_cast<const TokenId>(nElementAkt);
857 }
858 
StoreExtRef(sal_uInt16 nFileId,const String & rTabName,const ScSingleRefData & rRef)859 const TokenId TokenPool::StoreExtRef( sal_uInt16 nFileId, const String& rTabName, const ScSingleRefData& rRef )
860 {
861     if ( nElementAkt >= nElement )
862 		if (!GrowElement())
863             return (const TokenId) nElementAkt+1;
864 
865     pElement[nElementAkt] = static_cast<sal_uInt16>(maExtCellRefs.size());
866     pType[nElementAkt] = T_ExtRefC;
867 
868     maExtCellRefs.push_back(ExtCellRef());
869     ExtCellRef& r = maExtCellRefs.back();
870     r.mnFileId = nFileId;
871     r.maTabName = rTabName;
872     r.maRef = rRef;
873 
874     ++nElementAkt;
875 
876     return static_cast<const TokenId>(nElementAkt);
877 }
878 
StoreExtRef(sal_uInt16 nFileId,const String & rTabName,const ScComplexRefData & rRef)879 const TokenId TokenPool::StoreExtRef( sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rRef )
880 {
881     if ( nElementAkt >= nElement )
882 		if (!GrowElement())
883             return (const TokenId) nElementAkt+1;
884 
885     pElement[nElementAkt] = static_cast<sal_uInt16>(maExtAreaRefs.size());
886     pType[nElementAkt] = T_ExtRefA;
887 
888     maExtAreaRefs.push_back(ExtAreaRef());
889     ExtAreaRef& r = maExtAreaRefs.back();
890     r.mnFileId = nFileId;
891     r.maTabName = rTabName;
892     r.maRef = rRef;
893 
894     ++nElementAkt;
895 
896     return static_cast<const TokenId>(nElementAkt);
897 }
898 
Reset(void)899 void TokenPool::Reset( void )
900 {
901     nP_IdAkt = nP_IdLast = nElementAkt = nP_StrAkt = nP_DblAkt = nP_ErrAkt = nP_RefTrAkt = nP_ExtAkt = nP_NlfAkt = nP_MatrixAkt = 0;
902     maExtNames.clear();
903     maExtCellRefs.clear();
904     maExtAreaRefs.clear();
905 }
906 
907 
IsSingleOp(const TokenId & rId,const DefTokenId eId) const908 sal_Bool TokenPool::IsSingleOp( const TokenId& rId, const DefTokenId eId ) const
909 {
910     sal_uInt16 nId = (sal_uInt16) rId;
911 	if( nId && nId <= nElementAkt )
912 	{// existent?
913 		nId--;
914 		if( T_Id == pType[ nId ] )
915 		{// Tokenfolge?
916 			if( pSize[ nId ] == 1 )
917 			{// GENAU 1 Token
918                 sal_uInt16 nPid = pElement[ nId ];
919                 if (nPid < nP_Id)
920                 {
921                     sal_uInt16	nSecId = pP_Id[ nPid ];
922                     if( nSecId >= nScTokenOff )
923                     {// Default-Token?
924                         return ( DefTokenId ) ( nSecId - nScTokenOff ) == eId;	// Gesuchter?
925                     }
926                 }
927 			}
928 		}
929 	}
930 
931 	return sal_False;
932 }
933 
934 
GetExternal(const TokenId & rId) const935 const String* TokenPool::GetExternal( const TokenId& rId ) const
936 {
937     const String*   p = NULL;
938     sal_uInt16 n = (sal_uInt16) rId;
939 	if( n && n <= nElementAkt )
940 	{
941 		n--;
942         if( pType[ n ] == T_Ext )
943         {
944             sal_uInt16 nExt = pElement[ n ];
945             if ( nExt < nP_Ext && ppP_Ext[ nExt ] )
946                 p = &ppP_Ext[ nExt ]->aText;
947         }
948 	}
949 
950     return p;
951 }
952 
GetMatrix(unsigned int n) const953 ScMatrix* TokenPool::GetMatrix( unsigned int n ) const
954 {
955     if( n < nP_MatrixAkt )
956         return ppP_Matrix[ n ];
957     else
958         printf ("GETMATRIX %d >= %d\n", n, nP_MatrixAkt);
959     return NULL;
960 }
961 
962