diff --git a/src/core/util/CommandLine.cc b/src/core/util/CommandLine.cc index 3ae95202..711a7b7d 100644 --- a/src/core/util/CommandLine.cc +++ b/src/core/util/CommandLine.cc @@ -11,7 +11,7 @@ namespace fail { // Filter out all command line arguments that start with -Wf, for (int i = 0; i < argc; ++i) { if (strncmp(argv[i], "-Wf,", 4) == 0) { - this->argv.push_back(std::string(argv[i] + 4)); + this->argv.push_back(argv[i] + 4); // also copy argv[argc], which equals 0 for (int x = i + 1; x <= argc; ++x) { @@ -42,31 +42,27 @@ namespace fail { option::Descriptor desc = {0, 0, 0, 0, 0, 0}; this->options.push_back(desc); - // Build an argv array - std::vector tmp_argv; - int argc = this->argv.size(); - for (unsigned i = 0; i < this->argv.size(); ++i) - tmp_argv.push_back(this->argv[i].c_str()); - // Generate the options stats - option::Stats stats(this->options.data(), argc, tmp_argv.data()); + option::Stats stats(this->options.data(), argv.size(), argv.data()); if (parsed_options) delete[] parsed_options; if (parsed_buffer) delete[] parsed_buffer; + if (m_parser) + delete m_parser; parsed_options = new option::Option[stats.options_max]; parsed_buffer = new option::Option[stats.buffer_max]; - option::Parser parse(this->options.data(), argc, tmp_argv.data(), + m_parser = new option::Parser(this->options.data(), argv.size(), argv.data(), parsed_options, parsed_buffer); // Pop the terminating entry this->options.pop_back(); - return !parse.error(); + return !m_parser->error(); } diff --git a/src/core/util/CommandLine.hpp b/src/core/util/CommandLine.hpp index fa1f8c7f..de14526e 100644 --- a/src/core/util/CommandLine.hpp +++ b/src/core/util/CommandLine.hpp @@ -22,9 +22,10 @@ namespace fail { private: static CommandLine m_instance; - std::vector argv; + std::vector argv; std::vector options; option::Option *parsed_options, *parsed_buffer; + option::Parser *m_parser; public: /// Handle for accessing the parsed data of an option typedef int option_handle; @@ -45,7 +46,7 @@ namespace fail { /** * Add a argument manually */ - void add_args(char *value) { argv.push_back(value); } + void add_args(const char *value) { argv.push_back(value); } /** * Add a option to the command line interface of the fail-client @@ -89,6 +90,12 @@ namespace fail { int columns = getenv("COLUMNS")? atoi(getenv("COLUMNS")) : 80; option::printUsage(fwrite, stdout, options.data(), columns); } + /** + * Return the internal option::Parser object for further usage. + */ + option::Parser *parser() { + return m_parser; + } }; } // end of namespace