178bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
378bc99aaSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
478bc99aaSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
578bc99aaSAndrew Rist  * distributed with this work for additional information
678bc99aaSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
778bc99aaSAndrew Rist  * to you under the Apache License, Version 2.0 (the
878bc99aaSAndrew Rist  * "License"); you may not use this file except in compliance
978bc99aaSAndrew Rist  * with the License.  You may obtain a copy of the License at
1078bc99aaSAndrew Rist  *
1178bc99aaSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1278bc99aaSAndrew Rist  *
1378bc99aaSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1478bc99aaSAndrew Rist  * software distributed under the License is distributed on an
1578bc99aaSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1678bc99aaSAndrew Rist  * KIND, either express or implied.  See the License for the
1778bc99aaSAndrew Rist  * specific language governing permissions and limitations
1878bc99aaSAndrew Rist  * under the License.
1978bc99aaSAndrew Rist  *
2078bc99aaSAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include <s2_luidl/pe_struc.hxx>
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
27cdf0e10cSrcweir #include <ary/idl/i_gate.hxx>
28cdf0e10cSrcweir #include <ary/idl/i_struct.hxx>
29cdf0e10cSrcweir #include <ary/idl/ip_ce.hxx>
30cdf0e10cSrcweir #include <ary/doc/d_oldidldocu.hxx>
31cdf0e10cSrcweir #include <s2_luidl/tk_ident.hxx>
32cdf0e10cSrcweir #include <s2_luidl/tk_punct.hxx>
33cdf0e10cSrcweir #include <s2_luidl/tk_keyw.hxx>
34cdf0e10cSrcweir #include <s2_luidl/pe_type2.hxx>
35cdf0e10cSrcweir #include <s2_luidl/pe_selem.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir 
38cdf0e10cSrcweir 
39cdf0e10cSrcweir namespace csi
40cdf0e10cSrcweir {
41cdf0e10cSrcweir namespace uidl
42cdf0e10cSrcweir {
43cdf0e10cSrcweir 
44cdf0e10cSrcweir 
PE_Struct()45cdf0e10cSrcweir PE_Struct::PE_Struct()
46cdf0e10cSrcweir     // :    aWork,
47cdf0e10cSrcweir     //      pStati
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     pStati = new S_Stati(*this);
50cdf0e10cSrcweir }
51cdf0e10cSrcweir 
52cdf0e10cSrcweir void
EstablishContacts(UnoIDL_PE * io_pParentPE,ary::Repository & io_rRepository,TokenProcessing_Result & o_rResult)53cdf0e10cSrcweir PE_Struct::EstablishContacts( UnoIDL_PE *               io_pParentPE,
54cdf0e10cSrcweir                               ary::Repository &			io_rRepository,
55cdf0e10cSrcweir                               TokenProcessing_Result & 	o_rResult )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
58cdf0e10cSrcweir     Work().pPE_Element->EstablishContacts(this,io_rRepository,o_rResult);
59cdf0e10cSrcweir     Work().pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
~PE_Struct()62cdf0e10cSrcweir PE_Struct::~PE_Struct()
63cdf0e10cSrcweir {
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir void
ProcessToken(const Token & i_rToken)67cdf0e10cSrcweir PE_Struct::ProcessToken( const Token & i_rToken )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir     i_rToken.Trigger(*Stati().pCurStatus);
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 
73cdf0e10cSrcweir void
InitData()74cdf0e10cSrcweir PE_Struct::InitData()
75cdf0e10cSrcweir {
76cdf0e10cSrcweir     Work().InitData();
77cdf0e10cSrcweir     Stati().pCurStatus = &Stati().aWaitForName;
78cdf0e10cSrcweir }
79cdf0e10cSrcweir 
80cdf0e10cSrcweir void
TransferData()81cdf0e10cSrcweir PE_Struct::TransferData()
82cdf0e10cSrcweir {
83cdf0e10cSrcweir     if (NOT Work().bIsPreDeclaration)
84cdf0e10cSrcweir     {
85*a0d53b35SJürgen Schmidt         csv_assert(! Work().sData_Name.empty());
86cdf0e10cSrcweir         csv_assert(Work().nCurStruct.IsValid());
87cdf0e10cSrcweir     }
88cdf0e10cSrcweir     Stati().pCurStatus = &Stati().aNone;
89cdf0e10cSrcweir }
90cdf0e10cSrcweir 
91cdf0e10cSrcweir void
ReceiveData()92cdf0e10cSrcweir PE_Struct::ReceiveData()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     Stati().pCurStatus->On_SubPE_Left();
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
S_Work()97cdf0e10cSrcweir PE_Struct::S_Work::S_Work()
98cdf0e10cSrcweir     :   sData_Name(),
99cdf0e10cSrcweir         sData_TemplateParam(),
100cdf0e10cSrcweir         bIsPreDeclaration(false),
101cdf0e10cSrcweir         nCurStruct(0),
102cdf0e10cSrcweir         pPE_Element(0),
103cdf0e10cSrcweir         nCurParsed_ElementRef(0),
104cdf0e10cSrcweir         pPE_Type(0),
105cdf0e10cSrcweir         nCurParsed_Base(0)
106cdf0e10cSrcweir 
107cdf0e10cSrcweir {
108cdf0e10cSrcweir     pPE_Element = new PE_StructElement(nCurParsed_ElementRef,nCurStruct,sData_TemplateParam);
109cdf0e10cSrcweir     pPE_Type = new PE_Type(nCurParsed_Base);
110cdf0e10cSrcweir }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir void
InitData()113cdf0e10cSrcweir PE_Struct::S_Work::InitData()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir     sData_Name.clear();
116cdf0e10cSrcweir     sData_TemplateParam.clear();
117cdf0e10cSrcweir     bIsPreDeclaration = false;
118cdf0e10cSrcweir     nCurStruct = 0;
119cdf0e10cSrcweir     nCurParsed_ElementRef = 0;
120cdf0e10cSrcweir     nCurParsed_Base = 0;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir void
Prepare_PE_QualifiedName()124cdf0e10cSrcweir PE_Struct::S_Work::Prepare_PE_QualifiedName()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir     nCurParsed_ElementRef = 0;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
129cdf0e10cSrcweir void
Prepare_PE_Element()130cdf0e10cSrcweir PE_Struct::S_Work::Prepare_PE_Element()
131cdf0e10cSrcweir {
132cdf0e10cSrcweir     nCurParsed_Base = 0;
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir void
Data_Set_Name(const char * i_sName)136cdf0e10cSrcweir PE_Struct::S_Work::Data_Set_Name( const char * i_sName )
137cdf0e10cSrcweir {
138cdf0e10cSrcweir     sData_Name = i_sName;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir void
Data_Set_TemplateParam(const char * i_sTemplateParam)142cdf0e10cSrcweir PE_Struct::S_Work::Data_Set_TemplateParam( const char * i_sTemplateParam )
143cdf0e10cSrcweir {
144cdf0e10cSrcweir     sData_TemplateParam = i_sTemplateParam;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir 
S_Stati(PE_Struct & io_rStruct)147cdf0e10cSrcweir PE_Struct::S_Stati::S_Stati(PE_Struct & io_rStruct)
148cdf0e10cSrcweir     :   aNone(io_rStruct),
149cdf0e10cSrcweir         aWaitForName(io_rStruct),
150cdf0e10cSrcweir         aGotName(io_rStruct),
151cdf0e10cSrcweir         aWaitForTemplateParam(io_rStruct),
152cdf0e10cSrcweir         aWaitForTemplateEnd(io_rStruct),
153cdf0e10cSrcweir         aWaitForBase(io_rStruct),
154cdf0e10cSrcweir         aGotBase(io_rStruct),
155cdf0e10cSrcweir         aWaitForElement(io_rStruct),
156cdf0e10cSrcweir         aWaitForFinish(io_rStruct),
157cdf0e10cSrcweir         pCurStatus(0)
158cdf0e10cSrcweir {
159cdf0e10cSrcweir     pCurStatus = &aNone;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 
163cdf0e10cSrcweir //***********************       Stati       ***************************//
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 
166cdf0e10cSrcweir UnoIDL_PE &
MyPE()167cdf0e10cSrcweir PE_Struct::PE_StructState::MyPE()
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     return rStruct;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 
173cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier & i_rToken)174cdf0e10cSrcweir PE_Struct::State_WaitForName::Process_Identifier( const TokIdentifier & i_rToken )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir     Work().Data_Set_Name(i_rToken.Text());
177cdf0e10cSrcweir     MoveState( Stati().aGotName );
178cdf0e10cSrcweir     SetResult(done,stay);
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)182cdf0e10cSrcweir PE_Struct::State_GotName::Process_Punctuation( const TokPunctuation & i_rToken )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir     if ( i_rToken.Id() != TokPunctuation::Semicolon )
185cdf0e10cSrcweir     {
186cdf0e10cSrcweir         switch (i_rToken.Id())
187cdf0e10cSrcweir     	{
188cdf0e10cSrcweir             case TokPunctuation::Colon:
189cdf0e10cSrcweir                 MoveState( Stati().aWaitForBase );
190cdf0e10cSrcweir                 SetResult(done,push_sure,Work().pPE_Type.Ptr());
191cdf0e10cSrcweir                 Work().Prepare_PE_QualifiedName();
192cdf0e10cSrcweir             	break;
193cdf0e10cSrcweir             case TokPunctuation::CurledBracketOpen:
194cdf0e10cSrcweir                 PE().store_Struct();
195cdf0e10cSrcweir                 MoveState( Stati().aWaitForElement );
196cdf0e10cSrcweir                 SetResult(done,stay);
197cdf0e10cSrcweir             	break;
198cdf0e10cSrcweir             case TokPunctuation::Lesser:
199cdf0e10cSrcweir                 MoveState( Stati().aWaitForTemplateParam );
200cdf0e10cSrcweir                 SetResult(done,stay);
201cdf0e10cSrcweir             	break;
202cdf0e10cSrcweir             default:
203cdf0e10cSrcweir                 SetResult(not_done,pop_failure);
204cdf0e10cSrcweir         }   // end switch
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir     else
207cdf0e10cSrcweir     {
208cdf0e10cSrcweir         Work().sData_Name.clear();
209cdf0e10cSrcweir         SetResult(done,pop_success);
210cdf0e10cSrcweir     }
211cdf0e10cSrcweir }
212cdf0e10cSrcweir 
213cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier & i_rToken)214cdf0e10cSrcweir PE_Struct::State_WaitForTemplateParam::Process_Identifier( const TokIdentifier & i_rToken )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir     Work().Data_Set_TemplateParam(i_rToken.Text());
217cdf0e10cSrcweir     MoveState( Stati().aWaitForTemplateEnd );
218cdf0e10cSrcweir     SetResult(done,stay);
219cdf0e10cSrcweir }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation &)222cdf0e10cSrcweir PE_Struct::State_WaitForTemplateEnd::Process_Punctuation( const TokPunctuation & )
223cdf0e10cSrcweir {
224cdf0e10cSrcweir     // Assume:  TokPunctuation::Greater
225cdf0e10cSrcweir     MoveState( Stati().aGotName );
226cdf0e10cSrcweir     SetResult(done,stay);
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
229cdf0e10cSrcweir void
On_SubPE_Left()230cdf0e10cSrcweir PE_Struct::State_WaitForBase::On_SubPE_Left()
231cdf0e10cSrcweir {
232cdf0e10cSrcweir     MoveState(Stati().aGotBase);
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)236cdf0e10cSrcweir PE_Struct::State_GotBase::Process_Punctuation( const TokPunctuation & i_rToken )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     if ( i_rToken.Id() == TokPunctuation::CurledBracketOpen )
239cdf0e10cSrcweir     {
240cdf0e10cSrcweir         PE().store_Struct();
241cdf0e10cSrcweir         MoveState( Stati().aWaitForElement );
242cdf0e10cSrcweir         SetResult(done,stay);
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir     else
245cdf0e10cSrcweir     {
246cdf0e10cSrcweir         SetResult(not_done,pop_failure);
247cdf0e10cSrcweir     }
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier &)251cdf0e10cSrcweir PE_Struct::State_WaitForElement::Process_Identifier( const TokIdentifier & )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir     SetResult( not_done, push_sure, Work().pPE_Element.Ptr() );
254cdf0e10cSrcweir     Work().Prepare_PE_Element();
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir void
Process_NameSeparator()258cdf0e10cSrcweir PE_Struct::State_WaitForElement::Process_NameSeparator()
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
261cdf0e10cSrcweir     Work().Prepare_PE_Element();
262cdf0e10cSrcweir }
263cdf0e10cSrcweir 
264cdf0e10cSrcweir void
Process_BuiltInType(const TokBuiltInType &)265cdf0e10cSrcweir PE_Struct::State_WaitForElement::Process_BuiltInType( const TokBuiltInType & )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
268cdf0e10cSrcweir     Work().Prepare_PE_Element();
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir void
Process_TypeModifier(const TokTypeModifier &)272cdf0e10cSrcweir PE_Struct::State_WaitForElement::Process_TypeModifier(const TokTypeModifier & )
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     SetResult( not_done, push_sure, Work().pPE_Element.Ptr());
275cdf0e10cSrcweir     Work().Prepare_PE_Element();
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)279cdf0e10cSrcweir PE_Struct::State_WaitForElement::Process_Punctuation( const TokPunctuation & i_rToken )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     if ( i_rToken.Id() == TokPunctuation::CurledBracketClose )
282cdf0e10cSrcweir     {
283cdf0e10cSrcweir         MoveState( Stati().aWaitForFinish );
284cdf0e10cSrcweir         SetResult( done, stay );
285cdf0e10cSrcweir     }
286cdf0e10cSrcweir     else
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         SetResult( not_done, pop_failure );
289cdf0e10cSrcweir     }
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)293cdf0e10cSrcweir PE_Struct::State_WaitForFinish::Process_Punctuation( const TokPunctuation & i_rToken )
294cdf0e10cSrcweir {
295cdf0e10cSrcweir     if (i_rToken.Id() == TokPunctuation::Semicolon)
296cdf0e10cSrcweir     {
297cdf0e10cSrcweir         MoveState( Stati().aNone );
298cdf0e10cSrcweir         SetResult( done, pop_success );
299cdf0e10cSrcweir     }
300cdf0e10cSrcweir     else
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         SetResult( not_done, pop_failure );
303cdf0e10cSrcweir     }
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir void
store_Struct()307cdf0e10cSrcweir PE_Struct::store_Struct()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     ary::idl::Struct &
310cdf0e10cSrcweir         rCe = Gate().Ces().Store_Struct(
311cdf0e10cSrcweir                         CurNamespace().CeId(),
312cdf0e10cSrcweir                         Work().sData_Name,
313cdf0e10cSrcweir                         Work().nCurParsed_Base,
314cdf0e10cSrcweir                         Work().sData_TemplateParam );
315cdf0e10cSrcweir     PassDocuAt(rCe);
316cdf0e10cSrcweir     Work().nCurStruct = rCe.CeId();
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 
320cdf0e10cSrcweir }   // namespace uidl
321cdf0e10cSrcweir }   // namespace csi
322