summaryrefslogtreecommitdiff
path: root/basic/source/comp/symtbl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'basic/source/comp/symtbl.cxx')
-rw-r--r--basic/source/comp/symtbl.cxx538
1 files changed, 0 insertions, 538 deletions
diff --git a/basic/source/comp/symtbl.cxx b/basic/source/comp/symtbl.cxx
deleted file mode 100644
index 2099ad830d..0000000000
--- a/basic/source/comp/symtbl.cxx
+++ /dev/null
@@ -1,538 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * 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.
- *
- * 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).
- *
- * 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.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_basic.hxx"
-
-#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( sal_uInt16 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, sal_Bool bNoCase )
-{
- sal_uInt16 n = aData.Count();
- for( sal_uInt16 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 )
- {
- 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;
- default: break;
- }
- 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 = (sal_uInt16) -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 )
- {
-#ifdef DBG_UTIL
- // 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
-{
- sal_uInt16 nCount = aData.Count();
- for( sal_uInt16 i = 0; i < nCount; i++ )
- {
- SbiSymDef* p = aData.GetObject( nCount - i - 1 );
- 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( sal_uInt16 n ) const
-{
- for( sal_uInt16 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( sal_uInt16 n ) const
-{
- if( n >= aData.Count() )
- return NULL;
- else
- return aData.GetObject( n );
-}
-
-sal_uInt32 SbiSymPool::Define( const String& rName )
-{
- SbiSymDef* p = Find( rName );
- if( p )
- { if( p->IsDefined() )
- pParser->Error( SbERR_LABEL_DEFINED, rName );
- }
- else
- p = AddSym( rName );
- return p->Define();
-}
-
-sal_uInt32 SbiSymPool::Reference( const String& rName )
-{
- SbiSymDef* p = Find( rName );
- if( !p )
- p = AddSym( rName );
- //Sicherheitshalber
- pParser->aGen.GenStmnt();
- return p->Reference();
-}
-
-// Alle offenen Referenzen anmaulen
-
-void SbiSymPool::CheckRefs()
-{
- for( sal_uInt16 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;
- nDims = 0;
- nTypeId = 0;
- nProcId = 0;
- nId = 0;
- nPos = 0;
- nLen = 0;
- nChain = 0;
- bAs =
- bNew =
- bStatic =
- bOpt =
- bParamArray =
- bWithEvents =
- bWithBrackets =
- bByVal =
- bChained =
- bGlobal = sal_False;
- pIn =
- pPool = NULL;
- nDefaultId = 0;
- nFixedStringLength = -1;
-}
-
-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 )
- {
- sal_Unicode cu = aName.GetBuffer()[0];
- if( cu < 256 )
- {
- char ch = (char)aName.GetBuffer()[0];
- if( ch == '_' ) ch = 'Z';
- int ch2 = toupper( ch );
- unsigned char c = (unsigned char)ch2;
- if( c > 0 && c < 128 )
- t = pIn->pParser->eDefTypes[ ch2 - 'A' ];
- }
- }
- eType = t;
-}
-
-// Aufbau einer Backchain, falls noch nicht definiert
-// Es wird der Wert zurueckgeliefert, der als Operand gespeichert
-// werden soll.
-
-sal_uInt32 SbiSymDef::Reference()
-{
- if( !bChained )
- {
- sal_uInt32 n = nChain;
- nChain = pIn->pParser->aGen.GetOffset();
- return n;
- }
- else return nChain;
-}
-
-// Definition eines Symbols.
-// Hier wird der Backchain aufgeloest, falls vorhanden
-
-sal_uInt32 SbiSymDef::Define()
-{
- sal_uInt32 n = pIn->pParser->aGen.GetPC();
- pIn->pParser->aGen.GenStmnt();
- if( nChain ) pIn->pParser->aGen.BackChain( nChain );
- nChain = n;
- bChained = sal_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
-
-SbiProcDef::SbiProcDef( SbiParser* pParser, const String& rName,
- sal_Bool bProcDecl )
- : SbiSymDef( rName )
- , aParams( pParser->aGblStrings, SbPARAM ) // wird gedumpt
- , aLabels( pParser->aLclStrings, SbLOCAL ) // wird nicht gedumpt
- , mbProcDecl( bProcDecl )
-{
- aParams.SetParent( &pParser->aPublics );
- pPool = new SbiSymPool( pParser->aGblStrings, SbLOCAL ); // Locals
- pPool->SetParent( &aParams );
- nLine1 =
- nLine2 = 0;
- mePropMode = PROPERTY_MODE_NONE;
- bPublic = sal_True;
- bCdecl = sal_False;
- bStatic = sal_False;
- // 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 )
-{
- SbiSymDef* po, *pn=NULL;
- // Parameter 0 ist der Funktionsname
- sal_uInt16 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?
- if( !po && !pn->IsOptional() && !pn->IsParamArray() )
- 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;
-}
-
-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;
- case PROPERTY_MODE_NONE:
- OSL_FAIL( "Illegal PropertyMode PROPERTY_MODE_NONE" );
- break;
- }
- aCompleteProcName += aName;
- aName = aCompleteProcName;
- }
-}
-
-
-
-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;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */