You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
147 lines
5.1 KiB
147 lines
5.1 KiB
// 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 |
|
|
|
|