xref: /trunk/main/xml2cmp/source/xcd/main.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include <iostream>
29 #include <fstream>
30 #include <stdio.h>
31 
32 
33 #include <string.h>
34 #include "../support/cmdline.hxx"
35 #include "cr_metho.hxx"
36 #include "cr_html.hxx"
37 #include "cr_index.hxx"
38 #include "xmlelem.hxx"
39 #include "xmltree.hxx"
40 #include "parse.hxx"
41 #include "../support/syshelp.hxx"
42 #include "../support/heap.hxx"
43 
44 
45 
46 int                     Do_IndexCommandLine(
47                             const CommandLine &     i_rCommandLine );
48 int                     Do_SingleFileCommandLine(
49                             const CommandLine &     i_rCommandLine );
50 void                    Create_TypeInfo(
51                             const char *            o_sOutputFile,
52                             ModuleDescription &     i_rData );
53 
54 
55 int
56 #ifdef WNT
57 _cdecl
58 #endif
59 main( int       argc,
60       char *    argv[] )
61 {
62     // Variables
63     CommandLine             aCommandLine(argc, argv);
64     int ret = 0;
65 
66     if (! aCommandLine.IsOk())
67     {
68         std::cerr <<  aCommandLine.ErrorText() << std::endl ;
69         return 1;
70     }
71 
72     if ( aCommandLine.IsIndexCommand() )
73         ret = Do_IndexCommandLine(aCommandLine);
74     else
75         ret = Do_SingleFileCommandLine(aCommandLine);
76 
77     return ret;
78 }
79 
80 
81 int
82 Do_SingleFileCommandLine(const CommandLine & i_rCommandLine)
83 {
84     ModuleDescription   aDescr;
85     X2CParser           aParser(aDescr);
86 
87     // Load file and create Function-file
88     bool bLoadResult = aParser.LoadFile(i_rCommandLine.XmlSrcFile());
89     if (! bLoadResult)
90     {
91         std::cerr << "Error: File " << i_rCommandLine.XmlSrcFile() << " could not be loaded." << std::endl;
92         return 1;
93     }
94 
95     if ( strlen(i_rCommandLine.FuncFile()) > 0 )
96     {
97         Create_AccessMethod( i_rCommandLine.FuncFile(),
98                              aParser.PureText() );
99 
100         std::cout << "File "
101              << i_rCommandLine.FuncFile()
102              << " with component_getDescriptionFunc() is created now."
103              << std::endl;
104     }
105 
106     // Parse
107     aParser.Parse();
108 
109     // Produce output
110     if ( strlen(i_rCommandLine.HtmlFile()) > 0 )
111     {
112         HtmlCreator aHtmlCreator( i_rCommandLine.HtmlFile(),
113                                   aDescr,
114                                   i_rCommandLine.IdlRootPath() );
115         aHtmlCreator.Run();
116     }
117 
118     if (strlen(i_rCommandLine.TypeInfoFile()) > 0)
119     {
120         Create_TypeInfo( i_rCommandLine.TypeInfoFile(),
121                          aDescr );
122     }
123 
124     return 0;
125 };
126 
127 int
128 Do_IndexCommandLine(const CommandLine & i_rCommandLine)
129 {
130     // Parsen files:
131     List<Simstr>    aFiles;
132     Index           aIndex( i_rCommandLine.OutputDirectory(),
133                             i_rCommandLine.IdlRootPath(),
134                             i_rCommandLine.IndexedTags() );
135 
136     std::cout << "Gather xml-files ..." << std::endl;
137     GatherFileNames( aFiles, i_rCommandLine.XmlSrcDirectory() );
138 
139     std::cout << "Create output ..." << std::endl;
140     aIndex.GatherData(aFiles);
141     aIndex.WriteOutput( i_rCommandLine.IndexOutputFile() );
142 
143     std::cout << "... done." << std::endl;
144 
145     return 0;
146 };
147 
148 
149 
150 //********************      Creating of typeinfo       ********************//
151 
152 
153 void                    Put2StdOut_TypeInfo(
154                             ModuleDescription &     i_rData );
155 void                    Put2File_TypeInfo(
156                             const char *            i_sOutputFile,
157                             ModuleDescription &     i_rData );
158 void                    StreamOut_TypeInfo(
159                             std::ostream &               o_rOut,
160                             ModuleDescription &     i_rData,
161                             const char *            i_sSeparator );
162 
163 
164 
165 
166 void
167 Create_TypeInfo( const char *           o_sOutputFile,
168                  ModuleDescription &    i_rData )
169 {
170     if ( strcmp(o_sOutputFile, "stdout") == 0 )
171         Put2StdOut_TypeInfo(i_rData);
172     else
173         Put2File_TypeInfo(o_sOutputFile,i_rData);
174 
175 #if 0
176     std::ofstream aOut(o_sOutputFile, std::ios::out
177 #if defined(WNT) || defined(OS2)
178                                                | std::ios::binary
179 #endif
180     );
181     if ( !aOut )
182     {
183         std::cerr << "Error: " << o_sOutputFile << " could not be created." << std::endl;
184         return;
185     }
186 
187     Heap    aTypesHeap(12);
188     Simstr  sLibPrefix = i_rData.ModuleName();
189 
190     // Gather types:
191     List< const MultipleTextElement * > aTypes;
192     i_rData.Get_Types(aTypes);
193 
194     for ( unsigned t = 0; t < aTypes.size(); ++t )
195     {
196         unsigned i_max = aTypes[t]->Size();
197         for ( unsigned  i = 0; i < i_max; ++i )
198         {
199             aTypesHeap.InsertValue( aTypes[t]->Data(i), "" );
200         }  // end for
201     }
202 
203     // Write types:
204     WriteStr( aOut, sLibPrefix );
205     WriteStr( aOut, "_XML2CMPTYPES= ");
206 
207     HeapItem * pLastHeapTop = 0;
208     for ( HeapItem * pHeapTop = aTypesHeap.ReleaseTop(); pHeapTop != 0; pHeapTop = aTypesHeap.ReleaseTop() )
209     {
210         if (pLastHeapTop != 0)
211         {
212             if ( 0 == strcmp(pHeapTop->Key(), pLastHeapTop->Key()) )
213                 continue;
214             delete pLastHeapTop;
215             // pLastHeapTop = 0;
216         }
217         pLastHeapTop = pHeapTop;
218 
219         WriteStr( aOut, "\t\\\n\t\t" );
220 
221         const char * sEnd = strchr( pHeapTop->Key(), ' ' );
222         if (sEnd != 0)
223         {
224             const char * sQuali = strrchr( pHeapTop->Key(), ' ' )+1;
225             WriteStr( aOut, sQuali );
226             WriteStr( aOut, "." );
227             aOut.write( pHeapTop->Key(), sEnd - pHeapTop->Key() );
228         }
229         else
230             WriteStr( aOut, pHeapTop->Key() );
231     }   // end for
232 
233     if (pLastHeapTop != 0)
234     {
235         delete pLastHeapTop;
236         pLastHeapTop = 0;
237     }
238 
239     aOut.close();
240 #endif // 0
241 }
242 
243 void
244 Put2StdOut_TypeInfo( ModuleDescription &    i_rData )
245 {
246     StreamOut_TypeInfo(std::cout, i_rData, " ");
247 }
248 
249 void
250 Put2File_TypeInfo( const char *            i_sOutputFile,
251                    ModuleDescription &     i_rData )
252 {
253     std::ofstream aOut(i_sOutputFile, std::ios::out
254 #if defined(WNT) || defined(OS2)
255                                                | std::ios::binary
256 #endif
257     );
258     if ( !aOut )
259     {
260         std::cerr << "Error: " << i_sOutputFile << " could not be created." << std::endl;
261         return;
262     }
263 
264     Simstr  sLibPrefix = i_rData.ModuleName();
265     WriteStr( aOut, sLibPrefix );
266     WriteStr( aOut, "_XML2CMPTYPES= ");
267 
268     StreamOut_TypeInfo(aOut, i_rData, "\t\\\n\t\t");
269 
270     aOut.close();
271 }
272 
273 void
274 StreamOut_TypeInfo( std::ostream &               o_rOut,
275                     ModuleDescription &     i_rData,
276                     const char *            i_sSeparator )
277 {
278     Heap    aTypesHeap(12);
279 
280     // Gather types:
281     List< const MultipleTextElement * > aTypes;
282     i_rData.Get_Types(aTypes);
283 
284     for ( unsigned t = 0; t < aTypes.size(); ++t )
285     {
286         unsigned i_max = aTypes[t]->Size();
287         for ( unsigned  i = 0; i < i_max; ++i )
288         {
289             aTypesHeap.InsertValue( aTypes[t]->Data(i), "" );
290         }  // end for
291     }
292 
293     // Write types:
294     HeapItem * pLastHeapTop = 0;
295     for ( HeapItem * pHeapTop = aTypesHeap.ReleaseTop(); pHeapTop != 0; pHeapTop = aTypesHeap.ReleaseTop() )
296     {
297         if (pLastHeapTop != 0)
298         {
299             if ( 0 == strcmp(pHeapTop->Key(), pLastHeapTop->Key()) )
300                 continue;
301             delete pLastHeapTop;
302             // pLastHeapTop = 0;
303         }
304         pLastHeapTop = pHeapTop;
305 
306         WriteStr( o_rOut, i_sSeparator );
307 
308         const char * sEnd = strchr( pHeapTop->Key(), ' ' );
309         if (sEnd != 0)
310         {
311             const char * sQuali = strrchr( pHeapTop->Key(), ' ' ) + 1;
312             WriteStr( o_rOut, sQuali );
313             WriteStr( o_rOut, "." );
314             o_rOut.write( pHeapTop->Key(), sEnd - pHeapTop->Key() );
315         }
316         else
317             WriteStr( o_rOut, pHeapTop->Key() );
318     }   // end for
319 
320     if (pLastHeapTop != 0)
321     {
322         delete pLastHeapTop;
323         pLastHeapTop = 0;
324     }
325 }
326 
327