xref: /aoo41x/main/idlc/source/aststack.cxx (revision 2fe1ca3d)
1*2fe1ca3dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2fe1ca3dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2fe1ca3dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2fe1ca3dSAndrew Rist  * distributed with this work for additional information
6*2fe1ca3dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2fe1ca3dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2fe1ca3dSAndrew Rist  * "License"); you may not use this file except in compliance
9*2fe1ca3dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2fe1ca3dSAndrew Rist  *
11*2fe1ca3dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2fe1ca3dSAndrew Rist  *
13*2fe1ca3dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2fe1ca3dSAndrew Rist  * software distributed under the License is distributed on an
15*2fe1ca3dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2fe1ca3dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*2fe1ca3dSAndrew Rist  * specific language governing permissions and limitations
18*2fe1ca3dSAndrew Rist  * under the License.
19*2fe1ca3dSAndrew Rist  *
20*2fe1ca3dSAndrew Rist  *************************************************************/
21*2fe1ca3dSAndrew Rist 
22*2fe1ca3dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_idlc.hxx"
26cdf0e10cSrcweir #include <rtl/alloc.h>
27cdf0e10cSrcweir #include <idlc/aststack.hxx>
28cdf0e10cSrcweir #include <idlc/astscope.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #define STACKSIZE_INCREMENT 64
31cdf0e10cSrcweir 
AstStack()32cdf0e10cSrcweir AstStack::AstStack()
33cdf0e10cSrcweir 	: m_stack((AstScope**)rtl_allocateZeroMemory(sizeof(AstScope*) * STACKSIZE_INCREMENT))
34cdf0e10cSrcweir 	, m_size(STACKSIZE_INCREMENT)
35cdf0e10cSrcweir 	, m_top(0)
36cdf0e10cSrcweir {
37cdf0e10cSrcweir }
38cdf0e10cSrcweir 
~AstStack()39cdf0e10cSrcweir AstStack::~AstStack()
40cdf0e10cSrcweir {
41cdf0e10cSrcweir 	for(sal_uInt32 i=0; i < m_top; i++)
42cdf0e10cSrcweir 	{
43cdf0e10cSrcweir 		if (m_stack[i])
44cdf0e10cSrcweir 			delete(m_stack[i]);
45cdf0e10cSrcweir 	}
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 	rtl_freeMemory(m_stack);
48cdf0e10cSrcweir }
49cdf0e10cSrcweir 
depth()50cdf0e10cSrcweir sal_uInt32 AstStack::depth()
51cdf0e10cSrcweir {
52cdf0e10cSrcweir 	return m_top;
53cdf0e10cSrcweir }
54cdf0e10cSrcweir 
top()55cdf0e10cSrcweir AstScope* AstStack::top()
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 	if (m_top < 1)
58cdf0e10cSrcweir 		return NULL;
59cdf0e10cSrcweir 	return m_stack[m_top - 1];
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
bottom()62cdf0e10cSrcweir AstScope* AstStack::bottom()
63cdf0e10cSrcweir {
64cdf0e10cSrcweir 	if (m_top == 0)
65cdf0e10cSrcweir 		return NULL;
66cdf0e10cSrcweir 	return m_stack[0];
67cdf0e10cSrcweir }
68cdf0e10cSrcweir 
nextToTop()69cdf0e10cSrcweir AstScope* AstStack::nextToTop()
70cdf0e10cSrcweir {
71cdf0e10cSrcweir 	AstScope *tmp, *retval;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 	if (depth() < 2)
74cdf0e10cSrcweir 		return NULL;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 	tmp = top();		// Save top
77cdf0e10cSrcweir 	(void) pop();		// Pop it
78cdf0e10cSrcweir 	retval = top();		// Get next one down
79cdf0e10cSrcweir 	(void) push(tmp);	// Push top back
80cdf0e10cSrcweir 	return retval;		// Return next one down
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
topNonNull()83cdf0e10cSrcweir AstScope* AstStack::topNonNull()
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	for (sal_uInt32 i = m_top; i > 0; i--)
86cdf0e10cSrcweir 	{
87cdf0e10cSrcweir 		if ( m_stack[i - 1] )
88cdf0e10cSrcweir 			return m_stack[i - 1];
89cdf0e10cSrcweir   	}
90cdf0e10cSrcweir 	return NULL;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
push(AstScope * pScope)93cdf0e10cSrcweir AstStack* AstStack::push(AstScope* pScope)
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	AstScope		**tmp;
96cdf0e10cSrcweir //	AstDeclaration	*pDecl = ScopeAsDecl(pScope);
97cdf0e10cSrcweir 	sal_uInt32	newSize;
98cdf0e10cSrcweir 	sal_uInt32	i;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	// Make sure there's space for one more
101cdf0e10cSrcweir 	if (m_size == m_top)
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		newSize = m_size;
104cdf0e10cSrcweir 		newSize += STACKSIZE_INCREMENT;
105cdf0e10cSrcweir 		tmp	= (AstScope**)rtl_allocateZeroMemory(sizeof(AstScope*) * newSize);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 		for(i=0; i < m_size; i++)
108cdf0e10cSrcweir 			tmp[i] = m_stack[i];
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 		rtl_freeMemory(m_stack);
111cdf0e10cSrcweir 		m_stack = tmp;
112cdf0e10cSrcweir 	}
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	// Insert new scope
115cdf0e10cSrcweir 	m_stack[m_top++] = pScope;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	return this;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
pop()120cdf0e10cSrcweir void AstStack::pop()
121cdf0e10cSrcweir {
122cdf0e10cSrcweir 	AstScope *pScope;
123cdf0e10cSrcweir 
124cdf0e10cSrcweir 	if (m_top < 1)
125cdf0e10cSrcweir 		return;
126cdf0e10cSrcweir 	pScope = m_stack[--m_top];
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
clear()129cdf0e10cSrcweir void AstStack::clear()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	m_top = 0;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134