source: NonGTP/Boost/boost/program_options/parsers.hpp @ 857

Revision 857, 8.6 KB checked in by igarcia, 18 years ago (diff)
Line 
1// Copyright Vladimir Prus 2002-2004.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt
4// or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6
7#ifndef BOOST_PARSERS_VP_2003_05_19
8#define BOOST_PARSERS_VP_2003_05_19
9
10#include <boost/program_options/config.hpp>
11#include <boost/program_options/option.hpp>
12#include <boost/program_options/detail/cmdline.hpp>
13
14#include <boost/function/function1.hpp>
15
16#include <iosfwd>
17#include <vector>
18#include <utility>
19
20namespace boost { namespace program_options {
21
22    class options_description;
23    class positional_options_description;
24
25
26    /** Results of parsing an input source.
27        The primary use of this class is passing information from parsers
28        component to value storage component. This class does not makes
29        much sense itself.       
30    */
31    template<class charT>
32    class basic_parsed_options {
33    public:
34        explicit basic_parsed_options(const options_description* description)
35        : description(description) {}
36        /** Options found in the source. */
37        std::vector< basic_option<charT> > options;
38        /** Options description that was used for parsing.
39            Parsers should return pointer to the instance of
40            option_description passed to them, and issues of lifetime are
41            up to the caller. Can be NULL.
42         */
43        const options_description* description;
44    };
45
46    /** Specialization of basic_parsed_options which:
47        - provides convenient conversion from basic_parsed_options<char>
48        - stores the passed char-based options for later use.
49    */
50    template<>
51    class BOOST_PROGRAM_OPTIONS_DECL basic_parsed_options<wchar_t> {
52    public:
53        /** Constructs wrapped options from options in UTF8 encoding. */
54        explicit basic_parsed_options(const basic_parsed_options<char>& po);
55
56        std::vector< basic_option<wchar_t> > options;
57        const options_description* description;
58
59        /** Stores UTF8 encoded options that were passed to constructor,
60            to avoid reverse conversion in some cases. */
61        basic_parsed_options<char> utf8_encoded_options;       
62    };
63
64    typedef basic_parsed_options<char> parsed_options;
65    typedef basic_parsed_options<wchar_t> wparsed_options;
66
67    /** Augments basic_parsed_options<wchar_t> with conversion from
68        'parsed_options' */
69
70
71    typedef function1<std::pair<std::string, std::string>, const std::string&> ext_parser;
72
73    /** Command line parser.
74
75        The class allows one to specify all the information needed for parsing
76        and to parse the command line. It is primarily needed to
77        emulate named function parameters -- a regular function with 5
78        parameters will be hard to use and creating overloads with a smaller
79        nuber of parameters will be confusing.
80
81        For the most common case, the function parse_command_line is a better
82        alternative.       
83
84        There are two typedefs -- command_line_parser and wcommand_line_parser,
85        for charT == char and charT == wchar_t cases.
86    */
87    template<class charT>
88    class basic_command_line_parser : private detail::cmdline {
89    public:
90        /** Creates a command line parser for the specified arguments
91            list. The 'args' parameter should not include program name.
92        */
93        basic_command_line_parser(const std::vector<
94                                  std::basic_string<charT> >& args);
95        /** Creates a command line parser for the specified arguments
96            list. The parameters should be the same as passed to 'main'.
97        */
98        basic_command_line_parser(int argc, charT* argv[]);
99
100        /** Sets options descriptions to use. */
101        basic_command_line_parser& options(const options_description& desc);
102        /** Sets positional options description to use. */
103        basic_command_line_parser& positional(
104            const positional_options_description& desc);
105
106        /** Sets the command line style. */
107        basic_command_line_parser& style(int);
108        /** Sets the extra parsers. */
109        basic_command_line_parser& extra_parser(ext_parser);
110
111        /** Parses the options and returns the result of parsing.
112            Throws on error.
113        */
114        basic_parsed_options<charT> run();
115
116        /** Specifies that unregistered options are allowed and should
117            be passed though. For each command like token that looks
118            like an option but does not contain a recognized name, an
119            instance of basic_option<charT> will be added to result,
120            with 'unrecognized' field set to 'true'. It's possible to
121            collect all unrecognized options with the 'collect_unrecognized'
122            funciton.
123        */
124        basic_command_line_parser& allow_unregistered();
125       
126        using detail::cmdline::style_parser;
127
128        basic_command_line_parser& extra_style_parser(style_parser s);
129
130    private:
131        const options_description* m_desc;
132    };
133
134    typedef basic_command_line_parser<char> command_line_parser;
135    typedef basic_command_line_parser<wchar_t> wcommand_line_parser;
136
137    /** Creates instance of 'command_line_parser', passes parameters to it,
138        and returns the result of calling the 'run' method.       
139     */
140    template<class charT>
141    basic_parsed_options<charT>
142    parse_command_line(int argc, charT* argv[],
143                       const options_description&,
144                       int style = 0,
145                       function1<std::pair<std::string, std::string>,
146                                 const std::string&> ext
147                       = ext_parser());
148
149    /** Parse a config file.
150    */
151    template<class charT>
152#if ! BOOST_WORKAROUND(__ICL, BOOST_TESTED_AT(700))
153    BOOST_PROGRAM_OPTIONS_DECL
154#endif
155    basic_parsed_options<charT>
156    parse_config_file(std::basic_istream<charT>&, const options_description&);
157
158    /** Controls if the 'collect_unregistered' function should
159        include positional options, or not. */
160    enum collect_unrecognized_mode
161    { include_positional, exclude_positional };
162
163    /** Collects the original tokens for all named options with
164        'unregistered' flag set. If 'mode' is 'include_positional'
165        also collects all positional options.
166        Returns the vector of origianl tokens for all collected
167        options.
168    */
169    template<class charT>
170    std::vector< std::basic_string<charT> >
171    collect_unrecognized(const std::vector< basic_option<charT> >& options,
172                         enum collect_unrecognized_mode mode);
173
174    /** Parse environment.
175
176        For each environment variable, the 'name_mapper' function is called to
177        obtain the option name. If it returns empty string, the variable is
178        ignored.
179
180        This is done since naming of environment variables is typically
181        different from the naming of command line options.       
182    */
183    BOOST_PROGRAM_OPTIONS_DECL parsed_options
184    parse_environment(const options_description&,
185                      const function1<std::string, std::string>& name_mapper);
186
187    /** Parse environment.
188
189        Takes all environment variables which start with 'prefix'. The option
190        name is obtained from variable name by removing the prefix and
191        converting the remaining string into lower case.
192    */
193    BOOST_PROGRAM_OPTIONS_DECL parsed_options
194    parse_environment(const options_description&, const std::string& prefix);
195
196    /** @overload
197        This function exists to resolve ambiguity between the two above
198        functions when second argument is of 'char*' type. There's implicit
199        conversion to both function1 and string.
200    */
201    BOOST_PROGRAM_OPTIONS_DECL parsed_options
202    parse_environment(const options_description&, const char* prefix);
203
204    #ifdef _WIN32
205    /** Parses the char* string which is passed to WinMain function on
206        windows. This function is provided for convenience, and because it's
207        not clear how to portably access split command line string from
208        runtime library and if it always exists.
209        This function is available only on Windows.
210    */
211    BOOST_PROGRAM_OPTIONS_DECL std::vector<std::string>
212    split_winmain(const std::string& cmdline);
213
214#ifndef BOOST_NO_STD_WSTRING
215    /** @overload */
216    BOOST_PROGRAM_OPTIONS_DECL std::vector<std::wstring>
217    split_winmain(const std::wstring& cmdline);
218    #endif
219#endif
220   
221
222}}
223
224#undef DECL
225
226#include "boost/program_options/detail/parsers.hpp"
227
228#endif
Note: See TracBrowser for help on using the repository browser.