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
main(int argc,char * argv[])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
Do_SingleFileCommandLine(const CommandLine & i_rCommandLine)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
Do_IndexCommandLine(const CommandLine & i_rCommandLine)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
Create_TypeInfo(const char * o_sOutputFile,ModuleDescription & i_rData)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
Put2StdOut_TypeInfo(ModuleDescription & i_rData)240 Put2StdOut_TypeInfo( ModuleDescription & i_rData )
241 {
242 StreamOut_TypeInfo(std::cout, i_rData, " ");
243 }
244
245 void
Put2File_TypeInfo(const char * i_sOutputFile,ModuleDescription & i_rData)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
StreamOut_TypeInfo(std::ostream & o_rOut,ModuleDescription & i_rData,const char * i_sSeparator)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