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 23 24 #include <iostream> 25 #include <fstream> 26 #include <stdio.h> 27 28 29 #include <string.h> 30 #include "../support/cmdline.hxx" 31 #include "cr_metho.hxx" 32 #include "cr_html.hxx" 33 #include "cr_index.hxx" 34 #include "xmlelem.hxx" 35 #include "xmltree.hxx" 36 #include "parse.hxx" 37 #include "../support/syshelp.hxx" 38 #include "../support/heap.hxx" 39 40 41 42 int Do_IndexCommandLine( 43 const CommandLine & i_rCommandLine ); 44 int Do_SingleFileCommandLine( 45 const CommandLine & i_rCommandLine ); 46 void Create_TypeInfo( 47 const char * o_sOutputFile, 48 ModuleDescription & i_rData ); 49 50 51 int 52 #ifdef WNT 53 _cdecl 54 #endif 55 main( int argc, 56 char * argv[] ) 57 { 58 // Variables 59 CommandLine aCommandLine(argc, argv); 60 int ret = 0; 61 62 if (! aCommandLine.IsOk()) 63 { 64 std::cerr << aCommandLine.ErrorText() << std::endl ; 65 return 1; 66 } 67 68 if ( aCommandLine.IsIndexCommand() ) 69 ret = Do_IndexCommandLine(aCommandLine); 70 else 71 ret = Do_SingleFileCommandLine(aCommandLine); 72 73 return ret; 74 } 75 76 77 int 78 Do_SingleFileCommandLine(const CommandLine & i_rCommandLine) 79 { 80 ModuleDescription aDescr; 81 X2CParser aParser(aDescr); 82 83 // Load file and create Function-file 84 bool bLoadResult = aParser.LoadFile(i_rCommandLine.XmlSrcFile()); 85 if (! bLoadResult) 86 { 87 std::cerr << "Error: File " << i_rCommandLine.XmlSrcFile() << " could not be loaded." << std::endl; 88 return 1; 89 } 90 91 if ( strlen(i_rCommandLine.FuncFile()) > 0 ) 92 { 93 Create_AccessMethod( i_rCommandLine.FuncFile(), 94 aParser.PureText() ); 95 96 std::cout << "File " 97 << i_rCommandLine.FuncFile() 98 << " with component_getDescriptionFunc() is created now." 99 << std::endl; 100 } 101 102 // Parse 103 aParser.Parse(); 104 105 // Produce output 106 if ( strlen(i_rCommandLine.HtmlFile()) > 0 ) 107 { 108 HtmlCreator aHtmlCreator( i_rCommandLine.HtmlFile(), 109 aDescr, 110 i_rCommandLine.IdlRootPath() ); 111 aHtmlCreator.Run(); 112 } 113 114 if (strlen(i_rCommandLine.TypeInfoFile()) > 0) 115 { 116 Create_TypeInfo( i_rCommandLine.TypeInfoFile(), 117 aDescr ); 118 } 119 120 return 0; 121 }; 122 123 int 124 Do_IndexCommandLine(const CommandLine & i_rCommandLine) 125 { 126 // Parsen files: 127 List<Simstr> aFiles; 128 Index aIndex( i_rCommandLine.OutputDirectory(), 129 i_rCommandLine.IdlRootPath(), 130 i_rCommandLine.IndexedTags() ); 131 132 std::cout << "Gather xml-files ..." << std::endl; 133 GatherFileNames( aFiles, i_rCommandLine.XmlSrcDirectory() ); 134 135 std::cout << "Create output ..." << std::endl; 136 aIndex.GatherData(aFiles); 137 aIndex.WriteOutput( i_rCommandLine.IndexOutputFile() ); 138 139 std::cout << "... done." << std::endl; 140 141 return 0; 142 }; 143 144 145 146 //******************** Creating of typeinfo ********************// 147 148 149 void Put2StdOut_TypeInfo( 150 ModuleDescription & i_rData ); 151 void Put2File_TypeInfo( 152 const char * i_sOutputFile, 153 ModuleDescription & i_rData ); 154 void StreamOut_TypeInfo( 155 std::ostream & o_rOut, 156 ModuleDescription & i_rData, 157 const char * i_sSeparator ); 158 159 160 161 162 void 163 Create_TypeInfo( const char * o_sOutputFile, 164 ModuleDescription & i_rData ) 165 { 166 if ( strcmp(o_sOutputFile, "stdout") == 0 ) 167 Put2StdOut_TypeInfo(i_rData); 168 else 169 Put2File_TypeInfo(o_sOutputFile,i_rData); 170 171 #if 0 172 std::ofstream aOut(o_sOutputFile, std::ios::out 173 #if defined(WNT) || defined(OS2) 174 | std::ios::binary 175 #endif 176 ); 177 if ( !aOut ) 178 { 179 std::cerr << "Error: " << o_sOutputFile << " could not be created." << std::endl; 180 return; 181 } 182 183 Heap aTypesHeap(12); 184 Simstr sLibPrefix = i_rData.ModuleName(); 185 186 // Gather types: 187 List< const MultipleTextElement * > aTypes; 188 i_rData.Get_Types(aTypes); 189 190 for ( unsigned t = 0; t < aTypes.size(); ++t ) 191 { 192 unsigned i_max = aTypes[t]->Size(); 193 for ( unsigned i = 0; i < i_max; ++i ) 194 { 195 aTypesHeap.InsertValue( aTypes[t]->Data(i), "" ); 196 } // end for 197 } 198 199 // Write types: 200 WriteStr( aOut, sLibPrefix ); 201 WriteStr( aOut, "_XML2CMPTYPES= "); 202 203 HeapItem * pLastHeapTop = 0; 204 for ( HeapItem * pHeapTop = aTypesHeap.ReleaseTop(); pHeapTop != 0; pHeapTop = aTypesHeap.ReleaseTop() ) 205 { 206 if (pLastHeapTop != 0) 207 { 208 if ( 0 == strcmp(pHeapTop->Key(), pLastHeapTop->Key()) ) 209 continue; 210 delete pLastHeapTop; 211 // pLastHeapTop = 0; 212 } 213 pLastHeapTop = pHeapTop; 214 215 WriteStr( aOut, "\t\\\n\t\t" ); 216 217 const char * sEnd = strchr( pHeapTop->Key(), ' ' ); 218 if (sEnd != 0) 219 { 220 const char * sQuali = strrchr( pHeapTop->Key(), ' ' )+1; 221 WriteStr( aOut, sQuali ); 222 WriteStr( aOut, "." ); 223 aOut.write( pHeapTop->Key(), sEnd - pHeapTop->Key() ); 224 } 225 else 226 WriteStr( aOut, pHeapTop->Key() ); 227 } // end for 228 229 if (pLastHeapTop != 0) 230 { 231 delete pLastHeapTop; 232 pLastHeapTop = 0; 233 } 234 235 aOut.close(); 236 #endif // 0 237 } 238 239 void 240 Put2StdOut_TypeInfo( ModuleDescription & i_rData ) 241 { 242 StreamOut_TypeInfo(std::cout, i_rData, " "); 243 } 244 245 void 246 Put2File_TypeInfo( const char * i_sOutputFile, 247 ModuleDescription & i_rData ) 248 { 249 std::ofstream aOut(i_sOutputFile, std::ios::out 250 #if defined(WNT) || defined(OS2) 251 | std::ios::binary 252 #endif 253 ); 254 if ( !aOut ) 255 { 256 std::cerr << "Error: " << i_sOutputFile << " could not be created." << std::endl; 257 return; 258 } 259 260 Simstr sLibPrefix = i_rData.ModuleName(); 261 WriteStr( aOut, sLibPrefix ); 262 WriteStr( aOut, "_XML2CMPTYPES= "); 263 264 StreamOut_TypeInfo(aOut, i_rData, "\t\\\n\t\t"); 265 266 aOut.close(); 267 } 268 269 void 270 StreamOut_TypeInfo( std::ostream & o_rOut, 271 ModuleDescription & i_rData, 272 const char * i_sSeparator ) 273 { 274 Heap aTypesHeap(12); 275 276 // Gather types: 277 List< const MultipleTextElement * > aTypes; 278 i_rData.Get_Types(aTypes); 279 280 for ( unsigned t = 0; t < aTypes.size(); ++t ) 281 { 282 unsigned i_max = aTypes[t]->Size(); 283 for ( unsigned i = 0; i < i_max; ++i ) 284 { 285 aTypesHeap.InsertValue( aTypes[t]->Data(i), "" ); 286 } // end for 287 } 288 289 // Write types: 290 HeapItem * pLastHeapTop = 0; 291 for ( HeapItem * pHeapTop = aTypesHeap.ReleaseTop(); pHeapTop != 0; pHeapTop = aTypesHeap.ReleaseTop() ) 292 { 293 if (pLastHeapTop != 0) 294 { 295 if ( 0 == strcmp(pHeapTop->Key(), pLastHeapTop->Key()) ) 296 continue; 297 delete pLastHeapTop; 298 // pLastHeapTop = 0; 299 } 300 pLastHeapTop = pHeapTop; 301 302 WriteStr( o_rOut, i_sSeparator ); 303 304 const char * sEnd = strchr( pHeapTop->Key(), ' ' ); 305 if (sEnd != 0) 306 { 307 const char * sQuali = strrchr( pHeapTop->Key(), ' ' ) + 1; 308 WriteStr( o_rOut, sQuali ); 309 WriteStr( o_rOut, "." ); 310 o_rOut.write( pHeapTop->Key(), sEnd - pHeapTop->Key() ); 311 } 312 else 313 WriteStr( o_rOut, pHeapTop->Key() ); 314 } // end for 315 316 if (pLastHeapTop != 0) 317 { 318 delete pLastHeapTop; 319 pLastHeapTop = 0; 320 } 321 } 322 323