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