| // Copyright Vladimir Prus 2002-2004. |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE_1_0.txt |
| // or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| |
| #ifndef BOOST_CMDLINE_VP_2003_05_19 |
| #define BOOST_CMDLINE_VP_2003_05_19 |
| |
| #include <boost/program_options/config.hpp> |
| #include <boost/program_options/errors.hpp> |
| #include <boost/program_options/cmdline.hpp> |
| #include <boost/program_options/option.hpp> |
| #include <boost/program_options/options_description.hpp> |
| #include <boost/program_options/positional_options.hpp> |
| |
| |
| #include <boost/detail/workaround.hpp> |
| |
| #include <boost/function.hpp> |
| |
| #include <string> |
| #include <vector> |
| |
| #if defined(BOOST_MSVC) |
| # pragma warning (push) |
| # pragma warning (disable:4251) // class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'boost::program_options::positional_options_description' |
| #endif |
| |
| namespace boost { namespace program_options { namespace detail { |
| |
| /** Command line parser class. Main requirements were: |
| - Powerful enough to support all common uses. |
| - Simple and easy to learn/use. |
| - Minimal code size and external dependencies. |
| - Extensible for custom syntaxes. |
| |
| First all options are registered. After that, elements of command line |
| are extracted using operator++. |
| |
| For each element, user can find |
| - if it's an option or an argument |
| - name of the option |
| - index of the option |
| - option value(s), if any |
| |
| Sometimes the registered option name is not equal to the encountered |
| one, for example, because name abbreviation is supported. Therefore |
| two option names can be obtained: |
| - the registered one |
| - the one found at the command line |
| |
| There are lot of style options, which can be used to tune the command |
| line parsing. In addition, it's possible to install additional parser |
| which will process custom option styles. |
| |
| @todo mininal match length for guessing? |
| */ |
| class BOOST_PROGRAM_OPTIONS_DECL cmdline { |
| public: |
| |
| typedef ::boost::program_options::command_line_style::style_t style_t; |
| |
| typedef function1<std::pair<std::string, std::string>, |
| const std::string&> |
| additional_parser; |
| |
| typedef function1<std::vector<option>, std::vector<std::string>&> |
| style_parser; |
| |
| /** Constructs a command line parser for (argc, argv) pair. Uses |
| style options passed in 'style', which should be binary or'ed values |
| of style_t enum. It can also be zero, in which case a "default" |
| style will be used. If 'allow_unregistered' is true, then allows |
| unregistered options. They will be assigned index 1 and are |
| assumed to have optional parameter. |
| */ |
| cmdline(const std::vector<std::string>& args); |
| |
| /** @overload */ |
| cmdline(int argc, const char*const * argv); |
| |
| void style(int style); |
| void allow_unregistered(); |
| |
| void set_options_description(const options_description& desc); |
| void set_positional_options( |
| const positional_options_description& m_positional); |
| |
| std::vector<option> run(); |
| |
| std::vector<option> parse_long_option(std::vector<std::string>& args); |
| std::vector<option> parse_short_option(std::vector<std::string>& args); |
| std::vector<option> parse_dos_option(std::vector<std::string>& args); |
| std::vector<option> parse_disguised_long_option( |
| std::vector<std::string>& args); |
| std::vector<option> parse_terminator( |
| std::vector<std::string>& args); |
| std::vector<option> handle_additional_parser( |
| std::vector<std::string>& args); |
| |
| |
| /** Set additional parser. This will be called for each token |
| of command line. If first string in pair is not empty, |
| then the token is considered matched by this parser, |
| and the first string will be considered an option name |
| (which can be long or short), while the second will be |
| option's parameter (if not empty). |
| Note that additional parser can match only one token. |
| */ |
| void set_additional_parser(additional_parser p); |
| |
| void extra_style_parser(style_parser s); |
| |
| void check_style(int style) const; |
| |
| bool is_style_active(style_t style) const; |
| |
| void init(const std::vector<std::string>& args); |
| |
| void |
| finish_option(option& opt, |
| std::vector<std::string>& other_tokens, |
| const std::vector<style_parser>& style_parsers); |
| |
| // Copies of input. |
| std::vector<std::string> args; |
| style_t m_style; |
| bool m_allow_unregistered; |
| |
| const options_description* m_desc; |
| const positional_options_description* m_positional; |
| |
| additional_parser m_additional_parser; |
| style_parser m_style_parser; |
| }; |
| |
| void test_cmdline_detail(); |
| |
| }}} |
| |
| #if defined(BOOST_MSVC) |
| # pragma warning (pop) |
| #endif |
| |
| #endif |
| |