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