178bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
378bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
478bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file
578bc99aaSAndrew Rist * distributed with this work for additional information
678bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file
778bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the
878bc99aaSAndrew Rist * "License"); you may not use this file except in compliance
978bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
1178bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
1378bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing,
1478bc99aaSAndrew Rist * software distributed under the License is distributed on an
1578bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1678bc99aaSAndrew Rist * KIND, either express or implied. See the License for the
1778bc99aaSAndrew Rist * specific language governing permissions and limitations
1878bc99aaSAndrew Rist * under the License.
19cdf0e10cSrcweir *
2078bc99aaSAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "preproc.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
26cdf0e10cSrcweir #include <cosv/tpl/tpltools.hxx>
27cdf0e10cSrcweir #include "all_toks.hxx"
28cdf0e10cSrcweir #include "defdescr.hxx"
29cdf0e10cSrcweir #include <tools/tkpchars.hxx>
30cdf0e10cSrcweir #include "c_rcode.hxx"
31cdf0e10cSrcweir
32cdf0e10cSrcweir namespace cpp
33cdf0e10cSrcweir {
34cdf0e10cSrcweir
35cdf0e10cSrcweir PreProcessor::F_TOKENPROC PreProcessor::aTokProcs[PreProcessor::state_MAX] =
36cdf0e10cSrcweir {
37cdf0e10cSrcweir &PreProcessor::On_plain,
38cdf0e10cSrcweir &PreProcessor::On_expect_macro_bracket_left,
39cdf0e10cSrcweir &PreProcessor::On_expect_macro_param
40cdf0e10cSrcweir };
41cdf0e10cSrcweir
PreProcessor()42cdf0e10cSrcweir PreProcessor::PreProcessor()
43cdf0e10cSrcweir : pCppExplorer(0),
44cdf0e10cSrcweir pSourceText(0),
45cdf0e10cSrcweir pCurValidDefines(0),
46cdf0e10cSrcweir // aTokens,
47cdf0e10cSrcweir eState(plain),
48cdf0e10cSrcweir pCurMacro(0),
49cdf0e10cSrcweir dpCurMacroName(0),
50cdf0e10cSrcweir // aCurMacroParams,
51cdf0e10cSrcweir aCurParamText(60000),
52cdf0e10cSrcweir nBracketInParameterCounter(0)
53cdf0e10cSrcweir // aBlockedMacroNames
54cdf0e10cSrcweir {
55cdf0e10cSrcweir }
56cdf0e10cSrcweir
~PreProcessor()57cdf0e10cSrcweir PreProcessor::~PreProcessor()
58cdf0e10cSrcweir {
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir void
AssignPartners(CodeExplorer & o_rCodeExplorer,CharacterSource & o_rCharSource,const MacroMap & i_rCurValidDefines)62cdf0e10cSrcweir PreProcessor::AssignPartners( CodeExplorer & o_rCodeExplorer,
63cdf0e10cSrcweir CharacterSource & o_rCharSource,
64cdf0e10cSrcweir const MacroMap & i_rCurValidDefines )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir pCppExplorer = &o_rCodeExplorer;
67cdf0e10cSrcweir pSourceText = &o_rCharSource;
68cdf0e10cSrcweir pCurValidDefines = &i_rCurValidDefines;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
71cdf0e10cSrcweir void
Process_Token(cpp::Token & let_drToken)72cdf0e10cSrcweir PreProcessor::Process_Token( cpp::Token & let_drToken )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir csv_assert(pCppExplorer != 0); // Implies pSourceText and pCurValidDefines.
75cdf0e10cSrcweir
76cdf0e10cSrcweir (this->*aTokProcs[eState])(let_drToken);
77cdf0e10cSrcweir }
78cdf0e10cSrcweir
79cdf0e10cSrcweir void
On_plain(cpp::Token & let_drToken)80cdf0e10cSrcweir PreProcessor::On_plain( cpp::Token & let_drToken )
81cdf0e10cSrcweir {
82cdf0e10cSrcweir if ( let_drToken.TypeId() == Tid_Identifier )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir if (CheckForDefine(let_drToken))
85cdf0e10cSrcweir return;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir
88cdf0e10cSrcweir pCppExplorer->Process_Token(let_drToken);
89cdf0e10cSrcweir }
90cdf0e10cSrcweir
91cdf0e10cSrcweir void
On_expect_macro_bracket_left(cpp::Token & let_drToken)92cdf0e10cSrcweir PreProcessor::On_expect_macro_bracket_left( cpp::Token & let_drToken )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir if ( let_drToken.TypeId() == Tid_Bracket_Left )
95cdf0e10cSrcweir {
96cdf0e10cSrcweir aCurParamText.seekp(0);
97cdf0e10cSrcweir eState = expect_macro_param;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir else
100cdf0e10cSrcweir {
101cdf0e10cSrcweir pCppExplorer->Process_Token(*dpCurMacroName);
102cdf0e10cSrcweir dpCurMacroName = 0;
103cdf0e10cSrcweir pCppExplorer->Process_Token(let_drToken);
104cdf0e10cSrcweir eState = plain;
105cdf0e10cSrcweir }
106cdf0e10cSrcweir }
107cdf0e10cSrcweir
108cdf0e10cSrcweir void
On_expect_macro_param(cpp::Token & let_drToken)109cdf0e10cSrcweir PreProcessor::On_expect_macro_param( cpp::Token & let_drToken )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir if ( let_drToken.TypeId() == Tid_Bracket_Left )
112cdf0e10cSrcweir nBracketInParameterCounter++;
113cdf0e10cSrcweir else if ( let_drToken.TypeId() == Tid_Bracket_Right )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir if ( nBracketInParameterCounter > 0 )
116cdf0e10cSrcweir nBracketInParameterCounter--;
117cdf0e10cSrcweir else
118cdf0e10cSrcweir {
119cdf0e10cSrcweir if ( NOT csv::no_str(aCurParamText.c_str()) )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir aCurMacroParams.push_back( String(aCurParamText.c_str()) );
122cdf0e10cSrcweir }
123cdf0e10cSrcweir csv_assert( aCurMacroParams.size() == pCurMacro->ParamCount() );
124cdf0e10cSrcweir
125cdf0e10cSrcweir InterpretMacro();
126cdf0e10cSrcweir eState = plain;
127cdf0e10cSrcweir return;
128cdf0e10cSrcweir }
129cdf0e10cSrcweir }
130cdf0e10cSrcweir else if ( let_drToken.TypeId() == Tid_Comma AND nBracketInParameterCounter == 0 )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir aCurMacroParams.push_back( String (aCurParamText.c_str()) );
133cdf0e10cSrcweir aCurParamText.seekp(0);
134cdf0e10cSrcweir return;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
137cdf0e10cSrcweir // KORR_FUTURE:
138cdf0e10cSrcweir // If in future whitespace is parsed also, that should match exactly and the
139cdf0e10cSrcweir // safety spaces, " ", here should be removed.
140cdf0e10cSrcweir aCurParamText << let_drToken.Text() << " ";
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
143cdf0e10cSrcweir bool
CheckForDefine(cpp::Token & let_drToken)144cdf0e10cSrcweir PreProcessor::CheckForDefine( cpp::Token & let_drToken )
145cdf0e10cSrcweir {
146cdf0e10cSrcweir String sTokenText(let_drToken.Text());
147cdf0e10cSrcweir pCurMacro = csv::value_from_map( *pCurValidDefines, sTokenText );
148cdf0e10cSrcweir if (pCurMacro == 0 )
149cdf0e10cSrcweir return false;
150cdf0e10cSrcweir for ( StringVector::const_iterator it = aBlockedMacroNames.begin();
151cdf0e10cSrcweir it != aBlockedMacroNames.end();
152cdf0e10cSrcweir ++it )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir if ( strcmp( (*it).c_str(), let_drToken.Text() ) == 0 )
155cdf0e10cSrcweir return false;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
158cdf0e10cSrcweir if ( pCurMacro->DefineType() == DefineDescription::type_define )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir delete &let_drToken;
161cdf0e10cSrcweir
162cdf0e10cSrcweir aCurParamText.seekp(0);
163cdf0e10cSrcweir pCurMacro->GetDefineText(aCurParamText);
164cdf0e10cSrcweir
165cdf0e10cSrcweir if ( aCurParamText.tellp() > 1 )
166cdf0e10cSrcweir pSourceText->InsertTextAtCurPos(aCurParamText.c_str());
167cdf0e10cSrcweir }
168cdf0e10cSrcweir else // ( pCurMacro->DefineType() == DefineDescription::type_macro )
169cdf0e10cSrcweir {
170cdf0e10cSrcweir dpCurMacroName = &let_drToken;
171cdf0e10cSrcweir eState = expect_macro_bracket_left;
172cdf0e10cSrcweir csv::erase_container( aCurMacroParams );
173cdf0e10cSrcweir aCurParamText.seekp(0);
174cdf0e10cSrcweir nBracketInParameterCounter = 0;
175cdf0e10cSrcweir } // endif
176cdf0e10cSrcweir
177cdf0e10cSrcweir return true;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir
180cdf0e10cSrcweir void
UnblockMacro(const char * i_sMacroName)181cdf0e10cSrcweir PreProcessor::UnblockMacro( const char * i_sMacroName )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir for ( StringVector::iterator it = aBlockedMacroNames.begin();
184cdf0e10cSrcweir it != aBlockedMacroNames.end();
185cdf0e10cSrcweir ++it )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir if ( strcmp( (*it), i_sMacroName ) == 0 )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir aBlockedMacroNames.erase(it);
190cdf0e10cSrcweir break;
191cdf0e10cSrcweir }
192*feeb0b26Smseidel } // end for
193cdf0e10cSrcweir }
194cdf0e10cSrcweir
195cdf0e10cSrcweir void
InterpretMacro()196cdf0e10cSrcweir PreProcessor::InterpretMacro()
197cdf0e10cSrcweir {
198cdf0e10cSrcweir aCurParamText.seekp(0);
199cdf0e10cSrcweir pCurMacro->GetMacroText(aCurParamText, aCurMacroParams);
200cdf0e10cSrcweir
201cdf0e10cSrcweir if ( NOT csv::no_str(aCurParamText.c_str()) )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir aCurParamText.seekp(-1, csv::cur);
204cdf0e10cSrcweir aCurParamText << " #unblock-" << dpCurMacroName->Text() << " ";
205cdf0e10cSrcweir
206cdf0e10cSrcweir pSourceText->InsertTextAtCurPos(aCurParamText.c_str());
207cdf0e10cSrcweir String sCurMacroName(dpCurMacroName->Text());
208cdf0e10cSrcweir aBlockedMacroNames.insert( aBlockedMacroNames.begin(), sCurMacroName );
209cdf0e10cSrcweir }
210cdf0e10cSrcweir
211cdf0e10cSrcweir delete dpCurMacroName;
212cdf0e10cSrcweir dpCurMacroName = 0;
213cdf0e10cSrcweir pCurMacro = 0;
214cdf0e10cSrcweir csv::erase_container(aCurMacroParams);
215cdf0e10cSrcweir aCurParamText.seekp(0);
216cdf0e10cSrcweir }
217cdf0e10cSrcweir
218cdf0e10cSrcweir
219cdf0e10cSrcweir } // end namespace cpp
220*feeb0b26Smseidel
221*feeb0b26Smseidel /* vim: set noet sw=4 ts=4: */
222