1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #ifndef ADC_CPP_SOWNSTCK_HXX 29*cdf0e10cSrcweir #define ADC_CPP_SOWNSTCK_HXX 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir // USED SERVICES 34*cdf0e10cSrcweir // BASE CLASSES 35*cdf0e10cSrcweir #include "cxt2ary.hxx" 36*cdf0e10cSrcweir // COMPONENTS 37*cdf0e10cSrcweir #include <ary/cpp/c_types4cpp.hxx> 38*cdf0e10cSrcweir #include <estack.hxx> 39*cdf0e10cSrcweir // PARAMETERS 40*cdf0e10cSrcweir #include <ary/cpp/c_namesp.hxx> 41*cdf0e10cSrcweir #include <x_parse.hxx> 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir namespace cpp 45*cdf0e10cSrcweir { 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir using ary::cpp::E_Protection; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir /** Implementation struct for cpp::ContextForAry. 51*cdf0e10cSrcweir */ 52*cdf0e10cSrcweir struct ContextForAry::S_OwnerStack 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir public: 55*cdf0e10cSrcweir S_OwnerStack(); 56*cdf0e10cSrcweir void SetGlobalNamespace( 57*cdf0e10cSrcweir ary::cpp::Namespace & 58*cdf0e10cSrcweir io_rGlobalNamespace ); 59*cdf0e10cSrcweir ~S_OwnerStack(); 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir void Reset(); 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir void OpenNamespace( 64*cdf0e10cSrcweir ary::cpp::Namespace & 65*cdf0e10cSrcweir io_rOpenedNamespace ); 66*cdf0e10cSrcweir void OpenExternC(); 67*cdf0e10cSrcweir void OpenClass( 68*cdf0e10cSrcweir ary::cpp::Class & io_rOpenedClass ); 69*cdf0e10cSrcweir void OpenEnum( 70*cdf0e10cSrcweir ary::cpp::Enum & io_rOpenedEnum ); 71*cdf0e10cSrcweir void CloseBlock(); 72*cdf0e10cSrcweir void CloseClass(); 73*cdf0e10cSrcweir void CloseEnum(); 74*cdf0e10cSrcweir void SetCurProtection( 75*cdf0e10cSrcweir ary::cpp::E_Protection 76*cdf0e10cSrcweir i_eProtection ); 77*cdf0e10cSrcweir ary::cpp::Namespace & 78*cdf0e10cSrcweir CurNamespace() const; 79*cdf0e10cSrcweir ary::cpp::Class * CurClass() const; 80*cdf0e10cSrcweir ary::cpp::Enum * CurEnum() const; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir Owner & CurOwner() const; 83*cdf0e10cSrcweir ary::cpp::E_Protection 84*cdf0e10cSrcweir CurProtection() const; 85*cdf0e10cSrcweir bool IsExternC() const { return nExternC > 0; } 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir private: 88*cdf0e10cSrcweir typedef std::pair< ary::cpp::Class*, E_Protection > ClassEnv; 89*cdf0e10cSrcweir typedef EStack< ary::cpp::Namespace* > Stack_Namespaces; 90*cdf0e10cSrcweir typedef EStack< ClassEnv > Stack_Classes; 91*cdf0e10cSrcweir typedef ary::cpp::InputContext::Owner Ifc_Owner; 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir void SetOwner_2CurNamespace(); 94*cdf0e10cSrcweir void SetOwner_2CurClass(); 95*cdf0e10cSrcweir void SetOwner_2None(); 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir // DATA 98*cdf0e10cSrcweir Stack_Namespaces aStack_Namespaces; 99*cdf0e10cSrcweir Stack_Classes aStack_Classes; 100*cdf0e10cSrcweir ary::cpp::Enum * pCurEnum; 101*cdf0e10cSrcweir uintt nExternC; /// This is a number, for the case that extern "C" blocks are nested. 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir Dyn<Owner_Namespace> 104*cdf0e10cSrcweir pOwner_Namespace; 105*cdf0e10cSrcweir Dyn<Owner_Class> pOwner_Class; 106*cdf0e10cSrcweir Ifc_Owner * pOwner_Cur; 107*cdf0e10cSrcweir }; 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir // IMPLEMENTATION 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir /* The implementation is in header, though not inline, because this file is included 113*cdf0e10cSrcweir in cxt2ary.cxx only! 114*cdf0e10cSrcweir */ 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir inline ary::cpp::Namespace & 117*cdf0e10cSrcweir ContextForAry:: 118*cdf0e10cSrcweir S_OwnerStack::CurNamespace() const 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir csv_assert( aStack_Namespaces.size() > 0 ); 121*cdf0e10cSrcweir return *aStack_Namespaces.top(); 122*cdf0e10cSrcweir } 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir inline ary::cpp::Class * 125*cdf0e10cSrcweir ContextForAry:: 126*cdf0e10cSrcweir S_OwnerStack::CurClass() const 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir return aStack_Classes.size() > 0 129*cdf0e10cSrcweir ? aStack_Classes.top().first 130*cdf0e10cSrcweir : (ary::cpp::Class *) 0; 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir inline void 134*cdf0e10cSrcweir ContextForAry:: 135*cdf0e10cSrcweir S_OwnerStack::SetOwner_2CurNamespace() 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir csv_assert( aStack_Namespaces.size() > 0 ); 138*cdf0e10cSrcweir pOwner_Cur = pOwner_Namespace.MutablePtr(); 139*cdf0e10cSrcweir pOwner_Namespace->SetAnotherNamespace( CurNamespace() ); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir inline void 143*cdf0e10cSrcweir ContextForAry:: 144*cdf0e10cSrcweir S_OwnerStack::SetOwner_2CurClass() 145*cdf0e10cSrcweir { 146*cdf0e10cSrcweir csv_assert( aStack_Classes.size() > 0 ); 147*cdf0e10cSrcweir pOwner_Cur = pOwner_Class.MutablePtr(); 148*cdf0e10cSrcweir pOwner_Class->SetAnotherClass( *CurClass() ); 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir ContextForAry:: 152*cdf0e10cSrcweir S_OwnerStack::S_OwnerStack() 153*cdf0e10cSrcweir : // aStack_Namespaces, 154*cdf0e10cSrcweir // aStack_Classes, 155*cdf0e10cSrcweir pCurEnum(0), 156*cdf0e10cSrcweir nExternC(0), 157*cdf0e10cSrcweir pOwner_Namespace(new Owner_Namespace), 158*cdf0e10cSrcweir pOwner_Class(new Owner_Class), 159*cdf0e10cSrcweir pOwner_Cur(0) 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir void 164*cdf0e10cSrcweir ContextForAry:: 165*cdf0e10cSrcweir S_OwnerStack::Reset() 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir while ( aStack_Namespaces.top()->Owner().IsValid() ) 168*cdf0e10cSrcweir aStack_Namespaces.pop(); 169*cdf0e10cSrcweir while ( NOT aStack_Classes.empty() ) 170*cdf0e10cSrcweir aStack_Classes.pop(); 171*cdf0e10cSrcweir pCurEnum = 0; 172*cdf0e10cSrcweir nExternC = 0; 173*cdf0e10cSrcweir SetOwner_2CurNamespace(); 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir inline void 177*cdf0e10cSrcweir ContextForAry:: 178*cdf0e10cSrcweir S_OwnerStack::SetGlobalNamespace( ary::cpp::Namespace & io_rGlobalNamespace ) 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir csv_assert( aStack_Namespaces.size() == 0 ); 181*cdf0e10cSrcweir aStack_Namespaces.push(&io_rGlobalNamespace); 182*cdf0e10cSrcweir SetOwner_2CurNamespace(); 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir ContextForAry:: 186*cdf0e10cSrcweir S_OwnerStack::~S_OwnerStack() 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir inline void 191*cdf0e10cSrcweir ContextForAry:: 192*cdf0e10cSrcweir S_OwnerStack::OpenNamespace( ary::cpp::Namespace & io_rOpenedNamespace ) 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir csv_assert( aStack_Namespaces.size() > 0 OR io_rOpenedNamespace.Parent() == 0 ); 195*cdf0e10cSrcweir aStack_Namespaces.push(&io_rOpenedNamespace); 196*cdf0e10cSrcweir SetOwner_2CurNamespace(); 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir inline void 200*cdf0e10cSrcweir ContextForAry:: 201*cdf0e10cSrcweir S_OwnerStack::OpenExternC() 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir ++nExternC; 204*cdf0e10cSrcweir // SetOwner_2None(); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir inline void 208*cdf0e10cSrcweir ContextForAry:: 209*cdf0e10cSrcweir S_OwnerStack::SetCurProtection( ary::cpp::E_Protection i_eProtection ) 210*cdf0e10cSrcweir { 211*cdf0e10cSrcweir csv_assert( aStack_Classes.size() > 0 ); 212*cdf0e10cSrcweir aStack_Classes.top().second = i_eProtection; 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir inline ary::cpp::Enum * 216*cdf0e10cSrcweir ContextForAry:: 217*cdf0e10cSrcweir S_OwnerStack::CurEnum() const 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir return pCurEnum; 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir inline ary::cpp::InputContext::Owner & 224*cdf0e10cSrcweir ContextForAry:: 225*cdf0e10cSrcweir S_OwnerStack::CurOwner() const 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir csv_assert( pOwner_Cur != 0 ); 228*cdf0e10cSrcweir return *pOwner_Cur; 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir inline E_Protection 232*cdf0e10cSrcweir ContextForAry:: 233*cdf0e10cSrcweir S_OwnerStack::CurProtection() const 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir return aStack_Classes.size() > 0 236*cdf0e10cSrcweir ? aStack_Classes.top().second 237*cdf0e10cSrcweir : ary::cpp::PROTECT_global; 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir inline void 241*cdf0e10cSrcweir ContextForAry:: 242*cdf0e10cSrcweir S_OwnerStack::SetOwner_2None() 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir pOwner_Cur = 0; 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir void 248*cdf0e10cSrcweir ContextForAry:: 249*cdf0e10cSrcweir S_OwnerStack::OpenClass( ary::cpp::Class & io_rOpenedClass ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir E_Protection eDefaultProtection 252*cdf0e10cSrcweir = io_rOpenedClass.ClassKey() == ary::cpp::CK_class 253*cdf0e10cSrcweir ? ary::cpp::PROTECT_private 254*cdf0e10cSrcweir : ary::cpp::PROTECT_public; 255*cdf0e10cSrcweir aStack_Classes.push( ClassEnv(&io_rOpenedClass, eDefaultProtection) ); 256*cdf0e10cSrcweir SetOwner_2CurClass(); 257*cdf0e10cSrcweir } 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir inline void 260*cdf0e10cSrcweir ContextForAry:: 261*cdf0e10cSrcweir S_OwnerStack::OpenEnum( ary::cpp::Enum & io_rOpenedEnum ) 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir csv_assert( pCurEnum == 0 ); 264*cdf0e10cSrcweir pCurEnum = &io_rOpenedEnum; 265*cdf0e10cSrcweir SetOwner_2None(); 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir void 269*cdf0e10cSrcweir ContextForAry:: 270*cdf0e10cSrcweir S_OwnerStack::CloseBlock() 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir if (nExternC > 0) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir --nExternC; 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir else 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir // csv_assert( aStack_Classes.size() == 0 ); 279*cdf0e10cSrcweir if ( aStack_Classes.size() > 0 ) 280*cdf0e10cSrcweir throw X_Parser(X_Parser::x_UnspecifiedSyntaxError, "", String::Null_(), 0); 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir csv_assert( pCurEnum == 0 ); 283*cdf0e10cSrcweir aStack_Namespaces.pop(); 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir // csv_assert( aStack_Namespaces.size() > 0 ); 286*cdf0e10cSrcweir if( aStack_Namespaces.size() == 0 ) 287*cdf0e10cSrcweir throw X_Parser(X_Parser::x_UnspecifiedSyntaxError, "", String::Null_(), 0); 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir SetOwner_2CurNamespace(); 291*cdf0e10cSrcweir } 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir void 294*cdf0e10cSrcweir ContextForAry:: 295*cdf0e10cSrcweir S_OwnerStack::CloseClass() 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir // csv_assert( aStack_Classes.size() > 0 ); 298*cdf0e10cSrcweir if ( aStack_Classes.size() == 0 ) 299*cdf0e10cSrcweir throw X_Parser(X_Parser::x_UnspecifiedSyntaxError, "", String::Null_(), 0); 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir aStack_Classes.pop(); 302*cdf0e10cSrcweir if ( aStack_Classes.size() > 0 ) 303*cdf0e10cSrcweir SetOwner_2CurClass(); 304*cdf0e10cSrcweir else 305*cdf0e10cSrcweir SetOwner_2CurNamespace(); 306*cdf0e10cSrcweir } 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir void 309*cdf0e10cSrcweir ContextForAry:: 310*cdf0e10cSrcweir S_OwnerStack::CloseEnum() 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir csv_assert( pCurEnum != 0 ); 313*cdf0e10cSrcweir pCurEnum = 0; 314*cdf0e10cSrcweir if ( aStack_Classes.size() > 0 ) 315*cdf0e10cSrcweir SetOwner_2CurClass(); 316*cdf0e10cSrcweir else 317*cdf0e10cSrcweir SetOwner_2CurNamespace(); 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir } // namespace cpp 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir #endif 325*cdf0e10cSrcweir 326