123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- // 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);
- /** returns the canonical option prefix associated with the command_line_style
- * In order of precedence:
- * allow_long : allow_long
- * allow_long_disguise : allow_long_disguise
- * allow_dash_for_short : allow_short | allow_dash_for_short
- * allow_slash_for_short: allow_short | allow_slash_for_short
- *
- * This is mainly used for the diagnostic messages in exceptions
- */
- int get_canonical_option_prefix();
- 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> m_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
|