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()32cdf0e10cSrcweirAstStack::AstStack() 33cdf0e10cSrcweir : m_stack((AstScope**)rtl_allocateZeroMemory(sizeof(AstScope*) * STACKSIZE_INCREMENT)) 34cdf0e10cSrcweir , m_size(STACKSIZE_INCREMENT) 35cdf0e10cSrcweir , m_top(0) 36cdf0e10cSrcweir { 37cdf0e10cSrcweir } 38cdf0e10cSrcweir ~AstStack()39cdf0e10cSrcweirAstStack::~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()50cdf0e10cSrcweirsal_uInt32 AstStack::depth() 51cdf0e10cSrcweir { 52cdf0e10cSrcweir return m_top; 53cdf0e10cSrcweir } 54cdf0e10cSrcweir top()55cdf0e10cSrcweirAstScope* AstStack::top() 56cdf0e10cSrcweir { 57cdf0e10cSrcweir if (m_top < 1) 58cdf0e10cSrcweir return NULL; 59cdf0e10cSrcweir return m_stack[m_top - 1]; 60cdf0e10cSrcweir } 61cdf0e10cSrcweir bottom()62cdf0e10cSrcweirAstScope* AstStack::bottom() 63cdf0e10cSrcweir { 64cdf0e10cSrcweir if (m_top == 0) 65cdf0e10cSrcweir return NULL; 66cdf0e10cSrcweir return m_stack[0]; 67cdf0e10cSrcweir } 68cdf0e10cSrcweir nextToTop()69cdf0e10cSrcweirAstScope* 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()83cdf0e10cSrcweirAstScope* 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)93cdf0e10cSrcweirAstStack* 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()120cdf0e10cSrcweirvoid AstStack::pop() 121cdf0e10cSrcweir { 122cdf0e10cSrcweir AstScope *pScope; 123cdf0e10cSrcweir 124cdf0e10cSrcweir if (m_top < 1) 125cdf0e10cSrcweir return; 126cdf0e10cSrcweir pScope = m_stack[--m_top]; 127cdf0e10cSrcweir } 128cdf0e10cSrcweir clear()129cdf0e10cSrcweirvoid AstStack::clear() 130cdf0e10cSrcweir { 131cdf0e10cSrcweir m_top = 0; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134