|  | /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
|  | file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */ | 
|  | #ifndef @KWSYS_NAMESPACE@_CommandLineArguments_hxx | 
|  | #define @KWSYS_NAMESPACE@_CommandLineArguments_hxx | 
|  |  | 
|  | #include <@KWSYS_NAMESPACE@/Configure.h> | 
|  | #include <@KWSYS_NAMESPACE@/Configure.hxx> | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | namespace @KWSYS_NAMESPACE@ { | 
|  |  | 
|  | class CommandLineArgumentsInternal; | 
|  | struct CommandLineArgumentsCallbackStructure; | 
|  |  | 
|  | /** \class CommandLineArguments | 
|  | * \brief Command line arguments processing code. | 
|  | * | 
|  | * Find specified arguments with optional options and execute specified methods | 
|  | * or set given variables. | 
|  | * | 
|  | * The two interfaces it knows are callback based and variable based. For | 
|  | * callback based, you have to register callback for particular argument using | 
|  | * AddCallback method. When that argument is passed, the callback will be | 
|  | * called with argument, value, and call data. For boolean (NO_ARGUMENT) | 
|  | * arguments, the value is "1". If the callback returns 0 the argument parsing | 
|  | * will stop with an error. | 
|  | * | 
|  | * For the variable interface you associate variable with each argument. When | 
|  | * the argument is specified, the variable is set to the specified value casted | 
|  | * to the appropriate type. For boolean (NO_ARGUMENT), the value is "1". | 
|  | * | 
|  | * Both interfaces can be used at the same time. | 
|  | * | 
|  | * Possible argument types are: | 
|  | *   NO_ARGUMENT     - The argument takes no value             : --A | 
|  | *   CONCAT_ARGUMENT - The argument takes value after no space : --Aval | 
|  | *   SPACE_ARGUMENT  - The argument takes value after space    : --A val | 
|  | *   EQUAL_ARGUMENT  - The argument takes value after equal    : --A=val | 
|  | *   MULTI_ARGUMENT  - The argument takes values after space   : --A val1 val2 | 
|  | * val3 ... | 
|  | * | 
|  | * Example use: | 
|  | * | 
|  | * kwsys::CommandLineArguments arg; | 
|  | * arg.Initialize(argc, argv); | 
|  | * typedef kwsys::CommandLineArguments argT; | 
|  | * arg.AddArgument("--something", argT::EQUAL_ARGUMENT, &some_variable, | 
|  | *                 "This is help string for --something"); | 
|  | * if ( !arg.Parse() ) | 
|  | *   { | 
|  | *   std::cerr << "Problem parsing arguments" << std::endl; | 
|  | *   res = 1; | 
|  | *   } | 
|  | * | 
|  | */ | 
|  |  | 
|  | class @KWSYS_NAMESPACE@_EXPORT CommandLineArguments | 
|  | { | 
|  | public: | 
|  | CommandLineArguments(); | 
|  | ~CommandLineArguments(); | 
|  |  | 
|  | CommandLineArguments(CommandLineArguments const&) = delete; | 
|  | CommandLineArguments& operator=(CommandLineArguments const&) = delete; | 
|  |  | 
|  | /** | 
|  | * Various argument types. | 
|  | */ | 
|  | enum ArgumentTypeEnum | 
|  | { | 
|  | NO_ARGUMENT, | 
|  | CONCAT_ARGUMENT, | 
|  | SPACE_ARGUMENT, | 
|  | EQUAL_ARGUMENT, | 
|  | MULTI_ARGUMENT | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Various variable types. When using the variable interface, this specifies | 
|  | * what type the variable is. | 
|  | */ | 
|  | enum VariableTypeEnum | 
|  | { | 
|  | NO_VARIABLE_TYPE = 0,   // The variable is not specified | 
|  | INT_TYPE,               // The variable is integer (int) | 
|  | BOOL_TYPE,              // The variable is boolean (bool) | 
|  | DOUBLE_TYPE,            // The variable is float (double) | 
|  | STRING_TYPE,            // The variable is string (char*) | 
|  | STL_STRING_TYPE,        // The variable is string (char*) | 
|  | VECTOR_INT_TYPE,        // The variable is integer (int) | 
|  | VECTOR_BOOL_TYPE,       // The variable is boolean (bool) | 
|  | VECTOR_DOUBLE_TYPE,     // The variable is float (double) | 
|  | VECTOR_STRING_TYPE,     // The variable is string (char*) | 
|  | VECTOR_STL_STRING_TYPE, // The variable is string (char*) | 
|  | LAST_VARIABLE_TYPE | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Prototypes for callbacks for callback interface. | 
|  | */ | 
|  | typedef int (*CallbackType)(char const* argument, char const* value, | 
|  | void* call_data); | 
|  | typedef int (*ErrorCallbackType)(char const* argument, void* client_data); | 
|  |  | 
|  | /** | 
|  | * Initialize internal data structures. This should be called before parsing. | 
|  | */ | 
|  | void Initialize(int argc, char const* const argv[]); | 
|  | void Initialize(int argc, char* argv[]); | 
|  |  | 
|  | /** | 
|  | * Initialize internal data structure and pass arguments one by one. This is | 
|  | * convenience method for use from scripting languages where argc and argv | 
|  | * are not available. | 
|  | */ | 
|  | void Initialize(); | 
|  | void ProcessArgument(char const* arg); | 
|  |  | 
|  | /** | 
|  | * This method will parse arguments and call appropriate methods. | 
|  | */ | 
|  | int Parse(); | 
|  |  | 
|  | /** | 
|  | * This method will add a callback for a specific argument. The arguments to | 
|  | * it are argument, argument type, callback method, and call data. The | 
|  | * argument help specifies the help string used with this option. The | 
|  | * callback and call_data can be skipped. | 
|  | */ | 
|  | void AddCallback(char const* argument, ArgumentTypeEnum type, | 
|  | CallbackType callback, void* call_data, char const* help); | 
|  |  | 
|  | /** | 
|  | * Add handler for argument which is going to set the variable to the | 
|  | * specified value. If the argument is specified, the option is casted to the | 
|  | * appropriate type. | 
|  | */ | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, bool* variable, | 
|  | char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, int* variable, | 
|  | char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | double* variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | char** variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::string* variable, char const* help); | 
|  |  | 
|  | /** | 
|  | * Add handler for argument which is going to set the variable to the | 
|  | * specified value. If the argument is specified, the option is casted to the | 
|  | * appropriate type. This will handle the multi argument values. | 
|  | */ | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::vector<bool>* variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::vector<int>* variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::vector<double>* variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::vector<char*>* variable, char const* help); | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | std::vector<std::string>* variable, char const* help); | 
|  |  | 
|  | /** | 
|  | * Add handler for boolean argument. The argument does not take any option | 
|  | * and if it is specified, the value of the variable is true/1, otherwise it | 
|  | * is false/0. | 
|  | */ | 
|  | void AddBooleanArgument(char const* argument, bool* variable, | 
|  | char const* help); | 
|  | void AddBooleanArgument(char const* argument, int* variable, | 
|  | char const* help); | 
|  | void AddBooleanArgument(char const* argument, double* variable, | 
|  | char const* help); | 
|  | void AddBooleanArgument(char const* argument, char** variable, | 
|  | char const* help); | 
|  | void AddBooleanArgument(char const* argument, std::string* variable, | 
|  | char const* help); | 
|  |  | 
|  | /** | 
|  | * Set the callbacks for error handling. | 
|  | */ | 
|  | void SetClientData(void* client_data); | 
|  | void SetUnknownArgumentCallback(ErrorCallbackType callback); | 
|  |  | 
|  | /** | 
|  | * Get remaining arguments. It allocates space for argv, so you have to call | 
|  | * delete[] on it. | 
|  | */ | 
|  | void GetRemainingArguments(int* argc, char*** argv); | 
|  | void DeleteRemainingArguments(int argc, char*** argv); | 
|  |  | 
|  | /** | 
|  | * If StoreUnusedArguments is set to true, then all unknown arguments will be | 
|  | * stored and the user can access the modified argc, argv without known | 
|  | * arguments. | 
|  | */ | 
|  | void StoreUnusedArguments(bool val) { this->StoreUnusedArgumentsFlag = val; } | 
|  | void GetUnusedArguments(int* argc, char*** argv); | 
|  |  | 
|  | /** | 
|  | * Return string containing help. If the argument is specified, only return | 
|  | * help for that argument. | 
|  | */ | 
|  | char const* GetHelp() { return this->Help.c_str(); } | 
|  | char const* GetHelp(char const* arg); | 
|  |  | 
|  | /** | 
|  | * Get / Set the help line length. This length is used when generating the | 
|  | * help page. Default length is 80. | 
|  | */ | 
|  | void SetLineLength(unsigned int); | 
|  | unsigned int GetLineLength(); | 
|  |  | 
|  | /** | 
|  | * Get the executable name (argv0). This is only available when using | 
|  | * Initialize with argc/argv. | 
|  | */ | 
|  | char const* GetArgv0(); | 
|  |  | 
|  | /** | 
|  | * Get index of the last argument parsed. This is the last argument that was | 
|  | * parsed ok in the original argc/argv list. | 
|  | */ | 
|  | unsigned int GetLastArgument(); | 
|  |  | 
|  | protected: | 
|  | void GenerateHelp(); | 
|  |  | 
|  | //! This is internal method that registers variable with argument | 
|  | void AddArgument(char const* argument, ArgumentTypeEnum type, | 
|  | VariableTypeEnum vtype, void* variable, char const* help); | 
|  |  | 
|  | bool GetMatchedArguments(std::vector<std::string>* matches, | 
|  | std::string const& arg); | 
|  |  | 
|  | //! Populate individual variables | 
|  | bool PopulateVariable(CommandLineArgumentsCallbackStructure* cs, | 
|  | char const* value); | 
|  |  | 
|  | //! Populate individual variables of type ... | 
|  | void PopulateVariable(bool* variable, std::string const& value); | 
|  | void PopulateVariable(int* variable, std::string const& value); | 
|  | void PopulateVariable(double* variable, std::string const& value); | 
|  | void PopulateVariable(char** variable, std::string const& value); | 
|  | void PopulateVariable(std::string* variable, std::string const& value); | 
|  | void PopulateVariable(std::vector<bool>* variable, std::string const& value); | 
|  | void PopulateVariable(std::vector<int>* variable, std::string const& value); | 
|  | void PopulateVariable(std::vector<double>* variable, | 
|  | std::string const& value); | 
|  | void PopulateVariable(std::vector<char*>* variable, | 
|  | std::string const& value); | 
|  | void PopulateVariable(std::vector<std::string>* variable, | 
|  | std::string const& value); | 
|  |  | 
|  | typedef CommandLineArgumentsInternal Internal; | 
|  | Internal* Internals; | 
|  | std::string Help; | 
|  |  | 
|  | unsigned int LineLength; | 
|  |  | 
|  | bool StoreUnusedArgumentsFlag; | 
|  | }; | 
|  |  | 
|  | } // namespace @KWSYS_NAMESPACE@ | 
|  |  | 
|  | #endif |