2000-09-18 15:18:56 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2005-09-29 11:52:47 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2005-09-29 11:52:47 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* $RCSfile: symtbl.cxx,v $
|
2008-07-02 08:59:06 +00:00
|
|
|
* $Revision: 1.20 $
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* OpenOffice.org 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 version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:52:41 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 09:03:42 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_basic.hxx"
|
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
#include "sbcomp.hxx"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
SV_IMPL_PTRARR(SbiStrings,String*)
|
|
|
|
SV_IMPL_PTRARR(SbiSymbols,SbiSymDef*)
|
|
|
|
|
|
|
|
// Alle Symbolnamen werden im Stringpool des Symbol-Pools abgelegt, damit
|
|
|
|
// alle Symbole im gleichen Case verarbeitet werden. Beim Speichern des
|
|
|
|
// Code-Images wird der globale Stringpool mit den entsprechenden Sympools
|
|
|
|
// gespeichert. Der lokale Stringpool nimmt alle Symbole auf, die nicht
|
|
|
|
// ins Image wandern (Labels, Konstantennamen etc).
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
|*
|
|
|
|
|* SbiStringPool
|
|
|
|
|*
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
SbiStringPool::SbiStringPool( SbiParser* p )
|
|
|
|
{
|
|
|
|
pParser = p;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiStringPool::~SbiStringPool()
|
|
|
|
{}
|
|
|
|
|
|
|
|
// Suchen
|
|
|
|
|
|
|
|
const String& SbiStringPool::Find( USHORT n ) const
|
|
|
|
{
|
|
|
|
if( !n || n > aData.Count() )
|
|
|
|
return aEmpty;
|
|
|
|
else
|
|
|
|
return *aData.GetObject( n-1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hinzufuegen eines Strings. Der String wird Case-Insensitiv
|
|
|
|
// verglichen.
|
|
|
|
|
|
|
|
short SbiStringPool::Add( const String& rVal, BOOL bNoCase )
|
|
|
|
{
|
|
|
|
USHORT n = aData.Count();
|
|
|
|
for( USHORT i = 0; i < n; i++ )
|
|
|
|
{
|
|
|
|
String* p = aData.GetObject( i );
|
|
|
|
if( ( bNoCase && p->Equals( rVal ) )
|
|
|
|
|| ( !bNoCase && p->EqualsIgnoreCaseAscii( rVal ) ) )
|
|
|
|
return i+1;
|
|
|
|
}
|
|
|
|
const String* pNew = new String( rVal );
|
|
|
|
aData.Insert( pNew, n++ );
|
|
|
|
return (short) n;
|
|
|
|
}
|
|
|
|
|
|
|
|
short SbiStringPool::Add( double n, SbxDataType t )
|
|
|
|
{
|
|
|
|
char buf[ 40 ];
|
|
|
|
switch( t )
|
|
|
|
{
|
2003-03-18 15:28:40 +00:00
|
|
|
case SbxINTEGER: snprintf( buf, sizeof(buf), "%d", (short) n ); break;
|
|
|
|
case SbxLONG: snprintf( buf, sizeof(buf), "%ld", (long) n ); break;
|
|
|
|
case SbxSINGLE: snprintf( buf, sizeof(buf), "%.6g", (float) n ); break;
|
|
|
|
case SbxDOUBLE: snprintf( buf, sizeof(buf), "%.16g", n ); break;
|
2006-06-19 16:43:20 +00:00
|
|
|
default: break;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
return Add( String::CreateFromAscii( buf ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
|*
|
|
|
|
|* SbiSymPool
|
|
|
|
|*
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
SbiSymPool::SbiSymPool( SbiStringPool& r, SbiSymScope s ) : rStrings( r )
|
|
|
|
{
|
|
|
|
pParser = r.GetParser();
|
|
|
|
eScope = s;
|
|
|
|
pParent = NULL;
|
|
|
|
nCur =
|
|
|
|
nProcId = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiSymPool::~SbiSymPool()
|
|
|
|
{}
|
|
|
|
|
|
|
|
// Inhalt loeschen
|
|
|
|
|
|
|
|
void SbiSymPool::Clear()
|
|
|
|
{
|
|
|
|
aData.DeleteAndDestroy( 0, aData.Count() );
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::First()
|
|
|
|
{
|
|
|
|
nCur = (USHORT) -1;
|
|
|
|
return Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::Next()
|
|
|
|
{
|
|
|
|
if( ++nCur >= aData.Count() )
|
|
|
|
return NULL;
|
|
|
|
else
|
|
|
|
return aData.GetObject( nCur );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hinzufuegen eines Symbols
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::AddSym( const String& rName )
|
|
|
|
{
|
|
|
|
SbiSymDef* p = new SbiSymDef( rName );
|
|
|
|
p->nPos = aData.Count();
|
|
|
|
p->nId = rStrings.Add( rName );
|
|
|
|
p->nProcId = nProcId;
|
|
|
|
p->pIn = this;
|
|
|
|
const SbiSymDef* q = p;
|
|
|
|
aData.Insert( q, q->nPos );
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiProcDef* SbiSymPool::AddProc( const String& rName )
|
|
|
|
{
|
|
|
|
SbiProcDef* p = new SbiProcDef( pParser, rName );
|
|
|
|
p->nPos = aData.Count();
|
|
|
|
p->nId = rStrings.Add( rName );
|
|
|
|
// Procs sind immer global
|
|
|
|
p->nProcId = 0;
|
|
|
|
p->pIn = this;
|
|
|
|
const SbiSymDef* q = p;
|
|
|
|
aData.Insert( q, q->nPos );
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hinzufuegen einer extern aufgebauten Symboldefinition
|
|
|
|
|
|
|
|
void SbiSymPool::Add( SbiSymDef* pDef )
|
|
|
|
{
|
|
|
|
if( pDef && pDef->pIn != this )
|
|
|
|
{
|
|
|
|
if( pDef->pIn )
|
|
|
|
{
|
|
|
|
#ifndef PRODUCT
|
|
|
|
// schon in einem anderen Pool drin!
|
|
|
|
pParser->Error( SbERR_INTERNAL_ERROR, "Dbl Pool" );
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
pDef->nPos = aData.Count();
|
|
|
|
if( !pDef->nId )
|
|
|
|
{
|
|
|
|
// Bei statischen Variablen muss ein eindeutiger Name
|
|
|
|
// im Stringpool erzeugt werden (Form ProcName:VarName)
|
|
|
|
String aName( pDef->aName );
|
|
|
|
if( pDef->IsStatic() )
|
|
|
|
{
|
|
|
|
aName = pParser->aGblStrings.Find( nProcId );
|
|
|
|
aName += ':';
|
|
|
|
aName += pDef->aName;
|
|
|
|
}
|
|
|
|
pDef->nId = rStrings.Add( aName );
|
|
|
|
}
|
|
|
|
// Procs sind immer global
|
|
|
|
if( !pDef->GetProcDef() )
|
|
|
|
pDef->nProcId = nProcId;
|
|
|
|
pDef->pIn = this;
|
|
|
|
const SbiSymDef* q = pDef;
|
|
|
|
aData.Insert( q, q->nPos );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Suchen eines Eintrags ueber den Namen. Es wird auch im Parent gesucht.
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::Find( const String& rName ) const
|
|
|
|
{
|
|
|
|
for( USHORT i = 0; i < aData.Count(); i++ )
|
|
|
|
{
|
|
|
|
SbiSymDef* p = aData.GetObject( i );
|
|
|
|
if( ( !p->nProcId || ( p->nProcId == nProcId ) )
|
|
|
|
&& ( p->aName.EqualsIgnoreCaseAscii( rName ) ) )
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
if( pParent )
|
|
|
|
return pParent->Find( rName );
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Suchen ueber ID-Nummer
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::FindId( USHORT n ) const
|
|
|
|
{
|
|
|
|
for( USHORT i = 0; i < aData.Count(); i++ )
|
|
|
|
{
|
|
|
|
SbiSymDef* p = aData.GetObject( i );
|
|
|
|
if( p->nId == n && ( !p->nProcId || ( p->nProcId == nProcId ) ) )
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
if( pParent )
|
|
|
|
return pParent->FindId( n );
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Suchen ueber Position (ab 0)
|
|
|
|
|
|
|
|
SbiSymDef* SbiSymPool::Get( USHORT n ) const
|
|
|
|
{
|
|
|
|
if( n >= aData.Count() )
|
|
|
|
return NULL;
|
|
|
|
else
|
|
|
|
return aData.GetObject( n );
|
|
|
|
}
|
|
|
|
|
2006-11-03 14:11:10 +00:00
|
|
|
UINT32 SbiSymPool::Define( const String& rName )
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
SbiSymDef* p = Find( rName );
|
|
|
|
if( p )
|
|
|
|
{ if( p->IsDefined() )
|
|
|
|
pParser->Error( SbERR_LABEL_DEFINED, rName );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
p = AddSym( rName );
|
|
|
|
return p->Define();
|
|
|
|
}
|
|
|
|
|
2006-11-01 15:14:34 +00:00
|
|
|
UINT32 SbiSymPool::Reference( const String& rName )
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
SbiSymDef* p = Find( rName );
|
|
|
|
if( !p )
|
|
|
|
p = AddSym( rName );
|
|
|
|
//Sicherheitshalber
|
|
|
|
pParser->aGen.GenStmnt();
|
|
|
|
return p->Reference();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Alle offenen Referenzen anmaulen
|
|
|
|
|
|
|
|
void SbiSymPool::CheckRefs()
|
|
|
|
{
|
|
|
|
for( USHORT i = 0; i < aData.Count(); i++ )
|
|
|
|
{
|
|
|
|
SbiSymDef* p = aData.GetObject( i );
|
|
|
|
if( !p->IsDefined() )
|
|
|
|
pParser->Error( SbERR_UNDEF_LABEL, p->GetName() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
|*
|
|
|
|
|* Symbol-Definitionen
|
|
|
|
|*
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
SbiSymDef::SbiSymDef( const String& rName ) : aName( rName )
|
|
|
|
{
|
|
|
|
eType = SbxEMPTY;
|
2006-11-03 14:11:10 +00:00
|
|
|
nDims = 0;
|
|
|
|
nTypeId = 0;
|
|
|
|
nProcId = 0;
|
|
|
|
nId = 0;
|
|
|
|
nPos = 0;
|
|
|
|
nLen = 0;
|
2000-09-18 15:18:56 +00:00
|
|
|
nChain = 0;
|
|
|
|
bAs =
|
|
|
|
bNew =
|
|
|
|
bStatic =
|
|
|
|
bOpt =
|
2005-01-28 15:06:49 +00:00
|
|
|
bParamArray =
|
2000-09-18 15:18:56 +00:00
|
|
|
bByVal =
|
2001-09-04 09:07:46 +00:00
|
|
|
bChained =
|
|
|
|
bGlobal = FALSE;
|
2000-09-18 15:18:56 +00:00
|
|
|
pIn =
|
|
|
|
pPool = NULL;
|
2004-03-17 12:33:51 +00:00
|
|
|
nDefaultId = 0;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SbiSymDef::~SbiSymDef()
|
|
|
|
{
|
|
|
|
delete pPool;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiProcDef* SbiSymDef::GetProcDef()
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiConstDef* SbiSymDef::GetConstDef()
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wenn der Name benoetigt wird, den aktuellen Namen
|
|
|
|
// aus dem Stringpool nehmen
|
|
|
|
|
|
|
|
const String& SbiSymDef::GetName()
|
|
|
|
{
|
|
|
|
if( pIn )
|
|
|
|
aName = pIn->rStrings.Find( nId );
|
|
|
|
return aName;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Eintragen eines Datentyps
|
|
|
|
|
|
|
|
void SbiSymDef::SetType( SbxDataType t )
|
|
|
|
{
|
|
|
|
if( t == SbxVARIANT && pIn )
|
|
|
|
{
|
2004-09-09 06:43:30 +00:00
|
|
|
sal_Unicode cu = aName.GetBuffer()[0];
|
|
|
|
if( cu < 256 )
|
|
|
|
{
|
|
|
|
char ch = (char)aName.GetBuffer()[0];
|
|
|
|
if( ch == '_' ) ch = 'Z';
|
2006-10-12 13:27:56 +00:00
|
|
|
int ch2 = toupper( ch );
|
|
|
|
unsigned char c = (unsigned char)ch2;
|
2004-09-09 06:43:30 +00:00
|
|
|
if( c > 0 && c < 128 )
|
2006-10-12 13:27:56 +00:00
|
|
|
t = pIn->pParser->eDefTypes[ ch2 - 'A' ];
|
2004-09-09 06:43:30 +00:00
|
|
|
}
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
eType = t;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Aufbau einer Backchain, falls noch nicht definiert
|
|
|
|
// Es wird der Wert zurueckgeliefert, der als Operand gespeichert
|
|
|
|
// werden soll.
|
|
|
|
|
2006-11-01 15:14:34 +00:00
|
|
|
UINT32 SbiSymDef::Reference()
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
if( !bChained )
|
|
|
|
{
|
2006-11-01 15:14:34 +00:00
|
|
|
UINT32 n = nChain;
|
2000-09-18 15:18:56 +00:00
|
|
|
nChain = pIn->pParser->aGen.GetOffset();
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
else return nChain;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Definition eines Symbols.
|
|
|
|
// Hier wird der Backchain aufgeloest, falls vorhanden
|
|
|
|
|
2006-11-03 14:11:10 +00:00
|
|
|
UINT32 SbiSymDef::Define()
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2006-11-01 15:14:34 +00:00
|
|
|
UINT32 n = pIn->pParser->aGen.GetPC();
|
2000-09-18 15:18:56 +00:00
|
|
|
pIn->pParser->aGen.GenStmnt();
|
|
|
|
if( nChain ) pIn->pParser->aGen.BackChain( nChain );
|
|
|
|
nChain = n;
|
|
|
|
bChained = TRUE;
|
|
|
|
return nChain;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Eine Symboldefinition kann einen eigenen Pool haben. Dies ist
|
|
|
|
// der Fall bei Objekten und Prozeduren (lokale Variable)
|
|
|
|
|
|
|
|
SbiSymPool& SbiSymDef::GetPool()
|
|
|
|
{
|
|
|
|
if( !pPool )
|
|
|
|
pPool = new SbiSymPool( pIn->pParser->aGblStrings, SbLOCAL ); // wird gedumpt
|
|
|
|
return *pPool;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiSymScope SbiSymDef::GetScope() const
|
|
|
|
{
|
|
|
|
return pIn ? pIn->GetScope() : SbLOCAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// Die Prozedur-Definition hat drei Pools:
|
|
|
|
// 1) aParams: wird durch die Definition gefuellt. Enthaelt die Namen
|
|
|
|
// der Parameter, wie sie innerhalb des Rumpfes verwendet werden.
|
|
|
|
// Das erste Element ist der Returnwert.
|
|
|
|
// 2) pPool: saemtliche lokale Variable
|
|
|
|
// 3) aLabels: Labels
|
|
|
|
|
2002-08-12 10:57:34 +00:00
|
|
|
SbiProcDef::SbiProcDef( SbiParser* pParser, const String& rName,
|
|
|
|
BOOL bProcDecl )
|
|
|
|
: SbiSymDef( rName )
|
|
|
|
, aParams( pParser->aGblStrings, SbPARAM ) // wird gedumpt
|
|
|
|
, aLabels( pParser->aLclStrings, SbLOCAL ) // wird nicht gedumpt
|
|
|
|
, mbProcDecl( bProcDecl )
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
aParams.SetParent( &pParser->aPublics );
|
|
|
|
pPool = new SbiSymPool( pParser->aGblStrings, SbLOCAL ); // Locals
|
|
|
|
pPool->SetParent( &aParams );
|
|
|
|
nLine1 =
|
|
|
|
nLine2 = 0;
|
2004-11-02 10:54:38 +00:00
|
|
|
mePropMode = PROPERTY_MODE_NONE;
|
2000-09-18 15:18:56 +00:00
|
|
|
bPublic = TRUE;
|
|
|
|
bCdecl = FALSE;
|
2008-07-02 08:59:06 +00:00
|
|
|
bStatic = FALSE;
|
2000-09-18 15:18:56 +00:00
|
|
|
// Fuer Returnwerte ist das erste Element der Parameterliste
|
|
|
|
// immer mit dem Namen und dem Typ der Proc definiert
|
|
|
|
aParams.AddSym( aName );
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiProcDef::~SbiProcDef()
|
|
|
|
{}
|
|
|
|
|
|
|
|
SbiProcDef* SbiProcDef::GetProcDef()
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SbiProcDef::SetType( SbxDataType t )
|
|
|
|
{
|
|
|
|
SbiSymDef::SetType( t );
|
|
|
|
aParams.Get( 0 )->SetType( eType );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Match mit einer Forward-Deklaration
|
|
|
|
// Falls der Match OK ist, wird pOld durch this im Pool ersetzt
|
|
|
|
// pOld wird immer geloescht!
|
|
|
|
|
|
|
|
void SbiProcDef::Match( SbiProcDef* pOld )
|
|
|
|
{
|
2003-11-25 09:43:02 +00:00
|
|
|
SbiSymDef* po, *pn=NULL;
|
2000-09-18 15:18:56 +00:00
|
|
|
// Parameter 0 ist der Funktionsname
|
|
|
|
USHORT i;
|
|
|
|
for( i = 1; i < aParams.GetSize(); i++ )
|
|
|
|
{
|
|
|
|
po = pOld->aParams.Get( i );
|
|
|
|
pn = aParams.Get( i );
|
|
|
|
// Kein Typabgleich; das wird beim Laufen erledigt
|
|
|
|
// aber ist sie evtl. mit zu wenigen Parametern aufgerufen
|
|
|
|
// worden?
|
2005-01-28 15:06:49 +00:00
|
|
|
if( !po && !pn->IsOptional() && !pn->IsParamArray() )
|
2000-09-18 15:18:56 +00:00
|
|
|
break;
|
|
|
|
po = pOld->aParams.Next();
|
|
|
|
}
|
|
|
|
// Wurden zu viele Parameter angegeben?
|
|
|
|
if( pn && i < aParams.GetSize() && pOld->pIn )
|
|
|
|
{
|
|
|
|
// Die ganze Zeile markieren
|
|
|
|
pOld->pIn->GetParser()->SetCol1( 0 );
|
|
|
|
pOld->pIn->GetParser()->Error( SbERR_BAD_DECLARATION, aName );
|
|
|
|
}
|
|
|
|
if( !pIn && pOld->pIn )
|
|
|
|
{
|
|
|
|
// Alten Eintrag durch neuen ersetzen
|
|
|
|
SbiSymDef** pData = (SbiSymDef**) pOld->pIn->aData.GetData();
|
|
|
|
pData[ pOld->nPos ] = this;
|
|
|
|
nPos = pOld->nPos;
|
|
|
|
nId = pOld->nId;
|
|
|
|
pIn = pOld->pIn;
|
|
|
|
}
|
|
|
|
delete pOld;
|
|
|
|
}
|
|
|
|
|
2004-11-02 10:54:38 +00:00
|
|
|
void SbiProcDef::setPropertyMode( PropertyMode ePropMode )
|
|
|
|
{
|
|
|
|
mePropMode = ePropMode;
|
|
|
|
if( mePropMode != PROPERTY_MODE_NONE )
|
|
|
|
{
|
|
|
|
// Prop name = original scanned procedure name
|
|
|
|
maPropName = aName;
|
|
|
|
|
|
|
|
// CompleteProcName includes "Property xxx "
|
|
|
|
// to avoid conflicts with other symbols
|
|
|
|
String aCompleteProcName;
|
|
|
|
aCompleteProcName.AppendAscii( "Property " );
|
|
|
|
switch( mePropMode )
|
|
|
|
{
|
|
|
|
case PROPERTY_MODE_GET: aCompleteProcName.AppendAscii( "Get " ); break;
|
|
|
|
case PROPERTY_MODE_LET: aCompleteProcName.AppendAscii( "Let " ); break;
|
|
|
|
case PROPERTY_MODE_SET: aCompleteProcName.AppendAscii( "Set " ); break;
|
2006-06-19 16:43:20 +00:00
|
|
|
case PROPERTY_MODE_NONE:
|
|
|
|
DBG_ERROR( "Illegal PropertyMode PROPERTY_MODE_NONE" );
|
|
|
|
break;
|
2004-11-02 10:54:38 +00:00
|
|
|
}
|
|
|
|
aCompleteProcName += aName;
|
|
|
|
aName = aCompleteProcName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
SbiConstDef::SbiConstDef( const String& rName )
|
|
|
|
: SbiSymDef( rName )
|
|
|
|
{
|
|
|
|
nVal = 0; eType = SbxINTEGER;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SbiConstDef::Set( double n, SbxDataType t )
|
|
|
|
{
|
|
|
|
aVal.Erase(); nVal = n; eType = t;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SbiConstDef::Set( const String& n )
|
|
|
|
{
|
|
|
|
aVal = n; nVal = 0; eType = SbxSTRING;
|
|
|
|
}
|
|
|
|
|
|
|
|
SbiConstDef::~SbiConstDef()
|
|
|
|
{}
|
|
|
|
|
|
|
|
SbiConstDef* SbiConstDef::GetConstDef()
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|