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 <cpp/prs_cpp.hxx> 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <cosv/file.hxx> 28 #include <ary/ary.hxx> 29 #include <ary/cpp/c_gate.hxx> 30 #include <autodoc/prs_docu.hxx> 31 #include <autodoc/filecoli.hxx> 32 #include <autodoc/x_parsing.hxx> 33 #include <tools/tkpchars.hxx> 34 #include <adc_cl.hxx> 35 #include "c_dealer.hxx" 36 #include "defdescr.hxx" 37 #include "tkp_cpp.hxx" 38 39 40 // Helper function 41 static bool Local_LoadFile( 42 CharacterSource & o_rTextBuffer, 43 const String & i_rFullFilePath ); 44 45 46 47 48 namespace cpp 49 { 50 51 // This class is used for the UDK as workaround for the missing 52 // feature of parsing #define s. 53 54 class Udk_MacroMap 55 { 56 public: 57 typedef std::map< String , DefineDescription* > Data; 58 59 Udk_MacroMap(const ::std::vector<String>& ignoreDefines); 60 ~Udk_MacroMap(); 61 62 const Data & GetData() const { return aData; } 63 64 private: 65 Data aData; 66 }; 67 68 struct S_RunningData 69 { 70 CharacterSource aFileContent; 71 ary::cpp::Gate & rCppGate; 72 Udk_MacroMap aMacros; 73 Distributor aDealer; 74 TokenParser_Cpp aTkp; 75 76 S_RunningData( 77 ary::Repository & o_rRepository, 78 const autodoc::DocumentationParser_Ifc & 79 i_rDocumentationInterpreter, 80 const ::std::vector<String> & 81 ignoreDefines ); 82 }; 83 84 85 86 87 Cpluplus_Parser::Cpluplus_Parser() 88 // : pRunningData 89 { 90 } 91 92 Cpluplus_Parser::~Cpluplus_Parser() 93 { 94 } 95 96 void 97 Cpluplus_Parser::Setup( ary::Repository & o_rRepository, 98 const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter, 99 const ::std::vector<String> & ignoreDefines ) 100 { 101 pRunningData = new S_RunningData(o_rRepository, i_rDocumentationInterpreter, ignoreDefines); 102 } 103 104 void 105 Cpluplus_Parser::Run( const autodoc::FileCollector_Ifc & i_rFiles ) 106 { 107 for ( autodoc::FileCollector_Ifc::const_iterator iter = i_rFiles.Begin(); 108 iter != i_rFiles.End(); 109 ++iter ) 110 { 111 csv::ploc::Path 112 aFilePath(*iter); 113 114 try 115 { 116 if ( NOT Local_LoadFile(pRunningData->aFileContent, *iter) ) 117 continue; 118 for ( pRunningData->aTkp.StartNewFile(aFilePath); 119 pRunningData->aTkp.HasMore(); 120 pRunningData->aTkp.GetNextToken() ) 121 ; 122 } 123 catch (autodoc::X_Parser_Ifc & rX_Parse) 124 { 125 if ( DEBUG_ShowStoring() OR DEBUG_ShowText() ) 126 Cerr() << rX_Parse << Endl(); 127 } 128 catch (...) 129 { 130 if ( DEBUG_ShowStoring() OR DEBUG_ShowText() ) 131 Cerr() << "Error: Unknown exception." << Endl(); 132 } 133 } // end for (iter) 134 } 135 136 S_RunningData::S_RunningData( ary::Repository & o_rRepository, 137 const autodoc::DocumentationParser_Ifc & i_rDocumentationInterpreter, 138 const ::std::vector<String> & ignoreDefines ) 139 : aFileContent(), 140 rCppGate( o_rRepository.Gate_Cpp() ), 141 aMacros( ignoreDefines ), 142 aDealer(o_rRepository.Gate_Cpp()), 143 aTkp( * i_rDocumentationInterpreter.Create_DocuContext() ) 144 { 145 aDealer.AssignPartners( aFileContent, 146 aMacros.GetData() ); 147 aTkp.AssignPartners( aFileContent, aDealer ); 148 } 149 150 151 Udk_MacroMap::Udk_MacroMap( const ::std::vector<String> & ignoreDefines ) 152 { 153 String sSAL_CALL("SAL_CALL"); 154 String sSAL_CALL_ELLIPSE("SAL_CALL_ELLIPSE"); 155 String sSAL_NO_VTABLE("SAL_NO_VTABLE"); 156 String sREGISTRY_CALLTYPE("REGISTRY_CALLTYPE"); 157 String sSAL_THROW("SAL_THROW"); 158 String sSAL_THROW_EXTERN_C("SAL_THROW_EXTERN_C"); 159 160 String s__DEF_COMPIMPLHELPER_A("__DEF_COMPIMPLHELPER_A"); 161 String s__DEF_COMPIMPLHELPER_B("__DEF_COMPIMPLHELPER_B"); 162 String s__DEF_COMPIMPLHELPER("__DEF_COMPIMPLHELPER"); 163 164 String s__DEF_IMPLHELPER_PRE("__DEF_IMPLHELPER_PRE"); 165 String s__IFC_WRITEOFFSET("__IFC_WRITEOFFSET"); 166 String s__DEF_IMPLHELPER_POST("__DEF_IMPLHELPER_POST"); 167 168 String sSAL_EXCEPTION_DLLPUBLIC_EXPORT("SAL_EXCEPTION_DLLPUBLIC_EXPORT"); 169 String sSAL_EXCEPTION_DLLPRIVATE("SAL_EXCEPTION_DLLPRIVATE"); 170 171 172 StringVector aEmpty; 173 174 StringVector aParamsSAL_THROW; 175 aParamsSAL_THROW.push_back( String ("exc") ); 176 StringVector aDefSAL_THROW; 177 aDefSAL_THROW.push_back( String ("throw") ); 178 aDefSAL_THROW.push_back( String ("exc") ); 179 180 StringVector aCompImplHelperParams; 181 aCompImplHelperParams.push_back(String ("N")); 182 183 184 // filling up the list 185 186 187 aData[sSAL_CALL] = new DefineDescription(sSAL_CALL, aEmpty); 188 aData[sSAL_CALL_ELLIPSE] = new DefineDescription(sSAL_CALL_ELLIPSE, aEmpty); 189 aData[sSAL_NO_VTABLE] = new DefineDescription(sSAL_NO_VTABLE, aEmpty); 190 aData[sREGISTRY_CALLTYPE] = new DefineDescription(sREGISTRY_CALLTYPE, aEmpty); 191 192 aData[sSAL_THROW] = new DefineDescription(sSAL_THROW, aParamsSAL_THROW, aDefSAL_THROW); 193 aData[sSAL_THROW_EXTERN_C] = new DefineDescription(sSAL_THROW_EXTERN_C, aEmpty, aEmpty); 194 195 aData[s__DEF_COMPIMPLHELPER_A] 196 = new DefineDescription( s__DEF_COMPIMPLHELPER_A, aCompImplHelperParams, aEmpty); 197 aData[s__DEF_COMPIMPLHELPER_B] 198 = new DefineDescription(s__DEF_COMPIMPLHELPER_B, aCompImplHelperParams, aEmpty); 199 aData[s__DEF_COMPIMPLHELPER] 200 = new DefineDescription(s__DEF_COMPIMPLHELPER, aCompImplHelperParams, aEmpty); 201 202 aData[s__DEF_IMPLHELPER_PRE] 203 = new DefineDescription(s__DEF_IMPLHELPER_PRE, aCompImplHelperParams, aEmpty); 204 aData[s__IFC_WRITEOFFSET] 205 = new DefineDescription(s__IFC_WRITEOFFSET, aCompImplHelperParams, aEmpty); 206 aData[s__DEF_IMPLHELPER_POST] 207 = new DefineDescription(s__DEF_IMPLHELPER_POST, aCompImplHelperParams, aEmpty); 208 209 aData[sSAL_EXCEPTION_DLLPUBLIC_EXPORT] 210 = new DefineDescription(sSAL_EXCEPTION_DLLPUBLIC_EXPORT, aEmpty); 211 aData[sSAL_EXCEPTION_DLLPRIVATE] 212 = new DefineDescription(sSAL_EXCEPTION_DLLPRIVATE, aEmpty); 213 214 for (size_t index = 0; index != ignoreDefines.size(); ++index) 215 aData[ignoreDefines[index]] = new DefineDescription(ignoreDefines[index], aEmpty); 216 } 217 218 Udk_MacroMap::~Udk_MacroMap() 219 { 220 for ( Data::iterator it = aData.begin(); it != aData.end(); ++it ) 221 { 222 delete (*it).second; 223 } 224 } 225 226 227 228 } // namespace cpp 229 230 231 bool 232 Local_LoadFile( CharacterSource & o_rTextBuffer, 233 const String & i_rFullFilePath ) 234 { 235 Cout() << "Parse " << i_rFullFilePath << " ..." << Endl(); 236 237 csv::File aFile( i_rFullFilePath, csv::CFM_READ ); 238 if (NOT aFile.open()) 239 { 240 Cerr() << " could not be opened.\n" << Endl(); 241 return false; 242 } 243 o_rTextBuffer.LoadText(aFile); 244 aFile.close(); 245 return true; 246 } 247