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