diff options
-rw-r--r-- | sc/inc/token.hxx | 477 | ||||
-rw-r--r-- | sc/source/core/data/cell.cxx | 169 | ||||
-rw-r--r-- | sc/source/core/data/cell2.cxx | 189 | ||||
-rw-r--r-- | sc/source/core/data/conditio.cxx | 73 | ||||
-rw-r--r-- | sc/source/core/data/documen4.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/inc/interpre.hxx | 31 | ||||
-rw-r--r-- | sc/source/core/tool/chgtrack.cxx | 64 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 589 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 156 | ||||
-rw-r--r-- | sc/source/core/tool/interpr2.cxx | 25 | ||||
-rw-r--r-- | sc/source/core/tool/interpr4.cxx | 343 | ||||
-rw-r--r-- | sc/source/core/tool/interpr5.cxx | 22 | ||||
-rw-r--r-- | sc/source/core/tool/rangenam.cxx | 76 | ||||
-rw-r--r-- | sc/source/core/tool/refdata.cxx | 70 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 786 | ||||
-rw-r--r-- | sc/source/filter/inc/imp_op.hxx | 6 | ||||
-rw-r--r-- | sc/source/filter/inc/tokstack.hxx | 6 | ||||
-rw-r--r-- | sc/source/ui/miscdlgs/anyrefdg.cxx | 20 |
18 files changed, 2023 insertions, 1088 deletions
diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx new file mode 100644 index 000000000000..85fc2436d7d4 --- /dev/null +++ b/sc/inc/token.hxx @@ -0,0 +1,477 @@ +/************************************************************************* + * + * $RCSfile: token.hxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: er $ $Date: 2001-02-21 18:25:45 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef SC_TOKEN_HXX +#define SC_TOKEN_HXX + +#include <string.h> // memcpy(), don't use memory.h (MAC) + +#ifndef SC_OPCODE_HXX +#include "opcode.hxx" +#endif + +#ifndef SC_REFDATA_HXX +#include "refdata.hxx" +#endif + + +enum StackVar +{ + svByte, + svDouble, + svString, + svSingleRef, + svDoubleRef, + svMatrix, + svIndex, + svJump, + svExternal, // Byte + String + + svMissing = 0x70, // 0 or "" + svErr // unknown StackType +}; + + +#if 0 +union { + double nValue; + ComplRefData aRef; + BYTE cByte; + ScMatrix* pMat; + USHORT nIndex; // Index fuer Name-Tabelle + sal_Unicode cStr[ MAXSTRLEN+1 ]; // String (bis 255 Zeichen + 0) + short nJump[MAXJUMPCOUNT+1]; // If/Chose-Token +}; +#endif + + +class ScMatrix; + +class ScToken +{ +private: + + OpCode eOp; // OpCode + const StackVar eType; // type of data + USHORT nRefCnt; // reference count + + // not implemented, prevent usage + ScToken(); + ScToken& operator=( const ScToken& ); + +protected: + + static SingleRefData aDummySingleRef; + static ComplRefData aDummyDoubleRef; + static String aDummyString; + + ScToken( OpCode eOpP, StackVar eTypeP ) : + eOp( eOpP ), eType( eTypeP ), nRefCnt(0) {} + ScToken( const ScToken& r ) : + eOp( r.eOp ), eType( r.eType ), nRefCnt(0) {} + +public: + + virtual ~ScToken(); + + inline void Delete() { delete this; } + inline const StackVar GetType() const { return eType; } + inline OpCode GetOpCode() const { return eOp; } + BOOL IsFunction() const; // pure functions, no operators + BOOL IsMatrixFunction() const; // if a function _always_ returns a Matrix + BYTE GetParamCount() const; + inline void NewOpCode( OpCode e ) { eOp = e; } + inline void IncRef() { nRefCnt++; } + inline void DecRef() { if( !--nRefCnt ) Delete(); } + inline USHORT GetRef() const { return nRefCnt; } + + // Dummy methods to avoid switches and casts where possible, + // the real token classes have to overload the appropriate method[s]. + // The only method valid anytime if not overloaded is GetByte() since + // this represents the count of parameters to a function which of course + // is 0 on non-functions. ScByteToken and ScExternal do overload it. + // Any other non-overloaded method pops up an assertion. + virtual BYTE GetByte() const; + virtual void SetByte( BYTE n ); + virtual double GetDouble() const; + virtual const String& GetString() const; + virtual const SingleRefData& GetSingleRef() const; + virtual SingleRefData& GetSingleRef(); + virtual const ComplRefData& GetDoubleRef() const; + virtual ComplRefData& GetDoubleRef(); + virtual void CalcAbsIfRel( const ScAddress& ); + virtual void CalcRelFromAbs( const ScAddress& ); + virtual ScMatrix* GetMatrix() const; + virtual USHORT GetIndex() const; + virtual void SetIndex( USHORT n ); + virtual short* GetJump() const; + virtual const String& GetExternal() const; + virtual BYTE* GetUnknown() const; + + ScToken* Clone() const; + + void Store( SvStream& ) const; + + virtual BOOL operator==( const ScToken& rToken ) const; + BOOL TextEqual( const ScToken& rToken ) const; + + static size_t GetStrLenBytes( xub_StrLen nLen ) + { return nLen * sizeof(sal_Unicode); } + static size_t GetStrLenBytes( const String& rStr ) + { return GetStrLenBytes( rStr.Len() ); } +}; + + +class ScByteToken : public ScToken +{ +private: + BYTE nByte; +public: + ScByteToken( OpCode e, BYTE n ) : + ScToken( e, svByte ), nByte( n ) {} + ScByteToken( OpCode e ) : + ScToken( e, svByte ), nByte( 0 ) {} + ScByteToken( const ScByteToken& r ) : + ScToken( r ), nByte( r.nByte ) {} + virtual BYTE GetByte() const; + virtual void SetByte( BYTE n ); + virtual BOOL operator==( const ScToken& rToken ) const; + + DECL_FIXEDMEMPOOL_NEWDEL( ScByteToken ); +}; + + +class ScDoubleToken : public ScToken +{ +private: + double fDouble; +public: + ScDoubleToken( double f ) : + ScToken( ocPush, svDouble ), fDouble( f ) {} + ScDoubleToken( OpCode e, double f ) : + ScToken( e, svDouble ), fDouble( f ) {} + ScDoubleToken( const ScDoubleToken& r ) : + ScToken( r ), fDouble( r.fDouble ) {} + virtual double GetDouble() const; + virtual BOOL operator==( const ScToken& rToken ) const; + + DECL_FIXEDMEMPOOL_NEWDEL( ScDoubleToken ); +}; + + +class ScStringToken : public ScToken +{ +private: + String aString; +public: + ScStringToken( const String& r ) : + ScToken( ocPush, svString ), aString( r ) {} + ScStringToken( OpCode e, const String& r ) : + ScToken( e, svString ), aString( r ) {} + ScStringToken( const ScStringToken& r ) : + ScToken( r ), aString( r.aString ) {} + virtual const String& GetString() const; + virtual BOOL operator==( const ScToken& rToken ) const; + + DECL_FIXEDMEMPOOL_NEWDEL( ScStringToken ); +}; + + +class ScSingleRefToken : public ScToken +{ +private: + SingleRefData aSingleRef; +public: + ScSingleRefToken( const SingleRefData& r ) : + ScToken( ocPush, svSingleRef ), aSingleRef( r ) {} + ScSingleRefToken( OpCode e, const SingleRefData& r ) : + ScToken( e, svSingleRef ), aSingleRef( r ) {} + ScSingleRefToken( const ScSingleRefToken& r ) : + ScToken( r ), aSingleRef( r.aSingleRef ) {} + virtual const SingleRefData& GetSingleRef() const; + virtual SingleRefData& GetSingleRef(); + virtual void CalcAbsIfRel( const ScAddress& ); + virtual void CalcRelFromAbs( const ScAddress& ); + virtual BOOL operator==( const ScToken& rToken ) const; + + DECL_FIXEDMEMPOOL_NEWDEL( ScSingleRefToken ); +}; + + +class ScDoubleRefToken : public ScToken +{ +private: + ComplRefData aDoubleRef; +public: + ScDoubleRefToken( const ComplRefData& r ) : + ScToken( ocPush, svDoubleRef ), aDoubleRef( r ) {} + ScDoubleRefToken( OpCode e, const ComplRefData& r ) : + ScToken( e, svDoubleRef ), aDoubleRef( r ) {} + ScDoubleRefToken( OpCode e, const SingleRefData& r ) : + ScToken( e, svDoubleRef ) + { + aDoubleRef.Ref1 = r; + aDoubleRef.Ref2 = r; + } + ScDoubleRefToken( const ScDoubleRefToken& r ) : + ScToken( r ), aDoubleRef( r.aDoubleRef ) {} + virtual const SingleRefData& GetSingleRef() const; + virtual SingleRefData& GetSingleRef(); + virtual const ComplRefData& GetDoubleRef() const; + virtual ComplRefData& GetDoubleRef(); + virtual void CalcAbsIfRel( const ScAddress& ); + virtual void CalcRelFromAbs( const ScAddress& ); + virtual BOOL operator==( const ScToken& rToken ) const; + + DECL_FIXEDMEMPOOL_NEWDEL( ScDoubleRefToken ); +}; + + +class ScMatrixToken : public ScToken +{ +private: + ScMatrix* pMatrix; +public: + ScMatrixToken( ScMatrix* p ) : + ScToken( ocPush, svMatrix ), pMatrix( p ) {} + ScMatrixToken( OpCode e, ScMatrix* p ) : + ScToken( e, svMatrix ), pMatrix( p ) {} + ScMatrixToken( const ScMatrixToken& r ) : + ScToken( r ), pMatrix( r.pMatrix ) {} + virtual ScMatrix* GetMatrix() const; + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScIndexToken : public ScToken +{ +private: + USHORT nIndex; +public: + ScIndexToken( OpCode e, USHORT n ) : + ScToken( e, svIndex ), nIndex( n ) {} + ScIndexToken( const ScIndexToken& r ) : + ScToken( r ), nIndex( r.nIndex ) {} + virtual USHORT GetIndex() const; + virtual void SetIndex( USHORT n ); + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScJumpToken : public ScToken +{ +private: + short* pJump; +public: + ScJumpToken( OpCode e, short* p ) : + ScToken( e, svJump ) + { + pJump = new short[ p[0] + 1 ]; + memcpy( pJump, p, (p[0] + 1) * sizeof(short) ); + } + ScJumpToken( const ScJumpToken& r ) : + ScToken( r ) + { + pJump = new short[ r.pJump[0] + 1 ]; + memcpy( pJump, r.pJump, (r.pJump[0] + 1) * sizeof(short) ); + } + virtual ~ScJumpToken(); + virtual short* GetJump() const; + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScExternalToken : public ScToken +{ +private: + String aExternal; + BYTE nByte; +public: + ScExternalToken( OpCode e, BYTE n, const String& r ) : + ScToken( e, svExternal ), nByte( n ), + aExternal( r ) {} + ScExternalToken( OpCode e, const String& r ) : + ScToken( e, svExternal ), nByte( 0 ), + aExternal( r ) {} + ScExternalToken( const ScExternalToken& r ) : + ScToken( r ), nByte( r.nByte ), + aExternal( r.aExternal ) {} + virtual const String& GetExternal() const; + virtual BYTE GetByte() const; + virtual void SetByte( BYTE n ); + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScMissingToken : public ScToken +{ +public: + ScMissingToken() : + ScToken( ocPush, svMissing ) {} + ScMissingToken( OpCode e ) : + ScToken( e, svMissing ) {} + ScMissingToken( const ScMissingToken& r ) : + ScToken( r ) {} + virtual double GetDouble() const; + virtual const String& GetString() const; + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScErrToken : public ScToken +{ +public: + ScErrToken( OpCode e ) : + ScToken( e, svErr ) {} + ScErrToken( const ScErrToken& r ) : + ScToken( r ) {} + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScUnknownToken : public ScToken +{ +private: + BYTE* pUnknown; +public: + ScUnknownToken( OpCode e, StackVar v, BYTE* p ) : + ScToken( e, v ) + { + pUnknown = new BYTE[ int(p[0]) + 1 ]; + memcpy( pUnknown, p, int(p[0]) + 1 ); + } + ScUnknownToken( const ScUnknownToken& r ) : + ScToken( r ) + { + pUnknown = new BYTE[ int(r.pUnknown[0]) + 1 ]; + memcpy( pUnknown, r.pUnknown, int(r.pUnknown[0]) + 1 ); + } + virtual ~ScUnknownToken(); + virtual BYTE* GetUnknown() const; + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +class ScTokenRef +{ + ScToken* p; +public: + inline ScTokenRef() { p = NULL; } + inline ScTokenRef( const ScTokenRef& r ) { if( ( p = r.p ) != NULL ) p->IncRef(); } + inline ScTokenRef( ScToken *t ) { if( ( p = t ) != NULL ) t->IncRef(); } + inline void Clear() { if( p ) p->DecRef(); } + inline ~ScTokenRef() { if( p ) p->DecRef(); } + inline ScTokenRef& operator=( const ScTokenRef& r ) { return *this = r.p; } + inline ScTokenRef& operator=( ScToken* t ) + { if( t ) t->IncRef(); if( p ) p->DecRef(); p = t; return *this; } + inline BOOL Is() const { return p != NULL; } + inline BOOL operator ! () const { return p == NULL; } + inline ScToken* operator&() const { return p; } + inline ScToken* operator->() const { return p; } + inline ScToken& operator*() const { return *p; } + inline operator ScToken*() const { return p; } +}; + + +// Simplify argument passing to RefUpdate methods with ScSingleRefToken or +// ScDoubleRefToken +class SingleDoubleRefModifier +{ + ComplRefData aDub; + SingleRefData& rS; + ComplRefData& rD; + BOOL bSingle; + +public: + SingleDoubleRefModifier( SingleRefData& r ) + : rS( r ), rD( aDub ), bSingle( TRUE ) + { aDub.Ref1 = aDub.Ref2 = rS; } + SingleDoubleRefModifier( ComplRefData& r ) + : rD( r ), rS( r.Ref1 ), bSingle( FALSE ) + {} + ~SingleDoubleRefModifier() + { if ( bSingle ) rS = rD.Ref1; } + inline ComplRefData& Ref() { return rD; } +}; + +class SingleDoubleRefProvider +{ +public: + + const SingleRefData& Ref1; + const SingleRefData& Ref2; + + SingleDoubleRefProvider( const ScToken& r ) + : Ref1( r.GetSingleRef() ), + Ref2( r.GetType() == svDoubleRef ? + r.GetDoubleRef().Ref2 : Ref1 ) + {} + SingleDoubleRefProvider( const SingleRefData& r ) + : Ref1( r ), Ref2( r ) + {} + SingleDoubleRefProvider( const ComplRefData& r ) + : Ref1( r.Ref1 ), Ref2( r.Ref2 ) + {} + ~SingleDoubleRefProvider() + {} +}; + +#endif diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx index 5b1bd73f8678..15d85074d66e 100644 --- a/sc/source/core/data/cell.cxx +++ b/sc/source/core/data/cell.cxx @@ -2,9 +2,9 @@ * * $RCSfile: cell.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: er $ $Date: 2001-02-13 18:58:28 $ + * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -119,8 +119,6 @@ // STATIC DATA ----------------------------------------------------------- -#pragma code_seg("SCSTATICS") - #ifdef USE_MEMPOOL // MemPools auf 4k Boundaries - 64 Bytes ausrichten const USHORT nMemPoolValueCell = (0x8000 - 64) / sizeof(ScValueCell); @@ -264,60 +262,64 @@ void ScBaseCell::StartListeningTo( ScDocument* pDoc, BOOL bOnlyRelNames ) for( ScToken* t = pArr->GetNextReferenceRPN(); t; t = pArr->GetNextReferenceRPN() ) { + StackVar eType = t->GetType(); + SingleRefData& rRef1 = t->GetSingleRef(); + SingleRefData& rRef2 = (eType == svDoubleRef ? + t->GetDoubleRef().Ref2 : rRef1); if ( !bOnlyRelNames || (bOnlyRelNames - && (t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName()))) + && (rRef1.IsRelName() || rRef2.IsRelName()))) { - switch( t->GetType() ) + switch( eType ) { case svSingleRef: - t->aRef.Ref1.CalcAbsIfRel( pFormCell->aPos ); - if ( t->aRef.Ref1.Valid() ) + rRef1.CalcAbsIfRel( pFormCell->aPos ); + if ( rRef1.Valid() ) { pDoc->StartListeningCell( - ScAddress( t->aRef.Ref1.nCol, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab ), pFormCell ); + ScAddress( rRef1.nCol, + rRef1.nRow, + rRef1.nTab ), pFormCell ); } - break; + break; case svDoubleRef: - t->aRef.CalcAbsIfRel( pFormCell->aPos ); - if ( t->aRef.Valid() ) + t->CalcAbsIfRel( pFormCell->aPos ); + if ( rRef1.Valid() && rRef2.Valid() ) { if ( t->GetOpCode() == ocColRowNameAuto ) { // automagically - if ( t->aRef.Ref1.IsColRel() ) + if ( rRef1.IsColRel() ) { // ColName pDoc->StartListeningArea( ScRange ( 0, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab, + rRef1.nRow, + rRef1.nTab, MAXCOL, - t->aRef.Ref2.nRow, - t->aRef.Ref2.nTab ), pFormCell ); + rRef2.nRow, + rRef2.nTab ), pFormCell ); } else { // RowName pDoc->StartListeningArea( ScRange ( - t->aRef.Ref1.nCol, + rRef1.nCol, 0, - t->aRef.Ref1.nTab, - t->aRef.Ref2.nCol, + rRef1.nTab, + rRef2.nCol, MAXROW, - t->aRef.Ref2.nTab ), pFormCell ); + rRef2.nTab ), pFormCell ); } } else { pDoc->StartListeningArea( ScRange ( - t->aRef.Ref1.nCol, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab, - t->aRef.Ref2.nCol, - t->aRef.Ref2.nRow, - t->aRef.Ref2.nTab ), pFormCell ); + rRef1.nCol, + rRef1.nRow, + rRef1.nTab, + rRef2.nCol, + rRef2.nRow, + rRef2.nTab ), pFormCell ); } } - break; + break; } } } @@ -351,60 +353,64 @@ void ScBaseCell::EndListeningTo( ScDocument* pDoc, BOOL bOnlyRelNames, for( ScToken* t = pArr->GetNextReferenceRPN(); t; t = pArr->GetNextReferenceRPN() ) { + StackVar eType = t->GetType(); + SingleRefData& rRef1 = t->GetSingleRef(); + SingleRefData& rRef2 = (eType == svDoubleRef ? + t->GetDoubleRef().Ref2 : rRef1); if ( !bOnlyRelNames || (bOnlyRelNames - && (t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName()))) + && (rRef1.IsRelName() || rRef2.IsRelName()))) { switch( t->GetType() ) { case svSingleRef: - t->aRef.Ref1.CalcAbsIfRel( aPos ); - if ( t->aRef.Ref1.Valid() ) + rRef1.CalcAbsIfRel( aPos ); + if ( rRef1.Valid() ) { pDoc->EndListeningCell( - ScAddress( t->aRef.Ref1.nCol, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab ), pFormCell ); + ScAddress( rRef1.nCol, + rRef1.nRow, + rRef1.nTab ), pFormCell ); } - break; + break; case svDoubleRef: - t->aRef.CalcAbsIfRel( aPos ); - if ( t->aRef.Valid() ) + t->CalcAbsIfRel( aPos ); + if ( rRef1.Valid() && rRef2.Valid() ) { if ( t->GetOpCode() == ocColRowNameAuto ) { // automagically - if ( t->aRef.Ref1.IsColRel() ) + if ( rRef1.IsColRel() ) { // ColName pDoc->EndListeningArea( ScRange ( 0, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab, + rRef1.nRow, + rRef1.nTab, MAXCOL, - t->aRef.Ref2.nRow, - t->aRef.Ref2.nTab ), pFormCell ); + rRef2.nRow, + rRef2.nTab ), pFormCell ); } else { // RowName pDoc->EndListeningArea( ScRange ( - t->aRef.Ref1.nCol, + rRef1.nCol, 0, - t->aRef.Ref1.nTab, - t->aRef.Ref2.nCol, + rRef1.nTab, + rRef2.nCol, MAXROW, - t->aRef.Ref2.nTab ), pFormCell ); + rRef2.nTab ), pFormCell ); } } else { pDoc->EndListeningArea( ScRange ( - t->aRef.Ref1.nCol, - t->aRef.Ref1.nRow, - t->aRef.Ref1.nTab, - t->aRef.Ref2.nCol, - t->aRef.Ref2.nRow, - t->aRef.Ref2.nTab ), pFormCell ); + rRef1.nCol, + rRef1.nRow, + rRef1.nTab, + rRef2.nCol, + rRef2.nRow, + rRef2.nTab ), pFormCell ); } } - break; + break; } } } @@ -697,7 +703,7 @@ ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rNewPos, { if ( t->GetType() == svIndex ) { - ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( t->nIndex ); + ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( t->GetIndex() ); if( pRangeData ) { if( pRangeData->HasReferences() ) @@ -845,7 +851,9 @@ BOOL lcl_IsBeyond( ScTokenArray* pCode, USHORT nMaxRow ) ScToken* t; pCode->Reset(); while ( t = pCode->GetNextReferenceRPN() ) // RPN -> auch in Namen - if ( t->aRef.Ref1.nRow > nMaxRow || t->aRef.Ref2.nRow > nMaxRow ) + if ( t->GetSingleRef().nRow > nMaxRow || + (t->GetType() == svDoubleRef && + t->GetDoubleRef().Ref2.nRow > nMaxRow) ) return TRUE; return FALSE; } @@ -941,10 +949,11 @@ void ScFormulaCell::GetFormula( String& rFormula ) const ScBaseCell* pCell = NULL; if ( !IsInChangeTrack() ) { - p->aRef.Ref1.CalcAbsIfRel( aPos ); - if ( p->aRef.Ref1.Valid() ) - pCell = pDocument->GetCell( ScAddress( p->aRef.Ref1.nCol, - p->aRef.Ref1.nRow, p->aRef.Ref1.nTab ) ); + SingleRefData& rRef = p->GetSingleRef(); + rRef.CalcAbsIfRel( aPos ); + if ( rRef.Valid() ) + pCell = pDocument->GetCell( ScAddress( rRef.nCol, + rRef.nRow, rRef.nTab ) ); } if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA) { @@ -1553,32 +1562,46 @@ ScDetectiveRefIter::ScDetectiveRefIter( ScFormulaCell* pCell ) aPos = pCell->aPos; } +BOOL lcl_ScDetectiveRefIter_SkipRef( ScToken* p ) +{ + SingleRefData& rRef1 = p->GetSingleRef(); + if ( rRef1.IsColDeleted() || rRef1.IsRowDeleted() || rRef1.IsTabDeleted() + || !rRef1.Valid() ) + return TRUE; + if ( p->GetType() == svDoubleRef ) + { + SingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if ( rRef2.IsColDeleted() || rRef2.IsRowDeleted() || rRef2.IsTabDeleted() + || !rRef2.Valid() ) + return TRUE; + } + return FALSE; +} + BOOL ScDetectiveRefIter::GetNextRef( ScTripel& rStart, ScTripel& rEnd ) { BOOL bRet = FALSE; ScToken* p = pCode->GetNextReferenceRPN(); if (p) - p->aRef.CalcAbsIfRel( aPos ); + p->CalcAbsIfRel( aPos ); - while ( p && ( p->aRef.Ref1.IsColDeleted() || p->aRef.Ref2.IsColDeleted() || - p->aRef.Ref1.IsRowDeleted() || p->aRef.Ref2.IsRowDeleted() || - p->aRef.Ref1.IsTabDeleted() || p->aRef.Ref2.IsTabDeleted() || - !p->aRef.Ref1.Valid() || !p->aRef.Ref2.Valid() ) ) + while ( p && lcl_ScDetectiveRefIter_SkipRef( p ) ) { p = pCode->GetNextReferenceRPN(); if (p) - p->aRef.CalcAbsIfRel( aPos ); + p->CalcAbsIfRel( aPos ); } if( p ) { - rStart.Put( p->aRef.Ref1.nCol, - p->aRef.Ref1.nRow, - p->aRef.Ref1.nTab ); - rEnd.Put( p->aRef.Ref2.nCol, - p->aRef.Ref2.nRow, - p->aRef.Ref2.nTab ); + SingleDoubleRefProvider aProv( *p ); + rStart.Put( aProv.Ref1.nCol, + aProv.Ref1.nRow, + aProv.Ref1.nTab ); + rEnd.Put( aProv.Ref2.nCol, + aProv.Ref2.nRow, + aProv.Ref2.nTab ); bRet = TRUE; } diff --git a/sc/source/core/data/cell2.cxx b/sc/source/core/data/cell2.cxx index 7b679fc8f26e..8c8e6224a516 100644 --- a/sc/source/core/data/cell2.cxx +++ b/sc/source/core/data/cell2.cxx @@ -2,9 +2,9 @@ * * $RCSfile: cell2.cxx,v $ * - * $Revision: 1.7 $ + * $Revision: 1.8 $ * - * last change: $Author: er $ $Date: 2001-02-13 18:58:28 $ + * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -284,10 +284,11 @@ void ScFormulaCell::GetEnglishFormula( String& rFormula, BOOL bCompileXML ) cons if( p ) { ScBaseCell* pCell; - p->aRef.Ref1.CalcAbsIfRel( aPos ); - if ( p->aRef.Ref1.Valid() ) - pCell = pDocument->GetCell( ScAddress( p->aRef.Ref1.nCol, - p->aRef.Ref1.nRow, p->aRef.Ref1.nTab ) ); + SingleRefData& rRef = p->GetSingleRef(); + rRef.CalcAbsIfRel( aPos ); + if ( rRef.Valid() ) + pCell = pDocument->GetCell( ScAddress( rRef.nCol, + rRef.nRow, rRef.nTab ) ); else pCell = NULL; if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA) @@ -390,10 +391,11 @@ BOOL ScFormulaCell::GetMatrixOrigin( ScAddress& rPos ) const ScToken* t = pCode->GetNextReferenceRPN(); if( t ) { - t->aRef.Ref1.CalcAbsIfRel( aPos ); - if ( t->aRef.Ref1.Valid() ) + SingleRefData& rRef = t->GetSingleRef(); + rRef.CalcAbsIfRel( aPos ); + if ( rRef.Valid() ) { - rPos.Set( t->aRef.Ref1.nCol, t->aRef.Ref1.nRow, t->aRef.Ref1.nTab ); + rPos.Set( rRef.nCol, rRef.nRow, rRef.nTab ); return TRUE; } } @@ -554,13 +556,14 @@ BOOL ScFormulaCell::HasOneReference( ScRange& r ) const ScToken* p = pCode->GetNextReferenceRPN(); if( p && !pCode->GetNextReferenceRPN() ) // nur eine! { - p->aRef.CalcAbsIfRel( aPos ); - r.aStart.Set( p->aRef.Ref1.nCol, - p->aRef.Ref1.nRow, - p->aRef.Ref1.nTab ); - r.aEnd.Set( p->aRef.Ref2.nCol, - p->aRef.Ref2.nRow, - p->aRef.Ref2.nTab ); + p->CalcAbsIfRel( aPos ); + SingleDoubleRefProvider aProv( *p ); + r.aStart.Set( aProv.Ref1.nCol, + aProv.Ref1.nRow, + aProv.Ref1.nTab ); + r.aEnd.Set( aProv.Ref2.nCol, + aProv.Ref2.nRow, + aProv.Ref2.nTab ); return TRUE; } else @@ -573,7 +576,9 @@ BOOL ScFormulaCell::HasRelNameReference() const for( ScToken* t = pCode->GetNextReferenceRPN(); t; t = pCode->GetNextReferenceRPN() ) { - if ( t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName() ) + if ( t->GetSingleRef().IsRelName() || + (t->GetType() == svDoubleRef && + t->GetDoubleRef().Ref2.IsRelName()) ) return TRUE; } return FALSE; @@ -715,9 +720,9 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode, pCode->Reset(); while ( !bColRowNameCompile && (t = pCode->GetNextColRowName()) ) { - if ( nDy > 0 && t->aRef.Ref1.IsColRel() ) + SingleRefData& rRef = t->GetSingleRef(); + if ( nDy > 0 && rRef.IsColRel() ) { // ColName - SingleRefData& rRef = t->aRef.Ref1; rRef.CalcAbsIfRel( aPos ); ScAddress aAdr( rRef.nCol, rRef.nRow, rRef.nTab ); ScRangePair* pR = pColList->Find( aAdr ); @@ -728,13 +733,12 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode, } else { // on the fly - if ( t->aRef.Ref1.nRow + 1 == nRow1 ) + if ( rRef.nRow + 1 == nRow1 ) bColRowNameCompile = TRUE; } } - if ( nDx > 0 && t->aRef.Ref1.IsRowRel() ) + if ( nDx > 0 && rRef.IsRowRel() ) { // RowName - SingleRefData& rRef = t->aRef.Ref1; rRef.CalcAbsIfRel( aPos ); ScAddress aAdr( rRef.nCol, rRef.nRow, rRef.nTab ); ScRangePair* pR = pRowList->Find( aAdr ); @@ -745,7 +749,7 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode, } else { // on the fly - if ( t->aRef.Ref1.nCol + 1 == nCol1 ) + if ( rRef.nCol + 1 == nCol1 ) bColRowNameCompile = TRUE; } } @@ -764,7 +768,7 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode, bColRowNameCompile = TRUE; while ( t && !bColRowNameCompile ) { - SingleRefData& rRef = t->aRef.Ref1; + SingleRefData& rRef = t->GetSingleRef(); rRef.CalcAbsIfRel( aPos ); if ( rRef.Valid() ) { @@ -965,15 +969,15 @@ void ScFormulaCell::UpdateInsertTabAbs(USHORT nTable) ScToken* p = pCode->GetNextReferenceRPN(); while( p ) { - if( !p->aRef.Ref1.IsTabRel() && (short) nTable <= p->aRef.Ref1.nTab ) - p->aRef.Ref1.nTab++; + SingleRefData& rRef1 = p->GetSingleRef(); + if( !rRef1.IsTabRel() && (short) nTable <= rRef1.nTab ) + rRef1.nTab++; if( p->GetType() == svDoubleRef ) { - if( !p->aRef.Ref2.IsTabRel() && (short) nTable <= p->aRef.Ref2.nTab ) - p->aRef.Ref2.nTab++; + SingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if( !rRef2.IsTabRel() && (short) nTable <= rRef2.nTab ) + rRef2.nTab++; } - else - p->aRef.Ref2.nTab = p->aRef.Ref1.nTab; p = pCode->GetNextReferenceRPN(); } } @@ -988,25 +992,25 @@ BOOL ScFormulaCell::TestTabRefAbs(USHORT nTable) ScToken* p = pCode->GetNextReferenceRPN(); while( p ) { - if( !p->aRef.Ref1.IsTabRel() ) + SingleRefData& rRef1 = p->GetSingleRef(); + if( !rRef1.IsTabRel() ) { - if( (short) nTable != p->aRef.Ref1.nTab ) + if( (short) nTable != rRef1.nTab ) bRet = TRUE; else if (nTable != aPos.Tab()) - p->aRef.Ref1.nTab = aPos.Tab(); + rRef1.nTab = aPos.Tab(); } if( p->GetType() == svDoubleRef ) { - if( !p->aRef.Ref2.IsTabRel() ) + SingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if( !rRef2.IsTabRel() ) { - if( (short)nTable != p->aRef.Ref1.nTab ) + if( (short) nTable != rRef2.nTab ) bRet = TRUE; else if (nTable != aPos.Tab()) - p->aRef.Ref2.nTab = aPos.Tab(); + rRef2.nTab = aPos.Tab(); } } - else - p->aRef.Ref2.nTab = p->aRef.Ref1.nTab; p = pCode->GetNextReferenceRPN(); } } @@ -1031,20 +1035,28 @@ void ScFormulaCell::TransposeReference() for( ScToken* t = pCode->GetNextReference(); t; t = pCode->GetNextReference() ) { - if ( t->aRef.Ref1.IsColRel() && t->aRef.Ref1.IsRowRel() && - t->aRef.Ref2.IsColRel() && t->aRef.Ref2.IsRowRel() ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsColRel() && rRef1.IsRowRel() ) { - INT16 nTemp; + BOOL bDouble = (t->GetType() == svDoubleRef); + SingleRefData& rRef2 = (bDouble ? t->GetDoubleRef().Ref2 : rRef1); + if ( !bDouble || (rRef2.IsColRel() && rRef2.IsRowRel()) ) + { + INT16 nTemp; - nTemp = t->aRef.Ref1.nRelCol; - t->aRef.Ref1.nRelCol = t->aRef.Ref1.nRelRow; - t->aRef.Ref1.nRelRow = nTemp; + nTemp = rRef1.nRelCol; + rRef1.nRelCol = rRef1.nRelRow; + rRef1.nRelRow = nTemp; - nTemp = t->aRef.Ref2.nRelCol; - t->aRef.Ref2.nRelCol = t->aRef.Ref2.nRelRow; - t->aRef.Ref2.nRelRow = nTemp; + if ( bDouble ) + { + nTemp = rRef2.nRelCol; + rRef2.nRelCol = rRef2.nRelRow; + rRef2.nRelRow = nTemp; + } - bFound = TRUE; + bFound = TRUE; + } } } @@ -1085,7 +1097,7 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD { if( t->GetOpCode() == ocName ) { - ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->nIndex ); + ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->GetIndex() ); if (pName) { if (pName->IsModified()) @@ -1096,11 +1108,19 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD } else if( t->GetType() != svIndex ) { - t->aRef.CalcAbsIfRel( aOldPos ); - if ( ScRefUpdate::UpdateTranspose( pDocument, rSource, rDest, t->aRef ) != UR_NOTHING - || bPosChanged ) + t->CalcAbsIfRel( aOldPos ); + BOOL bMod; + { // own scope for SingleDoubleRefModifier dtor if SingleRef + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); + bMod = (ScRefUpdate::UpdateTranspose( pDocument, rSource, + rDest, rRef ) != UR_NOTHING || bPosChanged); + } + if ( bMod ) { - t->aRef.CalcRelFromAbs( aPos ); + t->CalcRelFromAbs( aPos ); bChanged = TRUE; } } @@ -1117,12 +1137,18 @@ void ScFormulaCell::UpdateTranspose( const ScRange& rSource, const ScAddress& rD { if( t->GetType() != svIndex ) { - t->aRef.CalcAbsIfRel( aOldPos ); - if ( ScRefUpdate::UpdateTranspose( pDocument, rSource, rDest, t->aRef ) != UR_NOTHING - || bPosChanged ) - { - t->aRef.CalcRelFromAbs( aPos ); + t->CalcAbsIfRel( aOldPos ); + BOOL bMod; + { // own scope for SingleDoubleRefModifier dtor if SingleRef + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); + bMod = (ScRefUpdate::UpdateTranspose( pDocument, rSource, + rDest, rRef ) != UR_NOTHING || bPosChanged); } + if ( bMod ) + t->CalcRelFromAbs( aPos ); } } } @@ -1159,7 +1185,7 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro { if( t->GetOpCode() == ocName ) { - ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->nIndex ); + ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->GetIndex() ); if (pName) { if (pName->IsModified()) @@ -1170,10 +1196,19 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro } else if( t->GetType() != svIndex ) { - t->aRef.CalcAbsIfRel( aPos ); - if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING ) + t->CalcAbsIfRel( aPos ); + BOOL bMod; + { // own scope for SingleDoubleRefModifier dtor if SingleRef + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); + bMod = (ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, + rRef ) != UR_NOTHING); + } + if ( bMod ) { - t->aRef.CalcRelFromAbs( aPos ); + t->CalcRelFromAbs( aPos ); bChanged = TRUE; } } @@ -1190,9 +1225,18 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGro { if( t->GetType() != svIndex ) { - t->aRef.CalcAbsIfRel( aPos ); - if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING ) - t->aRef.CalcRelFromAbs( aPos ); + t->CalcAbsIfRel( aPos ); + BOOL bMod; + { // own scope for SingleDoubleRefModifier dtor if SingleRef + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); + bMod = (ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, + rRef ) != UR_NOTHING); + } + if ( bMod ) + t->CalcRelFromAbs( aPos ); } } } @@ -1213,12 +1257,12 @@ BOOL lcl_IsRangeNameInUse(USHORT nIndex, ScTokenArray* pCode, ScRangeName* pName { if (p->GetOpCode() == ocName) { - if (p->nIndex == nIndex) + if (p->GetIndex() == nIndex) return TRUE; else { // RangeData kann Null sein in bestimmten Excel-Dateien (#31168#) - ScRangeData* pSubName = pNames->FindIndex(p->nIndex); + ScRangeData* pSubName = pNames->FindIndex(p->GetIndex()); if (pSubName && lcl_IsRangeNameInUse(nIndex, pSubName->GetCode(), pNames)) return TRUE; @@ -1239,10 +1283,11 @@ void ScFormulaCell::ReplaceRangeNamesInUse( const ScIndexMap& rMap ) { if( p->GetOpCode() == ocName ) { - USHORT nNewIndex = rMap.Find( p->nIndex ); - if ( p->nIndex != nNewIndex ) + USHORT nIndex = p->GetIndex(); + USHORT nNewIndex = rMap.Find( nIndex ); + if ( nIndex != nNewIndex ) { - p->nIndex = nNewIndex; + p->SetIndex( nNewIndex ); bCompile = TRUE; } } @@ -1256,7 +1301,7 @@ void ScFormulaCell::CompileDBFormula() for( ScToken* p = pCode->First(); p; p = pCode->Next() ) { if ( p->GetOpCode() == ocDBArea - || (p->GetOpCode() == ocName && p->nIndex >= SC_START_INDEX_DB_COLL) ) + || (p->GetOpCode() == ocName && p->GetIndex() >= SC_START_INDEX_DB_COLL) ) { bCompile = TRUE; CompileTokenArray(); @@ -1285,7 +1330,7 @@ void ScFormulaCell::CompileDBFormula( BOOL bCreateFormulaString ) bRecompile = TRUE; break; case ocName: - if ( p->nIndex >= SC_START_INDEX_DB_COLL ) + if ( p->GetIndex() >= SC_START_INDEX_DB_COLL ) bRecompile = TRUE; // DB-Bereich } } diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx index 881b0d4ecd4b..693d542b7614 100644 --- a/sc/source/core/data/conditio.cxx +++ b/sc/source/core/data/conditio.cxx @@ -2,9 +2,9 @@ * * $RCSfile: conditio.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: nn $ $Date: 2000-12-06 09:14:39 $ + * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -97,10 +97,15 @@ BOOL lcl_HasRelRef( ScTokenArray* pFormula ) ScToken* t; for( t = pFormula->GetNextReference(); t; t = pFormula->GetNextReference() ) { - ComplRefData& rRef = t->GetReference(); - if ( rRef.Ref1.IsColRel() || rRef.Ref1.IsRowRel() || rRef.Ref1.IsTabRel() || - rRef.Ref2.IsColRel() || rRef.Ref2.IsRowRel() || rRef.Ref2.IsTabRel() ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() ) return TRUE; + if ( t->GetType() == svDoubleRef ) + { + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsColRel() || rRef2.IsRowRel() || rRef2.IsTabRel() ) + return TRUE; + } } } return FALSE; @@ -220,13 +225,13 @@ ScConditionEntry::ScConditionEntry( ScConditionMode eOper, { if ( pToken->GetType() == svDouble ) { - nVal1 = pToken->nValue; + nVal1 = pToken->GetDouble(); DELETEZ(pFormula1); // nicht als Formel merken } else if ( pToken->GetType() == svString ) { bIsStr1 = TRUE; - aStrVal1 = pToken->cStr; // char-ptr + aStrVal1 = pToken->GetString(); DELETEZ(pFormula1); // nicht als Formel merken } } @@ -244,13 +249,13 @@ ScConditionEntry::ScConditionEntry( ScConditionMode eOper, { if ( pToken->GetType() == svDouble ) { - nVal2 = pToken->nValue; + nVal2 = pToken->GetDouble(); DELETEZ(pFormula2); // nicht als Formel merken } else if ( pToken->GetType() == svString ) { bIsStr2 = TRUE; - aStrVal2 = pToken->cStr; // char-ptr + aStrVal2 = pToken->GetString(); DELETEZ(pFormula2); // nicht als Formel merken } } @@ -406,13 +411,13 @@ void ScConditionEntry::Compile( const String& rExpr1, const String& rExpr2, { if ( pToken->GetType() == svDouble ) { - nVal1 = pToken->nValue; + nVal1 = pToken->GetDouble(); DELETEZ(pFormula1); // nicht als Formel merken } else if ( pToken->GetType() == svString ) { bIsStr1 = TRUE; - aStrVal1 = pToken->cStr; // char-ptr + aStrVal1 = pToken->GetString(); DELETEZ(pFormula1); // nicht als Formel merken } } @@ -431,13 +436,13 @@ void ScConditionEntry::Compile( const String& rExpr1, const String& rExpr2, { if ( pToken->GetType() == svDouble ) { - nVal2 = pToken->nValue; + nVal2 = pToken->GetDouble(); DELETEZ(pFormula2); // nicht als Formel merken } else if ( pToken->GetType() == svString ) { bIsStr2 = TRUE; - aStrVal2 = pToken->cStr; // char-ptr + aStrVal2 = pToken->GetString(); DELETEZ(pFormula2); // nicht als Formel merken } } @@ -944,56 +949,56 @@ void ScConditionEntry::SourceChanged( const ScAddress& rChanged ) ScToken* t; for( t = pFormula->GetNextReference(); t; t = pFormula->GetNextReference() ) { - ComplRefData& rRef = t->GetReference(); - if ( rRef.Ref1.IsColRel() || rRef.Ref1.IsRowRel() || rRef.Ref1.IsTabRel() || - rRef.Ref2.IsColRel() || rRef.Ref2.IsRowRel() || rRef.Ref2.IsTabRel() ) + SingleDoubleRefProvider aProv( *t ); + if ( aProv.Ref1.IsColRel() || aProv.Ref1.IsRowRel() || aProv.Ref1.IsTabRel() || + aProv.Ref2.IsColRel() || aProv.Ref2.IsRowRel() || aProv.Ref2.IsTabRel() ) { // absolut muss getroffen sein, relativ bestimmt Bereich BOOL bHit = TRUE; INT16 nCol1, nRow1, nTab1, nCol2, nRow2, nTab2; - if ( rRef.Ref1.IsColRel() ) - nCol2 = rChanged.Col() - rRef.Ref1.nRelCol; + if ( aProv.Ref1.IsColRel() ) + nCol2 = rChanged.Col() - aProv.Ref1.nRelCol; else { - bHit &= ( rChanged.Col() >= rRef.Ref1.nCol ); + bHit &= ( rChanged.Col() >= aProv.Ref1.nCol ); nCol2 = MAXCOL; } - if ( rRef.Ref1.IsRowRel() ) - nRow2 = rChanged.Row() - rRef.Ref1.nRelRow; + if ( aProv.Ref1.IsRowRel() ) + nRow2 = rChanged.Row() - aProv.Ref1.nRelRow; else { - bHit &= ( rChanged.Row() >= rRef.Ref1.nRow ); + bHit &= ( rChanged.Row() >= aProv.Ref1.nRow ); nRow2 = MAXROW; } - if ( rRef.Ref1.IsTabRel() ) - nTab2 = rChanged.Tab() - rRef.Ref1.nRelTab; + if ( aProv.Ref1.IsTabRel() ) + nTab2 = rChanged.Tab() - aProv.Ref1.nRelTab; else { - bHit &= ( rChanged.Tab() >= rRef.Ref1.nTab ); + bHit &= ( rChanged.Tab() >= aProv.Ref1.nTab ); nTab2 = MAXTAB; } - if ( rRef.Ref2.IsColRel() ) - nCol1 = rChanged.Col() - rRef.Ref2.nRelCol; + if ( aProv.Ref2.IsColRel() ) + nCol1 = rChanged.Col() - aProv.Ref2.nRelCol; else { - bHit &= ( rChanged.Col() <= rRef.Ref2.nCol ); + bHit &= ( rChanged.Col() <= aProv.Ref2.nCol ); nCol1 = 0; } - if ( rRef.Ref2.IsRowRel() ) - nRow1 = rChanged.Row() - rRef.Ref2.nRelRow; + if ( aProv.Ref2.IsRowRel() ) + nRow1 = rChanged.Row() - aProv.Ref2.nRelRow; else { - bHit &= ( rChanged.Row() <= rRef.Ref2.nRow ); + bHit &= ( rChanged.Row() <= aProv.Ref2.nRow ); nRow1 = 0; } - if ( rRef.Ref2.IsTabRel() ) - nTab1 = rChanged.Tab() - rRef.Ref2.nRelTab; + if ( aProv.Ref2.IsTabRel() ) + nTab1 = rChanged.Tab() - aProv.Ref2.nRelTab; else { - bHit &= ( rChanged.Tab() <= rRef.Ref2.nTab ); + bHit &= ( rChanged.Tab() <= aProv.Ref2.nTab ); nTab1 = 0; } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index dd1af18c7c6e..85162904612f 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -2,9 +2,9 @@ * * $RCSfile: documen4.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: dr $ $Date: 2001-02-13 17:12:29 $ + * last change: $Author: er $ $Date: 2001-02-21 18:29:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -209,8 +209,7 @@ void ScDocument::InsertMatrixFormula(USHORT nCol1, USHORT nRow1, { aRefData.nTab = i; aRefData.nRelTab = i - nTab1; - t->SetSingleReference( aRefData ); - t->NewOpCode( ocMatRef ); + t->GetSingleRef() = aRefData; } for (j = nCol1; j <= nCol2; j++) { @@ -221,7 +220,7 @@ void ScDocument::InsertMatrixFormula(USHORT nCol1, USHORT nRow1, // Array muss geklont werden, damit jede // Zelle ein eigenes Array erhaelt! aPos = ScAddress( j, k, i ); - t->aRef.CalcRelFromAbs( aPos ); + t->CalcRelFromAbs( aPos ); pCell = new ScFormulaCell( this, aPos, aArr.Clone(), MM_REFERENCE ); pTab[i]->PutCell(j, k, (ScBaseCell*) pCell); } diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index 571ebcad9d01..7ebc96918fde 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -2,9 +2,9 @@ * * $RCSfile: interpre.hxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: er $ $Date: 2001-02-13 19:01:00 $ + * last change: $Author: er $ $Date: 2001-02-21 18:31:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -135,7 +135,7 @@ struct ScCompare } }; -struct ScToken; +class ScToken; #define MAXSTACK (4096 / sizeof(ScToken*)) @@ -192,7 +192,6 @@ private: static ScTokenStack* pGlobalStack; static ScErrorStack* pGlobalErrorStack; static BOOL bGlobalStackInUse; - static const sal_Unicode cEmptyString; // =0 for return &cEmptyString ScTokenIterator aCode; ScAddress aPos; @@ -275,12 +274,12 @@ BOOL CreateCellArr(USHORT nCol1, USHORT nRow1, USHORT nTab1, //----------------------------------------------------------------------------- void Push( ScToken& r ); void PushTempToken( const ScToken& ); -void PushTempToken( ScDoubleToken* ); //! see warnings in interpr4.cxx +void PushTempToken( ScToken* ); //! see warnings in interpr4.cxx void Pop(); void PopError(); BYTE PopByte(); double PopDouble(); -const sal_Unicode* PopString(); +const String& PopString(); void PopSingleRef( ScAddress& ); void PopSingleRef(USHORT& rCol, USHORT &rRow, USHORT& rTab); void PopDoubleRef( ScRange&, BOOL bDontCheckForTableOp = FALSE ); @@ -294,8 +293,8 @@ ScMatrix* PopMatrix(); //void PushByte(BYTE nVal); void PushDouble(double nVal); void PushInt( int nVal ); -void PushString(const sal_Unicode* cString); -void PushStringObject(const String& aString); +void PushStringBuffer( const sal_Unicode* pString ); +void PushString( const String& rString ); void PushSingleRef(USHORT nCol, USHORT nRow, USHORT nTab); void PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1, USHORT nCol2, USHORT nRow2, USHORT nTab2); @@ -312,7 +311,7 @@ double GetLong(); BOOL DoubleRefToPosSingleRef( const ScRange& rRange, ScAddress& rAdr ); double GetDouble(); BOOL GetBool() { return GetDouble() != 0.0; } -const sal_Unicode* GetString(); +const String& GetString(); ScMatrix* GetMatrix(USHORT& nMatInd); // in interpr2.cxx void ScTableOp(); // Mehrfachoperationen void ScErrCell(); // Sonderbehandlung @@ -322,6 +321,9 @@ void ScDefPar(); // DefaultParameter void SetMaxIterationCount(USHORT n); inline void CurFmtToFuncFmt() { nFuncFmtType = nCurFmtType; nFuncFmtIndex = nCurFmtIndex; } +// Check for String overflow of rResult+rAdd and set error and erase rResult +// if so. Return TRUE if ok, FALSE if overflow +inline BOOL CheckStringResultLen( String& rResult, const String& rAdd ); //---------------------------------Funktionen in interpr1.cxx--------- //-----------------------------Textfunktionen void ScIfJump(); @@ -741,4 +743,15 @@ inline BOOL ScInterpreter::MustHaveParamCountMin( BYTE nAct, BYTE nMin ) } +inline BOOL ScInterpreter::CheckStringResultLen( String& rResult, const String& rAdd ) +{ + if ( (ULONG) rResult.Len() + rAdd.Len() > STRING_MAXLEN ) + { + SetError( errStringOverflow ); + rResult.Erase(); + return FALSE; + } + return TRUE; +} + #endif diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx index 1fdfd30b31ed..35439503387b 100644 --- a/sc/source/core/tool/chgtrack.cxx +++ b/sc/source/core/tool/chgtrack.cxx @@ -2,9 +2,9 @@ * * $RCSfile: chgtrack.cxx,v $ * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * - * last change: $Author: er $ $Date: 2001-02-16 17:48:54 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -2314,34 +2314,48 @@ void ScChangeActionContent::PutValueToDoc( ScBaseCell* pCell, } -void lcl_InvalidateReference( ComplRefData& rRef, const ScBigAddress& rPos ) +void lcl_InvalidateReference( ScToken& rTok, const ScBigAddress& rPos ) { + SingleRefData& rRef1 = rTok.GetSingleRef(); if ( rPos.Col() < 0 || MAXCOL < rPos.Col() ) { - rRef.Ref1.nCol = (INT16)(~0); - rRef.Ref1.nRelCol = (INT16)(~0); - rRef.Ref1.SetColDeleted( TRUE ); - rRef.Ref2.nCol = (INT16)(~0); - rRef.Ref2.nRelCol = (INT16)(~0); - rRef.Ref2.SetColDeleted( TRUE ); + rRef1.nCol = (INT16)(~0); + rRef1.nRelCol = (INT16)(~0); + rRef1.SetColDeleted( TRUE ); } if ( rPos.Row() < 0 || MAXROW < rPos.Row() ) { - rRef.Ref1.nRow = (INT16)(~0); - rRef.Ref1.nRelRow = (INT16)(~0); - rRef.Ref1.SetRowDeleted( TRUE ); - rRef.Ref2.nRow = (INT16)(~0); - rRef.Ref2.nRelRow = (INT16)(~0); - rRef.Ref2.SetRowDeleted( TRUE ); + rRef1.nRow = (INT16)(~0); + rRef1.nRelRow = (INT16)(~0); + rRef1.SetRowDeleted( TRUE ); } if ( rPos.Tab() < 0 || MAXTAB < rPos.Tab() ) { - rRef.Ref1.nTab = (INT16)(~0); - rRef.Ref1.nRelTab = (INT16)(~0); - rRef.Ref1.SetTabDeleted( TRUE ); - rRef.Ref2.nTab = (INT16)(~0); - rRef.Ref2.nRelTab = (INT16)(~0); - rRef.Ref2.SetTabDeleted( TRUE ); + rRef1.nTab = (INT16)(~0); + rRef1.nRelTab = (INT16)(~0); + rRef1.SetTabDeleted( TRUE ); + } + if ( rTok.GetType() == svDoubleRef ) + { + SingleRefData& rRef2 = rTok.GetDoubleRef().Ref2; + if ( rPos.Col() < 0 || MAXCOL < rPos.Col() ) + { + rRef2.nCol = (INT16)(~0); + rRef2.nRelCol = (INT16)(~0); + rRef2.SetColDeleted( TRUE ); + } + if ( rPos.Row() < 0 || MAXROW < rPos.Row() ) + { + rRef2.nRow = (INT16)(~0); + rRef2.nRelRow = (INT16)(~0); + rRef2.SetRowDeleted( TRUE ); + } + if ( rPos.Tab() < 0 || MAXTAB < rPos.Tab() ) + { + rRef2.nTab = (INT16)(~0); + rRef2.nRelTab = (INT16)(~0); + rRef2.SetTabDeleted( TRUE ); + } } } @@ -2440,10 +2454,10 @@ void ScChangeActionContent::UpdateReference( const ScChangeTrack* pTrack, ScTokenArray* pArr = ((ScFormulaCell*)pOldCell)->GetCode(); pArr->Reset(); while ( t = pArr->GetNextReference() ) - lcl_InvalidateReference( t->aRef, rPos ); + lcl_InvalidateReference( *t, rPos ); pArr->Reset(); while ( t = pArr->GetNextReferenceRPN() ) - lcl_InvalidateReference( t->aRef, rPos ); + lcl_InvalidateReference( *t, rPos ); } if ( bNewFormula ) { @@ -2451,10 +2465,10 @@ void ScChangeActionContent::UpdateReference( const ScChangeTrack* pTrack, ScTokenArray* pArr = ((ScFormulaCell*)pNewCell)->GetCode(); pArr->Reset(); while ( t = pArr->GetNextReference() ) - lcl_InvalidateReference( t->aRef, rPos ); + lcl_InvalidateReference( *t, rPos ); pArr->Reset(); while ( t = pArr->GetNextReferenceRPN() ) - lcl_InvalidateReference( t->aRef, rPos ); + lcl_InvalidateReference( *t, rPos ); } } } diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 0e7a65b8c82f..e50ad2db0c50 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -2,9 +2,9 @@ * * $RCSfile: compiler.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: er $ $Date: 2001-01-30 15:10:44 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -693,7 +693,7 @@ xub_StrLen ScCompiler::NextSymbol() else { aSymbol.Append( pStart + nSrcPos, aRes.EndPos - nSrcPos ); - nSrcPos = aRes.EndPos; + nSrcPos = (xub_StrLen) aRes.EndPos; if ( aRes.TokenType & KParseType::SINGLE_QUOTE_NAME ) { // special cases 'sheetname'. 'filename'# c = pStart[nSrcPos]; @@ -739,9 +739,9 @@ BOOL ScCompiler::IsOpCode( const String& rName ) if (bFound) { - ScToken aToken; + ScRawToken aToken; aToken.SetOpCode( (OpCode) --i ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); } else { @@ -749,9 +749,9 @@ BOOL ScCompiler::IsOpCode( const String& rName ) bFound = ScGlobal::GetFuncCollection()->SearchFunc(cSymbol, nIndex); if( bFound ) { - ScToken aToken; + ScRawToken aToken; aToken.SetExternal( cSymbol ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); } else { @@ -760,17 +760,17 @@ BOOL ScCompiler::IsOpCode( const String& rName ) FindFunction( cSymbol, ( pSymbolTable != pSymbolTableEnglish ) ); if (aIntName.Len()) { - ScToken aToken; + ScRawToken aToken; aToken.SetExternal( aIntName.GetBuffer() ); // international name - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); bFound = TRUE; } } } - if ( bFound && pToken->GetOpCode() == ocSub && + if ( bFound && pRawToken->GetOpCode() == ocSub && (eLastOp == ocOpen || eLastOp == ocSep || (eLastOp > ocEndDiv && eLastOp < ocEndBinOp /*ocEndUnOp*/))) - pToken->eOp = ocNegSub; + pRawToken->NewOpCode( ocNegSub ); return bFound; } @@ -783,9 +783,9 @@ BOOL ScCompiler::IsOpCode2( const String& rName ) if (bFound) { - ScToken aToken; + ScRawToken aToken; aToken.SetOpCode( (OpCode) --i ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); } return bFound; } @@ -813,9 +813,9 @@ BOOL ScCompiler::IsValue( const String& rSym ) if( nType == NUMBERFORMAT_TEXT ) // HACK: Die Zahl ist zu gross! SetError( errIllegalArgument ); - ScToken aToken; + ScRawToken aToken; aToken.SetDouble( fVal ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); return TRUE; } } @@ -838,9 +838,9 @@ BOOL ScCompiler::IsString() if ( bQuote ) { cSymbol[nLen] = '\0'; - ScToken aToken; + ScRawToken aToken; aToken.SetString( cSymbol+1 ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); return TRUE; } return FALSE; @@ -890,7 +890,7 @@ BOOL ScCompiler::IsReference( const String& rName ) USHORT nFlags = aRange.Parse( rName, pDoc ); if( nFlags & SCA_VALID ) { - ScToken aToken; + ScRawToken aToken; ComplRefData aRef; aRef.InitRange( aRange ); aRef.Ref1.SetColRel( (nFlags & SCA_COL_ABSOLUTE) == 0 ); @@ -907,7 +907,7 @@ BOOL ScCompiler::IsReference( const String& rName ) aRef.Ref2.SetFlag3D( ( nFlags & SCA_TAB2_3D ) != 0 ); aRef.CalcRelFromAbs( aPos ); aToken.SetDoubleReference( aRef ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); } else { @@ -917,7 +917,7 @@ BOOL ScCompiler::IsReference( const String& rName ) // damit Tabelle1.blah oder blah.a1 als (falsche) ref erkannt wird if( nFlags & ( SCA_VALID_COL|SCA_VALID_ROW|SCA_VALID_TAB ) ) { - ScToken aToken; + ScRawToken aToken; SingleRefData aRef; aRef.InitAddress( aAddr ); aRef.SetColRel( (nFlags & SCA_COL_ABSOLUTE) == 0 ); @@ -937,7 +937,7 @@ BOOL ScCompiler::IsReference( const String& rName ) } aRef.CalcRelFromAbs( aPos ); aToken.SetSingleReference( aRef ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); } } return ( nFlags & SCA_VALID ) != 0; @@ -970,10 +970,10 @@ BOOL ScCompiler::IsMacro( const String& rName ) pSfxApp->LeaveBasicCall(); return FALSE; } - ScToken aToken; + ScRawToken aToken; aToken.SetExternal( rName.GetBuffer() ); aToken.eOp = ocMacro; - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); pSfxApp->LeaveBasicCall(); return TRUE; } @@ -985,9 +985,9 @@ BOOL ScCompiler::IsNamedRange( const String& rName ) if (pRangeName->SearchName( rName, n ) ) { ScRangeData* pData = (*pRangeName)[n]; - ScToken aToken; + ScRawToken aToken; aToken.SetName( pData->GetIndex() ); - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); return TRUE; } else @@ -1001,10 +1001,10 @@ BOOL ScCompiler::IsDBRange( const String& rName ) if (pDBColl->SearchName( rName, n ) ) { ScDBData* pData = (*pDBColl)[n]; - ScToken aToken; + ScRawToken aToken; aToken.SetName( pData->GetIndex() ); aToken.eOp = ocDBArea; - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); return TRUE; } else @@ -1202,10 +1202,10 @@ BOOL ScCompiler::IsColRowName( const String& rName ) } if ( bFound ) { - ScToken aToken; + ScRawToken aToken; aToken.SetSingleReference( aRef ); aToken.eOp = ocColRowName; - pToken = aToken.Clone(); + pRawToken = aToken.Clone(); return TRUE; } else @@ -1407,7 +1407,7 @@ void ScCompiler::AutoCorrectParsedSymbol() BOOL ScCompiler::NextNewToken() { xub_StrLen nSpaces = NextSymbol(); - ScToken aToken; + ScRawToken aToken; if( cSymbol[0] ) { if( nSpaces ) @@ -1449,8 +1449,8 @@ BOOL ScCompiler::NextNewToken() SetError( errNoName ); ScGlobal::pCharClass->toLower( aUpper ); aToken.SetString( aUpper.GetBuffer() ); - aToken.eOp = ocBad; - pToken = aToken.Clone(); + aToken.NewOpCode( ocBad ); + pRawToken = aToken.Clone(); if ( bAutoCorrect ) AutoCorrectParsedSymbol(); } @@ -1494,9 +1494,9 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula ) eLastOp = ocOpen; while( NextNewToken() ) { - if( pToken->GetOpCode() == ocOpen ) + if( pRawToken->GetOpCode() == ocOpen ) nBrackets++; - else if( pToken->GetOpCode() == ocClose ) + else if( pRawToken->GetOpCode() == ocClose ) { if( !nBrackets ) { @@ -1510,19 +1510,18 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula ) else nBrackets--; } - if( !pArr->Add( pToken ) ) + if( !pArr->Add( pRawToken->CreateToken() ) ) { SetError(errCodeOverflow); break; } - eLastOp = pToken->GetOpCode(); + eLastOp = pRawToken->GetOpCode(); if ( bAutoCorrect ) aCorrectedFormula += aCorrectedSymbol; } if ( eLastOp != ocBad ) { // bei ocBad ist der Rest der Formel String, es wuerden zuviele // Klammern erscheinen - ScToken aToken; - aToken.SetOpCode( ocClose ); + ScByteToken aToken( ocClose ); while( nBrackets-- ) { if( !pArr->AddToken( aToken ) ) @@ -1617,27 +1616,21 @@ BOOL ScCompiler::GetToken() { if ( nWasColRowName >= 2 && pToken->GetOpCode() == ocColRowName ) { // aus einem ocSpaces ein ocIntersect im RPN machen - ScToken* pRawToken = new ScToken; - pRawToken->SetOpCode( ocIntersect ); - pToken = pRawToken->Clone(); - delete pRawToken; + pToken = new ScByteToken( ocIntersect ); pArr->nIndex--; // ganz schweinisch.. } } } if( bStop ) { - ScToken* pRawToken = new ScToken; - pRawToken->SetOpCode( ocStop ); - pToken = pRawToken->Clone(); - delete pRawToken; + pToken = new ScByteToken( ocStop ); return FALSE; } if( pToken->GetOpCode() == ocSubTotal ) glSubTotal = TRUE; else if( pToken->GetOpCode() == ocName ) { - ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( pToken->nIndex); + ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex( pToken->GetIndex() ); if (pRangeData) { USHORT nErr = pRangeData->GetErrCode(); @@ -1689,7 +1682,7 @@ BOOL ScCompiler::GetToken() } else if( pToken->GetOpCode() == ocColRowName ) { - SingleRefData& rRef = pToken->aRef.Ref1; + SingleRefData& rRef = pToken->GetSingleRef(); rRef.CalcAbsIfRel( aPos ); if ( !rRef.Valid() ) { @@ -1884,11 +1877,8 @@ BOOL ScCompiler::GetToken() pNew->AddDoubleReference( aRefData ); else { // automagically - ScToken* pRawToken = new ScToken; - pRawToken->SetDoubleReference( aRefData ); - pRawToken->eOp = ocColRowNameAuto; - pNew->AddToken( *pRawToken ); - delete pRawToken; + pNew->Add( new ScDoubleRefToken( ocColRowNameAuto, + aRefData ) ); } } PushTokenArray( pNew, TRUE ); @@ -1901,7 +1891,7 @@ BOOL ScCompiler::GetToken() } else if( pToken->GetOpCode() == ocDBArea ) { - ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex( pToken->nIndex); + ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex( pToken->GetIndex() ); if ( !pDBData ) SetError(errNoName); else if ( !bCompileForFAP ) @@ -2096,6 +2086,11 @@ BOOL ScCompiler::CompileTokenArray() // Token in den Code Eintragen //--------------------------------------------------------------------------- +void ScCompiler::PutCode( ScRawToken* p ) +{ + PutCode( p->CreateToken() ); +} + void ScCompiler::PutCode( ScToken* p ) { if( pc >= MAXCODE ) @@ -2250,11 +2245,7 @@ void ScCompiler::Factor() } else { - ScToken* pRawToken = new ScToken; - pRawToken->SetByte( SepCount ); - ScTokenRef pSepToken = pRawToken->Clone(); - delete pRawToken; - PutCode( pSepToken ); + PutCode( new ScByteToken( ocPush, SepCount ) ); if ( eOp != ocClose ) eOp = Expression(); } @@ -2293,7 +2284,7 @@ void ScCompiler::Factor() SetError(errPairExpected); else eOp = NextToken(); - pFacToken->cByte = SepCount; + pFacToken->SetByte( SepCount ); PutCode( pFacToken ); // Diese Funktionen muessen immer neu berechnet werden switch( eFuncOp ) @@ -2323,9 +2314,9 @@ void ScCompiler::Factor() // Die PC-Staende sind -1 pFacToken = pToken; if ( eOp == ocIf ) - pFacToken->nJump[ 0 ] = 3; // if, else, behind + pFacToken->GetJump()[ 0 ] = 3; // if, else, behind else - pFacToken->nJump[ 0 ] = MAXJUMPCOUNT+1; + pFacToken->GetJump()[ 0 ] = MAXJUMPCOUNT+1; eOp = NextToken(); if (eOp == ocOpen) { @@ -2337,7 +2328,7 @@ void ScCompiler::Factor() short nJumpCount = 0; PutCode( pFacToken ); // #36253# bei AutoCorrect (da pArr->nError ignoriert wird) - // unbegrenztes ocIf gibt GPF weil ScToken::Clone den JumpBuffer + // unbegrenztes ocIf gibt GPF weil ScRawToken::Clone den JumpBuffer // anhand von nJump[0]*2+2 alloziert, was bei ocIf 3*2+2 ist const short nJumpMax = (pFacToken->GetOpCode() == ocIf ? 3 : MAXJUMPCOUNT); @@ -2345,7 +2336,7 @@ void ScCompiler::Factor() && (!pArr->GetError() || bIgnoreErrors) ) { if ( ++nJumpCount <= nJumpMax ) - pFacToken->nJump[nJumpCount] = pc-1; + pFacToken->GetJump()[nJumpCount] = pc-1; NextToken(); eOp = Expression(); PutCode( pToken ); // Als Terminator des Teilausdrucks @@ -2359,12 +2350,12 @@ void ScCompiler::Factor() // mehr als 3 Parametern in ocIf einen Ueberschreiber, // das war auch schon in der 312 so (jaja, die Tester..) if ( ++nJumpCount <= nJumpMax ) - pFacToken->nJump[ nJumpCount ] = pc-1; + pFacToken->GetJump()[ nJumpCount ] = pc-1; if ((pFacToken->GetOpCode() == ocIf && (nJumpCount > 3)) || (nJumpCount >= MAXJUMPCOUNT)) SetError(errIllegalParameter); else - pFacToken->nJump[ 0 ] = nJumpCount; + pFacToken->GetJump()[ 0 ] = nJumpCount; } } else if ( eOp == ocBad ) @@ -2507,7 +2498,7 @@ OpCode ScCompiler::Expression() while (pToken->GetOpCode() == ocAnd || pToken->GetOpCode() == ocOr) { ScTokenRef p = pToken; - pToken->cByte = 2; // 2 Parameter! + pToken->SetByte( 2 ); // 2 parameters! NextToken(); NotLine(); PutCode(p); @@ -2526,14 +2517,14 @@ BOOL ScCompiler::HasModifiedRange() OpCode eOpCode = t->GetOpCode(); if ( eOpCode == ocName ) { - ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex(t->nIndex); + ScRangeData* pRangeData = pDoc->GetRangeName()->FindIndex(t->GetIndex()); if (pRangeData && pRangeData->IsModified()) return TRUE; } else if ( eOpCode == ocDBArea ) { - ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->nIndex); + ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->GetIndex()); if (pDBData && pDBData->IsModified()) return TRUE; @@ -2573,10 +2564,15 @@ void ScCompiler::SetRelNameReference() for( ScToken* t = pArr->GetNextReference(); t; t = pArr->GetNextReference() ) { - if ( t->aRef.Ref1.IsColRel() || t->aRef.Ref1.IsRowRel() || t->aRef.Ref1.IsTabRel() ) - t->aRef.Ref1.SetRelName( TRUE ); - if ( t->aRef.Ref2.IsColRel() || t->aRef.Ref2.IsRowRel() || t->aRef.Ref2.IsTabRel() ) - t->aRef.Ref2.SetRelName( TRUE ); + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() ) + rRef1.SetRelName( TRUE ); + if ( t->GetType() == svDoubleRef ) + { + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsColRel() || rRef2.IsRowRel() || rRef2.IsTabRel() ) + rRef2.SetRelName( TRUE ); + } } } @@ -2586,7 +2582,12 @@ void ScCompiler::MoveRelWrap() pArr->Reset(); for( ScToken* t = pArr->GetNextReference(); t; t = pArr->GetNextReference() ) - ScRefUpdate::MoveRelWrap( pDoc, aPos, t->aRef ); + { + if ( t->GetType() == svSingleRef ) + ScRefUpdate::MoveRelWrap( pDoc, aPos, SingleDoubleRefModifier( t->GetSingleRef() ).Ref() ); + else + ScRefUpdate::MoveRelWrap( pDoc, aPos, t->GetDoubleRef() ); + } } // static @@ -2597,7 +2598,12 @@ void ScCompiler::MoveRelWrap( ScTokenArray& rArr, ScDocument* pDoc, rArr.Reset(); for( ScToken* t = rArr.GetNextReference(); t; t = rArr.GetNextReference() ) - ScRefUpdate::MoveRelWrap( pDoc, rPos, t->aRef ); + { + if ( t->GetType() == svSingleRef ) + ScRefUpdate::MoveRelWrap( pDoc, rPos, SingleDoubleRefModifier( t->GetSingleRef() ).Ref() ); + else + ScRefUpdate::MoveRelWrap( pDoc, rPos, t->GetDoubleRef() ); + } } ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode, @@ -2618,7 +2624,7 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode, { if( t->GetOpCode() == ocName ) { - ScRangeData* pName = pDoc->GetRangeName()->FindIndex( t->nIndex ); + ScRangeData* pName = pDoc->GetRangeName()->FindIndex( t->GetIndex() ); if (pName && pName->HasType(RT_SHAREDMOD)) { pRangeData = pName; // => neu kompilieren etc. @@ -2627,12 +2633,24 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode, } else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!! { - t->aRef.CalcAbsIfRel( rOldPos ); - if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, - r, nDx, nDy, nDz, t->aRef ) - != UR_NOTHING - ) - rChanged = TRUE; + t->CalcAbsIfRel( rOldPos ); + if ( t->GetType() == svSingleRef ) + { + if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, + r, nDx, nDy, nDz, + SingleDoubleRefModifier( t->GetSingleRef() ).Ref() ) + != UR_NOTHING + ) + rChanged = TRUE; + } + else + { + if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, + r, nDx, nDy, nDz, t->GetDoubleRef() ) + != UR_NOTHING + ) + rChanged = TRUE; + } } } pArr->Reset(); @@ -2641,19 +2659,41 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode, { if ( t->GetRef() == 1 ) { // bei nRefCnt>1 bereits im Code angepasst - if ( t->aRef.Ref1.IsRelName() || t->aRef.Ref2.IsRelName() ) + if ( t->GetType() == svSingleRef ) { - ScRefUpdate::MoveRelWrap( pDoc, aPos, t->aRef ); - rChanged = TRUE; + SingleRefData& rRef = t->GetSingleRef(); + SingleDoubleRefModifier aMod( rRef ); + if ( rRef.IsRelName() ) + { + ScRefUpdate::MoveRelWrap( pDoc, aPos, aMod.Ref() ); + rChanged = TRUE; + } + else + { + aMod.Ref().CalcAbsIfRel( rOldPos ); + if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, + r, nDx, nDy, nDz, aMod.Ref() ) + != UR_NOTHING + ) + rChanged = TRUE; + } } else { - t->aRef.CalcAbsIfRel( rOldPos ); - if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, - r, nDx, nDy, nDz, t->aRef ) - != UR_NOTHING - ) + ComplRefData& rRef = t->GetDoubleRef(); + if ( rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName() ) + { + ScRefUpdate::MoveRelWrap( pDoc, aPos, rRef ); rChanged = TRUE; + } + else + { + if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, + r, nDx, nDy, nDz, rRef ) + != UR_NOTHING + ) + rChanged = TRUE; + } } } } @@ -2672,7 +2712,10 @@ BOOL ScCompiler::UpdateNameReference(UpdateRefMode eUpdateRefMode, for( ScToken* t = pArr->GetNextReference(); t; t = pArr->GetNextReference() ) { - ComplRefData& rRef = t->aRef; + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() && (!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) && ( t->GetType() == svSingleRef || @@ -2705,49 +2748,56 @@ void ScCompiler::UpdateSharedFormulaReference( UpdateRefMode eUpdateRefMode, { if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!! { - t->aRef.CalcAbsIfRel( rOldPos ); + t->CalcAbsIfRel( rOldPos ); // Absolute references have been already adjusted in the named // shared formula itself prior to breaking the shared formula // and calling this function. Don't readjust them again. - ComplRefData aBkp = t->aRef; + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); + ComplRefData aBkp = rRef; ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos, - r, nDx, nDy, nDz, t->aRef ); + r, nDx, nDy, nDz, rRef ); // restore absolute parts if ( !aBkp.Ref1.IsColRel() ) { - t->aRef.Ref1.nCol = aBkp.Ref1.nCol; - t->aRef.Ref1.nRelCol = aBkp.Ref1.nRelCol; - t->aRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() ); + rRef.Ref1.nCol = aBkp.Ref1.nCol; + rRef.Ref1.nRelCol = aBkp.Ref1.nRelCol; + rRef.Ref1.SetColDeleted( aBkp.Ref1.IsColDeleted() ); } if ( !aBkp.Ref1.IsRowRel() ) { - t->aRef.Ref1.nRow = aBkp.Ref1.nRow; - t->aRef.Ref1.nRelRow = aBkp.Ref1.nRelRow; - t->aRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() ); + rRef.Ref1.nRow = aBkp.Ref1.nRow; + rRef.Ref1.nRelRow = aBkp.Ref1.nRelRow; + rRef.Ref1.SetRowDeleted( aBkp.Ref1.IsRowDeleted() ); } if ( !aBkp.Ref1.IsTabRel() ) { - t->aRef.Ref1.nTab = aBkp.Ref1.nTab; - t->aRef.Ref1.nRelTab = aBkp.Ref1.nRelTab; - t->aRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() ); + rRef.Ref1.nTab = aBkp.Ref1.nTab; + rRef.Ref1.nRelTab = aBkp.Ref1.nRelTab; + rRef.Ref1.SetTabDeleted( aBkp.Ref1.IsTabDeleted() ); } - if ( !aBkp.Ref2.IsColRel() ) - { - t->aRef.Ref2.nCol = aBkp.Ref2.nCol; - t->aRef.Ref2.nRelCol = aBkp.Ref2.nRelCol; - t->aRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() ); - } - if ( !aBkp.Ref2.IsRowRel() ) - { - t->aRef.Ref2.nRow = aBkp.Ref2.nRow; - t->aRef.Ref2.nRelRow = aBkp.Ref2.nRelRow; - t->aRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() ); - } - if ( !aBkp.Ref2.IsTabRel() ) + if ( t->GetType() == svDoubleRef ) { - t->aRef.Ref2.nTab = aBkp.Ref2.nTab; - t->aRef.Ref2.nRelTab = aBkp.Ref2.nRelTab; - t->aRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() ); + if ( !aBkp.Ref2.IsColRel() ) + { + rRef.Ref2.nCol = aBkp.Ref2.nCol; + rRef.Ref2.nRelCol = aBkp.Ref2.nRelCol; + rRef.Ref2.SetColDeleted( aBkp.Ref2.IsColDeleted() ); + } + if ( !aBkp.Ref2.IsRowRel() ) + { + rRef.Ref2.nRow = aBkp.Ref2.nRow; + rRef.Ref2.nRelRow = aBkp.Ref2.nRelRow; + rRef.Ref2.SetRowDeleted( aBkp.Ref2.IsRowDeleted() ); + } + if ( !aBkp.Ref2.IsTabRel() ) + { + rRef.Ref2.nTab = aBkp.Ref2.nTab; + rRef.Ref2.nRelTab = aBkp.Ref2.nRelTab; + rRef.Ref2.SetTabDeleted( aBkp.Ref2.IsTabDeleted() ); + } } } } @@ -2774,16 +2824,16 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName ) { if (!bIsName) { - ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex); + ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex()); if (pName && pName->HasType(RT_SHAREDMOD)) pRangeData = pName; } } else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!! { - if ( !(bIsName && t->aRef.Ref1.IsTabRel()) ) + if ( !(bIsName && t->GetSingleRef().IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref1; + SingleRefData& rRef = t->GetSingleRef(); if ( rRef.IsTabRel() ) nTab = rRef.nRelTab + nOldPosTab; else @@ -2791,19 +2841,14 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName ) if ( nTable <= nTab ) rRef.nTab = nTab + 1; rRef.nRelTab = rRef.nTab - nPosTab; - if( t->GetType() == svSingleRef ) - { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } } else bIsRel = TRUE; if ( t->GetType() == svDoubleRef ) { - if ( !(bIsName && t->aRef.Ref2.IsTabRel()) ) + if ( !(bIsName && t->GetDoubleRef().Ref2.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref2; + SingleRefData& rRef = t->GetDoubleRef().Ref2; if ( rRef.IsTabRel() ) nTab = rRef.nRelTab + nOldPosTab; else @@ -2831,34 +2876,29 @@ ScRangeData* ScCompiler::UpdateInsertTab( USHORT nTable, BOOL bIsName ) { if ( t->GetRef() == 1 ) { - if ( !(t->aRef.Ref1.IsRelName() && t->aRef.Ref1.IsTabRel()) ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( !(rRef1.IsRelName() && rRef1.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref1; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef1.IsTabRel() ) + nTab = rRef1.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef1.nTab; if ( nTable <= nTab ) - rRef.nTab = nTab + 1; - rRef.nRelTab = rRef.nTab - nPosTab; - if( t->GetType() == svSingleRef ) - { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } + rRef1.nTab = nTab + 1; + rRef1.nRelTab = rRef1.nTab - nPosTab; } if ( t->GetType() == svDoubleRef ) { - if ( !(t->aRef.Ref2.IsRelName() && t->aRef.Ref2.IsTabRel()) ) + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( !(rRef2.IsRelName() && rRef2.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref2; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef2.IsTabRel() ) + nTab = rRef2.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef2.nTab; if ( nTable <= nTab ) - rRef.nTab = nTab + 1; - rRef.nRelTab = rRef.nTab - nPosTab; + rRef2.nTab = nTab + 1; + rRef2.nRelTab = rRef2.nTab - nPosTab; } } } @@ -2888,7 +2928,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa { if (!bIsName) { - ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex); + ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex()); if (pName && pName->HasType(RT_SHAREDMOD)) pRangeData = pName; } @@ -2896,9 +2936,9 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa } else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!! { - if ( !(bIsName && t->aRef.Ref1.IsTabRel()) ) + if ( !(bIsName && t->GetSingleRef().IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref1; + SingleRefData& rRef = t->GetSingleRef(); if ( rRef.IsTabRel() ) nTab = rRef.nRelTab + nOldPosTab; else @@ -2912,10 +2952,11 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa { if ( t->GetType() == svDoubleRef ) { - if ( t->aRef.Ref2.IsTabRel() ) - nTab2 = t->aRef.Ref2.nRelTab + nOldPosTab; + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsTabRel() ) + nTab2 = rRef2.nRelTab + nOldPosTab; else - nTab2 = t->aRef.Ref2.nTab; + nTab2 = rRef2.nTab; if ( nTab == nTab2 || (nTab+1) >= pDoc->GetTableCount() ) { @@ -2933,19 +2974,14 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa rChanged = TRUE; } rRef.nRelTab = rRef.nTab - nPosTab; - if( t->GetType() == svSingleRef ) - { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } } else bIsRel = TRUE; if ( t->GetType() == svDoubleRef ) { - if ( !(bIsName && t->aRef.Ref2.IsTabRel()) ) + if ( !(bIsName && t->GetDoubleRef().Ref2.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref2; + SingleRefData& rRef = t->GetDoubleRef().Ref2; if ( rRef.IsTabRel() ) nTab = rRef.nRelTab + nOldPosTab; else @@ -2957,7 +2993,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa } else if ( nTable == nTab ) { - if ( !t->aRef.Ref1.IsTabDeleted() ) + if ( !t->GetDoubleRef().Ref1.IsTabDeleted() ) rRef.nTab = nTab - 1; // Bereich verkleinern else { @@ -2987,75 +3023,71 @@ ScRangeData* ScCompiler::UpdateDeleteTab(USHORT nTable, BOOL bIsMove, BOOL bIsNa { if ( t->GetRef() == 1 ) { - if ( !(t->aRef.Ref1.IsRelName() && t->aRef.Ref1.IsTabRel()) ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( !(rRef1.IsRelName() && rRef1.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref1; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef1.IsTabRel() ) + nTab = rRef1.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef1.nTab; if ( nTable < nTab ) { - rRef.nTab = nTab - 1; + rRef1.nTab = nTab - 1; rChanged = TRUE; } else if ( nTable == nTab ) { if ( t->GetType() == svDoubleRef ) { - if ( t->aRef.Ref2.IsTabRel() ) - nTab2 = t->aRef.Ref2.nRelTab + nOldPosTab; + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsTabRel() ) + nTab2 = rRef2.nRelTab + nOldPosTab; else - nTab2 = t->aRef.Ref2.nTab; + nTab2 = rRef2.nTab; if ( nTab == nTab2 || (nTab+1) >= pDoc->GetTableCount() ) { - rRef.nTab = MAXTAB+1; - rRef.SetTabDeleted( TRUE ); + rRef1.nTab = MAXTAB+1; + rRef1.SetTabDeleted( TRUE ); } // else: nTab zeigt spaeter auf jetziges nTable+1 // => Bereich verkleinert } else { - rRef.nTab = MAXTAB+1; - rRef.SetTabDeleted( TRUE ); + rRef1.nTab = MAXTAB+1; + rRef1.SetTabDeleted( TRUE ); } rChanged = TRUE; } - rRef.nRelTab = rRef.nTab - nPosTab; - if( t->GetType() == svSingleRef ) - { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } + rRef1.nRelTab = rRef1.nTab - nPosTab; } if ( t->GetType() == svDoubleRef ) { - if ( !(t->aRef.Ref2.IsRelName() && t->aRef.Ref2.IsTabRel()) ) + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( !(rRef2.IsRelName() && rRef2.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref2; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef2.IsTabRel() ) + nTab = rRef2.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef2.nTab; if ( nTable < nTab ) { - rRef.nTab = nTab - 1; + rRef2.nTab = nTab - 1; rChanged = TRUE; } else if ( nTable == nTab ) { - if ( !t->aRef.Ref1.IsTabDeleted() ) - rRef.nTab = nTab - 1; // Bereich verkleinern + if ( !rRef1.IsTabDeleted() ) + rRef2.nTab = nTab - 1; // Bereich verkleinern else { - rRef.nTab = MAXTAB+1; - rRef.SetTabDeleted( TRUE ); + rRef2.nTab = MAXTAB+1; + rRef2.SetTabDeleted( TRUE ); } rChanged = TRUE; } - rRef.nRelTab = rRef.nTab - nPosTab; + rRef2.nRelTab = rRef2.nTab - nPosTab; } } } @@ -3107,65 +3139,60 @@ ScRangeData* ScCompiler::UpdateMoveTab( USHORT nOldTab, USHORT nNewTab, { if (!bIsName) { - ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->nIndex); + ScRangeData* pName = pDoc->GetRangeName()->FindIndex(t->GetIndex()); if (pName && pName->HasType(RT_SHAREDMOD)) pRangeData = pName; } } else if( t->GetType() != svIndex ) // es kann ein DB-Bereich sein !!! { - if ( !(bIsName && t->aRef.Ref1.IsTabRel()) ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( !(bIsName && rRef1.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref1; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef1.IsTabRel() ) + nTab = rRef1.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef1.nTab; if ( nTab == nOldTab ) - rRef.nTab = nNewTab; + rRef1.nTab = nNewTab; else if ( nStart <= nTab && nTab <= nEnd ) - rRef.nTab = nTab + nDir; - rRef.nRelTab = rRef.nTab - nPosTab; - if( t->GetType() == svSingleRef ) - { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } + rRef1.nTab = nTab + nDir; + rRef1.nRelTab = rRef1.nTab - nPosTab; } else bIsRel = TRUE; if ( t->GetType() == svDoubleRef ) { - if ( !(bIsName && t->aRef.Ref2.IsTabRel()) ) + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( !(bIsName && rRef2.IsTabRel()) ) { // Namen nur absolute anpassen - SingleRefData& rRef = t->aRef.Ref2; - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef2.IsTabRel() ) + nTab = rRef2.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef2.nTab; if ( nTab == nOldTab ) - rRef.nTab = nNewTab; + rRef2.nTab = nNewTab; else if ( nStart <= nTab && nTab <= nEnd ) - rRef.nTab = nTab + nDir; - rRef.nRelTab = rRef.nTab - nPosTab; + rRef2.nTab = nTab + nDir; + rRef2.nRelTab = rRef2.nTab - nPosTab; } else bIsRel = TRUE; INT16 nTab1, nTab2; - if ( t->aRef.Ref1.IsTabRel() ) - nTab1 = t->aRef.Ref1.nRelTab + nPosTab; + if ( rRef1.IsTabRel() ) + nTab1 = rRef1.nRelTab + nPosTab; else - nTab1 = t->aRef.Ref1.nTab; - if ( t->aRef.Ref2.IsTabRel() ) - nTab2 = t->aRef.Ref2.nRelTab + nPosTab; + nTab1 = rRef1.nTab; + if ( rRef2.IsTabRel() ) + nTab2 = rRef2.nRelTab + nPosTab; else - nTab2 = t->aRef.Ref1.nTab; + nTab2 = rRef1.nTab; if ( nTab2 < nTab1 ) { // PutInOrder - t->aRef.Ref1.nTab = nTab2; - t->aRef.Ref2.nTab = nTab1; - t->aRef.Ref1.nRelTab = t->aRef.Ref1.nTab - nPosTab; - t->aRef.Ref2.nRelTab = t->aRef.Ref2.nTab - nPosTab; + rRef1.nTab = nTab2; + rRef2.nTab = nTab1; + rRef1.nRelTab = rRef1.nTab - nPosTab; + rRef2.nRelTab = rRef2.nTab - nPosTab; } } if ( bIsName && bIsRel ) @@ -3185,72 +3212,67 @@ ScRangeData* ScCompiler::UpdateMoveTab( USHORT nOldTab, USHORT nNewTab, { if ( t->GetRef() == 1 ) { - SingleRefData& rRef = t->aRef.Ref1; - if ( rRef.IsRelName() && rRef.IsTabRel() ) + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsRelName() && rRef1.IsTabRel() ) { // RelName evtl. wrappen, wie lcl_MoveItWrap in refupdat.cxx - nTab = rRef.nRelTab + nPosTab; + nTab = rRef1.nRelTab + nPosTab; if ( nTab < 0 ) nTab += nMaxTabMod; else if ( nTab > nMaxTab ) nTab -= nMaxTabMod; - rRef.nRelTab = nTab - nPosTab; + rRef1.nRelTab = nTab - nPosTab; } else { - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef1.IsTabRel() ) + nTab = rRef1.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef1.nTab; if ( nTab == nOldTab ) - rRef.nTab = nNewTab; + rRef1.nTab = nNewTab; else if ( nStart <= nTab && nTab <= nEnd ) - rRef.nTab = nTab + nDir; - rRef.nRelTab = rRef.nTab - nPosTab; + rRef1.nTab = nTab + nDir; + rRef1.nRelTab = rRef1.nTab - nPosTab; } - if( t->GetType() == svSingleRef ) + if( t->GetType() == svDoubleRef ) { - t->aRef.Ref2.nTab = rRef.nTab; - t->aRef.Ref2.nRelTab = rRef.nRelTab; - } - else // svDoubleRef - { - SingleRefData& rRef = t->aRef.Ref2; - if ( rRef.IsRelName() && rRef.IsTabRel() ) + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsRelName() && rRef2.IsTabRel() ) { // RelName evtl. wrappen, wie lcl_MoveItWrap in refupdat.cxx - nTab = rRef.nRelTab + nPosTab; + nTab = rRef2.nRelTab + nPosTab; if ( nTab < 0 ) nTab += nMaxTabMod; else if ( nTab > nMaxTab ) nTab -= nMaxTabMod; - rRef.nRelTab = nTab - nPosTab; + rRef2.nRelTab = nTab - nPosTab; } else { - if ( rRef.IsTabRel() ) - nTab = rRef.nRelTab + nOldPosTab; + if ( rRef2.IsTabRel() ) + nTab = rRef2.nRelTab + nOldPosTab; else - nTab = rRef.nTab; + nTab = rRef2.nTab; if ( nTab == nOldTab ) - rRef.nTab = nNewTab; + rRef2.nTab = nNewTab; else if ( nStart <= nTab && nTab <= nEnd ) - rRef.nTab = nTab + nDir; - rRef.nRelTab = rRef.nTab - nPosTab; + rRef2.nTab = nTab + nDir; + rRef2.nRelTab = rRef2.nTab - nPosTab; } INT16 nTab1, nTab2; - if ( t->aRef.Ref1.IsTabRel() ) - nTab1 = t->aRef.Ref1.nRelTab + nPosTab; + if ( rRef1.IsTabRel() ) + nTab1 = rRef1.nRelTab + nPosTab; else - nTab1 = t->aRef.Ref1.nTab; - if ( t->aRef.Ref2.IsTabRel() ) - nTab2 = t->aRef.Ref2.nRelTab + nPosTab; + nTab1 = rRef1.nTab; + if ( rRef2.IsTabRel() ) + nTab2 = rRef2.nRelTab + nPosTab; else - nTab2 = t->aRef.Ref1.nTab; + nTab2 = rRef1.nTab; if ( nTab2 < nTab1 ) { // PutInOrder - t->aRef.Ref1.nTab = nTab2; - t->aRef.Ref2.nTab = nTab1; - t->aRef.Ref1.nRelTab = t->aRef.Ref1.nTab - nPosTab; - t->aRef.Ref2.nRelTab = t->aRef.Ref2.nTab - nPosTab; + rRef1.nTab = nTab2; + rRef2.nTab = nTab1; + rRef1.nRelTab = rRef1.nTab - nPosTab; + rRef2.nRelTab = rRef2.nTab - nPosTab; } } } @@ -3281,7 +3303,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, rFormula += ' '; if( eOp == ocSpaces ) - rFormula.Expand( rFormula.Len() + t->cByte ); + rFormula.Expand( rFormula.Len() + t->GetByte() ); else if( eOp >= ocInternalBegin && eOp <= ocInternalEnd ) rFormula.AppendAscii( pInternal[ eOp - ocInternalBegin ] ); else if( (USHORT) eOp < nAnzStrings) // Keyword: @@ -3299,25 +3321,25 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, ULONG nIndex = ( pSymbolTable == pSymbolTableEnglish ? pDoc->GetFormatTable()->GetStandardIndex( LANGUAGE_ENGLISH_US ) : 0 ); pDoc->GetFormatTable()-> - GetInputLineString(t->nValue,nIndex,aStr); + GetInputLineString(t->GetDouble(),nIndex,aStr); rFormula += aStr; } break; case svString: if( eOp == ocBad ) - rFormula += t->cStr; + rFormula += t->GetString(); else { if (bImportXML) - rFormula += t->cStr; + rFormula += t->GetString(); else { rFormula += '"'; - if ( ScGlobal::UnicodeStrChr( t->cStr, '"' ) == NULL ) - rFormula += t->cStr; + if ( ScGlobal::UnicodeStrChr( t->GetString().GetBuffer(), '"' ) == NULL ) + rFormula += t->GetString(); else { - String aStr( t->cStr ); + String aStr( t->GetString() ); xub_StrLen nPos = 0; while ( (nPos = aStr.Search( '"', nPos)) != STRING_NOTFOUND ) { @@ -3331,9 +3353,12 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, } break; case svSingleRef: + { + SingleRefData& rRef = t->GetSingleRef(); + ComplRefData aRef; + aRef.Ref1 = aRef.Ref2 = rRef; if ( eOp == ocColRowName ) - { // hier kein t->GetReference() weil nicht ocPush oder ocColRowNameAuto - SingleRefData& rRef = t->aRef.Ref1; + { rRef.CalcAbsIfRel( aPos ); if ( pDoc->HasStringData( rRef.nCol, rRef.nRow, rRef.nTab ) ) { @@ -3345,16 +3370,17 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, else { rFormula += ScGlobal::GetRscString(STR_NO_NAME_REF); - rFormula += MakeRefStr( t->aRef, TRUE ); + rFormula += MakeRefStr( aRef, TRUE ); } } else { - rFormula += MakeRefStr( t->GetReference(), TRUE ); + rFormula += MakeRefStr( aRef, TRUE ); } + } break; case svDoubleRef: - rFormula += MakeRefStr( t->GetReference(), FALSE ); + rFormula += MakeRefStr( t->GetDoubleRef(), FALSE ); break; case svIndex: { @@ -3363,7 +3389,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, { case ocName: { - ScRangeData* pData = pDoc->GetRangeName()->FindIndex(t->nIndex); + ScRangeData* pData = pDoc->GetRangeName()->FindIndex(t->GetIndex()); if (pData) { if (pData->HasType(RT_SHARED)) @@ -3377,7 +3403,7 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, break; case ocDBArea: { - ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->nIndex); + ScDBData* pDBData = pDoc->GetDBCollection()->FindIndex(t->GetIndex()); if (pDBData) pDBData->GetName(aStr); } @@ -3390,14 +3416,13 @@ ScToken* ScCompiler::CreateStringFromToken( String& rFormula, ScToken* pToken, break; } case svExternal: - // Byte 0 ist Parameter-Count!! - { - // show translated name of StarOne AddIns - String aAddIn( t->cStr+1 ); - if ( pSymbolTable != pSymbolTableEnglish ) - ScGlobal::GetAddInCollection()->LocalizeString( aAddIn ); - rFormula += aAddIn; - } + { + // show translated name of StarOne AddIns + String aAddIn( t->GetExternal() ); + if ( pSymbolTable != pSymbolTableEnglish ) + ScGlobal::GetAddInCollection()->LocalizeString( aAddIn ); + rFormula += aAddIn; + } break; case svByte: case svJump: diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index cedfc36309a9..77a0eb6e0946 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -2,9 +2,9 @@ * * $RCSfile: interpr1.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: er $ $Date: 2001-01-10 18:48:10 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -123,19 +123,20 @@ BOOL ScInterpreter::bGlobalStackInUse = FALSE; void ScInterpreter::ScIfJump() { - short nJumpCount = pCur->nJump[ 0 ]; + const short* pJump = pCur->GetJump(); + short nJumpCount = pJump[ 0 ]; if ( GetBool() ) { // TRUE if( nJumpCount >= 2 ) { // then Zweig nFuncFmtType = NUMBERFORMAT_UNDEFINED; - aCode.Jump( pCur->nJump[ 1 ], pCur->nJump[ nJumpCount ] ); + aCode.Jump( pJump[ 1 ], pJump[ nJumpCount ] ); } else { // kein Parameter fuer then nFuncFmtType = NUMBERFORMAT_LOGICAL; PushInt(1); - aCode.Jump( pCur->nJump[ nJumpCount ], pCur->nJump[ nJumpCount ] ); + aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] ); } } else @@ -143,13 +144,13 @@ void ScInterpreter::ScIfJump() if( nJumpCount == 3 ) { // else Zweig nFuncFmtType = NUMBERFORMAT_UNDEFINED; - aCode.Jump( pCur->nJump[ 2 ], pCur->nJump[ nJumpCount ] ); + aCode.Jump( pJump[ 2 ], pJump[ nJumpCount ] ); } else { // kein Parameter fuer else nFuncFmtType = NUMBERFORMAT_LOGICAL; PushInt(0); - aCode.Jump( pCur->nJump[ nJumpCount ], pCur->nJump[ nJumpCount ] ); + aCode.Jump( pJump[ nJumpCount ], pJump[ nJumpCount ] ); } } } @@ -157,10 +158,11 @@ void ScInterpreter::ScIfJump() void ScInterpreter::ScChoseJump() { - short nJumpCount = pCur->nJump[ 0 ]; + const short* pJump = pCur->GetJump(); + short nJumpCount = pJump[ 0 ]; double nJumpIndex = SolarMath::ApproxFloor( GetDouble() ); if ((nJumpIndex >= 1) && (nJumpIndex < nJumpCount)) - aCode.Jump( pCur->nJump[ (short) nJumpIndex ], pCur->nJump[ nJumpCount ] ); + aCode.Jump( pJump[ (short) nJumpIndex ], pJump[ nJumpCount ] ); else SetError(errIllegalArgument); } @@ -1224,7 +1226,7 @@ void ScInterpreter::ScFormula() Pop(); SetError( NOVALUE ); } - PushStringObject( aFormula ); + PushString( aFormula ); } @@ -1419,7 +1421,7 @@ void ScInterpreter::ScTrim() aStr += *p; p++; } - PushStringObject( aStr ); + PushString( aStr ); } @@ -1427,7 +1429,7 @@ void ScInterpreter::ScUpper() { String aString = GetString(); ScGlobal::pCharClass->toUpper(aString); - PushStringObject(aString); + PushString(aString); } @@ -1454,15 +1456,15 @@ void ScInterpreter::ScPropper() nPos++; } aStr.ReleaseBufferAccess( nLen ); - PushStringObject( aStr ); + PushString( aStr ); } void ScInterpreter::ScLower() { - String aString = GetString(); + String aString( GetString() ); ScGlobal::pCharClass->toLower(aString); - PushStringObject(aString); + PushString(aString); } @@ -1501,19 +1503,19 @@ void ScInterpreter::ScT() } } if ( bValue ) - PushString( NULL ); + PushString( EMPTY_STRING ); else { // wie GetString() GetCellString( aTempStr, pCell ); - PushString( aTempStr.GetBuffer() ); + PushString( aTempStr ); } } break; case svDouble : { PopError(); - PushString( NULL ); + PushString( EMPTY_STRING ); } break; case svString : @@ -1552,15 +1554,15 @@ void ScInterpreter::ScClean() if ( !lcl_ScInterpreter_IsPrintable( aStr.GetChar( i ) ) ) aStr.Erase(i,1); } - PushStringObject(aStr); + PushString(aStr); } void ScInterpreter::ScCode() { //2do: make it full range unicode? - const sal_Unicode* pStr = GetString(); - PushInt( (sal_uChar) ByteString::ConvertFromUnicode( pStr[0], gsl_getSystemTextEncoding() ) ); + const String& rStr = GetString(); + PushInt( (sal_uChar) ByteString::ConvertFromUnicode( rStr.GetChar(0), gsl_getSystemTextEncoding() ) ); } @@ -1572,10 +1574,9 @@ void ScInterpreter::ScChar() SetIllegalArgument(); else { - sal_Unicode cs[2]; - cs[0] = ByteString::ConvertToUnicode( (sal_Char) fVal, gsl_getSystemTextEncoding() ); - cs[1] = 0; - PushString(cs); + String aStr( '0' ); + aStr.SetChar( 0, ByteString::ConvertToUnicode( (sal_Char) fVal, gsl_getSystemTextEncoding() ) ); + PushString( aStr ); } } @@ -3370,7 +3371,7 @@ void ScInterpreter::ScLookup() if (pMat3->IsValue(nDelta)) PushDouble(pMat3->GetDouble(nDelta)); else - PushStringObject(pMat3->GetString(nDelta)); + PushString(pMat3->GetString(nDelta)); } else { @@ -3393,7 +3394,7 @@ void ScInterpreter::ScLookup() { String aStr; GetCellString(aStr, pCell); - PushStringObject(aStr); + PushString(aStr); } } } @@ -3551,14 +3552,14 @@ void ScInterpreter::ScLookup() if (bSpMatrix) { if (pMat1->IsString(nDelta, nR1-1)) - PushStringObject(pMat1->GetString(nDelta, nR1-1)); + PushString(pMat1->GetString(nDelta, nR1-1)); else PushDouble(pMat1->GetDouble(nDelta, nR1-1)); } else { if (pMat1->IsString(nC1-1, nDelta)) - PushStringObject(pMat1->GetString(nC1-1, nDelta)); + PushString(pMat1->GetString(nC1-1, nDelta)); else PushDouble(pMat1->GetDouble(nC1-1, nDelta)); } @@ -3767,7 +3768,7 @@ void ScInterpreter::ScHLookup() if (!pMat->IsString(nDelta, nZIndex)) PushDouble(pMat->GetDouble(nDelta, nZIndex)); else - PushStringObject(pMat->GetString(nDelta, nZIndex)); + PushString(pMat->GetString(nDelta, nZIndex)); } else SetNV(); @@ -3795,7 +3796,7 @@ void ScInterpreter::ScHLookup() { String aStr; GetCellString(aStr, pCell); - PushStringObject(aStr); + PushString(aStr); } } else @@ -4009,7 +4010,7 @@ void ScInterpreter::ScVLookup() if (!pMat->IsString(nSpIndex, nDelta)) PushDouble(pMat->GetDouble(nSpIndex, nDelta)); else - PushStringObject(pMat->GetString(nSpIndex, nDelta)); + PushString(pMat->GetString(nSpIndex, nDelta)); } else SetNV(); @@ -4035,7 +4036,7 @@ void ScInterpreter::ScVLookup() { String aStr; GetCellString(aStr, pCell); - PushStringObject(aStr); + PushString(aStr); } } else @@ -4415,12 +4416,10 @@ void ScInterpreter::ScAdress() BYTE nParamCount = GetByte(); if ( MustHaveParamCount( nParamCount, 2, 4 ) ) { - const sal_Unicode* sTabStr; + String sTabStr; USHORT nAbs = 1; if (nParamCount == 4) sTabStr = GetString(); - else - sTabStr = NULL; if (nParamCount >= 3) nAbs = (USHORT) SolarMath::ApproxFloor(GetDouble()); USHORT nCol = (USHORT) SolarMath::ApproxFloor(GetDouble()); @@ -4449,12 +4448,12 @@ void ScInterpreter::ScAdress() else if (nAbs == 3) aRefStr.Erase(aRefStr.Search('$',1),1); } - if (sTabStr != NULL) + if ( sTabStr.Len() ) { aRefStr.Insert('.',0); aRefStr.Insert(sTabStr,0); } - PushStringObject(aRefStr); + PushString(aRefStr); } } @@ -4614,7 +4613,7 @@ void ScInterpreter::ScIndex() if (!pMat->IsString(nCol-1, nRow-1)) PushDouble(pMat->GetDouble(nCol-1, nRow-1)); else - PushStringObject(pMat->GetString(nCol-1, nRow-1)); + PushString(pMat->GetString(nCol-1, nRow-1)); } ResetNewMat(nMatInd1); } @@ -4743,7 +4742,7 @@ void ScInterpreter::ScCurrency() BYTE nParamCount = GetByte(); if ( MustHaveParamCount( nParamCount, 1, 2 ) ) { - String cStr; + String aStr; double fDec; if (nParamCount == 2) { @@ -4784,16 +4783,16 @@ void ScInterpreter::ScCurrency() 1); // 1 Vorkommanull if (!pFormatter->GetPreviewString(sFormatString, fVal, - cStr, + aStr, &pColor, ScGlobal::eLnge)) SetError(errIllegalParameter); } else { - pFormatter->GetOutputString(fVal, nIndex, cStr, &pColor); + pFormatter->GetOutputString(fVal, nIndex, aStr, &pColor); } - PushStringObject(cStr); + PushString(aStr); } } @@ -4811,13 +4810,9 @@ void ScInterpreter::ScReplace() else { aOldStr.Erase( nPos-1, nCount ); - aOldStr.Insert( aNewStr, nPos-1 ); - if( aOldStr.Len() >= MAXSTRLEN ) - { - SetError(errStringOverflow); - aOldStr.Erase(); - } - PushStringObject( aOldStr ); + if ( CheckStringResultLen( aOldStr, aNewStr ) ) + aOldStr.Insert( aNewStr, nPos-1 ); + PushString( aOldStr ); } } } @@ -4828,7 +4823,7 @@ void ScInterpreter::ScFixed() BYTE nParamCount = GetByte(); if ( MustHaveParamCount( nParamCount, 1, 3 ) ) { - String cStr; + String aStr; double fDec; BOOL bThousand; if (nParamCount == 3) @@ -4872,12 +4867,12 @@ void ScInterpreter::ScFixed() 1); // 1 Vorkommanull if (!pFormatter->GetPreviewString(sFormatString, fVal, - cStr, + aStr, &pColor, ScGlobal::eLnge)) SetIllegalParameter(); else - PushStringObject(cStr); + PushString(aStr); } } @@ -4928,7 +4923,7 @@ void ScInterpreter::ScLeft() if (nParamCount == 2) { double nVal = SolarMath::ApproxFloor(GetDouble()); - if (nVal < 0.0 || nVal > MAXSTRLEN) + if ( nVal < 0.0 || nVal > STRING_MAXLEN ) { SetIllegalParameter(); return ; @@ -4940,7 +4935,7 @@ void ScInterpreter::ScLeft() n = 1; String aStr( GetString() ); aStr.Erase( n ); - PushStringObject( aStr ); + PushString( aStr ); } } @@ -4954,7 +4949,7 @@ void ScInterpreter::ScRight() if (nParamCount == 2) { double nVal = SolarMath::ApproxFloor(GetDouble()); - if (nVal < 0.0 || nVal > MAXSTRLEN) + if ( nVal < 0.0 || nVal > STRING_MAXLEN ) { SetIllegalParameter(); return ; @@ -4967,7 +4962,7 @@ void ScInterpreter::ScRight() String aStr( GetString() ); if( n < aStr.Len() ) aStr.Erase( 0, aStr.Len() - n ); - PushStringObject( aStr ); + PushString( aStr ); } } @@ -5015,11 +5010,11 @@ void ScInterpreter::ScMid() { double fAnz = SolarMath::ApproxFloor(GetDouble()); double fAnfang = SolarMath::ApproxFloor(GetDouble()); - String sStr = GetString(); + const String& rStr = GetString(); if (fAnfang < 1.0 || fAnz < 0.0 || fAnfang > double(STRING_MAXLEN) || fAnz > double(STRING_MAXLEN)) SetIllegalParameter(); else - PushStringObject(sStr.Copy( (xub_StrLen) fAnfang - 1, (xub_StrLen) fAnz )); + PushString(rStr.Copy( (xub_StrLen) fAnfang - 1, (xub_StrLen) fAnz )); } } @@ -5030,7 +5025,7 @@ void ScInterpreter::ScText() { String sFormatString = GetString(); double fVal = GetDouble(); - String cStr; + String aStr; Color* pColor = NULL; LanguageType eCellLang; const ScPatternAttr* pPattern = pDok->GetPattern( @@ -5040,11 +5035,11 @@ void ScInterpreter::ScText() pPattern->GetItem( ATTR_LANGUAGE_FORMAT )).GetValue(); else eCellLang = ScGlobal::eLnge; - if ( !pFormatter->GetPreviewStringGuess( sFormatString, fVal, cStr, + if ( !pFormatter->GetPreviewStringGuess( sFormatString, fVal, aStr, &pColor, eCellLang ) ) SetIllegalParameter(); else - PushStringObject(cStr); + PushString(aStr); } } @@ -5058,7 +5053,7 @@ void ScInterpreter::ScSubstitute() if (nParamCount == 4) { double fAnz = SolarMath::ApproxFloor(GetDouble()); - if( fAnz < 1 || fAnz > MAXSTRLEN ) + if( fAnz < 1 || fAnz > STRING_MAXLEN ) { SetIllegalParameter(); return; @@ -5084,9 +5079,12 @@ void ScInterpreter::ScSubstitute() if( !nAnz || nCount == nAnz ) { sStr.Erase(nPos,nOldLen); - sStr.Insert(sNewStr,nPos); - nPos += nNewLen; - if( sStr.Len() >= MAXSTRLEN ) + if ( CheckStringResultLen( sStr, sNewStr ) ) + { + sStr.Insert(sNewStr,nPos); + nPos += nNewLen; + } + else break; } else @@ -5095,7 +5093,7 @@ void ScInterpreter::ScSubstitute() else break; } - PushStringObject( sStr ); + PushString( sStr ); } } @@ -5105,23 +5103,29 @@ void ScInterpreter::ScRept() if ( MustHaveParamCount( GetByte(), 2 ) ) { double fAnz = SolarMath::ApproxFloor(GetDouble()); + String aStr( GetString() ); if ( fAnz < 0.0 ) SetIllegalParameter(); - else if ( fAnz > MAXSTRLEN ) + else if ( fAnz * aStr.Len() > STRING_MAXLEN ) { SetError( errStringOverflow ); PushInt(0); } else if ( fAnz == 0.0 ) - PushString( NULL ); + PushString( EMPTY_STRING ); else { - short n = (short) fAnz; + xub_StrLen n = (xub_StrLen) fAnz; + const xub_StrLen nLen = aStr.Len(); String aRes; - String aStr( GetString() ); + const sal_Unicode* const pSrc = aStr.GetBuffer(); + sal_Unicode* pDst = aRes.AllocBuffer( n * nLen ); while( n-- ) - aRes += aStr; - PushStringObject( aRes ); + { + memcpy( pDst, pSrc, nLen * sizeof(sal_Unicode) ); + pDst += nLen; + } + PushString( aRes ); } } } @@ -5133,10 +5137,10 @@ void ScInterpreter::ScConcat() String aRes; while( nParamCount-- ) { - const sal_Unicode* p = GetString(); - aRes.Insert( p, 0 ); + const String& rStr = GetString(); + aRes.Insert( rStr, 0 ); } - PushStringObject( aRes ); + PushString( aRes ); } diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index 175120ed8f89..48942e34ba20 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -2,9 +2,9 @@ * * $RCSfile: interpr2.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: nn $ $Date: 2000-10-31 17:43:04 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -1577,9 +1577,9 @@ void ScInterpreter::ScCurrent() break; case svString : { - const sal_Unicode* pStr = PopString(); - PushString( pStr ); - PushString( pStr ); + const String& rStr = PopString(); + PushString( rStr ); + PushString( rStr ); } break; case svDoubleRef : @@ -1605,8 +1605,8 @@ void ScInterpreter::ScCurrent() { String aStr; GetCellString( aStr, pCell ); - PushStringObject( aStr ); - PushStringObject( aStr ); + PushString( aStr ); + PushString( aStr ); } } else @@ -1794,11 +1794,12 @@ void ScInterpreter::ScBase() 0 }; static const int nDigits = (sizeof(pDigits)/sizeof(sal_Unicode))-1; + const size_t nBuf = 384; USHORT nMinLen; if ( nParamCount == 3 ) { double fLen = SolarMath::ApproxFloor( GetDouble() ); - if ( 1 <= fLen && fLen < MAXSTRLEN ) + if ( 1 <= fLen && fLen < nBuf-1 ) nMinLen = (USHORT) fLen; else nMinLen = 0; // Error @@ -1810,12 +1811,8 @@ void ScInterpreter::ScBase() if ( !nGlobalError && nMinLen && 2 <= fBase && fBase <= nDigits && 0 <= fVal ) { - const size_t nBuf = MAXSTRLEN+1; sal_Unicode pBuf[nBuf]; - for ( size_t j=0; j<nBuf; j++ ) - { - pBuf[j] = '0'; - } + memset( pBuf, '0', nBuf ); sal_Unicode* p = pBuf + nBuf - 1; *p = 0; if ( fVal <= (ULONG)(~0) ) @@ -1889,7 +1886,7 @@ void ScInterpreter::ScBase() { if ( nBuf - (p - pBuf) <= nMinLen ) p = pBuf + nBuf - 1 - nMinLen; - PushString( p ); + PushStringBuffer( p ); } } else diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 7837b0623610..c816935bedde 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -2,9 +2,9 @@ * * $RCSfile: interpr4.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: er $ $Date: 2001-02-13 19:01:55 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -139,8 +139,6 @@ extern BOOL bOderSo; // in GLOBAL.CXX //-----------------------------statische Daten----------------- -const sal_Unicode ScInterpreter::cEmptyString = 0; - USHORT ScInterpreter::nGlobalError = 0; // fuer matherr #if SOMA_FPSIGNAL_JUMP @@ -453,24 +451,10 @@ void ScInterpreter::GetCellString( String& rStr, const ScBaseCell* pCell ) switch (pCell->GetCellType()) { case CELLTYPE_STRING: - { ((ScStringCell*) pCell)->GetString(rStr); - if (rStr.Len() >= MAXSTRLEN) - { - rStr.Erase(); - nErr = errStringOverflow; - } - } break; case CELLTYPE_EDIT: - { ((ScEditCell*) pCell)->GetString(rStr); - if (rStr.Len() >= MAXSTRLEN) - { - rStr.Erase(); - nErr = errStringOverflow; - } - } break; case CELLTYPE_FORMULA: { @@ -859,11 +843,11 @@ void ScInterpreter::PushTempToken( const ScToken& r ) } -//! Nur fuer PushDouble/PushInt! -//! Das Token wurde per new angelegt und darf nach diesem Aufruf wg. -//! eventuellem delete bei errStackOverflow nicht mehr benutzt werden, falls -//! nicht ein RefCount gesetzt wurde! -void ScInterpreter::PushTempToken( ScDoubleToken* p ) +//! Only for PushDouble/PushInt! +//! The Token had to be allocated with `new' and must not be used after this +//! call because eventually it gets deleted in case of a errStackOverflow if +//! no RefCount was set! +void ScInterpreter::PushTempToken( ScToken* p ) { ((ScToken*)p)->IncRef(); if ( sp >= MAXSTACK ) @@ -895,12 +879,12 @@ double ScInterpreter::PopDouble() if ( !nGlobalError ) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svDouble ) - return p->nValue; + return p->GetDouble(); else if( p->GetType() == svMissing ) - return 0; + return 0.0; } SetError(errUnknownStackVariable); - return 0; + return 0.0; } @@ -913,7 +897,7 @@ BYTE ScInterpreter::PopByte() if ( !nGlobalError ) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svByte ) - return p->cByte; + return p->GetByte(); else if( p->GetType() == svMissing ) SetError( errIllegalParameter ); } @@ -922,7 +906,7 @@ BYTE ScInterpreter::PopByte() } -const sal_Unicode* ScInterpreter::PopString() +const String& ScInterpreter::PopString() { nCurFmtType = NUMBERFORMAT_TEXT; nCurFmtIndex = 0; @@ -933,12 +917,12 @@ const sal_Unicode* ScInterpreter::PopString() if ( !nGlobalError ) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svString ) - return p->cStr; + return p->GetString(); else if( p->GetType() == svMissing ) - return &cEmptyString; + return EMPTY_STRING; } SetError(errUnknownStackVariable); - return &cEmptyString; + return EMPTY_STRING; } @@ -952,24 +936,24 @@ void ScInterpreter::PopSingleRef(USHORT& rCol, USHORT &rRow, USHORT& rTab) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svSingleRef ) { - const SingleRefData& aRef = p->aRef.Ref1; - if ( aRef.IsColRel() ) - rCol = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = p->GetSingleRef(); + if ( rRef.IsColRel() ) + rCol = aPos.Col() + rRef.nRelCol; else - rCol = aRef.nCol; - if ( aRef.IsRowRel() ) - rRow = aPos.Row() + aRef.nRelRow; + rCol = rRef.nCol; + if ( rRef.IsRowRel() ) + rRow = aPos.Row() + rRef.nRelRow; else - rRow = aRef.nRow; - if ( aRef.IsTabRel() ) - rTab = aPos.Tab() + aRef.nRelTab; + rRow = rRef.nRow; + if ( rRef.IsTabRel() ) + rTab = aPos.Tab() + rRef.nRelTab; else - rTab = aRef.nTab; - if( rCol < 0 || rCol > MAXCOL || aRef.IsColDeleted() ) + rTab = rRef.nTab; + if( rCol < 0 || rCol > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), rCol = 0; - if( rRow < 0 || rRow > MAXROW || aRef.IsRowDeleted() ) + if( rRow < 0 || rRow > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), rRow = 0; - if( rTab < 0 || rTab >= pDok->GetTableCount() || aRef.IsTabDeleted() ) + if( rTab < 0 || rTab >= pDok->GetTableCount() || rRef.IsTabDeleted() ) SetError( errNoRef ), rTab = 0; if ( aTableOpList.Count() > 0 ) ReplaceCell( rCol, rRow, rTab ); @@ -993,24 +977,24 @@ void ScInterpreter::PopSingleRef( ScAddress& rAdr ) if( p->GetType() == svSingleRef ) { short nCol, nRow, nTab; - const SingleRefData& aRef = p->aRef.Ref1; - if ( aRef.IsColRel() ) - nCol = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = p->GetSingleRef(); + if ( rRef.IsColRel() ) + nCol = aPos.Col() + rRef.nRelCol; else - nCol = aRef.nCol; - if ( aRef.IsRowRel() ) - nRow = aPos.Row() + aRef.nRelRow; + nCol = rRef.nCol; + if ( rRef.IsRowRel() ) + nRow = aPos.Row() + rRef.nRelRow; else - nRow = aRef.nRow; - if ( aRef.IsTabRel() ) - nTab = aPos.Tab() + aRef.nRelTab; + nRow = rRef.nRow; + if ( rRef.IsTabRel() ) + nTab = aPos.Tab() + rRef.nRelTab; else - nTab = aRef.nTab; - if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() ) + nTab = rRef.nTab; + if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), nCol = 0; - if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() ) + if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), nRow = 0; - if( nTab < 0 || nTab >= pDok->GetTableCount() || aRef.IsTabDeleted() ) + if( nTab < 0 || nTab >= pDok->GetTableCount() || rRef.IsTabDeleted() ) SetError( errNoRef ), nTab = 0; rAdr.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab ); if ( aTableOpList.Count() > 0 ) @@ -1036,47 +1020,48 @@ void ScInterpreter::PopDoubleRef(USHORT& rCol1, USHORT &rRow1, USHORT& rTab1, nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svDoubleRef ) { + const ComplRefData& rCRef = p->GetDoubleRef(); USHORT nMaxTab = pDok->GetTableCount(); { - const SingleRefData& aRef = p->aRef.Ref1; - if ( aRef.IsColRel() ) - rCol1 = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = rCRef.Ref1; + if ( rRef.IsColRel() ) + rCol1 = aPos.Col() + rRef.nRelCol; else - rCol1 = aRef.nCol; - if ( aRef.IsRowRel() ) - rRow1 = aPos.Row() + aRef.nRelRow; + rCol1 = rRef.nCol; + if ( rRef.IsRowRel() ) + rRow1 = aPos.Row() + rRef.nRelRow; else - rRow1 = aRef.nRow; - if ( aRef.IsTabRel() ) - rTab1 = aPos.Tab() + aRef.nRelTab; + rRow1 = rRef.nRow; + if ( rRef.IsTabRel() ) + rTab1 = aPos.Tab() + rRef.nRelTab; else - rTab1 = aRef.nTab; - if( rCol1 < 0 || rCol1 > MAXCOL || aRef.IsColDeleted() ) + rTab1 = rRef.nTab; + if( rCol1 < 0 || rCol1 > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), rCol1 = 0; - if( rRow1 < 0 || rRow1 > MAXROW || aRef.IsRowDeleted() ) + if( rRow1 < 0 || rRow1 > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), rRow1 = 0; - if( rTab1 < 0 || rTab1 >= nMaxTab || aRef.IsTabDeleted() ) + if( rTab1 < 0 || rTab1 >= nMaxTab || rRef.IsTabDeleted() ) SetError( errNoRef ), rTab1 = 0; } { - const SingleRefData& aRef = p->aRef.Ref2; - if ( aRef.IsColRel() ) - rCol2 = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = rCRef.Ref2; + if ( rRef.IsColRel() ) + rCol2 = aPos.Col() + rRef.nRelCol; else - rCol2 = aRef.nCol; - if ( aRef.IsRowRel() ) - rRow2 = aPos.Row() + aRef.nRelRow; + rCol2 = rRef.nCol; + if ( rRef.IsRowRel() ) + rRow2 = aPos.Row() + rRef.nRelRow; else - rRow2 = aRef.nRow; - if ( aRef.IsTabRel() ) - rTab2 = aPos.Tab() + aRef.nRelTab; + rRow2 = rRef.nRow; + if ( rRef.IsTabRel() ) + rTab2 = aPos.Tab() + rRef.nRelTab; else - rTab2 = aRef.nTab; - if( rCol2 < 0 || rCol2 > MAXCOL || aRef.IsColDeleted() ) + rTab2 = rRef.nTab; + if( rCol2 < 0 || rCol2 > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), rCol2 = 0; - if( rRow2 < 0 || rRow2 > MAXROW || aRef.IsRowDeleted() ) + if( rRow2 < 0 || rRow2 > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), rRow2 = 0; - if( rTab2 < 0 || rTab2 >= nMaxTab || aRef.IsTabDeleted() ) + if( rTab2 < 0 || rTab2 >= nMaxTab || rRef.IsTabDeleted() ) SetError( errNoRef ), rTab2 = 0; } if ( aTableOpList.Count() > 0 && !bDontCheckForTableOp ) @@ -1104,49 +1089,50 @@ void ScInterpreter::PopDoubleRef( ScRange& rRange, BOOL bDontCheckForTableOp ) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svDoubleRef ) { + const ComplRefData& rCRef = p->GetDoubleRef(); short nCol, nRow, nTab; USHORT nMaxTab = pDok->GetTableCount(); { - const SingleRefData& aRef = p->aRef.Ref1; - if ( aRef.IsColRel() ) - nCol = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = rCRef.Ref1; + if ( rRef.IsColRel() ) + nCol = aPos.Col() + rRef.nRelCol; else - nCol = aRef.nCol; - if ( aRef.IsRowRel() ) - nRow = aPos.Row() + aRef.nRelRow; + nCol = rRef.nCol; + if ( rRef.IsRowRel() ) + nRow = aPos.Row() + rRef.nRelRow; else - nRow = aRef.nRow; - if ( aRef.IsTabRel() ) - nTab = aPos.Tab() + aRef.nRelTab; + nRow = rRef.nRow; + if ( rRef.IsTabRel() ) + nTab = aPos.Tab() + rRef.nRelTab; else - nTab = aRef.nTab; - if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() ) + nTab = rRef.nTab; + if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), nCol = 0; - if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() ) + if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), nRow = 0; - if( nTab < 0 || nTab >= nMaxTab || aRef.IsTabDeleted() ) + if( nTab < 0 || nTab >= nMaxTab || rRef.IsTabDeleted() ) SetError( errNoRef ), nTab = 0; rRange.aStart.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab ); } { - const SingleRefData& aRef = p->aRef.Ref2; - if ( aRef.IsColRel() ) - nCol = aPos.Col() + aRef.nRelCol; + const SingleRefData& rRef = rCRef.Ref2; + if ( rRef.IsColRel() ) + nCol = aPos.Col() + rRef.nRelCol; else - nCol = aRef.nCol; - if ( aRef.IsRowRel() ) - nRow = aPos.Row() + aRef.nRelRow; + nCol = rRef.nCol; + if ( rRef.IsRowRel() ) + nRow = aPos.Row() + rRef.nRelRow; else - nRow = aRef.nRow; - if ( aRef.IsTabRel() ) - nTab = aPos.Tab() + aRef.nRelTab; + nRow = rRef.nRow; + if ( rRef.IsTabRel() ) + nTab = aPos.Tab() + rRef.nRelTab; else - nTab = aRef.nTab; - if( nCol < 0 || nCol > MAXCOL || aRef.IsColDeleted() ) + nTab = rRef.nTab; + if( nCol < 0 || nCol > MAXCOL || rRef.IsColDeleted() ) SetError( errNoRef ), nCol = 0; - if( nRow < 0 || nRow > MAXROW || aRef.IsRowDeleted() ) + if( nRow < 0 || nRow > MAXROW || rRef.IsRowDeleted() ) SetError( errNoRef ), nRow = 0; - if( nTab < 0 || nTab >= nMaxTab || aRef.IsTabDeleted() ) + if( nTab < 0 || nTab >= nMaxTab || rRef.IsTabDeleted() ) SetError( errNoRef ), nTab = 0; rRange.aEnd.Set( (USHORT)nCol, (USHORT)nRow, (USHORT)nTab ); } @@ -1217,7 +1203,7 @@ ScMatrix* ScInterpreter::PopMatrix() if ( !nGlobalError ) nGlobalError = pErrorStack[ sp ]; if( p->GetType() == svMatrix ) - return p->pMat; + return p->GetMatrix(); else if( p->GetType() == svMissing ) SetError( errIllegalParameter ); } @@ -1236,59 +1222,45 @@ void ScInterpreter::PushDouble(double nVal) SetError(errIllegalFPOperation); } #endif - ScDoubleToken* pToken = new ScDoubleToken; - ((ScToken*)pToken)->SetDouble( nVal ); - ((ScToken*)pToken)->bRaw = FALSE; - PushTempToken( pToken ); + PushTempToken( new ScDoubleToken( nVal ) ); } void ScInterpreter::PushInt(int nVal) { - ScDoubleToken* pToken = new ScDoubleToken; - ((ScToken*)pToken)->SetInt( nVal ); - ((ScToken*)pToken)->bRaw = FALSE; - PushTempToken( pToken ); + PushTempToken( new ScDoubleToken( nVal ) ); } -void ScInterpreter::PushString( const sal_Unicode* cString ) +void ScInterpreter::PushStringBuffer( const sal_Unicode* pString ) { - ScToken aToken; - aToken.SetString( cString ); - PushTempToken( aToken ); + if ( pString ) + PushString( String( pString ) ); + else + PushString( EMPTY_STRING ); } -void ScInterpreter::PushStringObject(const String& aString) +void ScInterpreter::PushString( const String& rString ) { - if( aString.Len() >= MAXSTRLEN ) - { - SetError( errStringOverflow ); - PushString( NULL ); - } - else - PushString( aString.GetBuffer() ); + PushTempToken( new ScStringToken( rString ) ); } void ScInterpreter::PushSingleRef(USHORT nCol, USHORT nRow, USHORT nTab) { - ScToken aToken; SingleRefData aRef; aRef.InitFlags(); aRef.nCol = nCol; aRef.nRow = nRow; aRef.nTab = nTab; - aToken.SetSingleReference( aRef ); - PushTempToken( aToken ); + PushTempToken( new ScSingleRefToken( aRef ) ); } void ScInterpreter::PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1, USHORT nCol2, USHORT nRow2, USHORT nTab2) { - ScToken aToken; ComplRefData aRef; aRef.InitFlags(); aRef.Ref1.nCol = nCol1; @@ -1297,16 +1269,13 @@ void ScInterpreter::PushDoubleRef(USHORT nCol1, USHORT nRow1, USHORT nTab1, aRef.Ref2.nCol = nCol2; aRef.Ref2.nRow = nRow2; aRef.Ref2.nTab = nTab2; - aToken.SetDoubleReference( aRef ); - PushTempToken( aToken ); + PushTempToken( new ScDoubleRefToken( aRef ) ); } void ScInterpreter::PushMatrix(ScMatrix* pMat) { - ScToken aToken; - aToken.SetMatrix( pMat ); - PushTempToken( aToken ); + PushTempToken( new ScMatrixToken( pMat ) ); } @@ -1451,16 +1420,16 @@ double ScInterpreter::GetDouble() SetError(errIllegalArgument); nVal = 0.0; } - break; } + break; case svSingleRef: { ScAddress aAdr; PopSingleRef( aAdr ); ScBaseCell* pCell = GetCell( aAdr ); nVal = GetCellValue( aAdr, pCell ); - break; } + break; case svDoubleRef: { // positionsabhaengige SingleRef generieren ScRange aRange; @@ -1486,9 +1455,8 @@ double ScInterpreter::GetDouble() } -const sal_Unicode* ScInterpreter::GetString() +const String& ScInterpreter::GetString() { - const sal_Unicode* p; StackVar eRes = (StackVar) GetStackType(); if( eRes == svDouble && pStack[ sp-1 ]->GetType() == svMissing ) eRes = svString; @@ -1501,11 +1469,12 @@ const sal_Unicode* ScInterpreter::GetString() NUMBERFORMAT_NUMBER, ScGlobal::eLnge); pFormatter->GetInputLineString(fVal, nIndex, aTempStr); - p = aTempStr.GetBuffer(); - break; + return aTempStr; } + break; case svString: - p = PopString(); break; + return PopString(); + break; case svSingleRef: { ScAddress aAdr; @@ -1514,12 +1483,12 @@ const sal_Unicode* ScInterpreter::GetString() { ScBaseCell* pCell = GetCell( aAdr ); GetCellString( aTempStr, pCell ); - p = aTempStr.GetBuffer(); + return aTempStr; } else - p = &cEmptyString; - break; + return EMPTY_STRING; } + break; case svDoubleRef: { // positionsabhaengige SingleRef generieren ScRange aRange; @@ -1529,18 +1498,17 @@ const sal_Unicode* ScInterpreter::GetString() { ScBaseCell* pCell = GetCell( aAdr ); GetCellString( aTempStr, pCell ); - p = aTempStr.GetBuffer(); + return aTempStr; } else - p = &cEmptyString; + return EMPTY_STRING; } break; default: Pop(); SetError(errIllegalParameter); - p = &cEmptyString; } - return p; + return EMPTY_STRING; } @@ -1576,14 +1544,14 @@ void ScInterpreter::ScDBGet() { String rString; ((ScStringCell*)pCell)->GetString(rString); - PushStringObject(rString); + PushString(rString); } break; case CELLTYPE_EDIT: { String rString; ((ScEditCell*)pCell)->GetString(rString); - PushStringObject(rString); + PushString(rString); } break; case CELLTYPE_FORMULA: @@ -1603,7 +1571,7 @@ void ScInterpreter::ScDBGet() { String rString; ((ScFormulaCell*)pCell)->GetString(rString); - PushStringObject(rString); + PushString(rString); } } break; @@ -1628,9 +1596,8 @@ void ScInterpreter::ScExternal() USHORT nIndex; BYTE nParamCount = GetByte(); String aUnoName; - // Achtung: Der String faengt im 2. Byte an!! - const sal_Unicode* pFuncName = pCur->cStr + 1; - if (ScGlobal::GetFuncCollection()->SearchFunc(pFuncName, nIndex)) + String aFuncName( pCur->GetExternal() ); + if (ScGlobal::GetFuncCollection()->SearchFunc(aFuncName, nIndex)) { FuncData* pFuncData = (FuncData*)ScGlobal::GetFuncCollection()->At(nIndex); if (nParamCount == pFuncData->GetParamCount() - 1) @@ -1730,7 +1697,7 @@ void ScInterpreter::ScExternal() ppParam[0] = pcErg; pFuncData->Call(ppParam); String aUni( pcErg, osl_getThreadTextEncoding() ); - PushString( aUni.GetBuffer() ); + PushString( aUni ); delete[] pcErg; } break; @@ -1775,7 +1742,7 @@ void ScInterpreter::ScExternal() PushDouble( pAs->GetValue() ); break; case PTR_STRING : - PushStringObject( pAs->GetString() ); + PushString( pAs->GetString() ); break; default: SetError( errUnknownState ); @@ -1804,7 +1771,7 @@ void ScInterpreter::ScExternal() PushInt(0); } } - else if ( ( aUnoName = ScGlobal::GetAddInCollection()->FindFunction(pFuncName, FALSE) ).Len() ) + else if ( ( aUnoName = ScGlobal::GetAddInCollection()->FindFunction(aFuncName, FALSE) ).Len() ) { // bLocalFirst=FALSE in FindFunction, cFunc should be the stored internal name @@ -2144,7 +2111,7 @@ void ScInterpreter::ScExternal() } // otherwise error code has been set in GetNewMat } else if ( aCall.HasString() ) - PushStringObject( aCall.GetString() ); + PushString( aCall.GetString() ); else PushDouble( aCall.GetValue() ); } @@ -2163,9 +2130,7 @@ void ScInterpreter::ScExternal() void ScInterpreter::ScMissing() { - ScToken aToken; - aToken.SetOpCode( ocMissing ); - PushTempToken( aToken ); + PushTempToken( new ScMissingToken ); } @@ -2174,7 +2139,7 @@ void ScInterpreter::ScMacro() SbxBase::ResetError(); BYTE nParamCount = GetByte(); - const sal_Unicode* pMacro = pCur->cStr + 1; // Achtung: Der String faengt im 2. Byte an!! + String aMacro( pCur->GetString() ); SfxObjectShell* pDocSh = pDok->GetDocumentShell(); if ( !pDocSh || !pDok->CheckMacroWarn() ) @@ -2196,7 +2161,7 @@ void ScInterpreter::ScMacro() // dann aBasicStr, aMacroStr fuer SfxObjectShell::CallBasic zusammenbauen StarBASIC* pRoot = pDocSh->GetBasic(); - SbxVariable* pVar = pRoot->Find( String( pMacro ), SbxCLASS_METHOD ); + SbxVariable* pVar = pRoot->Find( aMacro, SbxCLASS_METHOD ); if( !pVar || pVar->GetType() == SbxVOID || !pVar->ISA(SbMethod) ) { SetError( errNoName ); @@ -2233,7 +2198,7 @@ void ScInterpreter::ScMacro() pPar->PutDouble( GetDouble() ); break; case svString: - pPar->PutString( String( GetString() ) ); + pPar->PutString( GetString() ); break; case svSingleRef: { @@ -2381,7 +2346,7 @@ void ScInterpreter::ScMacro() SetNoValue(); } else - PushStringObject( refRes->GetString() ); + PushString( refRes->GetString() ); if( pVar->GetError() ) SetNoValue(); } @@ -2501,7 +2466,7 @@ void ScInterpreter::ScTableOp() { String aCellString; GetCellString(aCellString, pFCell); - PushStringObject(aCellString); + PushString(aCellString); } if (pTableOp) { @@ -2540,7 +2505,7 @@ void ScInterpreter::ScDefPar() void ScInterpreter::ScDBArea() { - ScDBData* pDBData = pDok->GetDBCollection()->FindIndex( pCur->nIndex); + ScDBData* pDBData = pDok->GetDBCollection()->FindIndex( pCur->GetIndex()); if (pDBData) { ComplRefData aRefData; @@ -2552,9 +2517,7 @@ void ScInterpreter::ScDBArea() (USHORT&) aRefData.Ref2.nRow); aRefData.Ref2.nTab = aRefData.Ref1.nTab; aRefData.CalcRelFromAbs( aPos ); - ScToken aTok; - aTok.SetDoubleReference( aRefData ); - PushTempToken( aTok ); + PushTempToken( new ScDoubleRefToken( aRefData ) ); } else SetError(errNoName); @@ -2563,7 +2526,7 @@ void ScInterpreter::ScDBArea() void ScInterpreter::ScColRowNameAuto() { - ComplRefData aRefData( pCur->aRef ); + ComplRefData aRefData( pCur->GetDoubleRef() ); aRefData.CalcAbsIfRel( aPos ); if ( aRefData.Valid() ) { @@ -2636,9 +2599,7 @@ void ScInterpreter::ScColRowNameAuto() } else SetError( errNoRef ); - ScToken aTok; - aTok.SetDoubleReference( aRefData ); - PushTempToken( aTok ); + PushTempToken( new ScDoubleRefToken( aRefData ) ); } // --- internals ------------------------------------------------------------ @@ -2666,7 +2627,7 @@ void ScInterpreter::ScCalcTeam() String aTeam( RTL_CONSTASCII_USTRINGPARAM( "Timm, Ballach, Rathke, Rentz, Nebel" ) ); if ( (GetByte() == 1) && SolarMath::ApproxEqual( GetDouble(), 1996) ) aTeam.AppendAscii( " (a word with 'B': -Olk, -Nietsch, -Daeumling)" ); - PushStringObject( aTeam ); + PushString( aTeam ); bShown = TRUE; } else @@ -2688,11 +2649,11 @@ void ScInterpreter::ScSpewFunc() case svSingleRef: case svDoubleRef: { - const sal_Unicode* p = GetString(); - if ( !bRefresh && *p < 256 ) - bRefresh = (tolower( (sal_uChar) *p ) == 'r'); - if ( !bClear && *p < 256 ) - bClear = (tolower( (sal_uChar) *p ) == 'c'); + const sal_Unicode ch = GetString().GetChar(0); + if ( !bRefresh && ch < 256 ) + bRefresh = (tolower( (sal_uChar) ch ) == 'r'); + if ( !bClear && ch < 256 ) + bClear = (tolower( (sal_uChar) ch ) == 'c'); } break; default: @@ -2712,7 +2673,7 @@ void ScInterpreter::ScSpewFunc() #else aStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "spitted out all spew :-(" ) ); #endif - PushStringObject( aStr ); + PushString( aStr ); } @@ -2893,9 +2854,9 @@ int main() while ( nParamCount-- ) Pop(); if ( !aResult.Len() ) - PushStringObject( String( pGames[ eGame ], RTL_TEXTENCODING_ASCII_US ) ); + PushString( String( pGames[ eGame ], RTL_TEXTENCODING_ASCII_US ) ); else - PushStringObject( aResult ); + PushString( aResult ); } void ScInterpreter::ScTTT() @@ -2929,7 +2890,7 @@ void ScInterpreter::ScTTT() aFace[2] = sBads[ rand() % ((sizeof( sBads )/sizeof(sal_Unicode)) - 1) ]; } aFace[3] = 0; - PushString( aFace ); + PushStringBuffer( aFace ); } // ------------------------------------------------------------------------- @@ -3029,7 +2990,7 @@ StackVar ScInterpreter::Interpret() && (!nGlobalError || nErrorFunction <= nErrorFunctionCount) ) { OpCode eOp = pCur->GetOpCode(); - cPar = pCur->cByte; + cPar = pCur->GetByte(); if ( eOp == ocPush ) { Push( (ScToken&) *pCur ); @@ -3466,7 +3427,7 @@ StackVar ScInterpreter::Interpret() switch( eResult = pCur->GetType() ) { case svDouble : - nResult = pCur->nValue; + nResult = pCur->GetDouble(); if ( nFuncFmtType == NUMBERFORMAT_UNDEFINED ) { nRetTypeExpr = NUMBERFORMAT_NUMBER; diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 001fd64da808..5689c949c262 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -2,9 +2,9 @@ * * $RCSfile: interpr5.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: er $ $Date: 2001-02-13 19:01:55 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -671,7 +671,7 @@ void ScInterpreter::ScMatValue() BOOL bIsString; const MatValue* pMatVal = pMat->Get(nC, nR, bIsString); if (bIsString) - PushStringObject(*(pMatVal->pS)); + PushString(*(pMatVal->pS)); else PushDouble(pMatVal->fVal); } @@ -700,7 +700,7 @@ void ScInterpreter::ScMatValue() { String aStr; GetCellString(aStr, pCell); - PushStringObject(aStr); + PushString(aStr); } } else @@ -719,7 +719,7 @@ void ScInterpreter::ScMatValue() BOOL bIsString; const MatValue* pMatVal = pMat->Get(nC, nR, bIsString); if (bIsString) - PushStringObject(*(pMatVal->pS)); + PushString(*(pMatVal->pS)); else PushDouble(pMatVal->fVal); } @@ -1741,11 +1741,9 @@ void ScInterpreter::ScAmpersand() } else { - sStr1 += sStr2; - if (sStr1.Len() < MAXSTRLEN) - PushStringObject(sStr1); - else - SetError(errStringOverflow); + if ( CheckStringResultLen( sStr1, sStr2 ) ) + sStr1 += sStr2; + PushString(sStr1); } } @@ -4024,7 +4022,7 @@ void ScInterpreter::ScMatRef() BOOL bIsString; const MatValue* pMatVal = pMat->Get(nC, nR, bIsString); if (bIsString) - PushStringObject(*(pMatVal->pS)); + PushString(*(pMatVal->pS)); else { PushDouble(pMatVal->fVal); @@ -4047,7 +4045,7 @@ void ScInterpreter::ScMatRef() { String aVal; pCell->GetString( aVal ); - PushStringObject( aVal ); + PushString( aVal ); } pDok->GetNumberFormatInfo( nCurFmtType, nCurFmtIndex, aAdr, *pCell ); nFuncFmtType = nCurFmtType; diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx index 1fd00b0fb241..77d2202dc759 100644 --- a/sc/source/core/tool/rangenam.cxx +++ b/sc/source/core/tool/rangenam.cxx @@ -2,9 +2,9 @@ * * $RCSfile: rangenam.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: nn $ $Date: 2000-10-06 13:44:55 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -266,7 +266,9 @@ BOOL ScRangeData::IsBeyond( USHORT nMaxRow ) const ScToken* t; pCode->Reset(); while ( t = pCode->GetNextReference() ) - if ( t->aRef.Ref1.nRow > nMaxRow || t->aRef.Ref2.nRow > nMaxRow ) + if ( t->GetSingleRef().nRow > nMaxRow || + (t->GetType() == svDoubleRef && + t->GetDoubleRef().Ref2.nRow > nMaxRow) ) return TRUE; return FALSE; @@ -287,23 +289,23 @@ void ScRangeData::GuessPosition() pCode->Reset(); while ( t = pCode->GetNextReference() ) { - ComplRefData& rRef = t->aRef; - - if ( rRef.Ref1.IsColRel() && rRef.Ref1.nRelCol < nMinCol ) - nMinCol = rRef.Ref1.nRelCol; - if ( rRef.Ref1.IsRowRel() && rRef.Ref1.nRelRow < nMinRow ) - nMinRow = rRef.Ref1.nRelRow; - if ( rRef.Ref1.IsTabRel() && rRef.Ref1.nRelTab < nMinTab ) - nMinTab = rRef.Ref1.nRelTab; + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsColRel() && rRef1.nRelCol < nMinCol ) + nMinCol = rRef1.nRelCol; + if ( rRef1.IsRowRel() && rRef1.nRelRow < nMinRow ) + nMinRow = rRef1.nRelRow; + if ( rRef1.IsTabRel() && rRef1.nRelTab < nMinTab ) + nMinTab = rRef1.nRelTab; if ( t->GetType() == svDoubleRef ) { - if ( rRef.Ref2.IsColRel() && rRef.Ref2.nRelCol < nMinCol ) - nMinCol = rRef.Ref2.nRelCol; - if ( rRef.Ref2.IsRowRel() && rRef.Ref2.nRelRow < nMinRow ) - nMinRow = rRef.Ref2.nRelRow; - if ( rRef.Ref2.IsTabRel() && rRef.Ref2.nRelTab < nMinTab ) - nMinTab = rRef.Ref2.nRelTab; + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsColRel() && rRef2.nRelCol < nMinCol ) + nMinCol = rRef2.nRelCol; + if ( rRef2.IsRowRel() && rRef2.nRelRow < nMinRow ) + nMinRow = rRef2.nRelRow; + if ( rRef2.IsTabRel() && rRef2.nRelTab < nMinTab ) + nMinTab = rRef2.nRelTab; } } @@ -377,14 +379,17 @@ void ScRangeData::UpdateTranspose( const ScRange& rSource, const ScAddress& rDes { if( t->GetType() != svIndex ) { - ComplRefData& rRef = t->GetReference(); + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() && (!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) && ( t->GetType() == svSingleRef || (!rRef.Ref2.IsColRel() && !rRef.Ref2.IsRowRel() && (!rRef.Ref2.IsFlag3D() || !rRef.Ref2.IsTabRel())))) { - if ( ScRefUpdate::UpdateTranspose( pDoc, rSource, rDest, t->aRef ) != UR_NOTHING ) + if ( ScRefUpdate::UpdateTranspose( pDoc, rSource, rDest, rRef ) != UR_NOTHING ) bChanged = TRUE; } } @@ -404,14 +409,17 @@ void ScRangeData::UpdateGrow( const ScRange& rArea, USHORT nGrowX, USHORT nGrowY { if( t->GetType() != svIndex ) { - ComplRefData& rRef = t->GetReference(); + SingleDoubleRefModifier& rMod = (t->GetType() == svSingleRef ? + SingleDoubleRefModifier( t->GetSingleRef() ) : + SingleDoubleRefModifier( t->GetDoubleRef() )); + ComplRefData& rRef = rMod.Ref(); if (!rRef.Ref1.IsColRel() && !rRef.Ref1.IsRowRel() && (!rRef.Ref1.IsFlag3D() || !rRef.Ref1.IsTabRel()) && ( t->GetType() == svSingleRef || (!rRef.Ref2.IsColRel() && !rRef.Ref2.IsRowRel() && (!rRef.Ref2.IsFlag3D() || !rRef.Ref2.IsTabRel())))) { - if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, t->aRef ) != UR_NOTHING ) + if ( ScRefUpdate::UpdateGrow( rArea,nGrowX,nGrowY, rRef ) != UR_NOTHING ) bChanged = TRUE; } } @@ -610,14 +618,19 @@ void ScRangeData::TransferTabRef( USHORT nOldTab, USHORT nNewTab ) pCode->Reset(); while ( t = pCode->GetNextReference() ) { - if ( t->aRef.Ref1.IsTabRel() ) - t->aRef.Ref1.nTab += nPosDiff; - else - t->aRef.Ref1.nTab += nTabDiff; - if ( t->aRef.Ref2.IsTabRel() ) - t->aRef.Ref2.nTab += nPosDiff; + SingleRefData& rRef1 = t->GetSingleRef(); + if ( rRef1.IsTabRel() ) + rRef1.nTab += nPosDiff; else - t->aRef.Ref2.nTab += nTabDiff; + rRef1.nTab += nTabDiff; + if ( t->GetType() == svDoubleRef ) + { + SingleRefData& rRef2 = t->GetDoubleRef().Ref2; + if ( rRef2.IsTabRel() ) + rRef2.nTab += nPosDiff; + else + rRef2.nTab += nTabDiff; + } } } @@ -629,10 +642,11 @@ void ScRangeData::ReplaceRangeNamesInUse( const ScIndexMap& rMap ) { if ( p->GetOpCode() == ocName ) { - USHORT nNewIndex = rMap.Find( p->nIndex ); - if ( p->nIndex != nNewIndex ) + USHORT nIndex = p->GetIndex(); + USHORT nNewIndex = rMap.Find( nIndex ); + if ( nIndex != nNewIndex ) { - p->nIndex = nNewIndex; + p->SetIndex( nNewIndex ); bCompile = TRUE; } } diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx index fb482fb07cb4..92513177d068 100644 --- a/sc/source/core/tool/refdata.cxx +++ b/sc/source/core/tool/refdata.cxx @@ -2,9 +2,9 @@ * * $RCSfile: refdata.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: hr $ $Date: 2000-09-19 00:16:18 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -65,14 +65,8 @@ #pragma hdrstop -#include <segmentc.hxx> +#include "refdata.hxx" -#include "compiler.hxx" - -SEG_EOFGLOBALS() - - -#pragma SEG_FUNCDEF(refdata_01) void SingleRefData::CalcRelFromAbs( const ScAddress& rPos ) { @@ -82,8 +76,6 @@ void SingleRefData::CalcRelFromAbs( const ScAddress& rPos ) } -#pragma SEG_FUNCDEF(refdata_02) - void SingleRefData::SmartRelAbs( const ScAddress& rPos ) { if ( Flags.bColRel ) @@ -103,8 +95,6 @@ void SingleRefData::SmartRelAbs( const ScAddress& rPos ) } -#pragma SEG_FUNCDEF(refdata_06) - void SingleRefData::CalcAbsIfRel( const ScAddress& rPos ) { if ( Flags.bColRel ) @@ -128,8 +118,6 @@ void SingleRefData::CalcAbsIfRel( const ScAddress& rPos ) } -#pragma SEG_FUNCDEF(refdata_03) - void SingleRefData::OldBoolsToNewFlags( const OldSingleRefBools& rBools ) { switch ( rBools.bRelCol ) @@ -208,8 +196,6 @@ void SingleRefData::OldBoolsToNewFlags( const OldSingleRefBools& rBools ) Aber immer noch nCol > MAXCOL und gut sollte sein.. */ -#pragma SEG_FUNCDEF(refdata_04) - BYTE SingleRefData::CreateStoreByteFromFlags() const { return (BYTE)( @@ -225,8 +211,6 @@ BYTE SingleRefData::CreateStoreByteFromFlags() const } -#pragma SEG_FUNCDEF(refdata_05) - void SingleRefData::CreateFlagsFromLoadByte( BYTE n ) { Flags.bColRel = (n & 0x01 ); @@ -240,7 +224,14 @@ void SingleRefData::CreateFlagsFromLoadByte( BYTE n ) } -#pragma SEG_FUNCDEF(refdata_07) +BOOL SingleRefData::operator==( const SingleRefData& r ) const +{ + return bFlags == r.bFlags && + (Flags.bColRel ? nRelCol == r.nRelCol : nCol == r.nCol) && + (Flags.bRowRel ? nRelRow == r.nRelRow : nRow == r.nRow) && + (Flags.bTabRel ? nRelTab == r.nRelTab : nTab == r.nTab); +} + // Abs-Refs muessen vorher aktualisiert werden! // wird in refupdat.cxx mit MoveRelWrap verwendet @@ -336,42 +327,3 @@ void ComplRefData::PutInOrder() Ref2.Flags.bRelName = ( nRelState2 ? TRUE : FALSE ); } -/*------------------------------------------------------------------------ - - $Log: not supported by cvs2svn $ - Revision 1.10 2000/09/17 14:08:42 willem.vandorp - OpenOffice header added. - - Revision 1.9 2000/08/31 16:38:04 willem.vandorp - Header and footer replaced - - Revision 1.8 1997/11/13 20:06:50 NN - ifndef PCH raus - - - Rev 1.7 13 Nov 1997 21:06:50 NN - ifndef PCH raus - - Rev 1.6 08 Jan 1997 20:11:54 ER - ScAddress als Reference (keine temporaeren Objekte ohne inlining) - - Rev 1.5 14 May 1996 13:59:32 ER - ComplRefData PutInOrder - - Rev 1.4 24 Apr 1996 21:30:48 ER - CalcAbsIfRel: !valid => flag deleted - - Rev 1.3 24 Apr 1996 12:23:04 ER - unbenamster struct geht nicht - - Rev 1.2 23 Apr 1996 19:23:06 ER - ScTokenArray::Store mit Position, CalcAbsIfRel vor ScToken::Store - - Rev 1.1 23 Apr 1996 13:49:04 ER - RelRefs, zweite Runde - - Rev 1.0 22 Apr 1996 11:29:28 ER - *RefData: token.cxx --> refdata.cxx - -------------------------------------------------------------------------*/ -#pragma SEG_EOFMODULE diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 2dbfad0bba20..8510a59820d1 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2,9 +2,9 @@ * * $RCSfile: token.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: er $ $Date: 2001-02-16 19:09:06 $ + * last change: $Author: er $ $Date: 2001-02-21 18:33:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -97,13 +97,33 @@ struct ImpTokenIterator // SubCode via ScTokenIterator Push/Pop moeglich IMPL_FIXEDMEMPOOL_NEWDEL( ImpTokenIterator, 32, 16 ); -// Raw-ScToken Groesse ist FixMembers + MAXSTRLEN ~= 264 -IMPL_FIXEDMEMPOOL_NEWDEL( ScToken, 8, 4 ); -// ScDoubleToken werden evtl. massig gebraucht, FixMembers + sizeof(double) ~= 16 -const USHORT nMemPoolDoubleToken = (0x4000 - 64) / sizeof(ScDoubleToken); +// Align MemPools on 4k boundaries - 64 bytes (4k is a MUST for OS/2) + +// Since RawTokens are temporary for the compiler, don't align on 4k and waste memory. +// ScRawToken size is FixMembers + MAXSTRLEN ~= 264 +IMPL_FIXEDMEMPOOL_NEWDEL( ScRawToken, 8, 4 ); +// Some ScDoubleRawToken, FixMembers + sizeof(double) ~= 16 +const USHORT nMemPoolDoubleRawToken = 0x0400 / sizeof(ScDoubleRawToken); +IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleRawToken, nMemPoolDoubleRawToken, nMemPoolDoubleRawToken ); + +// Need a whole bunch of ScSingleRefToken +const USHORT nMemPoolSingleRefToken = (0x4000 - 64) / sizeof(ScSingleRefToken); +IMPL_FIXEDMEMPOOL_NEWDEL( ScSingleRefToken, nMemPoolSingleRefToken, nMemPoolSingleRefToken ); +// Need a lot of ScDoubleToken +const USHORT nMemPoolDoubleToken = (0x3000 - 64) / sizeof(ScDoubleToken); IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleToken, nMemPoolDoubleToken, nMemPoolDoubleToken ); +// Need a lot of ScByteToken +const USHORT nMemPoolByteToken = (0x3000 - 64) / sizeof(ScByteToken); +IMPL_FIXEDMEMPOOL_NEWDEL( ScByteToken, nMemPoolByteToken, nMemPoolByteToken ); +// Need quite a lot of ScDoubleRefToken +const USHORT nMemPoolDoubleRefToken = (0x2000 - 64) / sizeof(ScDoubleRefToken); +IMPL_FIXEDMEMPOOL_NEWDEL( ScDoubleRefToken, nMemPoolDoubleRefToken, nMemPoolDoubleRefToken ); +// Need several ScStringToken +const USHORT nMemPoolStringToken = (0x1000 - 64) / sizeof(ScStringToken); +IMPL_FIXEDMEMPOOL_NEWDEL( ScStringToken, nMemPoolStringToken, nMemPoolStringToken ); + -//-----------------------Funktionen der Klasse ScToken------------------------ +// --- helpers -------------------------------------------------------------- inline BOOL lcl_IsReference( OpCode eOp, StackVar eType ) { @@ -116,7 +136,9 @@ inline BOOL lcl_IsReference( OpCode eOp, StackVar eType ) } -xub_StrLen ScToken::GetStrLen( const sal_Unicode* pStr ) +// --- class ScRawToken ----------------------------------------------------- + +xub_StrLen ScRawToken::GetStrLen( const sal_Unicode* pStr ) { if ( !pStr ) return 0; @@ -127,69 +149,7 @@ xub_StrLen ScToken::GetStrLen( const sal_Unicode* pStr ) } -BOOL ScToken::IsFunction() const -{ - return (eOp != ocPush && eOp != ocBad && eOp != ocColRowName && - eOp != ocColRowNameAuto && eOp != ocName && eOp != ocDBArea && - (cByte != 0 // x Parameter - || (ocEndUnOp < eOp && eOp <= ocEndNoPar) // kein Parameter - || (ocIf == eOp || ocChose == eOp ) //@ Sprung Kommandos - || (ocEndNoPar < eOp && eOp <= ocEnd1Par) // ein Parameter - || (ocEnd1Par < eOp && eOp <= ocEnd2Par) // x Parameter (cByte==0 in - // FuncAutoPilot) - || eOp == ocMacro || eOp == ocExternal // Makros, AddIns - || eOp == ocAnd || eOp == ocOr // ehemals binaer, jetzt x Params - || eOp == ocNot || eOp == ocNeg // unaer aber Function - || (eOp >= ocInternalBegin && eOp <= ocInternalEnd) // Internal - )); -} - - -BYTE ScToken::GetParamCount() const -{ - if ( eOp <= ocEndDiv && eOp != ocExternal && eOp != ocMacro && - eOp != ocIf && eOp != ocChose ) - return 0; // Parameter und Specials - // ocIf und ocChose fuer FAP nicht, haben dann cByte -//2do: BOOL-Parameter ob FAP oder nicht? - else if ( cByte ) - return cByte; // alle Funktionen, gilt auch fuer ocExternal und ocMacro - else if ( ocEndDiv < eOp && eOp <= ocEndBinOp ) - return 2; // binaer - else if ( ocEndBinOp < eOp && eOp <= ocEndUnOp ) - return 1; // unaer - else if ( ocEndUnOp < eOp && eOp <= ocEndNoPar ) - return 0; // kein Parameter - else if ( ocEndNoPar < eOp && eOp <= ocEnd1Par ) - return 1; // ein Parameter - else - return 0; // der Rest, kein Parameter, oder - // wenn dann sollte er in cByte sein -} - - -BOOL ScToken::IsMatrixFunction() const -{ - switch ( eOp ) - { - case ocDde : - case ocGrowth : - case ocTrend : - case ocRKP : - case ocRGP : - case ocFrequency : - case ocMatTrans : - case ocMatMult : - case ocMatInv : - case ocMatrixUnit : - return TRUE; - break; - } - return FALSE; -} - - -void ScToken::SetOpCode( OpCode e ) +void ScRawToken::SetOpCode( OpCode e ) { eOp = e; if( eOp == ocIf ) @@ -207,7 +167,7 @@ void ScToken::SetOpCode( OpCode e ) nRefCnt = 0; } -void ScToken::SetString( const sal_Unicode* pStr ) +void ScRawToken::SetString( const sal_Unicode* pStr ) { eOp = ocPush; eType = svString; @@ -224,7 +184,7 @@ void ScToken::SetString( const sal_Unicode* pStr ) nRefCnt = 0; } -void ScToken::SetSingleReference( const SingleRefData& rRef ) +void ScRawToken::SetSingleReference( const SingleRefData& rRef ) { eOp = ocPush; eType = svSingleRef; @@ -233,7 +193,7 @@ void ScToken::SetSingleReference( const SingleRefData& rRef ) nRefCnt = 0; } -void ScToken::SetDoubleReference( const ComplRefData& rRef ) +void ScRawToken::SetDoubleReference( const ComplRefData& rRef ) { eOp = ocPush; eType = svDoubleRef; @@ -241,7 +201,7 @@ void ScToken::SetDoubleReference( const ComplRefData& rRef ) nRefCnt = 0; } -void ScToken::SetReference( ComplRefData& rRef ) +void ScRawToken::SetReference( ComplRefData& rRef ) { DBG_ASSERT( lcl_IsReference( eOp, GetType() ), "SetReference: no Ref" ); aRef = rRef; @@ -249,7 +209,7 @@ void ScToken::SetReference( ComplRefData& rRef ) aRef.Ref2 = aRef.Ref1; } -void ScToken::SetByte( BYTE c ) +void ScRawToken::SetByte( BYTE c ) { eOp = ocPush; eType = svByte; @@ -257,7 +217,7 @@ void ScToken::SetByte( BYTE c ) nRefCnt = 0; } -void ScToken::SetDouble(double rVal) +void ScRawToken::SetDouble(double rVal) { eOp = ocPush; eType = svDouble; @@ -265,7 +225,7 @@ void ScToken::SetDouble(double rVal) nRefCnt = 0; } -void ScToken::SetInt(int rVal) +void ScRawToken::SetInt(int rVal) { eOp = ocPush; eType = svDouble; @@ -273,7 +233,7 @@ void ScToken::SetInt(int rVal) nRefCnt = 0; } -void ScToken::SetName( USHORT n ) +void ScRawToken::SetName( USHORT n ) { eOp = ocName; eType = svIndex; @@ -281,13 +241,13 @@ void ScToken::SetName( USHORT n ) nRefCnt = 0; } -ComplRefData& ScToken::GetReference() +ComplRefData& ScRawToken::GetReference() { DBG_ASSERT( lcl_IsReference( eOp, GetType() ), "GetReference: no Ref" ); return aRef; } -void ScToken::SetExternal( const sal_Unicode* pStr ) +void ScRawToken::SetExternal( const sal_Unicode* pStr ) { eOp = ocExternal; eType = svExternal; @@ -300,7 +260,7 @@ void ScToken::SetExternal( const sal_Unicode* pStr ) nRefCnt = 0; } -void ScToken::SetMatrix( ScMatrix* p ) +void ScRawToken::SetMatrix( ScMatrix* p ) { eOp = ocPush; eType = svMatrix; @@ -308,19 +268,19 @@ void ScToken::SetMatrix( ScMatrix* p ) nRefCnt = 0; } -ScToken* ScToken::Clone() const +ScRawToken* ScRawToken::Clone() const { - ScToken* p; + ScRawToken* p; if ( eType == svDouble ) { - p = (ScToken*) new ScDoubleToken; + p = (ScRawToken*) new ScDoubleRawToken; p->eOp = eOp; p->eType = eType; p->nValue = nValue; } else { - USHORT n = offsetof( ScToken, cByte ); + USHORT n = offsetof( ScRawToken, cByte ); switch( eType ) { case svByte: n++; break; @@ -334,7 +294,7 @@ ScToken* ScToken::Clone() const case svExternal: n += GetStrLenBytes( cStr+1 ) + GetStrLenBytes( 2 ); break; default: n += (BYTE) cStr[ 0 ]; // unbekannt eingelesen! } - p = (ScToken*) new BYTE[ n ]; + p = (ScRawToken*) new BYTE[ n ]; memcpy( p, this, n * sizeof(BYTE) ); } p->nRefCnt = 0; @@ -342,38 +302,61 @@ ScToken* ScToken::Clone() const return p; } -BOOL ScToken::operator== (const ScToken& rToken) const -{ - // Ref-Count und bRaw darf hier nicht mit verglichen werden!!! - USHORT n = 0; - switch( eType ) +ScToken* ScRawToken::CreateToken() const +{ + switch ( GetType() ) { - case svByte: n++; break; - case svDouble: n += sizeof(double); break; - case svString: n += GetStrLenBytes( cStr ) + GetStrLenBytes( 1 ); break; - case svSingleRef: - case svDoubleRef: n += sizeof(aRef); break; - case svMatrix: n += sizeof(ScMatrix*); break; - case svIndex: n += sizeof(USHORT); break; - case svJump: n += nJump[ 0 ] * 2 + 2; break; - case svExternal: n += GetStrLenBytes( cStr+1 ) + GetStrLenBytes( 2 ); break; - default: n += (BYTE) cStr[ 0 ]; // unbekannt eingelesen! + case svByte : + return new ScByteToken( eOp, cByte ); + break; + case svDouble : + return new ScDoubleToken( eOp, nValue ); + break; + case svString : + return new ScStringToken( eOp, String( cStr ) ); + break; + case svSingleRef : + return new ScSingleRefToken( eOp, aRef.Ref1 ); + break; + case svDoubleRef : + return new ScDoubleRefToken( eOp, aRef ); + break; + case svMatrix : + return new ScMatrixToken( eOp, pMat ); + break; + case svIndex : + return new ScIndexToken( eOp, nIndex ); + break; + case svJump : + return new ScJumpToken( eOp, (short*) nJump ); + break; + case svExternal : + return new ScExternalToken( eOp, (BYTE) cStr[0], String( cStr[1] ) ); + break; + case svMissing : + return new ScMissingToken( eOp ); + break; + case svErr : + return new ScErrToken( eOp ); + break; + default: + // read in unknown! + return new ScUnknownToken( eOp, GetType(), (BYTE*) cStr ); } - return eOp == rToken.eOp && eType == rToken.eType && - ( n == 0 || memcmp( &cByte, &rToken.cByte, n ) == 0 ); } -void ScToken::Delete() + +void ScRawToken::Delete() { if ( bRaw ) - delete this; // FixedMemPool ScToken + delete this; // FixedMemPool ScRawToken else - { // per Clone erzeugt + { // created per Clone switch ( eType ) { case svDouble : - delete (ScDoubleToken*) this; // FixedMemPool ScDoubleToken + delete (ScDoubleRawToken*) this; // FixedMemPool ScDoubleRawToken break; default: delete [] (BYTE*) this; @@ -381,26 +364,180 @@ void ScToken::Delete() } } -// TextEqual: gleiche Formel eingegeben (fuer Optimierung beim Sortieren) -BOOL ScToken::TextEqual(const ScToken& rToken) const +// --- class ScToken -------------------------------------------------------- + +SingleRefData lcl_ScToken_InitSingleRef() +{ + SingleRefData aRef; + aRef.InitAddress( ScAddress() ); + return aRef; +} + +ComplRefData lcl_ScToken_InitDoubleRef() +{ + ComplRefData aRef; + aRef.Ref1 = lcl_ScToken_InitSingleRef(); + aRef.Ref2 = aRef.Ref1; + return aRef; +} + +SingleRefData ScToken::aDummySingleRef = lcl_ScToken_InitSingleRef(); +ComplRefData ScToken::aDummyDoubleRef = lcl_ScToken_InitDoubleRef(); +String ScToken::aDummyString; + + +ScToken::~ScToken() +{ +} + + +BOOL ScToken::IsFunction() const +{ + return (eOp != ocPush && eOp != ocBad && eOp != ocColRowName && + eOp != ocColRowNameAuto && eOp != ocName && eOp != ocDBArea && + (GetByte() != 0 // x parameters + || (ocEndUnOp < eOp && eOp <= ocEndNoPar) // no parameter + || (ocIf == eOp || ocChose == eOp ) // @ jump commands + || (ocEndNoPar < eOp && eOp <= ocEnd1Par) // one parameter + || (ocEnd1Par < eOp && eOp <= ocEnd2Par) // x parameters (cByte==0 in + // FuncAutoPilot) + || eOp == ocMacro || eOp == ocExternal // macros, AddIns + || eOp == ocAnd || eOp == ocOr // former binary, now x parameters + || eOp == ocNot || eOp == ocNeg // unary but function + || (eOp >= ocInternalBegin && eOp <= ocInternalEnd) // internal + )); +} + + +BYTE ScToken::GetParamCount() const +{ + if ( eOp <= ocEndDiv && eOp != ocExternal && eOp != ocMacro && + eOp != ocIf && eOp != ocChose ) + return 0; // parameters and specials + // ocIf and ocChose not for FAP, have cByte then +//2do: BOOL parameter whether FAP or not? + else if ( GetByte() ) + return GetByte(); // all functions, also ocExternal and ocMacro + else if ( ocEndDiv < eOp && eOp <= ocEndBinOp ) + return 2; // binary + else if ( ocEndBinOp < eOp && eOp <= ocEndUnOp ) + return 1; // unary + else if ( ocEndUnOp < eOp && eOp <= ocEndNoPar ) + return 0; // no parameter + else if ( ocEndNoPar < eOp && eOp <= ocEnd1Par ) + return 1; // one parameter + else + return 0; // all the rest, no Parameter, or + // if so then it should be in cByte +} + + +BOOL ScToken::IsMatrixFunction() const +{ + switch ( eOp ) + { + case ocDde : + case ocGrowth : + case ocTrend : + case ocRKP : + case ocRGP : + case ocFrequency : + case ocMatTrans : + case ocMatMult : + case ocMatInv : + case ocMatrixUnit : + return TRUE; + break; + } + return FALSE; +} + + +ScToken* ScToken::Clone() const +{ + switch ( GetType() ) + { + case svByte : + return new ScByteToken( *static_cast<const ScByteToken*>(this) ); + break; + case svDouble : + return new ScDoubleToken( *static_cast<const ScDoubleToken*>(this) ); + break; + case svString : + return new ScStringToken( *static_cast<const ScStringToken*>(this) ); + break; + case svSingleRef : + return new ScSingleRefToken( *static_cast<const ScSingleRefToken*>(this) ); + break; + case svDoubleRef : + return new ScDoubleRefToken( *static_cast<const ScDoubleRefToken*>(this) ); + break; + case svMatrix : + return new ScMatrixToken( *static_cast<const ScMatrixToken*>(this) ); + break; + case svIndex : + return new ScIndexToken( *static_cast<const ScIndexToken*>(this) ); + break; + case svJump : + return new ScJumpToken( *static_cast<const ScJumpToken*>(this) ); + break; + case svExternal : + return new ScExternalToken( *static_cast<const ScExternalToken*>(this) ); + break; + case svMissing : + return new ScMissingToken( *static_cast<const ScMissingToken*>(this) ); + break; + case svErr : + return new ScErrToken( *static_cast<const ScErrToken*>(this) ); + break; + default: + // read in unknown! + return new ScUnknownToken( *static_cast<const ScUnknownToken*>(this) ); + } +} + +BOOL ScToken::operator==( const ScToken& rToken ) const +{ + // don't compare reference count! + return eOp == rToken.eOp && eType == rToken.eType; +} + + +// TextEqual: if same formula entered (for optimization in sort) +BOOL ScToken::TextEqual( const ScToken& rToken ) const { if ( eType == svSingleRef || eType == svDoubleRef ) { - // bei relativen Refs auch nur den relativen Teil vergleichen + // in relative Refs only compare relative parts if ( eOp != rToken.eOp || eType != rToken.eType ) return FALSE; - ComplRefData aTemp1 = aRef; - ComplRefData aTemp2 = rToken.aRef; + ComplRefData aTemp1; + if ( eType == svSingleRef ) + { + aTemp1.Ref1 = GetSingleRef(); + aTemp1.Ref2 = aTemp1.Ref1; + } + else + aTemp1 = GetDoubleRef(); + + ComplRefData aTemp2; + if ( rToken.eType == svSingleRef ) + { + aTemp2.Ref1 = rToken.GetSingleRef(); + aTemp2.Ref2 = aTemp2.Ref1; + } + else + aTemp2 = rToken.GetDoubleRef(); ScAddress aPos; aTemp1.SmartRelAbs(aPos); aTemp2.SmartRelAbs(aPos); - // memcmp geht schief wegen des Alignment-Bytes hinter bFlags - // nach SmartRelAbs muessen nur die absoluten Teile verglichen werden + // memcmp doesn't work because of the alignment byte after bFlags. + // After SmartRelAbs only absolute parts have to be compared. return aTemp1.Ref1.nCol == aTemp2.Ref1.nCol && aTemp1.Ref1.nRow == aTemp2.Ref1.nRow && aTemp1.Ref1.nTab == aTemp2.Ref1.nTab && @@ -411,9 +548,218 @@ BOOL ScToken::TextEqual(const ScToken& rToken) const aTemp1.Ref2.bFlags == aTemp2.Ref2.bFlags; } else - return *this == rToken; // sonst normaler operator== + return *this == rToken; // else normal operator== +} + + +// virtual dummy methods + +BYTE ScToken::GetByte() const +{ + // ok to be called for any derived class + return 0; +} + +void ScToken::SetByte( BYTE n ) +{ + DBG_ERRORFILE( "ScToken::SetByte: virtual dummy called" ); +} + +double ScToken::GetDouble() const +{ + DBG_ERRORFILE( "ScToken::GetDouble: virtual dummy called" ); + return 0.0; } +const String& ScToken::GetString() const +{ + DBG_ERRORFILE( "ScToken::GetString: virtual dummy called" ); + return aDummyString; +} + +const SingleRefData& ScToken::GetSingleRef() const +{ + DBG_ERRORFILE( "ScToken::GetSingleRef: virtual dummy called" ); + return aDummySingleRef; +} + +SingleRefData& ScToken::GetSingleRef() +{ + DBG_ERRORFILE( "ScToken::GetSingleRef: virtual dummy called" ); + return aDummySingleRef; +} + +const ComplRefData& ScToken::GetDoubleRef() const +{ + DBG_ERRORFILE( "ScToken::GetDoubleRef: virtual dummy called" ); + return aDummyDoubleRef; +} + +ComplRefData& ScToken::GetDoubleRef() +{ + DBG_ERRORFILE( "ScToken::GetDoubleRef: virtual dummy called" ); + return aDummyDoubleRef; +} + +void ScToken::CalcAbsIfRel( const ScAddress& rPos ) +{ + DBG_ERRORFILE( "ScToken::CalcAbsIfRel: virtual dummy called" ); +} + +void ScToken::CalcRelFromAbs( const ScAddress& rPos ) +{ + DBG_ERRORFILE( "ScToken::CalcRelFromAbs: virtual dummy called" ); +} + +ScMatrix* ScToken::GetMatrix() const +{ + DBG_ERRORFILE( "ScToken::GetMatrix: virtual dummy called" ); + return NULL; +} + +USHORT ScToken::GetIndex() const +{ + DBG_ERRORFILE( "ScToken::GetIndex: virtual dummy called" ); + return 0; +} + +void ScToken::SetIndex( USHORT n ) +{ + DBG_ERRORFILE( "ScToken::SetIndex: virtual dummy called" ); +} + +short* ScToken::GetJump() const +{ + DBG_ERRORFILE( "ScToken::GetJump: virtual dummy called" ); + return NULL; +} + +const String& ScToken::GetExternal() const +{ + DBG_ERRORFILE( "ScToken::GetExternal: virtual dummy called" ); + return aDummyString; +} + +BYTE* ScToken::GetUnknown() const +{ + DBG_ERRORFILE( "ScToken::GetUnknown: virtual dummy called" ); + return NULL; +} + + +// real implementations of virtual functions + +BYTE ScByteToken::GetByte() const { return nByte; } +void ScByteToken::SetByte( BYTE n ) { nByte = n; } +BOOL ScByteToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && nByte == r.GetByte(); +} + + +double ScDoubleToken::GetDouble() const { return fDouble; } +BOOL ScDoubleToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && fDouble == r.GetDouble(); +} + + +const String& ScStringToken::GetString() const { return aString; } +BOOL ScStringToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && aString == r.GetString(); +} + + +const SingleRefData& ScSingleRefToken::GetSingleRef() const { return aSingleRef; } +SingleRefData& ScSingleRefToken::GetSingleRef() { return aSingleRef; } +void ScSingleRefToken::CalcAbsIfRel( const ScAddress& rPos ) + { aSingleRef.CalcAbsIfRel( rPos ); } +void ScSingleRefToken::CalcRelFromAbs( const ScAddress& rPos ) + { aSingleRef.CalcRelFromAbs( rPos ); } +BOOL ScSingleRefToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && aSingleRef == r.GetSingleRef(); +} + + +const SingleRefData& ScDoubleRefToken::GetSingleRef() const { return aDoubleRef.Ref1; } +SingleRefData& ScDoubleRefToken::GetSingleRef() { return aDoubleRef.Ref1; } +const ComplRefData& ScDoubleRefToken::GetDoubleRef() const { return aDoubleRef; } +ComplRefData& ScDoubleRefToken::GetDoubleRef() { return aDoubleRef; } +void ScDoubleRefToken::CalcAbsIfRel( const ScAddress& rPos ) + { aDoubleRef.CalcAbsIfRel( rPos ); } +void ScDoubleRefToken::CalcRelFromAbs( const ScAddress& rPos ) + { aDoubleRef.CalcRelFromAbs( rPos ); } +BOOL ScDoubleRefToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && aDoubleRef == r.GetDoubleRef(); +} + + +ScMatrix* ScMatrixToken::GetMatrix() const { return pMatrix; } +BOOL ScMatrixToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && pMatrix == r.GetMatrix(); +} + + +USHORT ScIndexToken::GetIndex() const { return nIndex; } +void ScIndexToken::SetIndex( USHORT n ) { nIndex = n; } +BOOL ScIndexToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && nIndex == r.GetIndex(); +} + + +short* ScJumpToken::GetJump() const { return pJump; } +BOOL ScJumpToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && pJump[0] == r.GetJump()[0] && + memcmp( pJump+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0; +} +ScJumpToken::~ScJumpToken() +{ + delete [] pJump; +} + + +const String& ScExternalToken::GetExternal() const { return aExternal; } +BYTE ScExternalToken::GetByte() const { return nByte; } +void ScExternalToken::SetByte( BYTE n ) { nByte = n; } +BOOL ScExternalToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && nByte == r.GetByte() && + aExternal == r.GetExternal(); +} + + +double ScMissingToken::GetDouble() const { return 0.0; } +const String& ScMissingToken::GetString() const { return aDummyString; } +BOOL ScMissingToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ); +} + + +BOOL ScErrToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ); +} + + +BYTE* ScUnknownToken::GetUnknown() const { return pUnknown; } +BOOL ScUnknownToken::operator==( const ScToken& r ) const +{ + return ScToken::operator==( r ) && pUnknown[0] == r.GetUnknown()[0] && + memcmp( pUnknown+1, r.GetUnknown()+1, pUnknown[0] * sizeof(BYTE) ) == 0; +} +ScUnknownToken::~ScUnknownToken() +{ + delete [] pUnknown; +} + + ////////////////////////////////////////////////////////////////////////// ScToken* ScTokenArray::GetNextReference() @@ -607,20 +953,20 @@ BOOL ScTokenArray::IsReference( ScRange& rRange ) const BOOL bIs = FALSE; if ( pCode && nLen == 1 ) { - ScToken* pToken = pCode[0]; + const ScToken* pToken = pCode[0]; if ( pToken ) { if ( pToken->GetType() == svSingleRef ) { - SingleRefData& rRef = pToken->GetReference().Ref1; + const SingleRefData& rRef = ((const ScSingleRefToken*)pToken)->GetSingleRef(); rRange.aStart = rRange.aEnd = ScAddress( rRef.nCol, rRef.nRow, rRef.nTab ); bIs = TRUE; } else if ( pToken->GetType() == svDoubleRef ) { - ComplRefData& rCompl = pToken->GetReference(); - SingleRefData& rRef1 = rCompl.Ref1; - SingleRefData& rRef2 = rCompl.Ref2; + const ComplRefData& rCompl = ((const ScDoubleRefToken*)pToken)->GetDoubleRef(); + const SingleRefData& rRef1 = rCompl.Ref1; + const SingleRefData& rRef2 = rCompl.Ref2; rRange.aStart = ScAddress( rRef1.nCol, rRef1.nRow, rRef1.nTab ); rRange.aEnd = ScAddress( rRef2.nCol, rRef2.nRow, rRef2.nTab ); bIs = TRUE; @@ -630,9 +976,13 @@ BOOL ScTokenArray::IsReference( ScRange& rRange ) const return bIs; } -inline void lcl_GetAddress( ScAddress& rAddress, const ScToken& rToken ) // rToken must be a svSingleRef +inline void lcl_GetAddress( ScAddress& rAddress, const ScToken& rToken ) { - rAddress.Set( rToken.aRef.Ref1.nCol, rToken.aRef.Ref1.nRow, rToken.aRef.Ref1.nTab ); + if ( rToken.GetType() == svSingleRef ) + { + const SingleRefData& rRef = ((const ScSingleRefToken&)rToken).GetSingleRef(); + rAddress.Set( rRef.nCol, rRef.nRow, rRef.nTab ); + } } BOOL ScTokenArray::GetTableOpRefs( @@ -735,7 +1085,7 @@ void ScTokenArray::Load30( SvStream& rStream, const ScAddress& rPos ) { Clear(); ScToken* pToks[ MAXCODE ]; - ScToken t; + ScRawToken t; for( nLen = 0; nLen < MAXCODE; nLen++ ) { t.Load30( rStream ); @@ -747,7 +1097,7 @@ void ScTokenArray::Load30( SvStream& rStream, const ScAddress& rPos ) nRefs++; t.aRef.CalcRelFromAbs( rPos ); } - ScToken* p = pToks[ nLen ] = t.Clone(); + ScToken* p = pToks[ nLen ] = t.CreateToken(); p->IncRef(); } pCode = new ScToken*[ nLen ]; @@ -779,7 +1129,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos ) rStream >> nError; ScToken* pToks[ MAXCODE ]; ScToken** pp = pToks; - ScToken t; + ScRawToken t; if( cData & 0x40 ) { rStream >> nLen; @@ -789,7 +1139,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos ) if ( t.GetType() == svSingleRef || t.GetType() == svDoubleRef ) t.aRef.CalcRelFromAbs( rPos ); // gespeichert wurde und wird immer absolut - *pp = t.Clone(); + *pp = t.CreateToken(); (*pp++)->IncRef(); } pCode = new ScToken*[ nLen ]; @@ -813,7 +1163,7 @@ void ScTokenArray::Load( SvStream& rStream, USHORT nVer, const ScAddress& rPos ) if ( t.GetType() == svSingleRef || t.GetType() == svDoubleRef ) t.aRef.CalcRelFromAbs( rPos ); // gespeichert wurde und wird immer absolut - *pp = t.Clone(); + *pp = t.CreateToken(); } else { @@ -874,10 +1224,10 @@ void ScTokenArray::Store( SvStream& rStream, const ScAddress& rPos ) const switch ( (*p)->GetType() ) { case svSingleRef : - (*p)->aRef.Ref1.CalcAbsIfRel( rPos ); + (*p)->GetSingleRef().CalcAbsIfRel( rPos ); break; case svDoubleRef : - (*p)->aRef.CalcAbsIfRel( rPos ); + (*p)->GetDoubleRef().CalcAbsIfRel( rPos ); break; } (*p)->Store( rStream ); @@ -911,10 +1261,10 @@ void ScTokenArray::Store( SvStream& rStream, const ScAddress& rPos ) const switch ( t->GetType() ) { case svSingleRef : - t->aRef.Ref1.CalcAbsIfRel( rPos ); + t->GetSingleRef().CalcAbsIfRel( rPos ); break; case svDoubleRef : - t->aRef.CalcAbsIfRel( rPos ); + t->GetDoubleRef().CalcAbsIfRel( rPos ); break; } rStream << (BYTE) 0xFF; @@ -1052,6 +1402,11 @@ void ScTokenArray::Clear() ClearRecalcMode(); } +ScToken* ScTokenArray::AddToken( const ScRawToken& r ) +{ + return Add( r.CreateToken() ); +} + ScToken* ScTokenArray::AddToken( const ScToken& r ) { return Add( r.Clone() ); @@ -1081,74 +1436,69 @@ ScToken* ScTokenArray::Add( ScToken* t ) ScToken* ScTokenArray::AddOpCode( OpCode e ) { - ScToken t; + ScRawToken t; t.SetOpCode( e ); return AddToken( t ); } ScToken* ScTokenArray::AddString( const sal_Unicode* pStr ) { - ScToken t; - t.SetString( pStr ); - return AddToken( t ); + return AddString( String( pStr ) ); } -ScToken* ScTokenArray::AddDouble(double rVal ) +ScToken* ScTokenArray::AddString( const String& rStr ) { - ScToken t; - t.SetDouble( rVal ); - return AddToken( t ); + return Add( new ScStringToken( rStr ) ); +} + +ScToken* ScTokenArray::AddDouble( double fVal ) +{ + return Add( new ScDoubleToken( fVal ) ); } ScToken* ScTokenArray::AddSingleReference( const SingleRefData& rRef ) { - ScToken t; - t.SetSingleReference( rRef ); - return AddToken( t ); + return Add( new ScSingleRefToken( rRef ) ); } ScToken* ScTokenArray::AddDoubleReference( const ComplRefData& rRef ) { - ScToken t; - t.SetDoubleReference( rRef ); - return AddToken( t ); + return Add( new ScDoubleRefToken( rRef ) ); } ScToken* ScTokenArray::AddName( USHORT n ) { - ScToken t; - t.SetName( n ); - return AddToken( t ); + return Add( new ScIndexToken( ocName, n ) ); } ScToken* ScTokenArray::AddExternal( const sal_Unicode* pStr ) { - ScToken t; - t.SetExternal( pStr ); - return AddToken( t ); + return AddExternal( String( pStr ) ); +} + +ScToken* ScTokenArray::AddExternal( const String& rStr ) +{ + return Add( new ScExternalToken( ocExternal, rStr ) ); } ScToken* ScTokenArray::AddMatrix( ScMatrix* p ) { - ScToken t; - t.SetMatrix( p ); - return AddToken( t ); + return Add( new ScMatrixToken( p ) ); } ScToken* ScTokenArray::AddColRowName( const SingleRefData& rRef ) { - ScToken t; - t.SetSingleReference( rRef ); - t.eOp = ocColRowName; - return AddToken( t ); + return Add( new ScSingleRefToken( ocColRowName, rRef ) ); } ScToken* ScTokenArray::AddBad( const sal_Unicode* pStr ) { - ScToken t; - t.SetString( pStr ); - t.eOp = ocBad; - return AddToken( t ); + return AddBad( String( pStr ) ); +} + +ScToken* ScTokenArray::AddBad( const String& rStr ) +{ + return Add( new ScStringToken( ocBad, rStr ) ); } @@ -1191,7 +1541,7 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend, ScToken* t = pRPN[nRPN-1]; if ( t->GetType() == svByte ) { - BYTE nParamCount = t->cByte; + BYTE nParamCount = t->GetByte(); if ( nParamCount && nRPN > nParamCount ) { BOOL bRet = FALSE; @@ -1202,9 +1552,49 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend, switch ( p->GetType() ) { case svSingleRef : + { + SingleRefData& rRef = p->GetSingleRef(); + rRef.CalcAbsIfRel( rPos ); + switch ( eDir ) + { + case DIR_BOTTOM : + if ( rRef.nRow == nRow + && rRef.nRow > nExtend ) + { + nExtend = rRef.nRow; + bRet = TRUE; + } + break; + case DIR_RIGHT : + if ( rRef.nCol == nCol + && rRef.nCol > nExtend ) + { + nExtend = rRef.nCol; + bRet = TRUE; + } + break; + case DIR_TOP : + if ( rRef.nRow == nRow + && rRef.nRow < nExtend ) + { + nExtend = rRef.nRow; + bRet = TRUE; + } + break; + case DIR_LEFT : + if ( rRef.nCol == nCol + && rRef.nCol < nExtend ) + { + nExtend = rRef.nCol; + bRet = TRUE; + } + break; + } + } + break; case svDoubleRef : { - ComplRefData& rRef = p->GetReference(); + ComplRefData& rRef = p->GetDoubleRef(); rRef.CalcAbsIfRel( rPos ); switch ( eDir ) { @@ -1242,6 +1632,7 @@ BOOL ScTokenArray::GetAdjacentExtendOfOuterFuncRefs( USHORT& nExtend, break; } } + break; } // switch } // for return bRet; @@ -1323,8 +1714,7 @@ BOOL ScTokenArray::HasMatrixDoubleRefOps() // RPN-Interpreter Simulation // als Ergebnis jeder Funktion wird einfach ein Double angenommen ScToken** pStack = new ScToken* [nRPN]; - ScToken* pResult = new ScToken; - pResult->SetDouble( 0.0 ); + ScToken* pResult = new ScDoubleToken( ocPush, 0.0 ); short sp = 0; for ( USHORT j = 0; j < nRPN; j++ ) { @@ -1387,7 +1777,7 @@ BOOL ScTokenArray::HasMatrixDoubleRefOps() /////////////////////////////////////////////////////////////////////////// -void ScToken::Load30( SvStream& rStream ) +void ScRawToken::Load30( SvStream& rStream ) { UINT16 nOp; BYTE n; @@ -1507,7 +1897,7 @@ void ScToken::Load30( SvStream& rStream ) // Bei unbekannten Tokens steht in cStr (k)ein Pascal-String (cStr[0] = Laenge), // der nur gepuffert wird. cStr[0] = GESAMT-Laenge inkl. [0] !!! -void ScToken::Load( SvStream& rStream, USHORT nVer ) +void ScRawToken::Load( SvStream& rStream, USHORT nVer ) { BYTE n; UINT16 nOp; @@ -1637,59 +2027,75 @@ void ScToken::Store( SvStream& rStream ) const switch( eType ) { case svByte: - rStream << cByte; + rStream << GetByte(); break; case svDouble: - rStream << nValue; + rStream << GetDouble(); break; case svExternal: { - ByteString aTmp( cStr+1, rStream.GetStreamCharSet() ); - rStream << cByte + ByteString aTmp( GetExternal(), rStream.GetStreamCharSet() ); + aTmp.Erase( 255 ); // old SO5 can't handle more + rStream << GetByte() << (UINT8) aTmp.Len(); rStream.Write( aTmp.GetBuffer(), (UINT8) aTmp.Len() ); } break; case svString: { - ByteString aTmp( cStr, rStream.GetStreamCharSet() ); + ByteString aTmp( GetString(), rStream.GetStreamCharSet() ); + aTmp.Erase( 255 ); // old SO5 can't handle more rStream << (UINT8) aTmp.Len(); rStream.Write( aTmp.GetBuffer(), (UINT8) aTmp.Len() ); } break; case svSingleRef: - case svDoubleRef: { - const SingleRefData& r = aRef.Ref1; + const SingleRefData& r = GetSingleRef(); BYTE n = r.CreateStoreByteFromFlags(); rStream << (INT16) r.nCol << (INT16) r.nRow << (INT16) r.nTab << (BYTE) n; - if( eType == svDoubleRef ) - { - const SingleRefData& r = aRef.Ref2; - BYTE n = r.CreateStoreByteFromFlags(); - rStream << (INT16) r.nCol - << (INT16) r.nRow - << (INT16) r.nTab - << (BYTE) n; - } + } break; + case svDoubleRef: + { + const ComplRefData& rRef = GetDoubleRef(); + const SingleRefData& r1 = rRef.Ref1; + BYTE n = r1.CreateStoreByteFromFlags(); + rStream << (INT16) r1.nCol + << (INT16) r1.nRow + << (INT16) r1.nTab + << (BYTE) n; + const SingleRefData& r2 = rRef.Ref2; + n = r2.CreateStoreByteFromFlags(); + rStream << (INT16) r2.nCol + << (INT16) r2.nRow + << (INT16) r2.nTab + << (BYTE) n; } + break; case svIndex: - rStream << (UINT16) nIndex; + rStream << (UINT16) GetIndex(); break; case svJump: - rStream << (BYTE) nJump[ 0 ]; - for( i = 1; i <= nJump[ 0 ]; i++ ) - rStream << (UINT16) nJump[ i ]; + { + short* pJump = GetJump(); + rStream << (BYTE) pJump[ 0 ]; + for( i = 1; i <= pJump[ 0 ]; i++ ) + rStream << (UINT16) pJump[ i ]; + } break; case svMissing: case svErr: break; default: - rStream.Write( cStr, cStr[ 0 ] ); + { + BYTE* pUnknown = GetUnknown(); + if ( pUnknown ) + rStream.Write( pUnknown, pUnknown[ 0 ] ); + } } } diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx index ce6a80704d8b..233125a32faf 100644 --- a/sc/source/filter/inc/imp_op.hxx +++ b/sc/source/filter/inc/imp_op.hxx @@ -2,9 +2,9 @@ * * $RCSfile: imp_op.hxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: dr $ $Date: 2001-02-08 14:12:29 $ + * last change: $Author: er $ $Date: 2001-02-21 18:38:34 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -96,7 +96,7 @@ class SvStream; class ScFormulaCell; class SdrObject; class ScDocument; -struct ScToken; +class ScToken; class ScToken2; class ScExtDocOptions; class _ScRangeListTabs; diff --git a/sc/source/filter/inc/tokstack.hxx b/sc/source/filter/inc/tokstack.hxx index 63e5680189a7..c930b154b268 100644 --- a/sc/source/filter/inc/tokstack.hxx +++ b/sc/source/filter/inc/tokstack.hxx @@ -2,9 +2,9 @@ * * $RCSfile: tokstack.hxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: gt $ $Date: 2000-09-22 14:55:27 $ + * last change: $Author: er $ $Date: 2001-02-21 18:38:34 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -82,7 +82,7 @@ typedef OpCode DefTokenId; //------------------------------------------------------------------------ struct ComplRefData; class TokenStack; -struct ScToken; +class ScToken; enum E_TYPE diff --git a/sc/source/ui/miscdlgs/anyrefdg.cxx b/sc/source/ui/miscdlgs/anyrefdg.cxx index 37fba40935eb..a8382ccfa38b 100644 --- a/sc/source/ui/miscdlgs/anyrefdg.cxx +++ b/sc/source/ui/miscdlgs/anyrefdg.cxx @@ -2,9 +2,9 @@ * * $RCSfile: anyrefdg.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: nn $ $Date: 2000-11-09 19:54:11 $ + * last change: $Author: er $ $Date: 2001-02-21 18:39:37 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -698,7 +698,7 @@ void ScAnyRefDlg::ShowFormulaReference( const XubString& rStr ) pTabViewShell->ClearHighlightRanges(); pScTokA->Reset(); - ScToken* pToken=pScTokA->GetNextReference(); + const ScToken* pToken=pScTokA->GetNextReference(); USHORT nIndex=0; @@ -710,17 +710,19 @@ void ScAnyRefDlg::ShowFormulaReference( const XubString& rStr ) if(pToken->GetType()==svSingleRef || bDoubleRef) { ScRange aRange; - ComplRefData aRef( pToken->GetReference() ); - aRef.Ref1.CalcAbsIfRel( aPos ); if(bDoubleRef) { - aRef.Ref2.CalcAbsIfRel( aPos ); - aRange=ScRange( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab, - aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab); + ComplRefData aRef( pToken->GetDoubleRef() ); + aRef.CalcAbsIfRel( aPos ); + aRange.aStart.Set( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab ); + aRange.aEnd.Set( aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab ); } else { - aRange=ScRange( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab); + SingleRefData aRef( pToken->GetSingleRef() ); + aRef.CalcAbsIfRel( aPos ); + aRange.aStart.Set( aRef.nCol, aRef.nRow, aRef.nTab ); + aRange.aEnd = aRange.aStart; } ColorData aColName=ScRangeFindList::GetColorName(nIndex++); pTabViewShell->AddHighlightRange(aRange, aColName); |