Update ooo320-m1
[ooovba.git] / idlc / source / aststack.cxx
blob06a31f3bc6dce4061bbbeeeb98847a14842d1430
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: aststack.cxx,v $
10 * $Revision: 1.5 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_idlc.hxx"
33 #include <rtl/alloc.h>
34 #include <idlc/aststack.hxx>
35 #include <idlc/astscope.hxx>
37 #define STACKSIZE_INCREMENT 64
39 AstStack::AstStack()
40 : m_stack((AstScope**)rtl_allocateZeroMemory(sizeof(AstScope*) * STACKSIZE_INCREMENT))
41 , m_size(STACKSIZE_INCREMENT)
42 , m_top(0)
46 AstStack::~AstStack()
48 for(sal_uInt32 i=0; i < m_top; i++)
50 if (m_stack[i])
51 delete(m_stack[i]);
54 rtl_freeMemory(m_stack);
57 sal_uInt32 AstStack::depth()
59 return m_top;
62 AstScope* AstStack::top()
64 if (m_top < 1)
65 return NULL;
66 return m_stack[m_top - 1];
69 AstScope* AstStack::bottom()
71 if (m_top == 0)
72 return NULL;
73 return m_stack[0];
76 AstScope* AstStack::nextToTop()
78 AstScope *tmp, *retval;
80 if (depth() < 2)
81 return NULL;
83 tmp = top(); // Save top
84 (void) pop(); // Pop it
85 retval = top(); // Get next one down
86 (void) push(tmp); // Push top back
87 return retval; // Return next one down
90 AstScope* AstStack::topNonNull()
92 for (sal_uInt32 i = m_top; i > 0; i--)
94 if ( m_stack[i - 1] )
95 return m_stack[i - 1];
97 return NULL;
100 AstStack* AstStack::push(AstScope* pScope)
102 AstScope **tmp;
103 // AstDeclaration *pDecl = ScopeAsDecl(pScope);
104 sal_uInt32 newSize;
105 sal_uInt32 i;
107 // Make sure there's space for one more
108 if (m_size == m_top)
110 newSize = m_size;
111 newSize += STACKSIZE_INCREMENT;
112 tmp = (AstScope**)rtl_allocateZeroMemory(sizeof(AstScope*) * newSize);
114 for(i=0; i < m_size; i++)
115 tmp[i] = m_stack[i];
117 rtl_freeMemory(m_stack);
118 m_stack = tmp;
121 // Insert new scope
122 m_stack[m_top++] = pScope;
124 return this;
127 void AstStack::pop()
129 AstScope *pScope;
131 if (m_top < 1)
132 return;
133 pScope = m_stack[--m_top];
136 void AstStack::clear()
138 m_top = 0;