xref: /trunk/main/autodoc/source/parser/cpp/preproc.cxx (revision feeb0b2648bd57ef12ff339bc8af4beeb2c15506)
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