Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <precomp.h>
21 : #include <adc_cl.hxx>
22 :
23 :
24 : // NOT FULLY DEFINED SERVICES
25 : #include <algorithm>
26 : #include <cosv/x.hxx>
27 : #include <cosv/file.hxx>
28 : #include <cosv/tpl/tpltools.hxx>
29 : #include <ary/ary.hxx>
30 : #include <tools/tkpchars.hxx>
31 : #include <adc_msg.hxx>
32 : #include "adc_cmds.hxx"
33 : #include "adc_cmd_parse.hxx"
34 : #include "cmd_sincedata.hxx"
35 :
36 :
37 : namespace autodoc
38 : {
39 :
40 : CommandLine * CommandLine::pTheInstance_ = 0;
41 :
42 : const char * const C_sUserGuide =
43 : "\n\n\n"
44 : " General Use of Autodoc\n"
45 : " ----------------------\n"
46 : "\n"
47 : " Example for IDL:\n"
48 : "\n"
49 : " -html <OutputDirectory> -name \"UDK 3.x anything\" -lg idl\n"
50 : " -t <SourceDir1> <SourceDir2>\n"
51 : "\n"
52 : " Instead of or in addition to -t may be\n"
53 : " used -d (no subdirectories) or -f (just one file). There can\n"
54 : " be multiple arguments after each of these options (-t -d -f).\n"
55 : "\n"
56 : "\n"
57 : " Replacing @since Tag Content\n"
58 : " ----------------------------\n"
59 : "\n"
60 : " You can give a transformation file to replace\n"
61 : " entries in @since tags by different entries.\n"
62 : " This file is given by the option\n"
63 : " -sincefile <TransformationFilePath>\n"
64 : " This option has to appear between the -html and the -lg option.\n"
65 : " Example:\n"
66 : " -html <OutputDirectory> -sincefile replacesince.txt\n"
67 : " -name \"UDK 3.x anything\" -lg idl -t <SourceDir>\n"
68 : "\n"
69 : "\n";
70 :
71 1 : CommandLine::CommandLine()
72 : : nDebugStyle(0),
73 1 : pSinceTransformator(new command::SinceTagTransformationData),
74 : aCommands(),
75 : bInitOk(false),
76 : pCommand_CreateHtml(0),
77 1 : pReposy( & ary::Repository::Create_() ),
78 3 : bIdl(false)
79 : {
80 : csv_assert(pTheInstance_ == 0);
81 1 : pTheInstance_ = this;
82 1 : }
83 :
84 2 : CommandLine::~CommandLine()
85 : {
86 1 : csv::erase_container_of_heap_ptrs(aCommands);
87 1 : pTheInstance_ = 0;
88 1 : }
89 :
90 : int
91 1 : CommandLine::Run() const
92 : {
93 1 : Cout() << "\nAutodoc version 2.2.5"
94 1 : << "\n---------------------"
95 2 : << "\n" << Endl();
96 :
97 : bool
98 1 : ok = true;
99 12 : for ( CommandList::const_iterator it = aCommands.begin();
100 9 : ok AND it != aCommands.end();
101 : ++it )
102 : {
103 2 : ok = (*it)->Run();
104 : }
105 :
106 1 : if (pCommand_CreateHtml != 0)
107 : {
108 1 : StreamStr aDiagnosticMessagesFile(700);
109 : aDiagnosticMessagesFile
110 1 : << pCommand_CreateHtml->OutputDir()
111 2 : << csv::ploc::Delimiter()
112 1 : << "Autodoc_DiagnosticMessages.txt";
113 1 : TheMessages().WriteFile(aDiagnosticMessagesFile.c_str());
114 : }
115 :
116 1 : return ok ? 0 : 1;
117 : }
118 :
119 : CommandLine &
120 11960968 : CommandLine::Get_()
121 : {
122 : csv_assert(pTheInstance_ != 0);
123 11960968 : return *pTheInstance_;
124 : }
125 :
126 : bool
127 2584 : CommandLine::DoesTransform_SinceTag() const
128 : {
129 2584 : return pSinceTransformator->DoesTransform();
130 : }
131 :
132 : //bool
133 : //CommandLine::Strip_SinceTagText( String & io_sSinceTagValue ) const
134 : //{
135 : // return pSinceTransformator->StripSinceTagText(io_sSinceTagValue);
136 : //}
137 :
138 : const String &
139 413 : CommandLine::DisplayOf_SinceTagValue( const String & i_sVersionNumber ) const
140 : {
141 413 : return pSinceTransformator->DisplayOf(i_sVersionNumber);
142 : }
143 :
144 : void
145 1 : CommandLine::do_Init( int argc,
146 : char * argv[] )
147 : {
148 : try
149 : {
150 1 : bInitOk = false;
151 1 : StringVector aParameters;
152 :
153 1 : char * * itpEnd = &argv[0] + argc;
154 13 : for ( char * * itp = &argv[1]; itp != itpEnd; ++itp )
155 : {
156 12 : if ( strncmp(*itp, "-I:", 3) != 0 )
157 12 : aParameters.push_back(String(*itp));
158 : else
159 0 : load_IncludedCommands(aParameters, (*itp)+3);
160 : }
161 :
162 1 : StringVector::const_iterator itEnd = aParameters.end();
163 4 : for ( StringVector::const_iterator it = aParameters.begin();
164 : it != itEnd;
165 : )
166 : {
167 2 : if ( *it == command::C_opt_Verbose )
168 0 : do_clVerbose(it,itEnd);
169 5 : else if ( *it == command::C_opt_LangAll
170 2 : OR *it == command::C_opt_Name
171 1 : OR *it == command::C_opt_DevmanFile )
172 1 : do_clParse(it,itEnd);
173 1 : else if (*it == command::C_opt_CreateHtml)
174 1 : do_clCreateHtml(it,itEnd);
175 0 : else if (*it == command::C_opt_SinceFile)
176 0 : do_clSinceFile(it,itEnd);
177 0 : else if (*it == command::C_opt_ExternNamespace)
178 : {
179 0 : sExternNamespace = *(++it);
180 0 : ++it;
181 0 : if ( strncmp(sExternNamespace.c_str(), "::", 2) != 0)
182 : {
183 : throw command::X_CommandLine(
184 : "-extnsp needs an absolute qualified namespace, starting with \"::\"."
185 0 : );
186 : }
187 : }
188 0 : else if (*it == command::C_opt_ExternRoot)
189 : {
190 0 : ++it;
191 0 : StreamLock sl(1000);
192 0 : if ( csv::compare(*it, 0, "http://", 7) != 0 )
193 : {
194 0 : sl() << "http://" << *it;
195 : }
196 0 : if ( *(sl().end()-1) != '/')
197 0 : sl() << '/';
198 0 : sExternRoot = sl().c_str();
199 :
200 0 : ++it;
201 : }
202 : // else if (*it == command::C_opt_CreateXml)
203 : // do_clCreateXml(it,itEnd);
204 : // else if (command::C_opt_Load)
205 : // do_clLoad(it,itEnd);
206 : // else if (*it == command::C_opt_Save)
207 : // do_clSave(it,itEnd);
208 0 : else if (*it == "-h" OR *it == "-?" OR *it == "?")
209 : // Leads to displaying help, because bInitOk stays on false.
210 1 : return;
211 0 : else if ( *it == command::C_opt_Parse )
212 : // Only for backwards compatibility.
213 : // Just ignore "-parse".
214 0 : ++it;
215 : else
216 : {
217 0 : StreamLock sl(200);
218 : throw command::X_CommandLine(
219 0 : sl() << "Unknown commandline option \""
220 0 : << *it
221 0 : << "\"."
222 0 : << c_str );
223 : }
224 : } // end for
225 1 : sort_Commands();
226 :
227 1 : bInitOk = true;
228 :
229 : } // end try
230 0 : catch ( command::X_CommandLine & xxx )
231 : {
232 0 : xxx.Report( Cerr() );
233 : }
234 0 : catch ( csv::Exception & xxx )
235 : {
236 0 : xxx.GetInfo( Cerr() );
237 : }
238 : }
239 :
240 : void
241 0 : CommandLine::do_PrintUse() const
242 : {
243 0 : Cout() << C_sUserGuide << Endl();
244 0 : }
245 :
246 : bool
247 1 : CommandLine::inq_CheckParameters() const
248 : {
249 1 : if (NOT bInitOk OR aCommands.empty())
250 0 : return false;
251 1 : return true;
252 : }
253 :
254 : void
255 0 : CommandLine::load_IncludedCommands( StringVector & out,
256 : const char * i_filePath )
257 : {
258 : CharacterSource
259 0 : aIncludedCommands;
260 : csv::File
261 0 : aFile(i_filePath, csv::CFM_READ);
262 0 : if (NOT aFile.open())
263 : {
264 0 : Cerr() << "Command include file \""
265 0 : << i_filePath
266 0 : << "\" not found."
267 0 : << Endl();
268 0 : throw command::X_CommandLine("Invalid file in option -I:<command-file>.");
269 : }
270 0 : aIncludedCommands.LoadText(aFile);
271 0 : aFile.close();
272 :
273 0 : bool bInToken = false;
274 0 : StreamLock aTransmit(200);
275 0 : for ( ; NOT aIncludedCommands.IsFinished(); aIncludedCommands.MoveOn() )
276 : {
277 0 : if (bInToken)
278 : {
279 0 : if (aIncludedCommands.CurChar() <= 32)
280 : {
281 : const char *
282 0 : pToken = aIncludedCommands.CutToken();
283 0 : bInToken = false;
284 :
285 0 : if ( strncmp(pToken, "-I:", 3) != 0 )
286 : {
287 0 : aTransmit().seekp(0);
288 0 : aTransmit() << pToken;
289 0 : aTransmit().replace_all('\\', *csv::ploc::Delimiter());
290 0 : aTransmit().replace_all('/', *csv::ploc::Delimiter());
291 0 : out.push_back(String(aTransmit().c_str()));
292 : }
293 : else
294 0 : load_IncludedCommands(out, pToken+3);
295 : }
296 : }
297 : else
298 : {
299 0 : if (aIncludedCommands.CurChar() > 32)
300 : {
301 0 : aIncludedCommands.CutToken();
302 0 : bInToken = true;
303 : }
304 : } // endif (bInToken) else
305 :
306 0 : } // end while()
307 0 : }
308 :
309 : namespace
310 : {
311 : inline int
312 0 : v_nr(StringVector::const_iterator it)
313 : {
314 0 : return int( *(*it).c_str() ) - int('0');
315 : }
316 : } // anonymous namespace
317 :
318 : void
319 0 : CommandLine::do_clVerbose( opt_iter & it,
320 : opt_iter itEnd )
321 : {
322 0 : ++it;
323 0 : if ( it == itEnd ? true : v_nr(it) < 0 OR v_nr(it) > 7 )
324 0 : throw command::X_CommandLine( "Missing or invalid number in -v option." );
325 0 : nDebugStyle = v_nr(it);
326 0 : ++it;
327 0 : }
328 :
329 : void
330 1 : CommandLine::do_clParse( opt_iter & it,
331 : opt_iter itEnd )
332 : {
333 : command::Command *
334 1 : pCmd_Parse = new command::Parse;
335 1 : pCmd_Parse->Init(it, itEnd);
336 1 : aCommands.push_back(pCmd_Parse);
337 1 : }
338 :
339 : void
340 1 : CommandLine::do_clCreateHtml( opt_iter & it,
341 : opt_iter itEnd )
342 : {
343 1 : pCommand_CreateHtml = new command::CreateHtml;
344 1 : pCommand_CreateHtml->Init(it, itEnd);
345 1 : aCommands.push_back(pCommand_CreateHtml);
346 1 : }
347 :
348 : void
349 0 : CommandLine::do_clSinceFile( opt_iter & it,
350 : opt_iter itEnd )
351 : {
352 0 : pSinceTransformator->Init(it, itEnd);
353 0 : }
354 :
355 :
356 : namespace
357 : {
358 :
359 : struct Less_RunningRank
360 : {
361 1 : bool operator()(
362 : const command::Command * const &
363 : i1,
364 : const command::Command * const &
365 : i2 ) const
366 1 : { return i1->RunningRank() < i2->RunningRank(); }
367 : };
368 :
369 : } // anonymous namespace
370 :
371 :
372 :
373 : void
374 1 : CommandLine::sort_Commands()
375 : {
376 : std::sort( aCommands.begin(),
377 : aCommands.end(),
378 1 : Less_RunningRank() );
379 1 : }
380 :
381 3 : } // namespace autodoc
382 :
383 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|