source: src/UIElements/CommandLineUI/CommandLineParser.cpp@ 7912e9

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 7912e9 was 7912e9, checked in by Frederik Heber <heber@…>, 10 years ago

CommandLineParser adds Action's default values as implicit.

  • this allows to have action's token as option with both empty (then default is used) and some given argument.
  • Property mode set to 100644
File size: 23.3 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * CommandLineParser.cpp
25 *
26 * Created on: May 8, 2010
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "CodePatterns/MemDebug.hpp"
36
37#include <boost/filesystem.hpp>
38#include <boost/program_options.hpp>
39#include <fstream>
40#include <iostream>
41#include <set>
42#include <map>
43
44#include "Actions/Action.hpp"
45#include "Actions/ActionQueue.hpp"
46#include "Actions/ActionTrait.hpp"
47#include "Actions/OptionRegistry.hpp"
48#include "Actions/OptionTrait.hpp"
49#include "Actions/Values.hpp"
50#include "CodePatterns/Log.hpp"
51#include "CodePatterns/Verbose.hpp"
52#include "CommandLineParser.hpp"
53#include "CommandLineParser_validate.hpp"
54#include "World.hpp"
55
56#include "CodePatterns/Singleton_impl.hpp"
57
58using namespace MoleCuilder;
59
60class element;
61
62/** Constructor of class CommandLineParser.
63 *
64 */
65CommandLineParser::CommandLineParser() :
66 analysis("Analysis options"),
67 atom("Atom options"),
68 bond("Bond options"),
69 command("Command options"),
70 fill("fill options"),
71 shape("shape options"),
72 fragmentation("Fragmentation options"),
73 graph("Graph options"),
74 molecule("Molecule options"),
75 options("Secondary options"),
76 parser("Parser options"),
77 potential("Potential options"),
78 selection("Selection options"),
79 tesselation("Tesselation options"),
80 world("World options")
81{
82 // put all options lists into a lookup
83 CmdParserLookup["analysis"] = &analysis;
84 CmdParserLookup["atom"] = &atom;
85 CmdParserLookup["bond"] = &bond;
86 CmdParserLookup["command"] = &command;
87 CmdParserLookup["edit"] = &edit;
88 CmdParserLookup["fill"] = &fill;
89 CmdParserLookup["shape"] = &shape;
90 CmdParserLookup["fragmentation"] = &fragmentation;
91 CmdParserLookup["graph"] = &graph;
92 CmdParserLookup["options"] = &options;
93 CmdParserLookup["molecule"] = &molecule;
94 CmdParserLookup["parser"] = &parser;
95 CmdParserLookup["potential"] = &potential;
96 CmdParserLookup["selection"] = &selection;
97 CmdParserLookup["tesselation"] = &tesselation;
98 CmdParserLookup["world"] = &world;
99}
100
101/** Destructor of class CommandLineParser.
102 *
103 */
104CommandLineParser::~CommandLineParser()
105{}
106
107/** Initializes command arguments to accept.
108 * Goes through ActionRegistry and puts all actions therein into the map.
109 */
110void CommandLineParser::InitializeCommandArguments()
111{
112 // we need a list of already added options, otherwise we get ambigious exceptions
113 std::set<std::string> AlreadyAddedOptionNames;
114
115 bool ActionAlreadyAdded_flag = false;
116 ActionQueue &AQ = ActionQueue::getInstance();
117 ActionQueue::ActionTokens_t tokens = AQ.getListOfActions();
118 for (ActionQueue::ActionTokens_t::const_iterator iter = tokens.begin();
119 iter != tokens.end(); ++iter) {
120 const ActionTrait &CurrentTrait = AQ.getActionsTrait(*iter);
121 ActionAlreadyAdded_flag = false;
122 //std::cout << "Current Action to initialize is: " << actioniter->first << std::endl;
123
124 for (ActionTrait::options_const_iterator optioniter = CurrentTrait.getBeginIter();
125 optioniter != CurrentTrait.getEndIter();
126 ++optioniter) {
127 if (optioniter->first == *iter)
128 ActionAlreadyAdded_flag = true;
129 ASSERT( OptionRegistry::getInstance().isOptionPresentByName(optioniter->first),
130 "CommandLineParser::Init() - Option "+optioniter->first+" not present in OptionRegistry." );
131 const OptionTrait* const currentOption = OptionRegistry::getInstance().getOptionByName(optioniter->first);
132
133 if (AlreadyAddedOptionNames.find(optioniter->first) == AlreadyAddedOptionNames.end()) {
134 // add the option
135// std::cout << "Registering Option "
136// << currentOption->getName()
137// << " with type '" << currentOption->getTypeName() << "' "
138// << " with description '" << currentOption->getDescription() << "' ";
139// if (currentOption->hasShortForm())
140// std::cout << ", with short form " << currentOption->getShortForm();
141// else
142// std::cout << ", with no short form ";
143// if (currentOption->hasDefaultValue())
144// std::cout << ", with default value " << currentOption->getDefaultValue();
145// else
146// std::cout << ", with no default value ";
147// std::cout << std::endl;
148
149 AddOptionToParser(currentOption, (CmdParserLookup["options"]),
150 (optioniter->first == *iter) ?
151 true : false);
152
153 AlreadyAddedOptionNames.insert(optioniter->first);
154 } else {
155// std::cout << "Option " << currentOption->getName() << " already registered." << std::endl;
156 }
157 }
158
159 if (!ActionAlreadyAdded_flag) {
160 // add the action
161// std::cout << "Registering Action "
162// << currentAction->Traits.getName()
163// << " in menu " << currentAction->Traits.getMenuName()
164// << " with type '" << currentAction->Traits.getTypeName() << "' "
165// << " with description '" << currentAction->Traits.getDescription() << "' ";
166// if (currentAction->Traits.hasShortForm())
167// std::cout << ", with short form " << currentAction->Traits.getShortForm();
168// else
169// std::cout << ", with no short form ";
170// if (currentAction->Traits.hasDefaultValue())
171// std::cout << ", with default value " << currentAction->Traits.getDefaultValue();
172// else
173// std::cout << ", with no default value ";
174// std::cout << std::endl;
175
176 ASSERT(CmdParserLookup.find(CurrentTrait.getMenuName()) != CmdParserLookup.end(),
177 "CommandLineParser: boost::program_options::options_description for this Action not present.");
178 AddOptionToParser(
179 dynamic_cast<const OptionTrait * const>(&CurrentTrait),
180 (CmdParserLookup[CurrentTrait.getMenuName()]),
181 false);
182 }
183 }
184 // note: positioning is not important on the command line
185}
186
187/** Adds an Action or Option to the CommandLineParser.
188 * Note that Action is derived from Option(Trait)
189 *
190 * This ugly switch function is necessary because of the compile-time problem:
191 * po::value<T> has to be instantiated at compile-time however we do know the type not until run-time.
192 * Not even a templated function like po::value<T> getProgramOptionValuefromType() does help, specialized
193 * to each available type, as the signatures of all the functions differ. Hence, they cannot not put into
194 * one type_info -> po::value<T> map ...
195 *
196 * \param *currentOption pointer to Action/Option to add
197 * \param *OptionList program_options list to add to
198 * \param _DefaultAsImplicit whether to add a default value as default_value or
199 * as implicit_value (default = option token present or not, implicit =
200 option token present but not necessarily followed by argument)
201 */
202void CommandLineParser::AddOptionToParser(
203 const OptionTrait * const currentOption,
204 po::options_description* OptionList,
205 const bool _DefaultAsImplicit)
206{
207 // check whether dynamic_cast in Init() suceeded
208 ASSERT(currentOption != NULL, "CommandLineParser::AddOptionToParser() - currentOption is NULL!");
209 // add other options
210// std::cout << "Adding Action " << currentOption->getName() << " with type "
211// << currentOption->getType()->name() << ", " << (currentOption->hasDefaultValue() ? "with" : "without")
212// << " default value, and KeyandShortform " << currentOption->getKeyAndShortForm()
213// << " to CommandLineParser." << std::endl;
214 switch(TypeToEnums.getEnumforType(currentOption->getType())) {
215 default:
216 case TypeEnumContainer::NoneType:
217 OptionList->add_options()
218 (currentOption->getKeyAndShortForm().c_str(), currentOption->getDescription().c_str())
219 ;
220 break;
221 case TypeEnumContainer::BooleanType:
222 OptionList->add_options()
223 (currentOption->getKeyAndShortForm().c_str(),
224 currentOption->hasDefaultValue() ?
225 (_DefaultAsImplicit ?
226 po::value < bool >()->implicit_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str())) :
227 po::value < bool >()->default_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str()))) :
228 po::value < bool >(),
229 currentOption->getDescription().c_str())
230 ;
231 break;
232 case TypeEnumContainer::FileType:
233 OptionList->add_options()
234 (currentOption->getKeyAndShortForm().c_str(),
235// currentOption->hasDefaultValue() ?
236// po::value < boost::filesystem::path >()->default_value(boost::lexical_cast<boost::filesystem::path>(currentOption->getDefaultValue().c_str())) :
237 po::value < boost::filesystem::path >(),
238 currentOption->getDescription().c_str())
239 ;
240 break;
241 case TypeEnumContainer::ListOfFilesType:
242 OptionList->add_options()
243 (currentOption->getKeyAndShortForm().c_str(),
244// currentOption->hasDefaultValue() ?
245// po::value < std::vector<boost::filesystem::path> >()->default_value(boost::lexical_cast< std::vector<boost::filesystem::path> >(currentOption->getDefaultValue().c_str())) :
246 po::value < std::vector<boost::filesystem::path> >()->multitoken(),
247 currentOption->getDescription().c_str())
248 ;
249 break;
250 case TypeEnumContainer::IntegerType:
251 OptionList->add_options()
252 (currentOption->getKeyAndShortForm().c_str(),
253 currentOption->hasDefaultValue() ?
254 (_DefaultAsImplicit ?
255 po::value < int >()->implicit_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str())) :
256 po::value < int >()->default_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str()))) :
257 po::value < int >(),
258 currentOption->getDescription().c_str())
259 ;
260 break;
261 case TypeEnumContainer::ListOfIntegersType:
262 OptionList->add_options()
263 (currentOption->getKeyAndShortForm().c_str(),
264// currentOption->hasDefaultValue() ?
265// po::value < std::vector<int> >()->default_value(boost::lexical_cast< std::vector<int> >(currentOption->getDefaultValue().c_str())) :
266 po::value < std::vector<int> >()->multitoken(),
267 currentOption->getDescription().c_str())
268 ;
269 break;
270 case TypeEnumContainer::UnsignedIntegerType:
271 OptionList->add_options()
272 (currentOption->getKeyAndShortForm().c_str(),
273 currentOption->hasDefaultValue() ?
274 (_DefaultAsImplicit ?
275 po::value < unsigned int >()->implicit_value(boost::lexical_cast<unsigned int>(currentOption->getDefaultValue().c_str())) :
276 po::value < unsigned int >()->default_value(boost::lexical_cast<unsigned int>(currentOption->getDefaultValue().c_str()))) :
277 po::value < unsigned int >(),
278 currentOption->getDescription().c_str())
279 ;
280 break;
281 case TypeEnumContainer::ListOfUnsignedIntegersType:
282 OptionList->add_options()
283 (currentOption->getKeyAndShortForm().c_str(),
284// currentOption->hasDefaultValue() ?
285// po::value < std::vector<unsigned int> >()->default_value(boost::lexical_cast< std::vector<unsigned int> >(currentOption->getDefaultValue().c_str())) :
286 po::value < std::vector<unsigned int> >()->multitoken(),
287 currentOption->getDescription().c_str())
288 ;
289 break;
290 case TypeEnumContainer::DoubleType:
291 OptionList->add_options()
292 (currentOption->getKeyAndShortForm().c_str(),
293 currentOption->hasDefaultValue() ?
294 (_DefaultAsImplicit ?
295 po::value < double >()->implicit_value(boost::lexical_cast<double>(currentOption->getDefaultValue().c_str())) :
296 po::value < double >()->default_value(boost::lexical_cast<double>(currentOption->getDefaultValue().c_str()))) :
297 po::value < double >(),
298 currentOption->getDescription().c_str())
299 ;
300 break;
301 case TypeEnumContainer::ListOfDoublesType:
302 OptionList->add_options()
303 (currentOption->getKeyAndShortForm().c_str(),
304// currentOption->hasDefaultValue() ?
305// po::value < std::vector<double> >()->default_value(boost::lexical_cast< std::vector<double> >(currentOption->getDefaultValue().c_str())) :
306 po::value < std::vector<double> >()->multitoken(),
307 currentOption->getDescription().c_str())
308 ;
309 break;
310 case TypeEnumContainer::StringType:
311 OptionList->add_options()
312 (currentOption->getKeyAndShortForm().c_str(),
313 currentOption->hasDefaultValue() ?
314 (_DefaultAsImplicit ?
315 po::value < std::string >()->implicit_value(currentOption->getDefaultValue()) :
316 po::value < std::string >()->default_value(currentOption->getDefaultValue())) :
317 po::value < std::string >(),
318 currentOption->getDescription().c_str())
319 ;
320 break;
321 case TypeEnumContainer::ListOfStringsType:
322 OptionList->add_options()
323 (currentOption->getKeyAndShortForm().c_str(),
324// currentOption->hasDefaultValue() ?
325// po::value < std::vector<std::string> >()->default_value(boost::lexical_cast< std::vector<std::string> >(currentOption->getDefaultValue().c_str())) :
326 po::value < std::vector<std::string> >()->multitoken(),
327 currentOption->getDescription().c_str())
328 ;
329 break;
330 case TypeEnumContainer::VectorType:
331 OptionList->add_options()
332 (currentOption->getKeyAndShortForm().c_str(),
333// currentOption->hasDefaultValue() ?
334// po::value < VectorValue >()->default_value(boost::lexical_cast<VectorValue>(currentOption->getDefaultValue().c_str())) :
335 po::value < VectorValue >(),
336 currentOption->getDescription().c_str())
337 ;
338 break;
339 case TypeEnumContainer::ListOfVectorsType:
340 OptionList->add_options()
341 (currentOption->getKeyAndShortForm().c_str(),
342// currentOption->hasDefaultValue() ?
343// po::value < std::vector<VectorValue> >()->default_value(boost::lexical_cast< std::vector<VectorValue> >(currentOption->getDefaultValue().c_str())) :
344 po::value < std::vector<VectorValue> >()->multitoken(),
345 currentOption->getDescription().c_str())
346 ;
347 break;
348 case TypeEnumContainer::MoleculeType:
349 OptionList->add_options()
350 (currentOption->getKeyAndShortForm().c_str(),
351// currentOption->hasDefaultValue() ?
352// po::value < const molecule * >()->default_value(boost::lexical_cast<const molecule *>(currentOption->getDefaultValue().c_str())) :
353 po::value < int >(),
354 currentOption->getDescription().c_str())
355 ;
356 break;
357 case TypeEnumContainer::ListOfMoleculesType:
358 OptionList->add_options()
359 (currentOption->getKeyAndShortForm().c_str(),
360// currentOption->hasDefaultValue() ?
361// po::value < std::vector<const molecule *> >()->default_value(boost::lexical_cast< std::vector<const molecule *> >(currentOption->getDefaultValue().c_str())) :
362 po::value < std::vector<int> >()->multitoken(),
363 currentOption->getDescription().c_str())
364 ;
365 break;
366 case TypeEnumContainer::AtomType:
367 OptionList->add_options()
368 (currentOption->getKeyAndShortForm().c_str(),
369 currentOption->hasDefaultValue() ?
370 (_DefaultAsImplicit ?
371 po::value < int >()->implicit_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str())) :
372 po::value < int >()->default_value(boost::lexical_cast<int>(currentOption->getDefaultValue().c_str()))) :
373 po::value < int >(),
374 currentOption->getDescription().c_str())
375 ;
376 break;
377 case TypeEnumContainer::ListOfAtomsType:
378 OptionList->add_options()
379 (currentOption->getKeyAndShortForm().c_str(),
380// currentOption->hasDefaultValue() ?
381// po::value < std::vector<const atom *> >()->default_value(boost::lexical_cast< std::vector<const atom *> >(currentOption->getDefaultValue().c_str())) :
382 po::value < std::vector<int> >()->multitoken(),
383 currentOption->getDescription().c_str())
384 ;
385 break;
386 case TypeEnumContainer::ElementType:
387 OptionList->add_options()
388 (currentOption->getKeyAndShortForm().c_str(),
389// currentOption->hasDefaultValue() ?
390// po::value < const element * >()->default_value(boost::lexical_cast<const element *>(currentOption->getDefaultValue().c_str())) :
391 po::value < int >(),
392 currentOption->getDescription().c_str())
393 ;
394 break;
395 case TypeEnumContainer::ListOfElementsType:
396 OptionList->add_options()
397 (currentOption->getKeyAndShortForm().c_str(),
398// currentOption->hasDefaultValue() ?
399// po::value < std::vector<const element *> >()->default_value(boost::lexical_cast< std::vector<const element *> >(currentOption->getDefaultValue().c_str())) :
400 po::value < std::vector<int> >()->multitoken(),
401 currentOption->getDescription().c_str())
402 ;
403 break;
404 case TypeEnumContainer::RandomNumberDistribution_ParametersType:
405 OptionList->add_options()
406 (currentOption->getKeyAndShortForm().c_str(),
407 currentOption->hasDefaultValue() ?
408 (_DefaultAsImplicit ?
409 po::value < std::string >()->implicit_value(boost::lexical_cast< std::string >(currentOption->getDefaultValue().c_str())) :
410 po::value < std::string >()->default_value(boost::lexical_cast< std::string >(currentOption->getDefaultValue().c_str()))) :
411 po::value < std::string >(),
412 currentOption->getDescription().c_str())
413 ;
414 break;
415 case TypeEnumContainer::RealSpaceMatrixType:
416 OptionList->add_options()
417 (currentOption->getKeyAndShortForm().c_str(),
418// currentOption->hasDefaultValue() ?
419// po::value < RealSpaceMatrixValue >()->default_value(boost::lexical_cast<BoxValue>(currentOption->getDefaultValue().c_str())) :
420 po::value < RealSpaceMatrixValue >(),
421 currentOption->getDescription().c_str())
422 ;
423 break;
424 }
425}
426
427/** States whether there are command line arguments.
428 * \return true - there are none, false - there is at least one command line argument
429 */
430bool CommandLineParser::isEmpty()
431{
432 return vm.empty();
433}
434
435/** Sets the options.
436 * \param _argc arg count from main()
437 * \param **_argv argument array from main()
438 */
439void CommandLineParser::setOptions(int _argc, char **_argv)
440{
441 argc = _argc;
442 argv = _argv;
443 config_file_options.add(options);
444 // append all option_descriptions to both cmdline_options and visible
445 for (CmdParserLookupMap::iterator iter = CmdParserLookup.begin();
446 iter != CmdParserLookup.end();
447 ++iter) {
448 cmdline_options.add(*(iter->second));
449 visible.add(*(iter->second));
450 }
451}
452
453/** Parses the command line arguments.
454 * Calls program_options::store() and program_options::notify()
455 *
456 * @return true - all is ok, false - command-line options could not be parsed
457 * correctly
458 */
459bool CommandLineParser::Parse()
460{
461 bool status = true;
462 try {
463 po::store(po::command_line_parser(argc,argv).options(cmdline_options).run(), vm);
464 } catch (std::exception &e) {
465 std::cerr << "Something went wrong with parsing the command-line arguments: "
466 << e.what() << std::endl;
467 World::getInstance().setExitFlag(134);
468#ifdef HAVE_ACTION_THREAD
469 // force action queue to stop thread
470 ActionQueue::getInstance().stop();
471 ActionQueue::getInstance().clearTempQueue();
472#endif
473 ActionQueue::getInstance().clearQueue();
474 status = false;
475 }
476 if (status) {
477 std::ifstream input;
478 input.open("example.cfg");
479 if (!input.fail())
480 po::store(po::parse_config_file(input, config_file_options), vm);
481 input.close();
482 po::notify(vm);
483 }
484 return status;
485}
486
487/** Scan the argument list for -a or --arguments and store their order for later use.
488 */
489void CommandLineParser::scanforSequenceOfArguments()
490{
491 std::map <std::string, std::string> ShortFormToActionMap = getShortFormToActionMap();
492 LOG(0, "Scanning command line arguments and recognizing Actions.");
493 // go through all arguments
494 for (int i=1;i<argc;i++) {
495 LOG(2, "Checking on " << argv[i]);
496 // check whether they
497 if (argv[i][0] == '-') { // .. begin with -
498 LOG(2, "Possible argument: " << argv[i]);
499 if (argv[i][1] == '-') { // .. or --
500 LOG(1, "Putting " << argv[i] << " into the sequence.");
501 SequenceOfActions.push_back(&(argv[i][2]));
502 // .. and check that next letter is not numeric, if so insert
503 } else if (((argv[i][1] < '0') || (argv[i][1] > '9')) && ((argv[i][1] != '.'))) {
504 std::map <std::string, std::string>::iterator iter = ShortFormToActionMap.find(&(argv[i][1]));
505 if (iter != ShortFormToActionMap.end()) {
506 LOG(1, "Putting " << iter->second << " for " << iter->first << " into the sequence.");
507 SequenceOfActions.push_back(iter->second);
508 }
509 }
510 }
511 }
512}
513
514/** Makes the Parser parse the command line options with current known options.
515 * \param _argc arg count from main()
516 * \param **_argv argument array from main()
517 */
518void CommandLineParser::Run(int _argc, char **_argv)
519{
520 setOptions(_argc,_argv);
521 const bool status = Parse();
522 if (status)
523 scanforSequenceOfArguments();
524}
525
526/** Go through all Actions and create a map from short form to their token.
527 * \return map from Action's ShortForm to token.
528 */
529std::map <std::string, std::string> CommandLineParser::getShortFormToActionMap() const
530{
531 std::map <std::string, std::string> result;
532
533 ActionQueue &AQ = ActionQueue::getInstance();
534 ActionQueue::ActionTokens_t tokens = AQ.getListOfActions();
535 for (ActionQueue::ActionTokens_t::const_iterator iter = tokens.begin();
536 iter != tokens.end(); ++iter) {
537 const ActionTrait &CurrentTrait = AQ.getActionsTrait(*iter);
538 if (CurrentTrait.hasShortForm()) {
539 ASSERT(result.find(CurrentTrait.getShortForm()) == result.end(),
540 "Short form "+toString(CurrentTrait.getShortForm())+
541 " for action "+toString(*iter)+" already present from "+
542 std::string(result[CurrentTrait.getShortForm()])+"!");
543 result[CurrentTrait.getShortForm()] = *iter;
544 }
545 }
546
547 return result;
548}
549
550CONSTRUCT_SINGLETON(CommandLineParser)
Note: See TracBrowser for help on using the repository browser.