1*e1f63238SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*e1f63238SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*e1f63238SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*e1f63238SAndrew Rist * distributed with this work for additional information 6*e1f63238SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*e1f63238SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*e1f63238SAndrew Rist * "License"); you may not use this file except in compliance 9*e1f63238SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*e1f63238SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*e1f63238SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*e1f63238SAndrew Rist * software distributed under the License is distributed on an 15*e1f63238SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*e1f63238SAndrew Rist * KIND, either express or implied. See the License for the 17*e1f63238SAndrew Rist * specific language governing permissions and limitations 18*e1f63238SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*e1f63238SAndrew Rist *************************************************************/ 21*e1f63238SAndrew Rist 22*e1f63238SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_basic.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "sbcomp.hxx" 28cdf0e10cSrcweir #include <stdio.h> 29cdf0e10cSrcweir #include <string.h> 30cdf0e10cSrcweir #include <ctype.h> 31cdf0e10cSrcweir 32cdf0e10cSrcweir SV_IMPL_PTRARR(SbiStrings,String*) 33cdf0e10cSrcweir SV_IMPL_PTRARR(SbiSymbols,SbiSymDef*) 34cdf0e10cSrcweir 35cdf0e10cSrcweir // Alle Symbolnamen werden im Stringpool des Symbol-Pools abgelegt, damit 36cdf0e10cSrcweir // alle Symbole im gleichen Case verarbeitet werden. Beim Speichern des 37cdf0e10cSrcweir // Code-Images wird der globale Stringpool mit den entsprechenden Sympools 38cdf0e10cSrcweir // gespeichert. Der lokale Stringpool nimmt alle Symbole auf, die nicht 39cdf0e10cSrcweir // ins Image wandern (Labels, Konstantennamen etc). 40cdf0e10cSrcweir 41cdf0e10cSrcweir /*************************************************************************** 42cdf0e10cSrcweir |* 43cdf0e10cSrcweir |* SbiStringPool 44cdf0e10cSrcweir |* 45cdf0e10cSrcweir ***************************************************************************/ 46cdf0e10cSrcweir 47cdf0e10cSrcweir SbiStringPool::SbiStringPool( SbiParser* p ) 48cdf0e10cSrcweir { 49cdf0e10cSrcweir pParser = p; 50cdf0e10cSrcweir } 51cdf0e10cSrcweir 52cdf0e10cSrcweir SbiStringPool::~SbiStringPool() 53cdf0e10cSrcweir {} 54cdf0e10cSrcweir 55cdf0e10cSrcweir // Suchen 56cdf0e10cSrcweir 57cdf0e10cSrcweir const String& SbiStringPool::Find( sal_uInt16 n ) const 58cdf0e10cSrcweir { 59cdf0e10cSrcweir if( !n || n > aData.Count() ) 60cdf0e10cSrcweir return aEmpty; 61cdf0e10cSrcweir else 62cdf0e10cSrcweir return *aData.GetObject( n-1 ); 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir // Hinzufuegen eines Strings. Der String wird Case-Insensitiv 66cdf0e10cSrcweir // verglichen. 67cdf0e10cSrcweir 68cdf0e10cSrcweir short SbiStringPool::Add( const String& rVal, sal_Bool bNoCase ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir sal_uInt16 n = aData.Count(); 71cdf0e10cSrcweir for( sal_uInt16 i = 0; i < n; i++ ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir String* p = aData.GetObject( i ); 74cdf0e10cSrcweir if( ( bNoCase && p->Equals( rVal ) ) 75cdf0e10cSrcweir || ( !bNoCase && p->EqualsIgnoreCaseAscii( rVal ) ) ) 76cdf0e10cSrcweir return i+1; 77cdf0e10cSrcweir } 78cdf0e10cSrcweir const String* pNew = new String( rVal ); 79cdf0e10cSrcweir aData.Insert( pNew, n++ ); 80cdf0e10cSrcweir return (short) n; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir short SbiStringPool::Add( double n, SbxDataType t ) 84cdf0e10cSrcweir { 85cdf0e10cSrcweir char buf[ 40 ]; 86cdf0e10cSrcweir switch( t ) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir case SbxINTEGER: snprintf( buf, sizeof(buf), "%d", (short) n ); break; 89cdf0e10cSrcweir case SbxLONG: snprintf( buf, sizeof(buf), "%ld", (long) n ); break; 90cdf0e10cSrcweir case SbxSINGLE: snprintf( buf, sizeof(buf), "%.6g", (float) n ); break; 91cdf0e10cSrcweir case SbxDOUBLE: snprintf( buf, sizeof(buf), "%.16g", n ); break; 92cdf0e10cSrcweir default: break; 93cdf0e10cSrcweir } 94cdf0e10cSrcweir return Add( String::CreateFromAscii( buf ) ); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 97cdf0e10cSrcweir /*************************************************************************** 98cdf0e10cSrcweir |* 99cdf0e10cSrcweir |* SbiSymPool 100cdf0e10cSrcweir |* 101cdf0e10cSrcweir ***************************************************************************/ 102cdf0e10cSrcweir 103cdf0e10cSrcweir SbiSymPool::SbiSymPool( SbiStringPool& r, SbiSymScope s ) : rStrings( r ) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir pParser = r.GetParser(); 106cdf0e10cSrcweir eScope = s; 107cdf0e10cSrcweir pParent = NULL; 108cdf0e10cSrcweir nCur = 109cdf0e10cSrcweir nProcId = 0; 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir SbiSymPool::~SbiSymPool() 113cdf0e10cSrcweir {} 114cdf0e10cSrcweir 115cdf0e10cSrcweir // Inhalt loeschen 116cdf0e10cSrcweir 117cdf0e10cSrcweir void SbiSymPool::Clear() 118cdf0e10cSrcweir { 119cdf0e10cSrcweir aData.DeleteAndDestroy( 0, aData.Count() ); 120cdf0e10cSrcweir } 121cdf0e10cSrcweir 122cdf0e10cSrcweir SbiSymDef* SbiSymPool::First() 123cdf0e10cSrcweir { 124cdf0e10cSrcweir nCur = (sal_uInt16) -1; 125cdf0e10cSrcweir return Next(); 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir SbiSymDef* SbiSymPool::Next() 129cdf0e10cSrcweir { 130cdf0e10cSrcweir if( ++nCur >= aData.Count() ) 131cdf0e10cSrcweir return NULL; 132cdf0e10cSrcweir else 133cdf0e10cSrcweir return aData.GetObject( nCur ); 134cdf0e10cSrcweir } 135cdf0e10cSrcweir 136cdf0e10cSrcweir // Hinzufuegen eines Symbols 137cdf0e10cSrcweir 138cdf0e10cSrcweir SbiSymDef* SbiSymPool::AddSym( const String& rName ) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir SbiSymDef* p = new SbiSymDef( rName ); 141cdf0e10cSrcweir p->nPos = aData.Count(); 142cdf0e10cSrcweir p->nId = rStrings.Add( rName ); 143cdf0e10cSrcweir p->nProcId = nProcId; 144cdf0e10cSrcweir p->pIn = this; 145cdf0e10cSrcweir const SbiSymDef* q = p; 146cdf0e10cSrcweir aData.Insert( q, q->nPos ); 147cdf0e10cSrcweir return p; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir SbiProcDef* SbiSymPool::AddProc( const String& rName ) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir SbiProcDef* p = new SbiProcDef( pParser, rName ); 153cdf0e10cSrcweir p->nPos = aData.Count(); 154cdf0e10cSrcweir p->nId = rStrings.Add( rName ); 155cdf0e10cSrcweir // Procs sind immer global 156cdf0e10cSrcweir p->nProcId = 0; 157cdf0e10cSrcweir p->pIn = this; 158cdf0e10cSrcweir const SbiSymDef* q = p; 159cdf0e10cSrcweir aData.Insert( q, q->nPos ); 160cdf0e10cSrcweir return p; 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir // Hinzufuegen einer extern aufgebauten Symboldefinition 164cdf0e10cSrcweir 165cdf0e10cSrcweir void SbiSymPool::Add( SbiSymDef* pDef ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir if( pDef && pDef->pIn != this ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir if( pDef->pIn ) 170cdf0e10cSrcweir { 171cdf0e10cSrcweir #ifdef DBG_UTIL 172cdf0e10cSrcweir // schon in einem anderen Pool drin! 173cdf0e10cSrcweir pParser->Error( SbERR_INTERNAL_ERROR, "Dbl Pool" ); 174cdf0e10cSrcweir #endif 175cdf0e10cSrcweir return; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir 178cdf0e10cSrcweir pDef->nPos = aData.Count(); 179cdf0e10cSrcweir if( !pDef->nId ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir // Bei statischen Variablen muss ein eindeutiger Name 182cdf0e10cSrcweir // im Stringpool erzeugt werden (Form ProcName:VarName) 183cdf0e10cSrcweir String aName( pDef->aName ); 184cdf0e10cSrcweir if( pDef->IsStatic() ) 185cdf0e10cSrcweir { 186cdf0e10cSrcweir aName = pParser->aGblStrings.Find( nProcId ); 187cdf0e10cSrcweir aName += ':'; 188cdf0e10cSrcweir aName += pDef->aName; 189cdf0e10cSrcweir } 190cdf0e10cSrcweir pDef->nId = rStrings.Add( aName ); 191cdf0e10cSrcweir } 192cdf0e10cSrcweir // Procs sind immer global 193cdf0e10cSrcweir if( !pDef->GetProcDef() ) 194cdf0e10cSrcweir pDef->nProcId = nProcId; 195cdf0e10cSrcweir pDef->pIn = this; 196cdf0e10cSrcweir const SbiSymDef* q = pDef; 197cdf0e10cSrcweir aData.Insert( q, q->nPos ); 198cdf0e10cSrcweir } 199cdf0e10cSrcweir } 200cdf0e10cSrcweir 201cdf0e10cSrcweir // Suchen eines Eintrags ueber den Namen. Es wird auch im Parent gesucht. 202cdf0e10cSrcweir 203cdf0e10cSrcweir SbiSymDef* SbiSymPool::Find( const String& rName ) const 204cdf0e10cSrcweir { 205cdf0e10cSrcweir sal_uInt16 nCount = aData.Count(); 206cdf0e10cSrcweir for( sal_uInt16 i = 0; i < nCount; i++ ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir SbiSymDef* p = aData.GetObject( nCount - i - 1 ); 209cdf0e10cSrcweir if( ( !p->nProcId || ( p->nProcId == nProcId ) ) 210cdf0e10cSrcweir && ( p->aName.EqualsIgnoreCaseAscii( rName ) ) ) 211cdf0e10cSrcweir return p; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir if( pParent ) 214cdf0e10cSrcweir return pParent->Find( rName ); 215cdf0e10cSrcweir else 216cdf0e10cSrcweir return NULL; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir // Suchen ueber ID-Nummer 220cdf0e10cSrcweir 221cdf0e10cSrcweir SbiSymDef* SbiSymPool::FindId( sal_uInt16 n ) const 222cdf0e10cSrcweir { 223cdf0e10cSrcweir for( sal_uInt16 i = 0; i < aData.Count(); i++ ) 224cdf0e10cSrcweir { 225cdf0e10cSrcweir SbiSymDef* p = aData.GetObject( i ); 226cdf0e10cSrcweir if( p->nId == n && ( !p->nProcId || ( p->nProcId == nProcId ) ) ) 227cdf0e10cSrcweir return p; 228cdf0e10cSrcweir } 229cdf0e10cSrcweir if( pParent ) 230cdf0e10cSrcweir return pParent->FindId( n ); 231cdf0e10cSrcweir else 232cdf0e10cSrcweir return NULL; 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 235cdf0e10cSrcweir // Suchen ueber Position (ab 0) 236cdf0e10cSrcweir 237cdf0e10cSrcweir SbiSymDef* SbiSymPool::Get( sal_uInt16 n ) const 238cdf0e10cSrcweir { 239cdf0e10cSrcweir if( n >= aData.Count() ) 240cdf0e10cSrcweir return NULL; 241cdf0e10cSrcweir else 242cdf0e10cSrcweir return aData.GetObject( n ); 243cdf0e10cSrcweir } 244cdf0e10cSrcweir 245cdf0e10cSrcweir sal_uInt32 SbiSymPool::Define( const String& rName ) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir SbiSymDef* p = Find( rName ); 248cdf0e10cSrcweir if( p ) 249cdf0e10cSrcweir { if( p->IsDefined() ) 250cdf0e10cSrcweir pParser->Error( SbERR_LABEL_DEFINED, rName ); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir else 253cdf0e10cSrcweir p = AddSym( rName ); 254cdf0e10cSrcweir return p->Define(); 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir sal_uInt32 SbiSymPool::Reference( const String& rName ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir SbiSymDef* p = Find( rName ); 260cdf0e10cSrcweir if( !p ) 261cdf0e10cSrcweir p = AddSym( rName ); 262cdf0e10cSrcweir //Sicherheitshalber 263cdf0e10cSrcweir pParser->aGen.GenStmnt(); 264cdf0e10cSrcweir return p->Reference(); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir // Alle offenen Referenzen anmaulen 268cdf0e10cSrcweir 269cdf0e10cSrcweir void SbiSymPool::CheckRefs() 270cdf0e10cSrcweir { 271cdf0e10cSrcweir for( sal_uInt16 i = 0; i < aData.Count(); i++ ) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir SbiSymDef* p = aData.GetObject( i ); 274cdf0e10cSrcweir if( !p->IsDefined() ) 275cdf0e10cSrcweir pParser->Error( SbERR_UNDEF_LABEL, p->GetName() ); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir /*************************************************************************** 280cdf0e10cSrcweir |* 281cdf0e10cSrcweir |* Symbol-Definitionen 282cdf0e10cSrcweir |* 283cdf0e10cSrcweir ***************************************************************************/ 284cdf0e10cSrcweir 285cdf0e10cSrcweir SbiSymDef::SbiSymDef( const String& rName ) : aName( rName ) 286cdf0e10cSrcweir { 287cdf0e10cSrcweir eType = SbxEMPTY; 288cdf0e10cSrcweir nDims = 0; 289cdf0e10cSrcweir nTypeId = 0; 290cdf0e10cSrcweir nProcId = 0; 291cdf0e10cSrcweir nId = 0; 292cdf0e10cSrcweir nPos = 0; 293cdf0e10cSrcweir nLen = 0; 294cdf0e10cSrcweir nChain = 0; 295cdf0e10cSrcweir bAs = 296cdf0e10cSrcweir bNew = 297cdf0e10cSrcweir bStatic = 298cdf0e10cSrcweir bOpt = 299cdf0e10cSrcweir bParamArray = 300cdf0e10cSrcweir bWithEvents = 301cdf0e10cSrcweir bWithBrackets = 302cdf0e10cSrcweir bByVal = 303cdf0e10cSrcweir bChained = 304cdf0e10cSrcweir bGlobal = sal_False; 305cdf0e10cSrcweir pIn = 306cdf0e10cSrcweir pPool = NULL; 307cdf0e10cSrcweir nDefaultId = 0; 308cdf0e10cSrcweir nFixedStringLength = -1; 309cdf0e10cSrcweir } 310cdf0e10cSrcweir 311cdf0e10cSrcweir SbiSymDef::~SbiSymDef() 312cdf0e10cSrcweir { 313cdf0e10cSrcweir delete pPool; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir SbiProcDef* SbiSymDef::GetProcDef() 317cdf0e10cSrcweir { 318cdf0e10cSrcweir return NULL; 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir SbiConstDef* SbiSymDef::GetConstDef() 322cdf0e10cSrcweir { 323cdf0e10cSrcweir return NULL; 324cdf0e10cSrcweir } 325cdf0e10cSrcweir 326cdf0e10cSrcweir // Wenn der Name benoetigt wird, den aktuellen Namen 327cdf0e10cSrcweir // aus dem Stringpool nehmen 328cdf0e10cSrcweir 329cdf0e10cSrcweir const String& SbiSymDef::GetName() 330cdf0e10cSrcweir { 331cdf0e10cSrcweir if( pIn ) 332cdf0e10cSrcweir aName = pIn->rStrings.Find( nId ); 333cdf0e10cSrcweir return aName; 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 336cdf0e10cSrcweir // Eintragen eines Datentyps 337cdf0e10cSrcweir 338cdf0e10cSrcweir void SbiSymDef::SetType( SbxDataType t ) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir if( t == SbxVARIANT && pIn ) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir sal_Unicode cu = aName.GetBuffer()[0]; 343cdf0e10cSrcweir if( cu < 256 ) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir char ch = (char)aName.GetBuffer()[0]; 346cdf0e10cSrcweir if( ch == '_' ) ch = 'Z'; 347cdf0e10cSrcweir int ch2 = toupper( ch ); 348cdf0e10cSrcweir unsigned char c = (unsigned char)ch2; 349cdf0e10cSrcweir if( c > 0 && c < 128 ) 350cdf0e10cSrcweir t = pIn->pParser->eDefTypes[ ch2 - 'A' ]; 351cdf0e10cSrcweir } 352cdf0e10cSrcweir } 353cdf0e10cSrcweir eType = t; 354cdf0e10cSrcweir } 355cdf0e10cSrcweir 356cdf0e10cSrcweir // Aufbau einer Backchain, falls noch nicht definiert 357cdf0e10cSrcweir // Es wird der Wert zurueckgeliefert, der als Operand gespeichert 358cdf0e10cSrcweir // werden soll. 359cdf0e10cSrcweir 360cdf0e10cSrcweir sal_uInt32 SbiSymDef::Reference() 361cdf0e10cSrcweir { 362cdf0e10cSrcweir if( !bChained ) 363cdf0e10cSrcweir { 364cdf0e10cSrcweir sal_uInt32 n = nChain; 365cdf0e10cSrcweir nChain = pIn->pParser->aGen.GetOffset(); 366cdf0e10cSrcweir return n; 367cdf0e10cSrcweir } 368cdf0e10cSrcweir else return nChain; 369cdf0e10cSrcweir } 370cdf0e10cSrcweir 371cdf0e10cSrcweir // Definition eines Symbols. 372cdf0e10cSrcweir // Hier wird der Backchain aufgeloest, falls vorhanden 373cdf0e10cSrcweir 374cdf0e10cSrcweir sal_uInt32 SbiSymDef::Define() 375cdf0e10cSrcweir { 376cdf0e10cSrcweir sal_uInt32 n = pIn->pParser->aGen.GetPC(); 377cdf0e10cSrcweir pIn->pParser->aGen.GenStmnt(); 378cdf0e10cSrcweir if( nChain ) pIn->pParser->aGen.BackChain( nChain ); 379cdf0e10cSrcweir nChain = n; 380cdf0e10cSrcweir bChained = sal_True; 381cdf0e10cSrcweir return nChain; 382cdf0e10cSrcweir } 383cdf0e10cSrcweir 384cdf0e10cSrcweir // Eine Symboldefinition kann einen eigenen Pool haben. Dies ist 385cdf0e10cSrcweir // der Fall bei Objekten und Prozeduren (lokale Variable) 386cdf0e10cSrcweir 387cdf0e10cSrcweir SbiSymPool& SbiSymDef::GetPool() 388cdf0e10cSrcweir { 389cdf0e10cSrcweir if( !pPool ) 390cdf0e10cSrcweir pPool = new SbiSymPool( pIn->pParser->aGblStrings, SbLOCAL ); // wird gedumpt 391cdf0e10cSrcweir return *pPool; 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir SbiSymScope SbiSymDef::GetScope() const 395cdf0e10cSrcweir { 396cdf0e10cSrcweir return pIn ? pIn->GetScope() : SbLOCAL; 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////// 400cdf0e10cSrcweir 401cdf0e10cSrcweir // Die Prozedur-Definition hat drei Pools: 402cdf0e10cSrcweir // 1) aParams: wird durch die Definition gefuellt. Enthaelt die Namen 403cdf0e10cSrcweir // der Parameter, wie sie innerhalb des Rumpfes verwendet werden. 404cdf0e10cSrcweir // Das erste Element ist der Returnwert. 405cdf0e10cSrcweir // 2) pPool: saemtliche lokale Variable 406cdf0e10cSrcweir // 3) aLabels: Labels 407cdf0e10cSrcweir 408cdf0e10cSrcweir SbiProcDef::SbiProcDef( SbiParser* pParser, const String& rName, 409cdf0e10cSrcweir sal_Bool bProcDecl ) 410cdf0e10cSrcweir : SbiSymDef( rName ) 411cdf0e10cSrcweir , aParams( pParser->aGblStrings, SbPARAM ) // wird gedumpt 412cdf0e10cSrcweir , aLabels( pParser->aLclStrings, SbLOCAL ) // wird nicht gedumpt 413cdf0e10cSrcweir , mbProcDecl( bProcDecl ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir aParams.SetParent( &pParser->aPublics ); 416cdf0e10cSrcweir pPool = new SbiSymPool( pParser->aGblStrings, SbLOCAL ); // Locals 417cdf0e10cSrcweir pPool->SetParent( &aParams ); 418cdf0e10cSrcweir nLine1 = 419cdf0e10cSrcweir nLine2 = 0; 420cdf0e10cSrcweir mePropMode = PROPERTY_MODE_NONE; 421cdf0e10cSrcweir bPublic = sal_True; 422cdf0e10cSrcweir bCdecl = sal_False; 423cdf0e10cSrcweir bStatic = sal_False; 424cdf0e10cSrcweir // Fuer Returnwerte ist das erste Element der Parameterliste 425cdf0e10cSrcweir // immer mit dem Namen und dem Typ der Proc definiert 426cdf0e10cSrcweir aParams.AddSym( aName ); 427cdf0e10cSrcweir } 428cdf0e10cSrcweir 429cdf0e10cSrcweir SbiProcDef::~SbiProcDef() 430cdf0e10cSrcweir {} 431cdf0e10cSrcweir 432cdf0e10cSrcweir SbiProcDef* SbiProcDef::GetProcDef() 433cdf0e10cSrcweir { 434cdf0e10cSrcweir return this; 435cdf0e10cSrcweir } 436cdf0e10cSrcweir 437cdf0e10cSrcweir void SbiProcDef::SetType( SbxDataType t ) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir SbiSymDef::SetType( t ); 440cdf0e10cSrcweir aParams.Get( 0 )->SetType( eType ); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir // Match mit einer Forward-Deklaration 444cdf0e10cSrcweir // Falls der Match OK ist, wird pOld durch this im Pool ersetzt 445cdf0e10cSrcweir // pOld wird immer geloescht! 446cdf0e10cSrcweir 447cdf0e10cSrcweir void SbiProcDef::Match( SbiProcDef* pOld ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir SbiSymDef* po, *pn=NULL; 450cdf0e10cSrcweir // Parameter 0 ist der Funktionsname 451cdf0e10cSrcweir sal_uInt16 i; 452cdf0e10cSrcweir for( i = 1; i < aParams.GetSize(); i++ ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir po = pOld->aParams.Get( i ); 455cdf0e10cSrcweir pn = aParams.Get( i ); 456cdf0e10cSrcweir // Kein Typabgleich; das wird beim Laufen erledigt 457cdf0e10cSrcweir // aber ist sie evtl. mit zu wenigen Parametern aufgerufen 458cdf0e10cSrcweir // worden? 459cdf0e10cSrcweir if( !po && !pn->IsOptional() && !pn->IsParamArray() ) 460cdf0e10cSrcweir break; 461cdf0e10cSrcweir po = pOld->aParams.Next(); 462cdf0e10cSrcweir } 463cdf0e10cSrcweir // Wurden zu viele Parameter angegeben? 464cdf0e10cSrcweir if( pn && i < aParams.GetSize() && pOld->pIn ) 465cdf0e10cSrcweir { 466cdf0e10cSrcweir // Die ganze Zeile markieren 467cdf0e10cSrcweir pOld->pIn->GetParser()->SetCol1( 0 ); 468cdf0e10cSrcweir pOld->pIn->GetParser()->Error( SbERR_BAD_DECLARATION, aName ); 469cdf0e10cSrcweir } 470cdf0e10cSrcweir if( !pIn && pOld->pIn ) 471cdf0e10cSrcweir { 472cdf0e10cSrcweir // Alten Eintrag durch neuen ersetzen 473cdf0e10cSrcweir SbiSymDef** pData = (SbiSymDef**) pOld->pIn->aData.GetData(); 474cdf0e10cSrcweir pData[ pOld->nPos ] = this; 475cdf0e10cSrcweir nPos = pOld->nPos; 476cdf0e10cSrcweir nId = pOld->nId; 477cdf0e10cSrcweir pIn = pOld->pIn; 478cdf0e10cSrcweir } 479cdf0e10cSrcweir delete pOld; 480cdf0e10cSrcweir } 481cdf0e10cSrcweir 482cdf0e10cSrcweir void SbiProcDef::setPropertyMode( PropertyMode ePropMode ) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir mePropMode = ePropMode; 485cdf0e10cSrcweir if( mePropMode != PROPERTY_MODE_NONE ) 486cdf0e10cSrcweir { 487cdf0e10cSrcweir // Prop name = original scanned procedure name 488cdf0e10cSrcweir maPropName = aName; 489cdf0e10cSrcweir 490cdf0e10cSrcweir // CompleteProcName includes "Property xxx " 491cdf0e10cSrcweir // to avoid conflicts with other symbols 492cdf0e10cSrcweir String aCompleteProcName; 493cdf0e10cSrcweir aCompleteProcName.AppendAscii( "Property " ); 494cdf0e10cSrcweir switch( mePropMode ) 495cdf0e10cSrcweir { 496cdf0e10cSrcweir case PROPERTY_MODE_GET: aCompleteProcName.AppendAscii( "Get " ); break; 497cdf0e10cSrcweir case PROPERTY_MODE_LET: aCompleteProcName.AppendAscii( "Let " ); break; 498cdf0e10cSrcweir case PROPERTY_MODE_SET: aCompleteProcName.AppendAscii( "Set " ); break; 499cdf0e10cSrcweir case PROPERTY_MODE_NONE: 500cdf0e10cSrcweir DBG_ERROR( "Illegal PropertyMode PROPERTY_MODE_NONE" ); 501cdf0e10cSrcweir break; 502cdf0e10cSrcweir } 503cdf0e10cSrcweir aCompleteProcName += aName; 504cdf0e10cSrcweir aName = aCompleteProcName; 505cdf0e10cSrcweir } 506cdf0e10cSrcweir } 507cdf0e10cSrcweir 508cdf0e10cSrcweir 509cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////// 510cdf0e10cSrcweir 511cdf0e10cSrcweir SbiConstDef::SbiConstDef( const String& rName ) 512cdf0e10cSrcweir : SbiSymDef( rName ) 513cdf0e10cSrcweir { 514cdf0e10cSrcweir nVal = 0; eType = SbxINTEGER; 515cdf0e10cSrcweir } 516cdf0e10cSrcweir 517cdf0e10cSrcweir void SbiConstDef::Set( double n, SbxDataType t ) 518cdf0e10cSrcweir { 519cdf0e10cSrcweir aVal.Erase(); nVal = n; eType = t; 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir void SbiConstDef::Set( const String& n ) 523cdf0e10cSrcweir { 524cdf0e10cSrcweir aVal = n; nVal = 0; eType = SbxSTRING; 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir SbiConstDef::~SbiConstDef() 528cdf0e10cSrcweir {} 529cdf0e10cSrcweir 530cdf0e10cSrcweir SbiConstDef* SbiConstDef::GetConstDef() 531cdf0e10cSrcweir { 532cdf0e10cSrcweir return this; 533cdf0e10cSrcweir } 534cdf0e10cSrcweir 535