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
25 #include "cr_index.hxx"
26
27 #include <string.h>
28 #include <fstream>
29 #include "../support/syshelp.hxx"
30 #include "xmltree.hxx"
31 #include "parse.hxx"
32 #include "cr_html.hxx"
33
34
35 extern unsigned C_nSupportedServicesIndex;
36
37 char C_sLineEnd[] = "\n";
38
39 char C_sFileBegin[] = "<HTML><HEAD></HEAD><BODY bgcolor=\"#ffffff\">\n";
40 char C_sFileEnd[] = "</BODY></HTML>\n";
41 char C_sTableBegin[] = "<TABLE WIDTH=100% BORDER=1 CELLPADDING=4 CELLSPACING=0><TBODY>\n";
42 char C_sTableEnd[] = "</TBODY></TABLE>\n";
43 char C_sService[] = "SupportedService";
44 char C_sModule[] = "ModuleName";
45 char C_sComponentname[] = "ComponentName";
46
47
48
49 Simstr sIdlRootPath;
50
51
Index(const char * i_sOutputDirectory,const char * i_sIdlRootPath,const List<Simstr> &)52 Index::Index( const char * i_sOutputDirectory,
53 const char * i_sIdlRootPath,
54 const List<Simstr> & )
55 : aService2Module(20),
56 aModule2Service(20),
57 sOutputDirectory(i_sOutputDirectory),
58 sIdlRootPath(i_sIdlRootPath)
59 // sCurModule
60 {
61 ::sIdlRootPath = i_sIdlRootPath;
62 }
63
~Index()64 Index::~Index()
65 {
66 }
67
68 void
GatherData(const List<Simstr> & i_rInputFileList)69 Index::GatherData( const List<Simstr> & i_rInputFileList )
70 {
71 for ( unsigned i = 0; i < i_rInputFileList.size(); ++i )
72 {
73 ReadFile( i_rInputFileList[i].str() );
74 }
75 }
76
77 void
WriteOutput(const char * i_sOuputFile)78 Index::WriteOutput( const char * i_sOuputFile )
79 {
80 std::ofstream aOut( i_sOuputFile, std::ios::out );
81 if (! aOut)
82 {
83 std::cerr << "Error: Indexfile \""
84 << i_sOuputFile
85 << "\" could not be created."
86 << std::endl;
87 return;
88 }
89
90 WriteStr(aOut, C_sFileBegin);
91
92 WriteStr(aOut, "<H2>Module Descriptions Index</H2>");
93 WriteStr(aOut, C_sLineEnd );
94
95
96 WriteTableFromHeap( aOut, aService2Module, C_sService, C_sModule, lt_html );
97 WriteTableFromHeap( aOut, aModule2Service, C_sModule, C_sService, lt_idl );
98
99 WriteStr( aOut, C_sFileEnd );
100 aOut.close();
101 }
102
103 void
InsertSupportedService(const Simstr & i_sService)104 Index::InsertSupportedService( const Simstr & i_sService )
105 {
106 aService2Module.InsertValue( i_sService, sCurModule );
107 aModule2Service.InsertValue( sCurModule, i_sService );
108 }
109
110 void
ReadFile(const char * i_sFilename)111 Index::ReadFile( const char * i_sFilename )
112 {
113 static char sOutputHtml[1020];
114
115 ModuleDescription aModule;
116 X2CParser aParser(aModule);
117
118 // Parse
119 bool bResult = aParser.Parse(i_sFilename);
120 if (! bResult)
121 {
122 std::cerr << "Error: File \""
123 << i_sFilename
124 << "\" could not be parsed."
125 << std::endl;
126 return;
127 }
128
129 // Create Html:
130 CreateHtmlFileName( sOutputHtml, aModule );
131 HtmlCreator aHtmlCreator( sOutputHtml, aModule, sIdlRootPath );
132 aHtmlCreator.Run();
133
134 // GetResults:
135 sCurModule = aModule.ModuleName();
136
137 List< const MultipleTextElement* > aSupportedServices;
138 aModule.Get_SupportedServices(aSupportedServices);
139
140 for ( unsigned s = 0; s < aSupportedServices.size(); ++s )
141 {
142 aSupportedServices[s]->Insert2Index(*this);
143 }
144 }
145
146 void
CreateHtmlFileName(char * o_sOutputHtml,const ModuleDescription & i_rModule)147 Index::CreateHtmlFileName( char * o_sOutputHtml,
148 const ModuleDescription & i_rModule )
149 {
150 if ( strlen(sOutputDirectory.str()) + strlen(i_rModule.ModuleName()) > 1000 )
151 {
152 strcpy( o_sOutputHtml, "too-long-filename.html"); // STRCPY SAFE HERE
153 return;
154 }
155
156 strcpy( o_sOutputHtml, sOutputDirectory.str() ); // STRCPY SAFE HERE
157 #if defined(WNT) || defined(OS2)
158 strcat(o_sOutputHtml, "\\"); // STRCAT SAFE HERE
159 #elif defined(UNX)
160 strcat(o_sOutputHtml, "/"); // STRCAT SAFE HERE
161 #else
162 #error WNT or UNX have to be defined.
163 #endif
164 strcat( o_sOutputHtml, i_rModule.ModuleName() ); // STRCAT SAFE HERE
165 strcat( o_sOutputHtml, ".html" ); // STRCAT SAFE HERE
166 }
167
168
169 void
WriteTableFromHeap(std::ostream & o_rOut,Heap & i_rHeap,const char * i_sIndexValue,const char * i_sIndexReference,E_LinkType i_eLinkType)170 Index::WriteTableFromHeap( std::ostream & o_rOut,
171 Heap & i_rHeap,
172 const char * i_sIndexValue,
173 const char * i_sIndexReference,
174 E_LinkType i_eLinkType )
175 {
176 WriteStr(o_rOut, "<H3><BR>");
177 WriteStr(o_rOut, i_sIndexValue );
178 WriteStr(o_rOut, " -> ");
179 WriteStr(o_rOut, i_sIndexReference );
180 WriteStr(o_rOut, "</H3>\n");
181
182 WriteStr(o_rOut, C_sTableBegin);
183 WriteHeap( o_rOut, i_rHeap, i_eLinkType );
184 WriteStr(o_rOut, C_sTableEnd);
185 }
186
187
188 void
WriteHeap(std::ostream & o_rOut,Heap & i_rHeap,E_LinkType i_eLinkType)189 Index::WriteHeap( std::ostream & o_rOut,
190 Heap & i_rHeap,
191 E_LinkType i_eLinkType )
192 {
193 static Simstr S_sKey;
194 static char C_sSpaceInName[] = " ";
195 S_sKey = "";
196
197
198 WriteStr( o_rOut, "<TR><TD width=33% valign=\"top\">" );
199
200 for ( HeapItem * pHeapTop = i_rHeap.ReleaseTop();
201 pHeapTop != 0;
202 pHeapTop = i_rHeap.ReleaseTop() )
203 {
204 if ( S_sKey != pHeapTop->Key() )
205 {
206 const char * pStart = pHeapTop->Key().str();
207 const char * pBreak = strstr( pStart, " in ");
208
209 if (S_sKey.l()>0)
210 {
211 WriteStr( o_rOut, "</TD></TR>\n" );
212 WriteStr( o_rOut, "<TR><TD width=33% valign=\"top\">" );
213 }
214
215 if ( pBreak == 0 )
216 WriteStr( o_rOut, pStart );
217 else
218 {
219 o_rOut.write( pStart, pBreak - pStart );
220 WriteStr( o_rOut, C_sSpaceInName );
221 WriteStr( o_rOut, pBreak );
222 }
223 WriteStr( o_rOut, "</TD><TD width=66%>" );
224 S_sKey = pHeapTop->Key();
225 }
226 else
227 {
228 WriteStr( o_rOut, "<BR>" );
229 }
230 WriteName( o_rOut, sIdlRootPath, pHeapTop->Value(), i_eLinkType );
231 delete pHeapTop;
232 }
233
234 WriteStr( o_rOut, "</TD></TR>\n" );
235 }
236
237
238
239 /** �bersicht der Struktur
240
241 MODULEDESCRIPTION
242 {
243 ModuleName,
244 COMPONENTDESCRIPTION
245 {
246 Author,
247 Name,
248 Description,
249 LoaderName,
250 Language,
251 Status,
252 SupportedService+,
253 ReferenceDocu*
254 ServiceDependency*
255 Type*
256 }
257 ProjectBuildDependency*
258 RuntimeModuleDependency*
259 ReferenceDocu*
260 ServiceDependency*
261 Type*
262 }
263
264
265 */
266
267
268
269
270
271
272