39 #ifndef __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 
   40 #define __OPENFLUID_UTILS_COMMANDLINEPARSER_HPP__ 
   48 namespace openfluid { 
namespace utils {
 
   55     std::string m_LongName;
 
   57     std::string m_ShortName;
 
   63     std::string m_HelpText;
 
   71       m_ValueRequired(false),m_Active(false)
 
   80                       const std::string& HelpText, 
bool ValueRequired = 
false):
 
   81       m_LongName(LongName),m_ShortName(ShortName), m_ValueRequired(ValueRequired), m_HelpText(HelpText),
 
   91     { 
return m_HelpText; }
 
   99     { 
return m_LongName; }
 
  107     { 
return m_ShortName; }
 
  131     { 
return m_ValueRequired; }
 
  142       if ((!m_ValueRequired) || (m_ValueRequired && !m_Value.empty()))
 
  172     std::string m_HelpText;
 
  174     std::map<std::string,CommandLineOption> m_Options;
 
  176     std::map<std::string,CommandLineOption*> m_ShortOptions;
 
  190       m_Name(Name), m_HelpText(HelpText)
 
  199     { 
return m_HelpText; }
 
  214     const std::map<std::string,CommandLineOption>& 
options()
 
  215     { 
return m_Options; }
 
  237       auto it = m_Options.find(LongName);
 
  239       if (it == m_Options.end())
 
  242       (*it).second.activate(Value);
 
  243       return (*it).second.isActive();
 
  253       auto it = m_ShortOptions.find(ShortName);
 
  255       if (it == m_ShortOptions.end())
 
  258       return (*it).second->getLongName();
 
  268       return (m_Options.find(LongName) != m_Options.end());
 
  278       auto it = m_Options.find(LongName);
 
  280       if (it == m_Options.end())
 
  283       return (*it).second.isValueRequired();
 
  294       auto it = m_Options.find(LongName);
 
  296       return (it != m_Options.end() && (*it).second.isActive());
 
  306       auto it = m_Options.find(LongName);
 
  308       if (it == m_Options.end())
 
  311       return ((*it).second.getValue());
 
  321       for (
auto& Opt : m_Options)
 
  336     std::string m_ProgramName;
 
  338     std::string m_HelpText;
 
  340     std::map<std::string,CommandLineCommand> m_Commands;
 
  342     std::string m_ActiveCommand;
 
  344     std::vector<std::string> m_ExtraArgs;
 
  346     std::string m_ParsingMessage;
 
  365       m_ProgramName(ProgramName), m_HelpText(HelpText), m_HelpAsked(false)
 
  376     { 
return m_ExtraArgs; }
 
  384     { 
return m_HelpText; }
 
  392     { 
return m_ProgramName; }
 
  400     { 
return m_ParsingMessage; }
 
  408     { 
return m_ActiveCommand; }
 
  417       return m_Commands.at(Name);
 
  427       m_Commands[Command.
getName()] = Command;
 
  436       m_Commands[
""].addOption(Option);
 
  444     bool parse(std::list<std::string> ArgValues)
 
  448       while (!ArgValues.empty())
 
  450         std::string Arg = ArgValues.front();
 
  451         ArgValues.pop_front();
 
  456           if (m_ActiveCommand.empty())
 
  457             m_ActiveCommand = Arg;
 
  459             m_ExtraArgs.push_back(Arg);
 
  466           auto it = m_Commands.find(m_ActiveCommand);
 
  467           if (it == m_Commands.end())
 
  469             m_ParsingMessage = 
"unknown \""+ m_ActiveCommand + 
"\" command";
 
  473           if (Arg == 
"-h" || Arg == 
"--help")
 
  475           else if (Arg.size() < 2)
 
  477             m_ParsingMessage = 
"wrong format for option \"" + Arg + 
"\"";
 
  482             std::string LongOptName;
 
  483             std::string OptValue;
 
  484             bool IsFromShort = 
false;
 
  490                 m_ParsingMessage = 
"wrong format for short option \"" + Arg + 
"\"";
 
  495               LongOptName = m_Commands[m_ActiveCommand].getOptionNameFromShortName(Arg.substr(1,1));
 
  501               std::string TmpName = Arg.substr(2,Arg.size()-2);
 
  503               std::string::size_type EqualPos = TmpName.find(
"=");
 
  505               if (EqualPos != std::string::npos)
 
  507                 LongOptName = TmpName.substr(0,EqualPos);
 
  508                 OptValue = TmpName.substr(EqualPos+1,TmpName.size()-EqualPos-1);
 
  511                 LongOptName = TmpName;
 
  514             if (!m_Commands[m_ActiveCommand].isOptionExists(LongOptName))
 
  517               m_ParsingMessage = 
"unknown option \"" + Arg + 
"\"";
 
  518               if (!m_ActiveCommand.empty())
 
  519                 m_ParsingMessage += 
" for command \"" + m_ActiveCommand + 
"\"";
 
  523             if (m_Commands[m_ActiveCommand].isOptionRequiresValue(LongOptName))
 
  525               if (IsFromShort && !ArgValues.empty())
 
  527                 OptValue = ArgValues.front();
 
  528                 ArgValues.pop_front();
 
  531               if (OptValue.empty())
 
  533                 m_ParsingMessage = 
"missing value for option \"" + Arg + 
"\"";
 
  538             if (!m_Commands[m_ActiveCommand].activateOption(LongOptName,OptValue))
 
  541               m_ParsingMessage = 
"unknown error for option \"" + Arg + 
"\"";
 
  557       std::list<std::string> ArgValues;
 
  559       for (
int i=1; i< ArgC; i++)
 
  560         ArgValues.push_back(std::string(ArgV[i]));
 
  562       return parse(ArgValues);
 
  572       m_ActiveCommand.clear();
 
  573       m_ParsingMessage.clear();
 
  576       for (
auto& Cmd : m_Commands)
 
  586     { 
return m_HelpAsked; }
 
  595       std::string m_CmdName = m_ActiveCommand;
 
  596       if (m_CmdName.empty())
 
  597         m_CmdName = 
"[<command>]";
 
  599       OutStm << 
"Usage : " << m_ProgramName << 
" " << m_CmdName << 
" [<options>] [<args>]\n";
 
  601       if (m_ActiveCommand.empty())
 
  603         OutStm << 
"\nAvailable commands:\n";
 
  605         for (
auto& Cmd : m_Commands)
 
  606           if (!Cmd.first.empty())
 
  607             OutStm << 
"  " << Cmd.first << 
" : " << Cmd.second.getHelpText() << 
"\n";
 
  610       if (!m_Commands[m_ActiveCommand].
getHelpText().empty())
 
  611         OutStm << 
"\n" << m_Commands[m_ActiveCommand].getHelpText() << 
"\n";
 
  613       OutStm << 
"\nAvailable options:\n";
 
  614       OutStm << 
"  --help,-h : display this help message\n";
 
  616       for (
auto& Opt : m_Commands[m_ActiveCommand].options())
 
  618         OutStm << 
"  --" << Opt.second.getLongName();
 
  619         if (Opt.second.isValueRequired())
 
  622         if (!Opt.second.getShortName().empty())
 
  624           OutStm << 
", -" << Opt.second.getShortName();
 
  625           if (Opt.second.isValueRequired())
 
  629         OutStm << 
" : " << Opt.second.getHelpText() << 
"\n";
 
  640       for (
auto& Cmd : m_Commands)
 
  642         if (!Cmd.first.empty())
 
  644           if (Cmd.first == m_ActiveCommand)
 
  648           OutStm << 
" " << Cmd.first << 
" : " << Cmd.second.getHelpText() << 
"\n";
 
  650           for (
auto& Opt : Cmd.second.options())
 
  654             if (Opt.second.isActive())
 
  658             OutStm << 
" " << Opt.first;
 
  660             if (!Opt.second.getShortName().empty())
 
  661               OutStm << 
"," << Opt.second.getShortName();
 
  663             if (Opt.second.isValueRequired())
 
  664               OutStm << 
"[" << Opt.second.getValue() << 
"]";
 
  666             OutStm << 
" : " << Opt.second.getHelpText() << 
"\n";
 
  672       if (!m_ExtraArgs.empty())
 
  674         OutStm << 
"Extra arguments :";
 
  675         for (
auto& Arg : m_ExtraArgs)
 
  676           OutStm << 
" " << Arg;
 
std::string getHelpText() const 
Definition: CommandLineParser.hpp:90
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:434
std::string getHelpText() const 
Definition: CommandLineParser.hpp:383
std::string getProgramName() const 
Definition: CommandLineParser.hpp:391
bool isHelpAsked()
Definition: CommandLineParser.hpp:585
const std::vector< std::string > & extraArgs() const 
Definition: CommandLineParser.hpp:375
void reset()
Definition: CommandLineParser.hpp:570
Definition: CommandLineParser.hpp:51
std::string getOptionNameFromShortName(const std::string &ShortName) const 
Definition: CommandLineParser.hpp:251
std::string getShortName() const 
Definition: CommandLineParser.hpp:106
bool isOptionRequiresValue(const std::string &LongName) const 
Definition: CommandLineParser.hpp:276
std::string getLongName() const 
Definition: CommandLineParser.hpp:98
bool isOptionExists(const std::string &LongName) const 
Definition: CommandLineParser.hpp:266
CommandLineCommand(const std::string &Name, const std::string &HelpText)
Definition: CommandLineParser.hpp:189
bool parse(int ArgC, char **ArgV)
Definition: CommandLineParser.hpp:555
std::string getValue() const 
Definition: CommandLineParser.hpp:114
CommandLineOption()
Definition: CommandLineParser.hpp:70
std::string getOptionValue(const std::string &LongName) const 
Definition: CommandLineParser.hpp:304
bool activateOption(const std::string &LongName, const std::string &Value="")
Definition: CommandLineParser.hpp:235
std::string getParsingMessage() const 
Definition: CommandLineParser.hpp:399
void printHelp(std::ostream &OutStm)
Definition: CommandLineParser.hpp:593
void printState(std::ostream &OutStm)
Definition: CommandLineParser.hpp:638
Definition: CommandLineParser.hpp:166
bool parse(std::list< std::string > ArgValues)
Definition: CommandLineParser.hpp:444
CommandLineParser(const std::string &ProgramName, const std::string &HelpText)
Definition: CommandLineParser.hpp:364
bool isOptionActive(const std::string &LongName) const 
Definition: CommandLineParser.hpp:292
std::string getName() const 
Definition: CommandLineParser.hpp:206
void addOption(const CommandLineOption &Option)
Definition: CommandLineParser.hpp:222
CommandLineParser()
Definition: CommandLineParser.hpp:353
bool isActive() const 
Definition: CommandLineParser.hpp:122
std::string getActiveCommand() const 
Definition: CommandLineParser.hpp:407
const CommandLineCommand & command(const std::string &Name) const 
Definition: CommandLineParser.hpp:415
std::string getHelpText() const 
Definition: CommandLineParser.hpp:198
CommandLineCommand()
Definition: CommandLineParser.hpp:181
CommandLineOption(const std::string &LongName, const std::string &ShortName, const std::string &HelpText, bool ValueRequired=false)
Definition: CommandLineParser.hpp:79
void addCommand(const CommandLineCommand &Command)
Definition: CommandLineParser.hpp:425
void reset()
Definition: CommandLineParser.hpp:319
bool isValueRequired() const 
Definition: CommandLineParser.hpp:130
const std::map< std::string, CommandLineOption > & options()
Definition: CommandLineParser.hpp:214
void reset()
Definition: CommandLineParser.hpp:153
Definition: CommandLineParser.hpp:332
void activate(const std::string &Value="")
Definition: CommandLineParser.hpp:138