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 <parser/unoidl.hxx> 24 25 26 // NOT FULLY DECLARED SERVICES 27 #include <stdlib.h> 28 #include <cosv/file.hxx> 29 #include <ary/ary.hxx> 30 #include <ary/idl/i_gate.hxx> 31 #include <ary/doc/d_oldidldocu.hxx> 32 #include <../parser/inc/x_docu.hxx> 33 #include <parser/parserinfo.hxx> 34 #include <tools/filecoll.hxx> 35 #include <tools/tkpchars.hxx> 36 #include <s2_luidl/tkp_uidl.hxx> 37 #include <s2_luidl/distrib.hxx> 38 #include <s2_luidl/pe_file2.hxx> 39 #include <s2_dsapi/cx_dsapi.hxx> 40 #include <adc_msg.hxx> 41 #include <x_parse2.hxx> 42 43 44 45 namespace autodoc 46 { 47 48 49 class FileParsePerformers 50 { 51 public: 52 FileParsePerformers( 53 ary::Repository & 54 io_rRepository, 55 ParserInfo & io_rParserInfo ); 56 57 void ParseFile( 58 const char * i_sFullPath ); 59 60 void ConnectLinks(); 61 62 private: 63 CharacterSource aFileLoader; 64 Dyn<csi::uidl::TokenParser_Uidl> 65 pTokens; 66 csi::uidl::TokenDistributor 67 aDistributor; 68 Dyn<csi::uidl::PE_File> 69 pFileParseEnvironment; 70 ary::Repository & 71 rRepository; 72 ParserInfo & rParserInfo; 73 }; 74 75 76 IdlParser::IdlParser( ary::Repository & io_rRepository ) 77 : pRepository(&io_rRepository) 78 { 79 } 80 81 void 82 IdlParser::Run( const autodoc::FileCollector_Ifc & i_rFiles ) 83 { 84 Dyn<FileParsePerformers> 85 pFileParsePerformers( 86 new FileParsePerformers(*pRepository, 87 static_cast< ParserInfo& >(*this)) ); 88 89 FileCollector::const_iterator iEnd = i_rFiles.End(); 90 for ( FileCollector::const_iterator iter = i_rFiles.Begin(); 91 iter != iEnd; 92 ++iter ) 93 { 94 Cout() << (*iter) << " ..."<< Endl(); 95 96 try 97 { 98 pFileParsePerformers->ParseFile(*iter); 99 } 100 catch (X_AutodocParser &) 101 { 102 /// Ignore and goon 103 TheMessages().Out_ParseError(CurFile(), CurLine()); 104 pFileParsePerformers 105 = new FileParsePerformers(*pRepository, 106 static_cast< ParserInfo& >(*this)); 107 } 108 catch (X_Docu & xd) 109 { 110 // Currently thic catches only wrong since tags, while since tags are 111 // transformed. In this case the program shall be terminated. 112 Cerr() << xd << Endl(); 113 exit(1); 114 } 115 catch (...) 116 { 117 Cout() << "Unknown error." << Endl(); 118 exit(0); 119 // pFileParsePerformers = new FileParsePerformers( *pRepository ); 120 } 121 } 122 123 pFileParsePerformers->ConnectLinks(); 124 } 125 126 FileParsePerformers::FileParsePerformers( ary::Repository & io_rRepository, 127 ParserInfo & io_rParserInfo ) 128 : pTokens(0), 129 aDistributor(io_rRepository, io_rParserInfo), 130 rRepository( io_rRepository ), 131 rParserInfo(io_rParserInfo) 132 { 133 DYN csi::dsapi::Context_Docu * 134 dpDocuContext 135 = new csi::dsapi::Context_Docu( aDistributor.DocuTokens_Receiver() ); 136 pTokens = new csi::uidl::TokenParser_Uidl( aDistributor.CodeTokens_Receiver(), *dpDocuContext ); 137 pFileParseEnvironment 138 = new csi::uidl::PE_File(aDistributor,rParserInfo); 139 140 aDistributor.SetTokenProvider(*pTokens); 141 aDistributor.SetTopParseEnvironment(*pFileParseEnvironment); 142 } 143 144 void 145 FileParsePerformers::ParseFile( const char * i_sFullPath ) 146 { 147 csv::File aFile(i_sFullPath); 148 149 aFile.open( csv::CFM_READ ); 150 csv_assert( aFile.is_open() ); 151 aFileLoader.LoadText(aFile); 152 aFile.close(); 153 154 rParserInfo.Set_CurFile(i_sFullPath, true); // true = count lines 155 pTokens->Start(aFileLoader); 156 aDistributor.Reset(); 157 158 do { 159 aDistributor.TradeToken(); 160 } while ( NOT aFileLoader.IsFinished() ); 161 } 162 163 void 164 FileParsePerformers::ConnectLinks() 165 { 166 // KORR_FUTURE ? 167 // rRepository.RwGate_Idl().ConnectAdditionalLinks(); 168 } 169 170 } // namespace autodoc 171