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 "sal/config.h"
21 :
22 : #include "sal/types.h"
23 :
24 : #include <precomp.h>
25 : #include <s2_luidl/pe_const.hxx>
26 :
27 : // NOT FULLY DECLARED SERVICES
28 : #include <ary/idl/i_gate.hxx>
29 : #include <ary/idl/i_constant.hxx>
30 : #include <ary/idl/i_constgroup.hxx>
31 : #include <ary/idl/ip_ce.hxx>
32 : #include <ary/doc/d_oldidldocu.hxx>
33 : #include <s2_luidl/pe_type2.hxx>
34 : #include <s2_luidl/pe_evalu.hxx>
35 : #include <s2_luidl/tk_punct.hxx>
36 : #include <s2_luidl/tk_ident.hxx>
37 : #include <s2_luidl/tk_keyw.hxx>
38 :
39 :
40 : namespace csi
41 : {
42 : namespace uidl
43 : {
44 :
45 :
46 : #ifdef DF
47 : #undef DF
48 : #endif
49 : #define DF &PE_Constant::On_Default
50 :
51 : PE_Constant::F_TOK
52 : PE_Constant::aDispatcher[PE_Constant::e_STATES_MAX][PE_Constant::tt_MAX] =
53 : { { DF, DF, DF }, // e_none
54 : { DF, &PE_Constant::On_expect_name_Identifier,
55 : DF }, // expect_name
56 : { DF, DF, &PE_Constant::On_expect_curl_bracket_open_Punctuation }, // expect_curl_bracket_open
57 : { &PE_Constant::On_expect_const_Stereotype,
58 : DF, &PE_Constant::On_expect_const_Punctuation }, // expect_const
59 : { DF, &PE_Constant::On_expect_value_Identifier,
60 : DF }, // expect_value
61 : { DF, DF, &PE_Constant::On_expect_finish_Punctuation } // expect_finish
62 : };
63 :
64 :
65 :
66 : inline void
67 7826 : PE_Constant::CallHandler( const char * i_sTokenText,
68 : E_TokenType i_eTokenType )
69 7826 : { (this->*aDispatcher[eState][i_eTokenType])(i_sTokenText); }
70 :
71 :
72 :
73 :
74 3 : PE_Constant::PE_Constant()
75 : : eState(e_none),
76 : sData_Name(),
77 : nDataId(0),
78 : pPE_Type(0),
79 : nType(0),
80 : pPE_Value(0),
81 : sName(),
82 3 : sAssignment()
83 : {
84 3 : pPE_Type = new PE_Type(nType);
85 3 : pPE_Value = new PE_Value(sName, sAssignment, true);
86 3 : }
87 :
88 : void
89 3 : PE_Constant::EstablishContacts( UnoIDL_PE * io_pParentPE,
90 : ary::Repository & io_rRepository,
91 : TokenProcessing_Result & o_rResult )
92 : {
93 3 : UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
94 3 : pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
95 3 : pPE_Value->EstablishContacts(this,io_rRepository,o_rResult);
96 3 : }
97 :
98 6 : PE_Constant::~PE_Constant()
99 : {
100 6 : }
101 :
102 : void
103 16946 : PE_Constant::ProcessToken( const Token & i_rToken )
104 : {
105 16946 : i_rToken.Trigger(*this);
106 16946 : }
107 :
108 : void
109 3567 : PE_Constant::Process_Identifier( const TokIdentifier & i_rToken )
110 : {
111 3567 : CallHandler(i_rToken.Text(), tt_identifier);
112 3567 : }
113 :
114 : void
115 1039 : PE_Constant::Process_Punctuation( const TokPunctuation & i_rToken )
116 : {
117 1039 : CallHandler(i_rToken.Text(), tt_punctuation);
118 1039 : }
119 :
120 : void
121 3220 : PE_Constant::Process_Stereotype( const TokStereotype & i_rToken )
122 : {
123 3220 : CallHandler(i_rToken.Text(), tt_stereotype);
124 3220 : }
125 :
126 : void
127 347 : PE_Constant::On_expect_name_Identifier(const char * i_sText)
128 : {
129 347 : sName = i_sText;
130 :
131 347 : SetResult(done,stay);
132 347 : eState = expect_curl_bracket_open;
133 347 : }
134 :
135 : void
136 347 : PE_Constant::On_expect_curl_bracket_open_Punctuation(const char * i_sText)
137 : {
138 347 : if ( i_sText[0] == '{')
139 : {
140 347 : sData_Name = sName;
141 :
142 : ary::idl::ConstantsGroup &
143 347 : rCe = Gate().Ces().
144 347 : Store_ConstantsGroup(CurNamespace().CeId(),sData_Name);
145 347 : PassDocuAt(rCe);
146 347 : nDataId = rCe.CeId();
147 :
148 347 : SetResult(done,stay);
149 347 : eState = expect_const;
150 : }
151 : else
152 : {
153 0 : On_Default(i_sText);
154 : }
155 347 : }
156 :
157 : void
158 3220 : PE_Constant::On_expect_const_Stereotype(SAL_UNUSED_PARAMETER const char *)
159 : {
160 3220 : SetResult( done, push_sure, pPE_Type.Ptr() );
161 3220 : }
162 :
163 : void
164 346 : PE_Constant::On_expect_const_Punctuation(const char * i_sText)
165 : {
166 346 : if ( i_sText[0] == '}')
167 : {
168 346 : SetResult(done,stay);
169 346 : eState = expect_finish;
170 : }
171 : else
172 : {
173 0 : On_Default(i_sText);
174 : }
175 346 : }
176 :
177 : void
178 3220 : PE_Constant::On_expect_value_Identifier(SAL_UNUSED_PARAMETER const char *)
179 : {
180 3220 : SetResult( not_done, push_sure, pPE_Value.Ptr() );
181 3220 : }
182 :
183 : void
184 346 : PE_Constant::On_expect_finish_Punctuation(const char * i_sText)
185 : {
186 346 : if ( i_sText[0] == ';')
187 : {
188 346 : SetResult(done,pop_success);
189 346 : eState = e_none;
190 : }
191 : else
192 : {
193 0 : On_Default(i_sText);
194 : }
195 346 : }
196 :
197 : void
198 0 : PE_Constant::On_Default(SAL_UNUSED_PARAMETER const char * )
199 : {
200 0 : SetResult(not_done,pop_failure);
201 0 : eState = e_none;
202 0 : }
203 :
204 : void
205 3567 : PE_Constant::EmptySingleConstData()
206 : {
207 3567 : nType = 0;
208 3567 : sName = "";
209 3567 : sAssignment = "";
210 3567 : }
211 :
212 : void
213 3220 : PE_Constant::CreateSingleConstant()
214 : {
215 : ary::idl::Constant &
216 3220 : rCe = Gate().Ces().Store_Constant( nDataId,
217 : sName,
218 : nType,
219 3220 : sAssignment );
220 3220 : pPE_Type->PassDocuAt(rCe);
221 3220 : }
222 :
223 : void
224 347 : PE_Constant::InitData()
225 : {
226 347 : eState = expect_name;
227 :
228 347 : sData_Name.clear();
229 347 : nDataId = 0;
230 :
231 347 : EmptySingleConstData();
232 347 : }
233 :
234 : void
235 6440 : PE_Constant::ReceiveData()
236 : {
237 6440 : switch (eState)
238 : {
239 : case expect_const:
240 3220 : eState = expect_value;
241 3220 : break;
242 : case expect_value:
243 : {
244 3220 : if (sName.length() == 0 OR sAssignment.length() == 0 OR NOT nType.IsValid())
245 : {
246 0 : Cerr() << "Constant without value found." << Endl();
247 0 : eState = expect_const;
248 0 : break;
249 : }
250 :
251 3220 : CreateSingleConstant();
252 3220 : EmptySingleConstData();
253 3220 : eState = expect_const;
254 3220 : } break;
255 : default:
256 0 : SetResult(not_done, pop_failure);
257 0 : eState = e_none;
258 : } // end switch
259 6440 : }
260 :
261 : void
262 346 : PE_Constant::TransferData()
263 : {
264 : csv_assert(nDataId.IsValid());
265 346 : eState = e_none;
266 346 : }
267 :
268 : UnoIDL_PE &
269 9120 : PE_Constant::MyPE()
270 : {
271 9120 : return *this;
272 : }
273 :
274 : } // namespace uidl
275 3 : } // namespace csi
276 :
277 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|