Chris@16
|
1 // Copyright Vladimir Prus 2004.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt
|
Chris@16
|
4 // or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 #ifndef BOOST_PARSERS_HPP_VP_2004_05_06
|
Chris@16
|
7 #define BOOST_PARSERS_HPP_VP_2004_05_06
|
Chris@16
|
8
|
Chris@16
|
9 #include <boost/program_options/detail/convert.hpp>
|
Chris@16
|
10
|
Chris@16
|
11 #include <iterator>
|
Chris@16
|
12
|
Chris@16
|
13 namespace boost { namespace program_options {
|
Chris@16
|
14
|
Chris@16
|
15 namespace detail {
|
Chris@16
|
16 template<class charT, class Iterator>
|
Chris@16
|
17 std::vector<std::basic_string<charT> >
|
Chris@16
|
18 make_vector(Iterator i, Iterator e)
|
Chris@16
|
19 {
|
Chris@16
|
20 std::vector<std::basic_string<charT> > result;
|
Chris@16
|
21 // Some compilers don't have templated constructor for
|
Chris@16
|
22 // vector, so we can't create vector from (argv+1, argv+argc) range
|
Chris@16
|
23 for(; i != e; ++i)
|
Chris@16
|
24 result.push_back(*i);
|
Chris@16
|
25 return result;
|
Chris@16
|
26 }
|
Chris@16
|
27 }
|
Chris@16
|
28
|
Chris@16
|
29 template<class charT>
|
Chris@16
|
30 basic_command_line_parser<charT>::
|
Chris@16
|
31 basic_command_line_parser(const std::vector<
|
Chris@16
|
32 std::basic_string<charT> >& xargs)
|
Chris@16
|
33 : detail::cmdline(to_internal(xargs))
|
Chris@16
|
34 {}
|
Chris@16
|
35
|
Chris@16
|
36
|
Chris@16
|
37 template<class charT>
|
Chris@16
|
38 basic_command_line_parser<charT>::
|
Chris@16
|
39 basic_command_line_parser(int argc, const charT* const argv[])
|
Chris@16
|
40 : detail::cmdline(
|
Chris@16
|
41 // Explicit template arguments are required by gcc 3.3.1
|
Chris@16
|
42 // (at least mingw version), and do no harm on other compilers.
|
Chris@16
|
43 to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
|
Chris@16
|
44 {}
|
Chris@16
|
45
|
Chris@16
|
46
|
Chris@16
|
47 template<class charT>
|
Chris@16
|
48 basic_command_line_parser<charT>&
|
Chris@16
|
49 basic_command_line_parser<charT>::options(const options_description& desc)
|
Chris@16
|
50 {
|
Chris@16
|
51 detail::cmdline::set_options_description(desc);
|
Chris@16
|
52 m_desc = &desc;
|
Chris@16
|
53 return *this;
|
Chris@16
|
54 }
|
Chris@16
|
55
|
Chris@16
|
56 template<class charT>
|
Chris@16
|
57 basic_command_line_parser<charT>&
|
Chris@16
|
58 basic_command_line_parser<charT>::positional(
|
Chris@16
|
59 const positional_options_description& desc)
|
Chris@16
|
60 {
|
Chris@16
|
61 detail::cmdline::set_positional_options(desc);
|
Chris@16
|
62 return *this;
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 template<class charT>
|
Chris@16
|
66 basic_command_line_parser<charT>&
|
Chris@16
|
67 basic_command_line_parser<charT>::style(int xstyle)
|
Chris@16
|
68 {
|
Chris@16
|
69 detail::cmdline::style(xstyle);
|
Chris@16
|
70 return *this;
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 template<class charT>
|
Chris@16
|
74 basic_command_line_parser<charT>&
|
Chris@16
|
75 basic_command_line_parser<charT>::extra_parser(ext_parser ext)
|
Chris@16
|
76 {
|
Chris@16
|
77 detail::cmdline::set_additional_parser(ext);
|
Chris@16
|
78 return *this;
|
Chris@16
|
79 }
|
Chris@16
|
80
|
Chris@16
|
81 template<class charT>
|
Chris@16
|
82 basic_command_line_parser<charT>&
|
Chris@16
|
83 basic_command_line_parser<charT>::allow_unregistered()
|
Chris@16
|
84 {
|
Chris@16
|
85 detail::cmdline::allow_unregistered();
|
Chris@16
|
86 return *this;
|
Chris@16
|
87 }
|
Chris@16
|
88
|
Chris@16
|
89 template<class charT>
|
Chris@16
|
90 basic_command_line_parser<charT>&
|
Chris@16
|
91 basic_command_line_parser<charT>::extra_style_parser(style_parser s)
|
Chris@16
|
92 {
|
Chris@16
|
93 detail::cmdline::extra_style_parser(s);
|
Chris@16
|
94 return *this;
|
Chris@16
|
95 }
|
Chris@16
|
96
|
Chris@16
|
97
|
Chris@16
|
98
|
Chris@16
|
99 template<class charT>
|
Chris@16
|
100 basic_parsed_options<charT>
|
Chris@16
|
101 basic_command_line_parser<charT>::run()
|
Chris@16
|
102 {
|
Chris@16
|
103 // save the canonical prefixes which were used by this cmdline parser
|
Chris@16
|
104 // eventually inside the parsed results
|
Chris@16
|
105 // This will be handy to format recognisable options
|
Chris@16
|
106 // for diagnostic messages if everything blows up much later on
|
Chris@16
|
107 parsed_options result(m_desc, detail::cmdline::get_canonical_option_prefix());
|
Chris@16
|
108 result.options = detail::cmdline::run();
|
Chris@16
|
109
|
Chris@16
|
110 // Presense of parsed_options -> wparsed_options conversion
|
Chris@16
|
111 // does the trick.
|
Chris@16
|
112 return basic_parsed_options<charT>(result);
|
Chris@16
|
113 }
|
Chris@16
|
114
|
Chris@16
|
115
|
Chris@16
|
116 template<class charT>
|
Chris@16
|
117 basic_parsed_options<charT>
|
Chris@16
|
118 parse_command_line(int argc, const charT* const argv[],
|
Chris@16
|
119 const options_description& desc,
|
Chris@16
|
120 int style,
|
Chris@16
|
121 function1<std::pair<std::string, std::string>,
|
Chris@16
|
122 const std::string&> ext)
|
Chris@16
|
123 {
|
Chris@16
|
124 return basic_command_line_parser<charT>(argc, argv).options(desc).
|
Chris@16
|
125 style(style).extra_parser(ext).run();
|
Chris@16
|
126 }
|
Chris@16
|
127
|
Chris@16
|
128 template<class charT>
|
Chris@16
|
129 std::vector< std::basic_string<charT> >
|
Chris@16
|
130 collect_unrecognized(const std::vector< basic_option<charT> >& options,
|
Chris@16
|
131 enum collect_unrecognized_mode mode)
|
Chris@16
|
132 {
|
Chris@16
|
133 std::vector< std::basic_string<charT> > result;
|
Chris@16
|
134 for(unsigned i = 0; i < options.size(); ++i)
|
Chris@16
|
135 {
|
Chris@16
|
136 if (options[i].unregistered ||
|
Chris@16
|
137 (mode == include_positional && options[i].position_key != -1))
|
Chris@16
|
138 {
|
Chris@16
|
139 copy(options[i].original_tokens.begin(),
|
Chris@16
|
140 options[i].original_tokens.end(),
|
Chris@16
|
141 back_inserter(result));
|
Chris@16
|
142 }
|
Chris@16
|
143 }
|
Chris@16
|
144 return result;
|
Chris@16
|
145 }
|
Chris@16
|
146
|
Chris@16
|
147
|
Chris@16
|
148 }}
|
Chris@16
|
149
|
Chris@16
|
150 #endif
|