Compare commits

..

27 Commits

Author SHA1 Message Date
Daniel James
066e1fe0fd Quickbook: Copy trunk headers into quickbook-dev.
[SVN r75212]
2011-11-01 13:03:44 +00:00
Vladimir Prus
76a62c1809 Fix warning push/pop mismatch.
Fixes #5869.


[SVN r75064]
2011-10-19 16:20:56 +00:00
Jürgen Hunold
540e300c38 Enable visibility support. Refs #2114.
[SVN r73299]
2011-07-22 12:08:03 +00:00
Daniel James
36c917be44 Quickbook: New branch for development.
From now on this will be my development branch.


[SVN r70613]
2011-03-27 10:17:05 +00:00
Vladimir Prus
9d7afca35c Return 0, not 1, when --help is passed.
Fixes #5329.


[SVN r70079]
2011-03-17 21:25:16 +00:00
Vladimir Prus
7051655c76 Clarify docs for 'zero_token'.
Fixes #1132.


[SVN r67774]
2011-01-08 11:45:50 +00:00
Vladimir Prus
825562ed1e Add more testscases. Addresses #4469.
[SVN r67773]
2011-01-08 10:49:06 +00:00
Vladimir Prus
38e7ea8516 Implement variables_map::clear to clear extra members.
Fixes #4927


[SVN r67772]
2011-01-08 10:39:21 +00:00
Vladimir Prus
5b7fbb5fe7 Fix compile error in utf8_codecvt_facet on HPUX.
Closes #5049.


[SVN r67770]
2011-01-08 10:12:43 +00:00
Vladimir Prus
28cafd9bd9 Make program_options compile on iOS.
Patch from Alejandro Isaza.
Fixes #5053.


[SVN r67768]
2011-01-08 09:57:31 +00:00
Marshall Clow
84415c1e7b fix typo
[SVN r67036]
2010-12-05 20:39:19 +00:00
Marshall Clow
c537274c44 Doc fix; refs #4858
[SVN r67030]
2010-12-05 20:16:57 +00:00
Marshall Clow
4b17731e11 update docs; refs #3992
[SVN r67028]
2010-12-05 20:08:40 +00:00
Marshall Clow
56d2c97ece patch tests for Sun; refs #3909
[SVN r67006]
2010-12-04 17:39:24 +00:00
Marshall Clow
e3f331a23b Take argv as const; refs #3909
[SVN r66959]
2010-12-01 18:54:41 +00:00
Vladimir Prus
b000bf9a1d Fix formatting of short-only options.
Fixes #4644.


[SVN r65645]
2010-09-28 09:04:44 +00:00
Jürgen Hunold
7d7dad09d3 Suppress msvc warning 4251 about templates as base classes not having a dll-interface.
Suppress msvc warning 4275 about base class std::logic_error not having a dll-interface.


[SVN r65318]
2010-09-06 08:43:06 +00:00
Vladimir Prus
f0fdc822d4 Update the code size measurement tool
[SVN r63916]
2010-07-12 07:53:24 +00:00
Daniel James
277065182e Update various libraries' documentation build.
Mostly to use the images and css files under doc/src instead of
doc/html, usually be deleting the settings in order to use the defaults.
Also add 'boost.root' to some builds in order to fix links which rely on
it.

[SVN r63146]
2010-06-20 18:00:48 +00:00
Vladimir Prus
572a93ac5b Fix -Wshadow warnings. Closes #4015.
Patch from Tatu Kilappa.


[SVN r62236]
2010-05-26 10:40:34 +00:00
Vladimir Prus
e79708eee7 Fix types. Closes #4069.
[SVN r62235]
2010-05-26 09:51:10 +00:00
Vladimir Prus
444146bd25 Correct typos. Closes #4138.
[SVN r62234]
2010-05-26 09:47:35 +00:00
Jeremiah Willcock
0a2145c008 Fixed tab and no-newline-at-end-of-file issues from inspection report
[SVN r61435]
2010-04-20 17:54:16 +00:00
Daniel James
9691bb1b62 Report error count at the actual end, rather than just the end of each file.
[SVN r60982]
2010-03-31 21:41:45 +00:00
Vladimir Prus
b9e8acef7b Add missing 'userinput'. Add spaces after shell prompt
[SVN r59944]
2010-02-26 07:40:11 +00:00
Vladimir Prus
53ba9ab34f Robustify disambiguation of full/approximate matches.
Fixes #3942.


[SVN r59744]
2010-02-18 09:43:07 +00:00
Sascha Ochsenknecht
af37add8c6 fix in winmain, Fixes #3879
[SVN r59437]
2010-02-03 08:26:35 +00:00
28 changed files with 170 additions and 64 deletions

View File

@@ -12,6 +12,8 @@ SOURCES =
lib boost_program_options
: $(SOURCES).cpp
: <link>shared:<define>BOOST_PROGRAM_OPTIONS_DYN_LINK=1 # tell source we're building dll's
# See https://svn.boost.org/trac/boost/ticket/5049
<target-os>hpux,<toolset>gcc:<define>_INCLUDE_STDC__SOURCE_199901
:
: <link>shared:<define>BOOST_PROGRAM_OPTIONS_DYN_LINK=1
;

View File

@@ -5,6 +5,7 @@ toolset.using doxygen ;
boostbook program_option
: program_options.xml
: <implicit-dependency>autodoc
<xsl:param>boost.root=../../../..
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
;

View File

@@ -107,7 +107,7 @@ if (vm.count("response-file")) {
// Load the file and tokenize it
ifstream ifs(vm["response-file"].as<string>().c_str());
if (!ifs) {
cout << "Could no open the response file\n";
cout << "Could not open the response file\n";
return 1;
}
// Read the whole file into a string
@@ -115,7 +115,8 @@ if (vm.count("response-file")) {
ss << ifs.rdbuf();
// Split the file content
char_separator<char> sep(" \n\r");
tokenizer<char_separator<char> > tok(ss.str(), sep);
std::string ResponsefileContents( ss.str() );
tokenizer<char_separator<char> > tok(ResponsefileContents, sep);
vector<string> args;
copy(tok.begin(), tok.end(), back_inserter(args));
// Parse the file and store the options
@@ -146,7 +147,7 @@ if (vm.count("response-file")) {
vector&lt;string&gt; args = split_winmain(lpCmdLine);
store(command_line_parser(args).options(desc).run(), vm);
</programlisting>
The function is an overload for <code>wchar_t</code> strings, so can
The <code>split_winmain</code> function is overloaded for <code>wchar_t</code> strings, so can
also be used in Unicode applications.
</para>
@@ -295,7 +296,7 @@ void validate(boost::any& v,
if (regex_match(s, match, r)) {
v = any(magic_number(lexical_cast<int>(match[1])));
} else {
throw validation_error("invalid value");
throw validation_error(validation_error::invalid_option_value);
}
}
]]>

View File

@@ -181,7 +181,7 @@ options_description desc;
desc.add_options()
("help", "produce help message")
("compression", value&lt;string&gt;(), "compression level")
("verbose", value&lt;string&gt;()->zero_tokens(), "verbosity level")
("verbose", value&lt;string&gt;()->implicit_value("0"), "verbosity level")
("email", value&lt;string&gt;()->multitoken(), "email to send to")
;
</programlisting>

View File

@@ -77,13 +77,13 @@ if (vm.count(&quot;compression&quot;)) {
<para>It's now a good time to try compiling the code yourself, but if
you're not yet ready, here's an example session:
<screen>
$<userinput>bin/gcc/debug/first</userinput>
$ <userinput>bin/gcc/debug/first</userinput>
Compression level was not set.
$<userinput>bin/gcc/debug/first --help</userinput>
$ <userinput>bin/gcc/debug/first --help</userinput>
Allowed options:
--help : produce help message
--compression arg : set compression level
$<userinput>bin/gcc/debug/first --compression 10</userinput>
$ <userinput>bin/gcc/debug/first --compression 10</userinput>
Compression level was set to 10.
</screen>
</para>
@@ -199,16 +199,16 @@ cout &lt;&lt; &quot;Optimization level is &quot; &lt;&lt; opt &lt;&lt; &quot;\n&
<para>Here's an example session:
<screen>
$<userinput>bin/gcc/debug/options_description --help</userinput>
$ <userinput>bin/gcc/debug/options_description --help</userinput>
Usage: options_description [options]
Allowed options:
--help : produce help message
--optimization arg : optimization level
-I [ --include-path ] arg : include path
--input-file arg : input file
$bin/gcc/debug/options_description
$ <userinput>bin/gcc/debug/options_description</userinput>
Optimization level is 10
$<userinput>bin/gcc/debug/options_description --optimization 4 -I foo a.cpp</userinput>
$ <userinput>bin/gcc/debug/options_description --optimization 4 -I foo a.cpp</userinput>
Include paths are: foo
Input files are: a.cpp
Optimization level is 4
@@ -308,10 +308,10 @@ visible.add(generic).add(config);
<para>Here's an example session:
<screen>
$<userinput>bin/gcc/debug/multiple_sources</userinput>
$ <userinput>bin/gcc/debug/multiple_sources</userinput>
Include paths are: /opt
Optimization level is 1
$<userinput>bin/gcc/debug/multiple_sources --help</userinput>
$ <userinput>bin/gcc/debug/multiple_sources --help</userinput>
Allows options:
Generic options:
@@ -322,7 +322,7 @@ Configuration:
--optimization n : optimization level
-I [ --include-path ] path : include path
$<userinput>bin/gcc/debug/multiple_sources --optimization=4 -I foo a.cpp b.cpp</userinput>
$ <userinput>bin/gcc/debug/multiple_sources --optimization=4 -I foo a.cpp b.cpp</userinput>
Include paths are: foo /opt
Input files are: a.cpp b.cpp
Optimization level is 4

View File

@@ -2,6 +2,7 @@
project
: requirements <library>../build//boost_program_options
<hardcode-dll-paths>true
<link>static
;
exe first : first.cpp ;

View File

@@ -29,7 +29,7 @@ int main(int ac, char* av[])
if (vm.count("help")) {
cout << desc << "\n";
return 1;
return 0;
}
if (vm.count("compression")) {

View File

@@ -79,7 +79,7 @@ int main(int ac, char* av[])
ifstream ifs(config_file.c_str());
if (!ifs)
{
cout << "can not open config file: " << config_file << "\n";
cout << "can not open config file: " << config_file << "\n";
return 0;
}
else

View File

@@ -34,17 +34,14 @@
#endif // BOOST_VERSION
///////////////////////////////////////////////////////////////////////////////
// Windows DLL suport
#ifdef BOOST_HAS_DECLSPEC
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_PROGRAM_OPTIONS_DYN_LINK)
// export if this is our own source, otherwise import:
#ifdef BOOST_PROGRAM_OPTIONS_SOURCE
# define BOOST_PROGRAM_OPTIONS_DECL __declspec(dllexport)
# define BOOST_PROGRAM_OPTIONS_DECL BOOST_SYMBOL_EXPORT
#else
# define BOOST_PROGRAM_OPTIONS_DECL __declspec(dllimport)
# define BOOST_PROGRAM_OPTIONS_DECL BOOST_SYMBOL_IMPORT
#endif // BOOST_PROGRAM_OPTIONS_SOURCE
#endif // DYN_LINK
#endif // BOOST_HAS_DECLSPEC
#ifndef BOOST_PROGRAM_OPTIONS_DECL
#define BOOST_PROGRAM_OPTIONS_DECL

View File

@@ -22,6 +22,11 @@
#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:
@@ -134,5 +139,9 @@ namespace boost { namespace program_options { namespace detail {
}}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#endif

View File

@@ -29,18 +29,18 @@ namespace boost { namespace program_options {
template<class charT>
basic_command_line_parser<charT>::
basic_command_line_parser(const std::vector<
std::basic_string<charT> >& args)
: detail::cmdline(to_internal(args))
std::basic_string<charT> >& xargs)
: detail::cmdline(to_internal(xargs))
{}
template<class charT>
basic_command_line_parser<charT>::
basic_command_line_parser(int argc, charT* argv[])
basic_command_line_parser(int argc, const charT* const argv[])
: detail::cmdline(
// Explicit template arguments are required by gcc 3.3.1
// (at least mingw version), and do no harm on other compilers.
to_internal(detail::make_vector<charT, charT**>(argv+1, argv+argc+!argc)))
to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
{}
@@ -64,9 +64,9 @@ namespace boost { namespace program_options {
template<class charT>
basic_command_line_parser<charT>&
basic_command_line_parser<charT>::style(int style)
basic_command_line_parser<charT>::style(int xstyle)
{
detail::cmdline::style(style);
detail::cmdline::style(xstyle);
return *this;
}
@@ -111,7 +111,7 @@ namespace boost { namespace program_options {
template<class charT>
basic_parsed_options<charT>
parse_command_line(int argc, charT* argv[],
parse_command_line(int argc, const charT* const argv[],
const options_description& desc,
int style,
function1<std::pair<std::string, std::string>,

View File

@@ -143,9 +143,9 @@ namespace boost { namespace program_options {
a validator for class T, we use it even
when parsing vector<T>. */
boost::any a;
std::vector<std::basic_string<charT> > v;
v.push_back(s[i]);
validate(a, v, (T*)0, 0);
std::vector<std::basic_string<charT> > cv;
cv.push_back(s[i]);
validate(a, cv, (T*)0, 0);
tv->push_back(boost::any_cast<T>(a));
}
catch(const bad_lexical_cast& /*e*/) {

View File

@@ -13,14 +13,18 @@
#include <stdexcept>
#include <vector>
#if defined(BOOST_MSVC)
# pragma warning (push)
# pragma warning (disable:4275) // non dll-interface class 'std::logic_error' used as base for dll-interface class 'boost::program_options::error'
# pragma warning (disable:4251) // class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'boost::program_options::ambiguous_option'
#endif
namespace boost { namespace program_options {
/** Base class for all errors in the library. */
class BOOST_PROGRAM_OPTIONS_DECL error : public std::logic_error {
public:
error(const std::string& what) : std::logic_error(what) {}
error(const std::string& xwhat) : std::logic_error(xwhat) {}
};
class BOOST_PROGRAM_OPTIONS_DECL invalid_syntax : public error {
@@ -78,9 +82,9 @@ namespace boost { namespace program_options {
class BOOST_PROGRAM_OPTIONS_DECL ambiguous_option : public error {
public:
ambiguous_option(const std::string& name,
const std::vector<std::string>& alternatives)
const std::vector<std::string>& xalternatives)
: error(std::string("ambiguous option ").append(name))
, m_alternatives(alternatives)
, m_alternatives(xalternatives)
, m_option_name(name)
{}
@@ -232,5 +236,8 @@ namespace boost { namespace program_options {
};
}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#endif

View File

@@ -28,10 +28,10 @@ namespace boost { namespace program_options {
, unregistered(false)
, case_insensitive(false)
{}
basic_option(const std::string& string_key,
const std::vector< std::string> &value)
: string_key(string_key)
, value(value)
basic_option(const std::string& xstring_key,
const std::vector< std::string> &xvalue)
: string_key(xstring_key)
, value(xvalue)
, unregistered(false)
, case_insensitive(false)
{}

View File

@@ -25,6 +25,12 @@
#include <iosfwd>
#if defined(BOOST_MSVC)
# pragma warning (push)
# pragma warning (disable:4251) // class 'boost::shared_ptr<T>' needs to have dll-interface to be used by clients of class 'boost::program_options::option_description'
#endif
/** Boost namespace */
namespace boost {
/** Namespace for the library. */
@@ -65,7 +71,7 @@ namespace program_options {
The 'name' parameter is interpreted by the following rules:
- if there's no "," character in 'name', it specifies long name
- otherwise, the part before "," specifies long name and the part
after -- long name.
after -- short name.
*/
option_description(const char* name,
const value_semantic* s);
@@ -81,12 +87,12 @@ namespace program_options {
enum match_result { no_match, full_match, approximate_match };
/** Given 'option', specified in the input source,
return 'true' is 'option' specifies *this.
returns 'true' if 'option' specifies *this.
*/
match_result match(const std::string& option, bool approx,
bool long_ignore_case, bool short_ignore_case) const;
/** Return the key that should identify the option, in
/** Returns the key that should identify the option, in
particular in the variables_map class.
The 'option' parameter is the option spelling from the
input source.
@@ -107,7 +113,7 @@ namespace program_options {
/// Returns the option name, formatted suitably for usage message.
std::string format_name() const;
/** Return the parameter name and properties, formatted suitably for
/** Returns the parameter name and properties, formatted suitably for
usage message. */
std::string format_parameter() const;
@@ -211,7 +217,7 @@ namespace program_options {
friend BOOST_PROGRAM_OPTIONS_DECL std::ostream& operator<<(std::ostream& os,
const options_description& desc);
/** Output 'desc' to the specified stream, calling 'f' to output each
/** Outputs 'desc' to the specified stream, calling 'f' to output each
option_description element. */
void print(std::ostream& os) const;
@@ -247,8 +253,12 @@ namespace program_options {
/** Class thrown when duplicate option description is found. */
class BOOST_PROGRAM_OPTIONS_DECL duplicate_option_error : public error {
public:
duplicate_option_error(const std::string& what) : error(what) {}
duplicate_option_error(const std::string& xwhat) : error(xwhat) {}
};
}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#endif

View File

@@ -17,6 +17,11 @@
#include <vector>
#include <utility>
#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::basic_parsed_options<wchar_t>'
#endif
namespace boost { namespace program_options {
class options_description;
@@ -31,8 +36,8 @@ namespace boost { namespace program_options {
template<class charT>
class basic_parsed_options {
public:
explicit basic_parsed_options(const options_description* description)
: description(description) {}
explicit basic_parsed_options(const options_description* xdescription)
: description(xdescription) {}
/** Options found in the source. */
std::vector< basic_option<charT> > options;
/** Options description that was used for parsing.
@@ -95,7 +100,7 @@ namespace boost { namespace program_options {
/** Creates a command line parser for the specified arguments
list. The parameters should be the same as passed to 'main'.
*/
basic_command_line_parser(int argc, charT* argv[]);
basic_command_line_parser(int argc, const charT* const argv[]);
/** Sets options descriptions to use. */
basic_command_line_parser& options(const options_description& desc);
@@ -139,7 +144,7 @@ namespace boost { namespace program_options {
*/
template<class charT>
basic_parsed_options<charT>
parse_command_line(int argc, charT* argv[],
parse_command_line(int argc, const charT* const argv[],
const options_description&,
int style = 0,
function1<std::pair<std::string, std::string>,
@@ -255,6 +260,10 @@ namespace boost { namespace program_options {
}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#undef DECL
#include "boost/program_options/detail/parsers.hpp"

View File

@@ -11,6 +11,11 @@
#include <vector>
#include <string>
#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 {
/** Describes positional options.
@@ -61,5 +66,9 @@ namespace boost { namespace program_options {
}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#endif

View File

@@ -261,13 +261,21 @@ namespace boost { namespace program_options {
return this;
}
/** Specifies that the value can span multiple tokens. */
/** Specifies that the value can span multiple tokens.
*/
typed_value* multitoken()
{
m_multitoken = true;
return this;
}
/** Specifies that no tokens may be provided as the value of
this option, which means that only presense of the option
is significant. For such option to be useful, either the
'validate' function should be specialized, or the
'implicit_value' method should be also used. In most
cases, you can use the 'bool_switch' function instead of
using this method. */
typed_value* zero_tokens()
{
m_zero_tokens = true;

View File

@@ -16,6 +16,11 @@
#include <map>
#include <set>
#if defined(BOOST_MSVC)
# pragma warning (push)
# pragma warning (disable:4251) // 'boost::program_options::variable_value::v' : class 'boost::any' needs to have dll-interface to be used by clients of class 'boost::program_options::variable_value
#endif
namespace boost { namespace program_options {
template<class charT>
@@ -53,8 +58,8 @@ namespace boost { namespace program_options {
class BOOST_PROGRAM_OPTIONS_DECL variable_value {
public:
variable_value() : m_defaulted(false) {}
variable_value(const boost::any& v, bool defaulted)
: v(v), m_defaulted(defaulted)
variable_value(const boost::any& xv, bool xdefaulted)
: v(xv), m_defaulted(xdefaulted)
{}
/** If stored value if of type T, returns that value. Otherwise,
@@ -148,6 +153,9 @@ namespace boost { namespace program_options {
// Resolve conflict between inherited operators.
const variable_value& operator[](const std::string& name) const
{ return abstract_variables_map::operator[](name); }
// Override to clear some extra fields.
void clear();
void notify();
@@ -203,4 +211,8 @@ namespace boost { namespace program_options {
}}
#if defined(BOOST_MSVC)
# pragma warning (pop)
#endif
#endif

View File

@@ -277,7 +277,7 @@ namespace boost { namespace program_options { namespace detail {
}
/* If an key option is followed by a positional option,
can can consume more tokens (e.g. it's multitoke option),
can can consume more tokens (e.g. it's multitoken option),
give those tokens to it. */
vector<option> result2;
for (unsigned i = 0; i < result.size(); ++i)

View File

@@ -174,10 +174,13 @@ namespace boost { namespace program_options {
option_description::format_name() const
{
if (!m_short_name.empty())
return string(m_short_name).append(" [ --").
append(m_long_name).append(" ]");
else
return string("--").append(m_long_name);
{
return m_long_name.empty()
? m_short_name
: string(m_short_name).append(" [ --").
append(m_long_name).append(" ]");
}
return string("--").append(m_long_name);
}
std::string
@@ -306,6 +309,7 @@ namespace boost { namespace program_options {
bool short_ignore_case) const
{
shared_ptr<option_description> found;
bool had_full_match = false;
vector<string> approximate_matches;
vector<string> full_matches;
@@ -323,15 +327,17 @@ namespace boost { namespace program_options {
if (r == option_description::full_match)
{
full_matches.push_back(m_options[i]->key(name));
found = m_options[i];
had_full_match = true;
}
else
{
// FIXME: the use of 'key' here might not
// be the best approach.
approximate_matches.push_back(m_options[i]->key(name));
if (!had_full_match)
found = m_options[i];
}
found = m_options[i];
}
if (full_matches.size() > 1)
boost::throw_exception(

View File

@@ -45,7 +45,10 @@
// See: http://article.gmane.org/gmane.comp.lib.boost.devel/103843
// See: http://lists.gnu.org/archive/html/bug-guile/2004-01/msg00013.html
#if defined(__APPLE__) && defined(__DYNAMIC__)
#include <crt_externs.h>
// The proper include for this is crt_externs.h, however it's not
// available on iOS. The right replacement is not known. See
// https://svn.boost.org/trac/boost/ticket/5053
extern "C" { extern char ***_NSGetEnviron(void); }
#define environ (*_NSGetEnviron())
#else
#if defined(__MWERKS__)

View File

@@ -182,6 +182,13 @@ namespace boost { namespace program_options {
: abstract_variables_map(next)
{}
void variables_map::clear()
{
std::map<std::string, variable_value>::clear();
m_final.clear();
m_required.clear();
}
const variable_value&
variables_map::get(const std::string& name) const
{

View File

@@ -30,6 +30,7 @@ namespace boost { namespace program_options {
std::string current;
bool inside_quoted = false;
bool empty_quote = false;
int backslash_count = 0;
for(; i != e; ++i) {
@@ -38,6 +39,7 @@ namespace boost { namespace program_options {
// n/2 backslashes and is a quoted block delimiter
if (backslash_count % 2 == 0) {
current.append(backslash_count / 2, '\\');
empty_quote = inside_quoted && current.empty();
inside_quoted = !inside_quoted;
// '"' preceded by odd number (n) of backslashes generates
// (n-1)/2 backslashes and is literal quote.
@@ -59,6 +61,7 @@ namespace boost { namespace program_options {
// Space outside quoted section terminate the current argument
result.push_back(current);
current.resize(0);
empty_quote = false;
for(;i != e && isspace((unsigned char)*i); ++i)
;
--i;
@@ -74,7 +77,7 @@ namespace boost { namespace program_options {
// If we have non-empty 'current' or we're still in quoted
// section (even if 'current' is empty), add the last token.
if (!current.empty() || inside_quoted)
if (!current.empty() || inside_quoted || empty_quote)
result.push_back(current);
}
return result;
@@ -94,3 +97,4 @@ namespace boost { namespace program_options {
}}
#endif

View File

@@ -378,6 +378,15 @@ void test_guessing()
{0, 0, 0}
};
test_cmdline("opt123 opt56 foo,f=", style, test_cases1);
test_case test_cases2[] = {
{"--fname file --fname2 file2", s_success, "fname: file fname2: file2"},
{"--fnam file --fnam file2", s_ambiguous_option, ""},
{"--fnam file --fname2 file2", s_ambiguous_option, ""},
{"--fname2 file2 --fnam file", s_ambiguous_option, ""},
{0, 0, 0}
};
test_cmdline("fname fname2", style, test_cases2);
}
void test_arguments()

View File

@@ -53,6 +53,17 @@ void test_approximation()
BOOST_CHECK_EQUAL(desc.find("all", true).long_name(), "all");
BOOST_CHECK_EQUAL(desc.find("all-ch", true).long_name(), "all-chroots");
options_description desc2;
desc2.add_options()
("help", "display this message")
("config", value<string>(), "config file name")
("config-value", value<string>(), "single config value")
;
BOOST_CHECK_EQUAL(desc2.find("config", true).long_name(), "config");
BOOST_CHECK_EQUAL(desc2.find("config-value", true).long_name(),
"config-value");
// BOOST_CHECK(desc.count_approx("foo") == 1);
// set<string> a = desc.approximations("f");

View File

@@ -131,7 +131,7 @@ void test_command_line()
// Regression test: check that '0' as style is interpreted as
// 'default_style'
vector<option> a4 =
parse_command_line(sizeof(cmdline3_)/sizeof(const char*), const_cast<char**>(cmdline3_),
parse_command_line(sizeof(cmdline3_)/sizeof(const char*), cmdline3_,
desc, 0, additional_parser).options;
BOOST_CHECK_EQUAL(a4.size(), 4u);

View File

@@ -21,7 +21,7 @@ void do_it()
f.write("(\"opt%d\", value<int>())\n")
f.write(";\n}\n")
f.close()
os.system(compiler_command + " -c -save-temps -I /home/ghost/Work/boost-rc program_options_test.cpp")
os.system(compiler_command + " -c -save-temps -I /home/ghost/Work/Boost/boost-svn program_options_test.cpp")
nm = os.popen("nm -S program_options_test.o")
for l in nm:
@@ -45,7 +45,7 @@ def run_tests(range, compiler_command):
print "Avarage: ", (last_size-first_size)/(range[-1]-range[0])
if __name__ == '__main__':
for compiler in [ "g++-3.3 -Os", "g++-3.3 -O3", "g++-3.4 -Os", "g++-3.4 -O3"]:
for compiler in [ "g++ -Os", "g++ -O3"]:
print "****", compiler, "****"
run_tests(range(1, 20), compiler)