Chris@16: // Copyright Vladimir Prus 2004. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt Chris@16: // or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PARSERS_HPP_VP_2004_05_06 Chris@16: #define BOOST_PARSERS_HPP_VP_2004_05_06 Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace program_options { Chris@16: Chris@16: namespace detail { Chris@16: template Chris@16: std::vector > Chris@16: make_vector(Iterator i, Iterator e) Chris@16: { Chris@16: std::vector > result; Chris@16: // Some compilers don't have templated constructor for Chris@16: // vector, so we can't create vector from (argv+1, argv+argc) range Chris@16: for(; i != e; ++i) Chris@16: result.push_back(*i); Chris@16: return result; Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser:: Chris@16: basic_command_line_parser(const std::vector< Chris@16: std::basic_string >& xargs) Chris@16: : detail::cmdline(to_internal(xargs)) Chris@16: {} Chris@16: Chris@16: Chris@16: template Chris@16: basic_command_line_parser:: Chris@16: basic_command_line_parser(int argc, const charT* const argv[]) Chris@16: : detail::cmdline( Chris@16: // Explicit template arguments are required by gcc 3.3.1 Chris@16: // (at least mingw version), and do no harm on other compilers. Chris@16: to_internal(detail::make_vector(argv+1, argv+argc+!argc))) Chris@16: {} Chris@16: Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::options(const options_description& desc) Chris@16: { Chris@16: detail::cmdline::set_options_description(desc); Chris@16: m_desc = &desc; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::positional( Chris@16: const positional_options_description& desc) Chris@16: { Chris@16: detail::cmdline::set_positional_options(desc); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::style(int xstyle) Chris@16: { Chris@16: detail::cmdline::style(xstyle); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::extra_parser(ext_parser ext) Chris@16: { Chris@16: detail::cmdline::set_additional_parser(ext); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::allow_unregistered() Chris@16: { Chris@16: detail::cmdline::allow_unregistered(); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_command_line_parser& Chris@16: basic_command_line_parser::extra_style_parser(style_parser s) Chris@16: { Chris@16: detail::cmdline::extra_style_parser(s); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: basic_parsed_options Chris@16: basic_command_line_parser::run() Chris@16: { Chris@16: // save the canonical prefixes which were used by this cmdline parser Chris@16: // eventually inside the parsed results Chris@16: // This will be handy to format recognisable options Chris@16: // for diagnostic messages if everything blows up much later on Chris@16: parsed_options result(m_desc, detail::cmdline::get_canonical_option_prefix()); Chris@16: result.options = detail::cmdline::run(); Chris@16: Chris@16: // Presense of parsed_options -> wparsed_options conversion Chris@16: // does the trick. Chris@16: return basic_parsed_options(result); Chris@16: } Chris@16: Chris@16: Chris@16: template Chris@16: basic_parsed_options Chris@16: parse_command_line(int argc, const charT* const argv[], Chris@16: const options_description& desc, Chris@16: int style, Chris@16: function1, Chris@16: const std::string&> ext) Chris@16: { Chris@16: return basic_command_line_parser(argc, argv).options(desc). Chris@16: style(style).extra_parser(ext).run(); Chris@16: } Chris@16: Chris@16: template Chris@16: std::vector< std::basic_string > Chris@16: collect_unrecognized(const std::vector< basic_option >& options, Chris@16: enum collect_unrecognized_mode mode) Chris@16: { Chris@16: std::vector< std::basic_string > result; Chris@16: for(unsigned i = 0; i < options.size(); ++i) Chris@16: { Chris@16: if (options[i].unregistered || Chris@16: (mode == include_positional && options[i].position_key != -1)) Chris@16: { Chris@16: copy(options[i].original_tokens.begin(), Chris@16: options[i].original_tokens.end(), Chris@16: back_inserter(result)); Chris@16: } Chris@16: } Chris@16: return result; Chris@16: } Chris@16: Chris@16: Chris@16: }} Chris@16: Chris@16: #endif