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_iface.hxx>
22 :
23 :
24 : // NOT FULLY DEFINED SERVICES
25 : #include <ary/idl/i_interface.hxx>
26 : #include <ary/idl/i_gate.hxx>
27 : #include <ary/idl/ip_ce.hxx>
28 : #include <ary/doc/d_oldidldocu.hxx>
29 : #include <s2_luidl/pe_func2.hxx>
30 : #include <s2_luidl/pe_attri.hxx>
31 : #include <s2_luidl/pe_type2.hxx>
32 : #include <s2_luidl/tk_keyw.hxx>
33 : #include <s2_luidl/tk_ident.hxx>
34 : #include <s2_luidl/tk_punct.hxx>
35 : #include <adc_cl.hxx>
36 :
37 :
38 :
39 : namespace csi
40 : {
41 : namespace uidl
42 : {
43 :
44 : #ifdef DF
45 : #undef DF
46 : #endif
47 : #define DF &PE_Interface::On_Default
48 :
49 : PE_Interface::F_TOK
50 : PE_Interface::aDispatcher[PE_Interface::e_STATES_MAX][PE_Interface::tt_MAX] =
51 : { { DF, DF, DF, DF, DF }, // e_none
52 : { &PE_Interface::On_need_uik_MetaType,
53 : DF, DF, DF, DF }, // need_uik
54 : { DF, &PE_Interface::On_uik_Identifier,
55 : &PE_Interface::On_uik_Punctuation,
56 : DF, DF }, // uik
57 : { &PE_Interface::On_need_ident_MetaType,
58 : DF, DF, DF, DF }, // need_ident
59 : { DF, &PE_Interface::On_ident_Identifier,
60 : &PE_Interface::On_ident_Punctuation,
61 : DF, DF }, // ident
62 : { &PE_Interface::On_need_interface_MetaType,
63 : DF, DF, DF, DF }, // need_interface
64 : { DF, &PE_Interface::On_need_name_Identifer,
65 : DF, DF, DF }, // need_name
66 : { DF, DF, &PE_Interface::On_wait_for_base_Punctuation,
67 : DF, DF }, // wait_for_base
68 : { DF, DF, DF, DF, DF }, // in_base
69 : { DF, DF, &PE_Interface::On_need_curlbr_open_Punctuation,
70 : DF, DF }, // need_curlbr_open
71 : { &PE_Interface::On_std_Metatype,
72 : &PE_Interface::On_std_GotoFunction,
73 : &PE_Interface::On_std_Punctuation,
74 : &PE_Interface::On_std_GotoFunction,
75 : &PE_Interface::On_std_Stereotype }, // e_std
76 : { DF, DF, DF, DF, DF }, // in_function
77 : { DF, DF, DF, DF, DF }, // in_attribute
78 : { DF, DF, &PE_Interface::On_need_finish_Punctuation,
79 : DF, DF }, // need_finish
80 : { DF, DF, DF, DF, DF } // in_base_interface
81 : };
82 :
83 :
84 :
85 : inline void
86 17980 : PE_Interface::CallHandler( const char * i_sTokenText,
87 : E_TokenType i_eTokenType )
88 17980 : { (this->*aDispatcher[eState][i_eTokenType])(i_sTokenText); }
89 :
90 :
91 :
92 3 : PE_Interface::PE_Interface()
93 : : eState(e_none),
94 : sData_Name(),
95 : bIsPreDeclaration(false),
96 : pCurInterface(0),
97 : nCurInterface(0),
98 : pPE_Function(0),
99 : pPE_Attribute(0),
100 : pPE_Type(0),
101 : nCurParsed_Base(0),
102 3 : bOptionalMember(false)
103 : {
104 3 : pPE_Function = new PE_Function(nCurInterface);
105 3 : pPE_Type = new PE_Type(nCurParsed_Base);
106 3 : pPE_Attribute = new PE_Attribute(nCurInterface);
107 3 : }
108 :
109 : void
110 3 : PE_Interface::EstablishContacts( UnoIDL_PE * io_pParentPE,
111 : ary::Repository & io_rRepository,
112 : TokenProcessing_Result & o_rResult )
113 : {
114 3 : UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
115 3 : pPE_Function->EstablishContacts(this,io_rRepository,o_rResult);
116 3 : pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
117 3 : pPE_Attribute->EstablishContacts(this,io_rRepository,o_rResult);
118 3 : }
119 :
120 6 : PE_Interface::~PE_Interface()
121 : {
122 6 : }
123 :
124 : void
125 39420 : PE_Interface::ProcessToken( const Token & i_rToken )
126 : {
127 39420 : i_rToken.Trigger(*this);
128 39420 : }
129 :
130 :
131 : void
132 3005 : PE_Interface::Process_MetaType( const TokMetaType & i_rToken )
133 : {
134 3005 : CallHandler( i_rToken.Text(), tt_metatype );
135 3005 : }
136 :
137 : void
138 3293 : PE_Interface::Process_Identifier( const TokIdentifier & i_rToken )
139 : {
140 3293 : CallHandler( i_rToken.Text(), tt_identifier );
141 3293 : }
142 :
143 : void
144 7214 : PE_Interface::Process_Punctuation( const TokPunctuation & i_rToken )
145 : {
146 7214 : CallHandler( i_rToken.Text(), tt_punctuation );
147 7214 : }
148 :
149 : void
150 111 : PE_Interface::Process_NameSeparator()
151 : {
152 111 : CallHandler( "", tt_startoftype );
153 111 : }
154 :
155 : void
156 3892 : PE_Interface::Process_BuiltInType( const TokBuiltInType & i_rToken )
157 : {
158 3892 : CallHandler( i_rToken.Text(), tt_startoftype );
159 3892 : }
160 :
161 : void
162 438 : PE_Interface::Process_TypeModifier( const TokTypeModifier & i_rToken )
163 : {
164 438 : CallHandler( i_rToken.Text(), tt_startoftype );
165 438 : }
166 :
167 : void
168 27 : PE_Interface::Process_Stereotype( const TokStereotype & i_rToken )
169 : {
170 27 : CallHandler( i_rToken.Text(), tt_stereotype );
171 27 : }
172 :
173 : void
174 0 : PE_Interface::Process_Default()
175 : {
176 0 : SetResult(done, stay);
177 0 : }
178 :
179 :
180 : void
181 0 : PE_Interface::On_need_uik_MetaType(SAL_UNUSED_PARAMETER const char *)
182 : {
183 : // Deprecated, data will be ignored
184 0 : SetResult(done, stay);
185 0 : eState = uik;
186 0 : }
187 :
188 : void
189 0 : PE_Interface::On_uik_Identifier(SAL_UNUSED_PARAMETER const char *)
190 : {
191 : // Deprecated, data will be ignored
192 0 : SetResult(done, stay);
193 0 : }
194 :
195 : void
196 0 : PE_Interface::On_uik_Punctuation(const char * i_sText)
197 : {
198 : // Deprecated, data will be ignored
199 0 : SetResult(done, stay);
200 0 : if (strcmp(",",i_sText) == 0)
201 : {
202 0 : eState = need_ident;
203 : }
204 0 : }
205 :
206 : void
207 0 : PE_Interface::On_need_ident_MetaType(SAL_UNUSED_PARAMETER const char *)
208 : {
209 0 : SetResult(done, stay);
210 0 : eState = ident;
211 0 : }
212 :
213 : void
214 0 : PE_Interface::On_ident_Identifier(SAL_UNUSED_PARAMETER const char *)
215 : {
216 0 : SetResult(done, stay);
217 0 : }
218 :
219 : void
220 0 : PE_Interface::On_ident_Punctuation(const char * i_sText)
221 : {
222 0 : SetResult(done, stay);
223 0 : if (strcmp(")",i_sText) == 0)
224 : {
225 0 : eState = need_interface;
226 : }
227 0 : }
228 :
229 : void
230 2232 : PE_Interface::On_need_interface_MetaType(SAL_UNUSED_PARAMETER const char *)
231 : {
232 2232 : SetResult(done, stay);
233 2232 : eState = need_name;
234 2232 : }
235 :
236 : void
237 2232 : PE_Interface::On_need_name_Identifer(const char * i_sText)
238 : {
239 2232 : SetResult(done, stay);
240 2232 : sData_Name = i_sText;
241 2232 : eState = wait_for_base;
242 2232 : }
243 :
244 : void
245 2232 : PE_Interface::On_wait_for_base_Punctuation(const char * i_sText)
246 : {
247 2232 : if (i_sText[0] != ';')
248 : {
249 1644 : switch (i_sText[0])
250 : {
251 : case ':':
252 1413 : SetResult(done, push_sure, pPE_Type.Ptr());
253 1413 : eState = in_base;
254 1413 : break;
255 : case '{':
256 231 : store_Interface();
257 :
258 231 : SetResult(done,stay);
259 231 : eState = e_std;
260 231 : break;
261 : default:
262 0 : SetResult(not_done, pop_failure);
263 0 : eState = e_none;
264 : } // end switch
265 : }
266 : else
267 : {
268 588 : bIsPreDeclaration = true;
269 588 : SetResult(done, pop_success);
270 588 : eState = e_none;
271 : }
272 2232 : }
273 :
274 : void
275 1413 : PE_Interface::On_need_curlbr_open_Punctuation(const char * i_sText)
276 : {
277 1413 : if (i_sText[0] == '{')
278 : {
279 1413 : store_Interface();
280 :
281 1413 : SetResult(done, stay);
282 1413 : eState = e_std;
283 : }
284 : else {
285 : csv_assert(false);
286 : }
287 1413 : }
288 :
289 :
290 : void
291 773 : PE_Interface::On_std_Metatype(const char * i_sText)
292 : {
293 773 : if (strcmp(i_sText,"attribute") == 0)
294 492 : On_std_GotoAttribute(i_sText);
295 281 : else if (strcmp(i_sText,"interface") == 0)
296 281 : On_std_GotoBaseInterface(i_sText);
297 : else
298 0 : On_std_GotoFunction(i_sText);
299 773 : }
300 :
301 : void
302 1925 : PE_Interface::On_std_Punctuation(const char * i_sText)
303 : {
304 1925 : switch (i_sText[0])
305 : {
306 : case '}':
307 1644 : SetResult(done, stay);
308 1644 : eState = need_finish;
309 1644 : break;
310 : case ';': // Appears after base interface declarations.
311 281 : SetResult(done, stay);
312 281 : break;
313 : default:
314 0 : SetResult(not_done, pop_failure);
315 0 : eState = e_none;
316 : } // end switch
317 1925 : }
318 :
319 : void
320 27 : PE_Interface::On_std_Stereotype(const char * i_sText)
321 : {
322 27 : if (strcmp(i_sText,"oneway") == 0)
323 0 : On_std_GotoFunction(i_sText);
324 33 : else if ( strcmp(i_sText,"readonly") == 0
325 6 : OR strcmp(i_sText,"bound") == 0 )
326 21 : On_std_GotoAttribute(i_sText);
327 6 : else if (strcmp(i_sText,"optional") == 0)
328 : {
329 6 : bOptionalMember = true;
330 6 : SetResult(done, stay);
331 : }
332 : else
333 0 : SetResult(not_done, pop_failure);
334 27 : }
335 :
336 : void
337 5502 : PE_Interface::On_std_GotoFunction(SAL_UNUSED_PARAMETER const char * )
338 : {
339 5502 : SetResult(not_done, push_sure, pPE_Function.Ptr());
340 5502 : eState = in_function;
341 5502 : }
342 :
343 : void
344 513 : PE_Interface::On_std_GotoAttribute(SAL_UNUSED_PARAMETER const char * )
345 : {
346 513 : SetResult(not_done, push_sure, pPE_Attribute.Ptr());
347 513 : eState = in_attribute;
348 513 : }
349 :
350 : void
351 281 : PE_Interface::On_std_GotoBaseInterface(SAL_UNUSED_PARAMETER const char * )
352 : {
353 281 : SetResult(done, push_sure, pPE_Type.Ptr());
354 281 : eState = in_base_interface;
355 281 : }
356 :
357 : void
358 1644 : PE_Interface::On_need_finish_Punctuation(const char * i_sText)
359 : {
360 1644 : switch (i_sText[0])
361 : {
362 : case ';':
363 1644 : SetResult(done, pop_success);
364 1644 : eState = e_none;
365 1644 : break;
366 : default:
367 0 : SetResult(not_done, pop_failure);
368 0 : eState = e_none;
369 : } // end switch
370 1644 : }
371 :
372 : void
373 0 : PE_Interface::On_Default(SAL_UNUSED_PARAMETER const char *)
374 : {
375 0 : SetResult(not_done, pop_failure);
376 0 : }
377 :
378 : void
379 2232 : PE_Interface::InitData()
380 : {
381 2232 : eState = need_interface;
382 :
383 2232 : sData_Name.clear();
384 2232 : bIsPreDeclaration = false;
385 2232 : pCurInterface = 0;
386 2232 : nCurInterface = 0;
387 2232 : nCurParsed_Base = 0;
388 2232 : bOptionalMember = false;
389 2232 : }
390 :
391 : void
392 2232 : PE_Interface::TransferData()
393 : {
394 2232 : if (NOT bIsPreDeclaration)
395 : {
396 : csv_assert(sData_Name.size() > 0);
397 : csv_assert(nCurInterface.IsValid());
398 : }
399 : else
400 : {
401 588 : sData_Name.clear();
402 588 : pCurInterface = 0;
403 588 : nCurInterface = 0;
404 : }
405 :
406 2232 : eState = e_none;
407 2232 : }
408 :
409 : void
410 7709 : PE_Interface::ReceiveData()
411 : {
412 7709 : switch (eState)
413 : {
414 : case in_base:
415 1413 : eState = need_curlbr_open;
416 1413 : break;
417 : case in_function:
418 5502 : eState = e_std;
419 5502 : break;
420 : case in_attribute:
421 513 : eState = e_std;
422 513 : break;
423 : case in_base_interface:
424 281 : if (bOptionalMember)
425 : {
426 6 : pPE_Type->SetOptional();
427 6 : bOptionalMember = false;
428 : }
429 : pCurInterface->Add_Base(
430 : nCurParsed_Base,
431 281 : pPE_Type->ReleaseDocu());
432 281 : nCurParsed_Base = 0;
433 281 : eState = e_std;
434 281 : break;
435 : default:
436 : csv_assert(false);
437 : }
438 7709 : }
439 :
440 : UnoIDL_PE &
441 21440 : PE_Interface::MyPE()
442 : {
443 21440 : return *this;
444 : }
445 :
446 : void
447 1644 : PE_Interface::store_Interface()
448 : {
449 1644 : pCurInterface = & Gate().Ces().Store_Interface(
450 1644 : CurNamespace().CeId(),
451 : sData_Name,
452 3288 : nCurParsed_Base );
453 1644 : nCurInterface = pCurInterface->CeId();
454 1644 : PassDocuAt(*pCurInterface);
455 1644 : }
456 :
457 :
458 : } // namespace uidl
459 3 : } // namespace csi
460 :
461 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|