diff options
Diffstat (limited to 'inc/bf_sc/token.hxx')
-rw-r--r-- | inc/bf_sc/token.hxx | 482 |
1 files changed, 482 insertions, 0 deletions
diff --git a/inc/bf_sc/token.hxx b/inc/bf_sc/token.hxx new file mode 100644 index 000000000..8b9436a43 --- /dev/null +++ b/inc/bf_sc/token.hxx @@ -0,0 +1,482 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef SC_TOKEN_HXX +#define SC_TOKEN_HXX + +#include <bf_svtools/bf_solar.h> + +#include <string.h> // memcpy(), don't use memory.h + +#include "opcode.hxx" + +#include "refdata.hxx" +namespace binfilter { + + +enum StackVarEnum +{ + svByte, + svDouble, + svString, + svSingleRef, + svDoubleRef, + svMatrix, + svIndex, + svJump, + svExternal, // Byte + String + + svFAP, // FormulaAutoPilot only, ever exported + + svMissing = 0x70, // 0 or "" + svErr // unknown StackType +}; + +#ifndef DBG_UTIL +// save memory since compilers tend to int an enum +typedef BYTE StackVar; +#else +// have enum names in debugger +typedef StackVarEnum StackVar; +#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 StackVar GetType() const { return eType; } + inline OpCode GetOpCode() const { return eOp; } + 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 const SingleRefData& GetSingleRef2() const; + virtual SingleRefData& GetSingleRef2(); + 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; + virtual ScToken* GetFAPOrigToken() 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 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; } +}; + + +class ScByteToken : public ScToken +{ +private: + BYTE nByte; +protected: + ScByteToken( OpCode e, BYTE n, StackVar v ) : + ScToken( e, v ), nByte( n ) {} +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 ); +}; + + +// A special token for the FormulaAutoPilot only. Keeps a reference pointer of +// the token of which it was created for comparison. +class ScFAPToken : public ScByteToken +{ +private: + ScTokenRef pOrigToken; +public: + ScFAPToken( OpCode e, BYTE n, ScToken* p ) : + ScByteToken( e, n, svFAP ), pOrigToken( p ) {} + ScFAPToken( const ScFAPToken& r ) : + ScByteToken( r ), pOrigToken( r.pOrigToken ) {} + virtual ScToken* GetFAPOrigToken() const; + virtual BOOL operator==( const ScToken& rToken ) const; +}; + + +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 const SingleRefData& GetSingleRef2() const; + virtual SingleRefData& GetSingleRef2(); + 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 ) + , aExternal( r ) + , nByte( n ) + {} + ScExternalToken( OpCode e, const String& r ) + : ScToken( e, svExternal ) + , aExternal( r ) + , nByte( 0 ) + {} + ScExternalToken( const ScExternalToken& r ) + : ScToken( r ) + , aExternal( r.aExternal ) + , nByte( r.nByte ) + {} + 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; +}; + + +// Simplify argument passing to RefUpdate methods with ScSingleRefToken or +// ScDoubleRefToken +class SingleDoubleRefModifier +{ + ComplRefData aDub; + SingleRefData* pS; + ComplRefData* pD; + + // not implemented, prevent usage + SingleDoubleRefModifier( const SingleDoubleRefModifier& ); + SingleDoubleRefModifier& operator=( const SingleDoubleRefModifier& ); + +public: + SingleDoubleRefModifier( ScToken& rT ) + { + if ( rT.GetType() == svSingleRef ) + { + pS = &rT.GetSingleRef(); + aDub.Ref1 = aDub.Ref2 = *pS; + pD = &aDub; + } + else + { + pS = 0; + pD = &rT.GetDoubleRef(); + } + } + SingleDoubleRefModifier( SingleRefData& rS ) + { + pS = &rS; + aDub.Ref1 = aDub.Ref2 = *pS; + pD = &aDub; + } + ~SingleDoubleRefModifier() + { + if ( pS ) + *pS = (*pD).Ref1; + } + inline ComplRefData& Ref() { return *pD; } +}; + +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() + {} +}; + +} //namespace binfilter +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |