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