1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #include <precomp.h>
23*b1cdbd2cSJim Jagielski #include <cpp/prs_cpp.hxx>
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <cosv/file.hxx>
28*b1cdbd2cSJim Jagielski #include <ary/ary.hxx>
29*b1cdbd2cSJim Jagielski #include <ary/cpp/c_gate.hxx>
30*b1cdbd2cSJim Jagielski #include <autodoc/prs_docu.hxx>
31*b1cdbd2cSJim Jagielski #include <autodoc/filecoli.hxx>
32*b1cdbd2cSJim Jagielski #include <autodoc/x_parsing.hxx>
33*b1cdbd2cSJim Jagielski #include <tools/tkpchars.hxx>
34*b1cdbd2cSJim Jagielski #include <adc_cl.hxx>
35*b1cdbd2cSJim Jagielski #include "c_dealer.hxx"
36*b1cdbd2cSJim Jagielski #include "defdescr.hxx"
37*b1cdbd2cSJim Jagielski #include "tkp_cpp.hxx"
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski // Helper function
41*b1cdbd2cSJim Jagielski static bool         Local_LoadFile(
42*b1cdbd2cSJim Jagielski                         CharacterSource &       o_rTextBuffer,
43*b1cdbd2cSJim Jagielski                         const String  &         i_rFullFilePath );
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski namespace cpp
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski // This class is used for the UDK as workaround for the missing
52*b1cdbd2cSJim Jagielski //   feature of parsing #define s.
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski class Udk_MacroMap
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski   public:
57*b1cdbd2cSJim Jagielski     typedef std::map< String , DefineDescription* > Data;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski                         Udk_MacroMap();
60*b1cdbd2cSJim Jagielski                         ~Udk_MacroMap();
61*b1cdbd2cSJim Jagielski 
GetData() const62*b1cdbd2cSJim Jagielski     const Data &        GetData() const         { return aData; }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski   private:
65*b1cdbd2cSJim Jagielski     Data                aData;
66*b1cdbd2cSJim Jagielski };
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski struct S_RunningData
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski     CharacterSource	    aFileContent;
71*b1cdbd2cSJim Jagielski 	ary::cpp::Gate &    rCppGate;
72*b1cdbd2cSJim Jagielski     Udk_MacroMap        aMacros;
73*b1cdbd2cSJim Jagielski 	Distributor	        aDealer;
74*b1cdbd2cSJim Jagielski 	TokenParser_Cpp	    aTkp;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski                             S_RunningData(
77*b1cdbd2cSJim Jagielski                                 ary::Repository &   o_rRepository,
78*b1cdbd2cSJim Jagielski                                 const autodoc::DocumentationParser_Ifc &
79*b1cdbd2cSJim Jagielski                                                     i_rDocumentationInterpreter );
80*b1cdbd2cSJim Jagielski };
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 
Cpluplus_Parser()85*b1cdbd2cSJim Jagielski Cpluplus_Parser::Cpluplus_Parser()
86*b1cdbd2cSJim Jagielski //    : pRunningData
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
~Cpluplus_Parser()90*b1cdbd2cSJim Jagielski Cpluplus_Parser::~Cpluplus_Parser()
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski void
Setup(ary::Repository & o_rRepository,const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter)95*b1cdbd2cSJim Jagielski Cpluplus_Parser::Setup( ary::Repository &                        o_rRepository,
96*b1cdbd2cSJim Jagielski                         const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter )
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski     pRunningData = new S_RunningData(o_rRepository, i_rDocumentationInterpreter);
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski void
Run(const autodoc::FileCollector_Ifc & i_rFiles)102*b1cdbd2cSJim Jagielski Cpluplus_Parser::Run( const autodoc::FileCollector_Ifc &    i_rFiles )
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	for ( autodoc::FileCollector_Ifc::const_iterator iter = i_rFiles.Begin();
105*b1cdbd2cSJim Jagielski 		  iter != i_rFiles.End();
106*b1cdbd2cSJim Jagielski 		  ++iter )
107*b1cdbd2cSJim Jagielski 	{
108*b1cdbd2cSJim Jagielski         csv::ploc::Path
109*b1cdbd2cSJim Jagielski             aFilePath(*iter);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         try
112*b1cdbd2cSJim Jagielski         {
113*b1cdbd2cSJim Jagielski             if ( NOT Local_LoadFile(pRunningData->aFileContent, *iter) )
114*b1cdbd2cSJim Jagielski                 continue;
115*b1cdbd2cSJim Jagielski     		for ( pRunningData->aTkp.StartNewFile(aFilePath);
116*b1cdbd2cSJim Jagielski                   pRunningData->aTkp.HasMore();
117*b1cdbd2cSJim Jagielski                   pRunningData->aTkp.GetNextToken() )
118*b1cdbd2cSJim Jagielski                 ;
119*b1cdbd2cSJim Jagielski         }
120*b1cdbd2cSJim Jagielski         catch (autodoc::X_Parser_Ifc & rX_Parse)
121*b1cdbd2cSJim Jagielski         {
122*b1cdbd2cSJim Jagielski             if ( DEBUG_ShowStoring() OR DEBUG_ShowText() )
123*b1cdbd2cSJim Jagielski                 Cerr() << rX_Parse << Endl();
124*b1cdbd2cSJim Jagielski         }
125*b1cdbd2cSJim Jagielski         catch (...)
126*b1cdbd2cSJim Jagielski         {
127*b1cdbd2cSJim Jagielski             if ( DEBUG_ShowStoring() OR DEBUG_ShowText() )
128*b1cdbd2cSJim Jagielski                 Cerr() << "Error:  Unknown exception." << Endl();
129*b1cdbd2cSJim Jagielski         }
130*b1cdbd2cSJim Jagielski 	}   // end for (iter)
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
S_RunningData(ary::Repository & o_rRepository,const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter)133*b1cdbd2cSJim Jagielski S_RunningData::S_RunningData( ary::Repository &                        o_rRepository,
134*b1cdbd2cSJim Jagielski                               const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter )
135*b1cdbd2cSJim Jagielski     :   aFileContent(),
136*b1cdbd2cSJim Jagielski         rCppGate( o_rRepository.Gate_Cpp() ),
137*b1cdbd2cSJim Jagielski         aMacros(),
138*b1cdbd2cSJim Jagielski         aDealer(o_rRepository.Gate_Cpp()),
139*b1cdbd2cSJim Jagielski         aTkp( * i_rDocumentationInterpreter.Create_DocuContext() )
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski     aDealer.AssignPartners( aFileContent,
142*b1cdbd2cSJim Jagielski                             aMacros.GetData() );
143*b1cdbd2cSJim Jagielski     aTkp.AssignPartners( aFileContent, aDealer );
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 
Udk_MacroMap()147*b1cdbd2cSJim Jagielski Udk_MacroMap::Udk_MacroMap()
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski     String  sSAL_CALL("SAL_CALL");
150*b1cdbd2cSJim Jagielski     String  sSAL_CALL_ELLIPSE("SAL_CALL_ELLIPSE");
151*b1cdbd2cSJim Jagielski     String  sSAL_NO_VTABLE("SAL_NO_VTABLE");
152*b1cdbd2cSJim Jagielski     String  sREGISTRY_CALLTYPE("REGISTRY_CALLTYPE");
153*b1cdbd2cSJim Jagielski     String  sSAL_THROW("SAL_THROW");
154*b1cdbd2cSJim Jagielski     String  sSAL_THROW_EXTERN_C("SAL_THROW_EXTERN_C");
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     String  s__DEF_COMPIMPLHELPER_A("__DEF_COMPIMPLHELPER_A");
157*b1cdbd2cSJim Jagielski     String  s__DEF_COMPIMPLHELPER_B("__DEF_COMPIMPLHELPER_B");
158*b1cdbd2cSJim Jagielski     String  s__DEF_COMPIMPLHELPER("__DEF_COMPIMPLHELPER");
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski     String  s__DEF_IMPLHELPER_PRE("__DEF_IMPLHELPER_PRE");
161*b1cdbd2cSJim Jagielski     String  s__IFC_WRITEOFFSET("__IFC_WRITEOFFSET");
162*b1cdbd2cSJim Jagielski     String  s__DEF_IMPLHELPER_POST("__DEF_IMPLHELPER_POST");
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     String  sSAL_EXCEPTION_DLLPUBLIC_EXPORT("SAL_EXCEPTION_DLLPUBLIC_EXPORT");
165*b1cdbd2cSJim Jagielski     String  sSAL_EXCEPTION_DLLPRIVATE("SAL_EXCEPTION_DLLPRIVATE");
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     StringVector aEmpty;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski     StringVector aParamsSAL_THROW;
171*b1cdbd2cSJim Jagielski     aParamsSAL_THROW.push_back( String ("exc") );
172*b1cdbd2cSJim Jagielski     StringVector aDefSAL_THROW;
173*b1cdbd2cSJim Jagielski     aDefSAL_THROW.push_back( String ("throw") );
174*b1cdbd2cSJim Jagielski     aDefSAL_THROW.push_back( String ("exc") );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski     StringVector aCompImplHelperParams;
177*b1cdbd2cSJim Jagielski     aCompImplHelperParams.push_back(String ("N"));
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     // filling up the list
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     aData[sSAL_CALL] = new DefineDescription(sSAL_CALL, aEmpty);
184*b1cdbd2cSJim Jagielski     aData[sSAL_CALL_ELLIPSE] = new DefineDescription(sSAL_CALL_ELLIPSE, aEmpty);
185*b1cdbd2cSJim Jagielski     aData[sSAL_NO_VTABLE] = new DefineDescription(sSAL_NO_VTABLE, aEmpty);
186*b1cdbd2cSJim Jagielski     aData[sREGISTRY_CALLTYPE] = new DefineDescription(sREGISTRY_CALLTYPE, aEmpty);
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski     aData[sSAL_THROW] = new DefineDescription(sSAL_THROW, aParamsSAL_THROW, aDefSAL_THROW);
189*b1cdbd2cSJim Jagielski     aData[sSAL_THROW_EXTERN_C] = new DefineDescription(sSAL_THROW_EXTERN_C, aEmpty, aEmpty);
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski     aData[s__DEF_COMPIMPLHELPER_A]
192*b1cdbd2cSJim Jagielski         = new DefineDescription( s__DEF_COMPIMPLHELPER_A, aCompImplHelperParams, aEmpty);
193*b1cdbd2cSJim Jagielski     aData[s__DEF_COMPIMPLHELPER_B]
194*b1cdbd2cSJim Jagielski         = new DefineDescription(s__DEF_COMPIMPLHELPER_B, aCompImplHelperParams, aEmpty);
195*b1cdbd2cSJim Jagielski     aData[s__DEF_COMPIMPLHELPER]
196*b1cdbd2cSJim Jagielski         = new DefineDescription(s__DEF_COMPIMPLHELPER, aCompImplHelperParams, aEmpty);
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     aData[s__DEF_IMPLHELPER_PRE]
199*b1cdbd2cSJim Jagielski         = new DefineDescription(s__DEF_IMPLHELPER_PRE, aCompImplHelperParams, aEmpty);
200*b1cdbd2cSJim Jagielski     aData[s__IFC_WRITEOFFSET]
201*b1cdbd2cSJim Jagielski         = new DefineDescription(s__IFC_WRITEOFFSET, aCompImplHelperParams, aEmpty);
202*b1cdbd2cSJim Jagielski     aData[s__DEF_IMPLHELPER_POST]
203*b1cdbd2cSJim Jagielski         = new DefineDescription(s__DEF_IMPLHELPER_POST, aCompImplHelperParams, aEmpty);
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     aData[sSAL_EXCEPTION_DLLPUBLIC_EXPORT]
206*b1cdbd2cSJim Jagielski         = new DefineDescription(sSAL_EXCEPTION_DLLPUBLIC_EXPORT, aEmpty);
207*b1cdbd2cSJim Jagielski     aData[sSAL_EXCEPTION_DLLPRIVATE]
208*b1cdbd2cSJim Jagielski         = new DefineDescription(sSAL_EXCEPTION_DLLPRIVATE, aEmpty);
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski 
~Udk_MacroMap()211*b1cdbd2cSJim Jagielski Udk_MacroMap::~Udk_MacroMap()
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski     for ( Data::iterator it = aData.begin(); it != aData.end(); ++it )
214*b1cdbd2cSJim Jagielski     {
215*b1cdbd2cSJim Jagielski      	delete (*it).second;
216*b1cdbd2cSJim Jagielski     }
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski } // namespace cpp
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski bool
Local_LoadFile(CharacterSource & o_rTextBuffer,const String & i_rFullFilePath)225*b1cdbd2cSJim Jagielski Local_LoadFile( CharacterSource &       o_rTextBuffer,
226*b1cdbd2cSJim Jagielski                 const String  &         i_rFullFilePath )
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski     Cout() << "Parse " << i_rFullFilePath << " ..." << Endl();
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 	csv::File aFile( i_rFullFilePath, csv::CFM_READ );
231*b1cdbd2cSJim Jagielski 	if (NOT aFile.open())
232*b1cdbd2cSJim Jagielski 	{
233*b1cdbd2cSJim Jagielski         Cerr() << "   could not be opened.\n" << Endl();
234*b1cdbd2cSJim Jagielski 		return false;
235*b1cdbd2cSJim Jagielski     }
236*b1cdbd2cSJim Jagielski 	o_rTextBuffer.LoadText(aFile);
237*b1cdbd2cSJim Jagielski 	aFile.close();
238*b1cdbd2cSJim Jagielski     return true;
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 
243