1*78bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*78bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*78bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*78bc99aaSAndrew Rist * distributed with this work for additional information
6*78bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*78bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*78bc99aaSAndrew Rist * "License"); you may not use this file except in compliance
9*78bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at
10*78bc99aaSAndrew Rist *
11*78bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*78bc99aaSAndrew Rist *
13*78bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*78bc99aaSAndrew Rist * software distributed under the License is distributed on an
15*78bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*78bc99aaSAndrew Rist * KIND, either express or implied. See the License for the
17*78bc99aaSAndrew Rist * specific language governing permissions and limitations
18*78bc99aaSAndrew Rist * under the License.
19*78bc99aaSAndrew Rist *
20*78bc99aaSAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "pe_defs.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir
26cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
27cdf0e10cSrcweir #include <cosv/tpl/tpltools.hxx>
28cdf0e10cSrcweir #include <ary/cpp/c_gate.hxx>
29cdf0e10cSrcweir #include <ary/cpp/c_define.hxx>
30cdf0e10cSrcweir #include <ary/cpp/c_macro.hxx>
31cdf0e10cSrcweir #include <ary/cpp/cp_def.hxx>
32cdf0e10cSrcweir #include "all_toks.hxx"
33cdf0e10cSrcweir
34cdf0e10cSrcweir
35cdf0e10cSrcweir namespace cpp
36cdf0e10cSrcweir {
37cdf0e10cSrcweir
38cdf0e10cSrcweir
PE_Defines(Cpp_PE * i_pParent)39cdf0e10cSrcweir PE_Defines::PE_Defines( Cpp_PE * i_pParent )
40cdf0e10cSrcweir : Cpp_PE(i_pParent),
41cdf0e10cSrcweir pStati( new PeStatusArray<PE_Defines> ),
42cdf0e10cSrcweir // sName,
43cdf0e10cSrcweir // aParameters,
44cdf0e10cSrcweir // sDefinition,
45cdf0e10cSrcweir bIsMacro(false)
46cdf0e10cSrcweir {
47cdf0e10cSrcweir Setup_StatusFunctions();
48cdf0e10cSrcweir }
49cdf0e10cSrcweir
50cdf0e10cSrcweir
~PE_Defines()51cdf0e10cSrcweir PE_Defines::~PE_Defines()
52cdf0e10cSrcweir {
53cdf0e10cSrcweir }
54cdf0e10cSrcweir
55cdf0e10cSrcweir void
Call_Handler(const cpp::Token & i_rTok)56cdf0e10cSrcweir PE_Defines::Call_Handler( const cpp::Token & i_rTok )
57cdf0e10cSrcweir {
58cdf0e10cSrcweir pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir void
Setup_StatusFunctions()62cdf0e10cSrcweir PE_Defines::Setup_StatusFunctions()
63cdf0e10cSrcweir {
64cdf0e10cSrcweir typedef CallFunction<PE_Defines>::F_Tok F_Tok;
65cdf0e10cSrcweir static F_Tok stateF_expectName[] = { &PE_Defines::On_expectName_DefineName,
66cdf0e10cSrcweir &PE_Defines::On_expectName_MacroName
67cdf0e10cSrcweir };
68cdf0e10cSrcweir static INT16 stateT_expectName[] = { Tid_DefineName,
69cdf0e10cSrcweir Tid_MacroName
70cdf0e10cSrcweir };
71cdf0e10cSrcweir
72cdf0e10cSrcweir static F_Tok stateF_gotDefineName[] = { &PE_Defines::On_gotDefineName_PreProDefinition };
73cdf0e10cSrcweir static INT16 stateT_gotDefineName[] = { Tid_PreProDefinition };
74cdf0e10cSrcweir
75cdf0e10cSrcweir static F_Tok stateF_expectMacroParameters[] =
76cdf0e10cSrcweir { &PE_Defines::On_expectMacroParameters_MacroParameter,
77cdf0e10cSrcweir &PE_Defines::On_expectMacroParameters_PreProDefinition
78cdf0e10cSrcweir };
79cdf0e10cSrcweir static INT16 stateT_expectMacroParameters[] =
80cdf0e10cSrcweir { Tid_MacroParameter,
81cdf0e10cSrcweir Tid_PreProDefinition
82cdf0e10cSrcweir };
83cdf0e10cSrcweir
84cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_Defines, expectName, Hdl_SyntaxError);
85cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_Defines, gotDefineName, Hdl_SyntaxError);
86cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_Defines, expectMacroParameters, Hdl_SyntaxError);
87cdf0e10cSrcweir }
88cdf0e10cSrcweir
89cdf0e10cSrcweir void
InitData()90cdf0e10cSrcweir PE_Defines::InitData()
91cdf0e10cSrcweir {
92cdf0e10cSrcweir pStati->SetCur(expectName);
93cdf0e10cSrcweir
94cdf0e10cSrcweir sName.clear();
95cdf0e10cSrcweir csv::erase_container( aParameters );
96cdf0e10cSrcweir csv::erase_container( aDefinition );
97cdf0e10cSrcweir bIsMacro = false;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir
100cdf0e10cSrcweir void
TransferData()101cdf0e10cSrcweir PE_Defines::TransferData()
102cdf0e10cSrcweir {
103cdf0e10cSrcweir if (NOT bIsMacro)
104cdf0e10cSrcweir {
105cdf0e10cSrcweir if (aDefinition.empty() OR aDefinition.front().empty())
106cdf0e10cSrcweir return;
107cdf0e10cSrcweir
108cdf0e10cSrcweir ary::cpp::Define &
109cdf0e10cSrcweir rNew = Env().AryGate().Defs().Store_Define(
110cdf0e10cSrcweir Env().Context(), sName, aDefinition );
111cdf0e10cSrcweir Env().Event_Store_CppDefinition(rNew);
112cdf0e10cSrcweir }
113cdf0e10cSrcweir else
114cdf0e10cSrcweir {
115cdf0e10cSrcweir ary::cpp::Macro &
116cdf0e10cSrcweir rNew = Env().AryGate().Defs().Store_Macro(
117cdf0e10cSrcweir Env().Context(), sName, aParameters, aDefinition );
118cdf0e10cSrcweir Env().Event_Store_CppDefinition(rNew);
119cdf0e10cSrcweir }
120cdf0e10cSrcweir pStati->SetCur(size_of_states);
121cdf0e10cSrcweir }
122cdf0e10cSrcweir
123cdf0e10cSrcweir void
Hdl_SyntaxError(const char * i_sText)124cdf0e10cSrcweir PE_Defines::Hdl_SyntaxError( const char * i_sText)
125cdf0e10cSrcweir {
126cdf0e10cSrcweir StdHandlingOfSyntaxError(i_sText);
127cdf0e10cSrcweir }
128cdf0e10cSrcweir
129cdf0e10cSrcweir void
On_expectName_DefineName(const char * i_sText)130cdf0e10cSrcweir PE_Defines::On_expectName_DefineName( const char * i_sText )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir SetTokenResult(done, stay);
133cdf0e10cSrcweir pStati->SetCur(gotDefineName);
134cdf0e10cSrcweir
135cdf0e10cSrcweir sName = i_sText;
136cdf0e10cSrcweir bIsMacro = false;
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
139cdf0e10cSrcweir void
On_expectName_MacroName(const char * i_sText)140cdf0e10cSrcweir PE_Defines::On_expectName_MacroName( const char * i_sText )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir SetTokenResult(done, stay);
143cdf0e10cSrcweir pStati->SetCur(expectMacroParameters);
144cdf0e10cSrcweir
145cdf0e10cSrcweir sName = i_sText;
146cdf0e10cSrcweir bIsMacro = true;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir void
On_gotDefineName_PreProDefinition(const char * i_sText)150cdf0e10cSrcweir PE_Defines::On_gotDefineName_PreProDefinition( const char * i_sText )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir SetTokenResult(done, pop_success);
153cdf0e10cSrcweir
154cdf0e10cSrcweir aDefinition.push_back( String (i_sText) );
155cdf0e10cSrcweir }
156cdf0e10cSrcweir
157cdf0e10cSrcweir void
On_expectMacroParameters_MacroParameter(const char * i_sText)158cdf0e10cSrcweir PE_Defines::On_expectMacroParameters_MacroParameter( const char * i_sText )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir SetTokenResult(done, stay);
161cdf0e10cSrcweir aParameters.push_back( String (i_sText) );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
164cdf0e10cSrcweir void
On_expectMacroParameters_PreProDefinition(const char * i_sText)165cdf0e10cSrcweir PE_Defines::On_expectMacroParameters_PreProDefinition( const char * i_sText )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir SetTokenResult(done, pop_success);
168cdf0e10cSrcweir
169cdf0e10cSrcweir aDefinition.push_back( String (i_sText) );
170cdf0e10cSrcweir }
171cdf0e10cSrcweir
172cdf0e10cSrcweir
173cdf0e10cSrcweir } // namespace cpp
174cdf0e10cSrcweir
175