2001-02-21 11:39:37 -06:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* $RCSfile: token.hxx,v $
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2007-07-06 06:31:14 -05:00
|
|
|
* $Revision: 1.13 $
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2007-07-06 06:31:14 -05:00
|
|
|
* last change: $Author: rt $ $Date: 2007-07-06 12:31:14 $
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* The Contents of this file are made available subject to
|
|
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* 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.
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* 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.
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
2005-09-08 12:01:09 -05:00
|
|
|
* 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
|
2001-02-21 11:39:37 -06:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef SC_TOKEN_HXX
|
|
|
|
#define SC_TOKEN_HXX
|
|
|
|
|
2007-07-06 06:31:14 -05:00
|
|
|
#include <memory>
|
2001-02-21 11:39:37 -06:00
|
|
|
|
|
|
|
#ifndef SC_OPCODE_HXX
|
|
|
|
#include "opcode.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef SC_REFDATA_HXX
|
|
|
|
#include "refdata.hxx"
|
|
|
|
#endif
|
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
#ifndef SC_MATRIX_HXX
|
|
|
|
#include "scmatrix.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef SC_INTRUREF_HXX
|
|
|
|
#include "intruref.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SVMEMPOOL_HXX
|
|
|
|
#include <tools/mempool.hxx>
|
|
|
|
#endif
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
//! Fixed values!
|
2001-02-28 04:51:17 -06:00
|
|
|
enum StackVarEnum
|
2001-02-21 11:39:37 -06:00
|
|
|
{
|
|
|
|
svByte,
|
|
|
|
svDouble,
|
|
|
|
svString,
|
|
|
|
svSingleRef,
|
|
|
|
svDoubleRef,
|
|
|
|
svMatrix,
|
|
|
|
svIndex,
|
|
|
|
svJump,
|
|
|
|
svExternal, // Byte + String
|
|
|
|
|
2002-09-27 11:19:11 -05:00
|
|
|
svFAP, // FormulaAutoPilot only, ever exported
|
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
svJumpMatrix, // 2003-07-02
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
svMissing = 0x70, // 0 or ""
|
|
|
|
svErr // unknown StackType
|
|
|
|
};
|
|
|
|
|
2001-02-28 04:51:17 -06:00
|
|
|
#ifdef PRODUCT
|
|
|
|
// save memory since compilers tend to int an enum
|
|
|
|
typedef BYTE StackVar;
|
|
|
|
#else
|
|
|
|
// have enum names in debugger
|
|
|
|
typedef StackVarEnum StackVar;
|
|
|
|
#endif
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
class ScJumpMatrix;
|
2001-02-21 11:39:37 -06:00
|
|
|
|
|
|
|
class ScToken
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
|
|
|
OpCode eOp; // OpCode
|
|
|
|
const StackVar eType; // type of data
|
2005-05-13 01:32:54 -05:00
|
|
|
mutable USHORT nRefCnt; // reference count
|
2001-02-21 11:39:37 -06:00
|
|
|
|
|
|
|
// 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; }
|
2005-05-13 01:32:54 -05:00
|
|
|
inline void IncRef() const { nRefCnt++; }
|
|
|
|
inline void DecRef() const
|
|
|
|
{
|
|
|
|
if (!--nRefCnt)
|
|
|
|
const_cast<ScToken*>(this)->Delete();
|
|
|
|
}
|
2001-02-21 11:39:37 -06:00
|
|
|
inline USHORT GetRef() const { return nRefCnt; }
|
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
/**
|
|
|
|
Dummy methods to avoid switches and casts where possible,
|
|
|
|
the real token classes have to overload the appropriate method[s].
|
|
|
|
The only methods valid anytime if not overloaded are:
|
|
|
|
|
|
|
|
- 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.
|
|
|
|
|
|
|
|
- HasForceArray() since also this is only used for operators and
|
|
|
|
functions and is 0 for other tokens.
|
|
|
|
|
|
|
|
Any other non-overloaded method pops up an assertion.
|
|
|
|
*/
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
virtual BYTE GetByte() const;
|
|
|
|
virtual void SetByte( BYTE n );
|
2004-03-08 04:42:25 -06:00
|
|
|
virtual bool HasForceArray() const;
|
|
|
|
virtual void SetForceArray( bool b );
|
2001-02-21 11:39:37 -06:00
|
|
|
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();
|
2001-10-12 06:32:37 -05:00
|
|
|
virtual const SingleRefData& GetSingleRef2() const;
|
|
|
|
virtual SingleRefData& GetSingleRef2();
|
2001-02-21 11:39:37 -06:00
|
|
|
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;
|
2002-09-27 11:19:11 -05:00
|
|
|
virtual ScToken* GetFAPOrigToken() const;
|
2004-03-08 04:42:25 -06:00
|
|
|
virtual ScJumpMatrix* GetJumpMatrix() const;
|
2001-02-21 11:39:37 -06:00
|
|
|
|
|
|
|
ScToken* Clone() const;
|
|
|
|
|
|
|
|
void Store( SvStream& ) const;
|
|
|
|
|
|
|
|
virtual BOOL operator==( const ScToken& rToken ) const;
|
|
|
|
BOOL TextEqual( const ScToken& rToken ) const;
|
2001-10-12 06:32:37 -05:00
|
|
|
BOOL Is3DRef() const; // reference with 3D flag set
|
2001-02-21 11:39:37 -06:00
|
|
|
|
2001-10-18 03:03:25 -05:00
|
|
|
// If token in RPN resulted from resolving a name and contains an absolute
|
|
|
|
// reference. Token must be obtained through ScTokenArray::GetNextReferenceRPN()
|
|
|
|
// or similar.
|
|
|
|
BOOL IsRPNReferenceAbsName() const;
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
static size_t GetStrLenBytes( xub_StrLen nLen )
|
|
|
|
{ return nLen * sizeof(sal_Unicode); }
|
|
|
|
static size_t GetStrLenBytes( const String& rStr )
|
|
|
|
{ return GetStrLenBytes( rStr.Len() ); }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-03-08 04:42:25 -06:00
|
|
|
typedef ScSimpleIntrusiveReference< class ScToken > ScTokenRef;
|
2005-05-13 01:32:54 -05:00
|
|
|
typedef ScSimpleIntrusiveReference< const class ScToken > ScConstTokenRef;
|
2002-09-27 11:19:11 -05:00
|
|
|
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
class ScByteToken : public ScToken
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
BYTE nByte;
|
2004-03-08 04:42:25 -06:00
|
|
|
bool bHasForceArray;
|
2002-09-27 11:19:11 -05:00
|
|
|
protected:
|
2004-03-08 04:42:25 -06:00
|
|
|
ScByteToken( OpCode e, BYTE n, StackVar v, bool b ) :
|
|
|
|
ScToken( e, v ), nByte( n ),
|
|
|
|
bHasForceArray( b ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
public:
|
2004-03-08 04:42:25 -06:00
|
|
|
ScByteToken( OpCode e, BYTE n, bool b ) :
|
|
|
|
ScToken( e, svByte ), nByte( n ),
|
|
|
|
bHasForceArray( b ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
ScByteToken( OpCode e, BYTE n ) :
|
2004-03-08 04:42:25 -06:00
|
|
|
ScToken( e, svByte ), nByte( n ),
|
|
|
|
bHasForceArray( false ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
ScByteToken( OpCode e ) :
|
2004-03-08 04:42:25 -06:00
|
|
|
ScToken( e, svByte ), nByte( 0 ),
|
|
|
|
bHasForceArray( false ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
ScByteToken( const ScByteToken& r ) :
|
2004-03-08 04:42:25 -06:00
|
|
|
ScToken( r ), nByte( r.nByte ),
|
|
|
|
bHasForceArray( r.bHasForceArray ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
virtual BYTE GetByte() const;
|
|
|
|
virtual void SetByte( BYTE n );
|
2004-03-08 04:42:25 -06:00
|
|
|
virtual bool HasForceArray() const;
|
|
|
|
virtual void SetForceArray( bool b );
|
2001-02-21 11:39:37 -06:00
|
|
|
virtual BOOL operator==( const ScToken& rToken ) const;
|
|
|
|
|
|
|
|
DECL_FIXEDMEMPOOL_NEWDEL( ScByteToken );
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-09-27 11:19:11 -05:00
|
|
|
// 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 ) :
|
2004-03-08 04:42:25 -06:00
|
|
|
ScByteToken( e, n, svFAP, false ),
|
|
|
|
pOrigToken( p ) {}
|
2002-09-27 11:19:11 -05:00
|
|
|
ScFAPToken( const ScFAPToken& r ) :
|
|
|
|
ScByteToken( r ), pOrigToken( r.pOrigToken ) {}
|
|
|
|
virtual ScToken* GetFAPOrigToken() const;
|
|
|
|
virtual BOOL operator==( const ScToken& rToken ) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2001-02-21 11:39:37 -06:00
|
|
|
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();
|
2001-10-12 06:32:37 -05:00
|
|
|
virtual const SingleRefData& GetSingleRef2() const;
|
|
|
|
virtual SingleRefData& GetSingleRef2();
|
2001-02-21 11:39:37 -06:00
|
|
|
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:
|
2004-03-08 04:42:25 -06:00
|
|
|
ScMatrixRef pMatrix;
|
2001-02-21 11:39:37 -06:00
|
|
|
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;
|
2004-03-08 04:42:25 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Only created from within the interpreter, no conversion from ScRawToken,
|
|
|
|
// never added to ScTokenArray!
|
|
|
|
class ScJumpMatrixToken : public ScToken
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
ScJumpMatrix* pJumpMatrix;
|
|
|
|
public:
|
|
|
|
ScJumpMatrixToken( ScJumpMatrix* p ) :
|
|
|
|
ScToken( ocPush, svJumpMatrix ), pJumpMatrix( p ) {}
|
|
|
|
ScJumpMatrixToken( const ScJumpMatrixToken& r ) :
|
|
|
|
ScToken( r ), pJumpMatrix( r.pJumpMatrix ) {}
|
2005-03-29 06:29:38 -06:00
|
|
|
virtual ~ScJumpMatrixToken();
|
2004-03-08 04:42:25 -06:00
|
|
|
virtual ScJumpMatrix* GetJumpMatrix() const;
|
|
|
|
virtual BOOL operator==( const ScToken& rToken ) const;
|
2001-02-21 11:39:37 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class ScExternalToken : public ScToken
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
String aExternal;
|
|
|
|
BYTE nByte;
|
|
|
|
public:
|
|
|
|
ScExternalToken( OpCode e, BYTE n, const String& r ) :
|
2005-03-08 04:28:51 -06:00
|
|
|
ScToken( e, svExternal ), aExternal( r ),
|
|
|
|
nByte( n ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
ScExternalToken( OpCode e, const String& r ) :
|
2005-03-08 04:28:51 -06:00
|
|
|
ScToken( e, svExternal ), aExternal( r ),
|
|
|
|
nByte( 0 ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
ScExternalToken( const ScExternalToken& r ) :
|
2005-03-08 04:28:51 -06:00
|
|
|
ScToken( r ), aExternal( r.aExternal ),
|
|
|
|
nByte( r.nByte ) {}
|
2001-02-21 11:39:37 -06:00
|
|
|
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;
|
2003-06-12 04:17:25 -05:00
|
|
|
SingleRefData* pS;
|
|
|
|
ComplRefData* pD;
|
|
|
|
|
|
|
|
// not implemented, prevent usage
|
|
|
|
SingleDoubleRefModifier( const SingleDoubleRefModifier& );
|
|
|
|
SingleDoubleRefModifier& operator=( const SingleDoubleRefModifier& );
|
2001-02-21 11:39:37 -06:00
|
|
|
|
|
|
|
public:
|
2003-06-12 04:17:25 -05:00
|
|
|
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;
|
|
|
|
}
|
2001-02-21 11:39:37 -06:00
|
|
|
~SingleDoubleRefModifier()
|
2003-06-12 04:17:25 -05:00
|
|
|
{
|
|
|
|
if ( pS )
|
|
|
|
*pS = (*pD).Ref1;
|
|
|
|
}
|
|
|
|
inline ComplRefData& Ref() { return *pD; }
|
2001-02-21 11:39:37 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
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
|