|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r54884 - in branches/release: boost/program_options/detail libs/program_options/example libs/program_options/src libs/program_options/test
From: ghost_at_[hidden]
Date: 2009-07-11 08:00:19
Author: vladimir_prus
Date: 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
New Revision: 54884
URL: http://svn.boost.org/trac/boost/changeset/54884
Log:
Merge from trunk
Text files modified:
branches/release/boost/program_options/detail/parsers.hpp | 2 ++
branches/release/boost/program_options/detail/value_semantic.hpp | 11 +++++------
branches/release/libs/program_options/example/options_description.cpp | 2 +-
branches/release/libs/program_options/example/regex.cpp | 2 +-
branches/release/libs/program_options/src/cmdline.cpp | 30 +++++++++++++++---------------
branches/release/libs/program_options/src/parsers.cpp | 8 +++++++-
branches/release/libs/program_options/src/variables_map.cpp | 13 ++++++++++++-
branches/release/libs/program_options/test/unicode_test.cpp | 10 +++++++---
8 files changed, 50 insertions(+), 28 deletions(-)
Modified: branches/release/boost/program_options/detail/parsers.hpp
==============================================================================
--- branches/release/boost/program_options/detail/parsers.hpp (original)
+++ branches/release/boost/program_options/detail/parsers.hpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -8,6 +8,8 @@
#include <boost/program_options/detail/convert.hpp>
+#include <iterator>
+
namespace boost { namespace program_options {
namespace detail {
Modified: branches/release/boost/program_options/detail/value_semantic.hpp
==============================================================================
--- branches/release/boost/program_options/detail/value_semantic.hpp (original)
+++ branches/release/boost/program_options/detail/value_semantic.hpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -55,13 +55,12 @@
{
static std::basic_string<charT> empty;
if (v.size() > 1)
- throw validation_error("multiple values not allowed");
- if (v.size() == 1)
+ boost::throw_exception(validation_error("multiple values not allowed"));
+ else if (v.size() == 1)
return v.front();
- else if (allow_empty)
- return empty;
- else
- throw validation_error("at least one value required");
+ else if (!allow_empty)
+ boost::throw_exception(validation_error("at least one value required"));
+ return empty;
}
/* Throws multiple_occurrences if 'value' is not empty. */
Modified: branches/release/libs/program_options/example/options_description.cpp
==============================================================================
--- branches/release/libs/program_options/example/options_description.cpp (original)
+++ branches/release/libs/program_options/example/options_description.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -77,7 +77,7 @@
cout << "Listen port is " << portnum << "\n";
}
- catch(exception& e)
+ catch(std::exception& e)
{
cout << e.what() << "\n";
return 1;
Modified: branches/release/libs/program_options/example/regex.cpp
==============================================================================
--- branches/release/libs/program_options/example/regex.cpp (original)
+++ branches/release/libs/program_options/example/regex.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -94,7 +94,7 @@
<< vm["magic"].as<magic_number>().n << "\"\n";
}
}
- catch(exception& e)
+ catch(std::exception& e)
{
cout << e.what() << "\n";
}
Modified: branches/release/libs/program_options/src/cmdline.cpp
==============================================================================
--- branches/release/libs/program_options/src/cmdline.cpp (original)
+++ branches/release/libs/program_options/src/cmdline.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -152,7 +152,7 @@
error = "style disallows all characters for short options";
if (error)
- throw invalid_command_line_style(error);
+ boost::throw_exception(invalid_command_line_style(error));
// Need to check that if guessing and long disguise are enabled
// -f will mean the same as -foo
@@ -196,24 +196,24 @@
if (m_additional_parser)
style_parsers.push_back(
- bind(&cmdline::handle_additional_parser, this, _1));
+ boost::bind(&cmdline::handle_additional_parser, this, _1));
if (m_style & allow_long)
style_parsers.push_back(
- bind(&cmdline::parse_long_option, this, _1));
+ boost::bind(&cmdline::parse_long_option, this, _1));
if ((m_style & allow_long_disguise))
style_parsers.push_back(
- bind(&cmdline::parse_disguised_long_option, this, _1));
+ boost::bind(&cmdline::parse_disguised_long_option, this, _1));
if ((m_style & allow_short) && (m_style & allow_dash_for_short))
style_parsers.push_back(
- bind(&cmdline::parse_short_option, this, _1));
+ boost::bind(&cmdline::parse_short_option, this, _1));
if ((m_style & allow_short) && (m_style & allow_slash_for_short))
- style_parsers.push_back(bind(&cmdline::parse_dos_option, this, _1));
+ style_parsers.push_back(boost::bind(&cmdline::parse_dos_option, this, _1));
- style_parsers.push_back(bind(&cmdline::parse_terminator, this, _1));
+ style_parsers.push_back(boost::bind(&cmdline::parse_terminator, this, _1));
vector<option> result;
while(!args.empty())
@@ -326,8 +326,8 @@
if (opt.position_key != -1) {
if (position >= m_positional->max_total_count())
{
- throw too_many_positional_options_error(
- "too many positional options");
+ boost::throw_exception(too_many_positional_options_error(
+ "too many positional options"));
}
opt.string_key = m_positional->name_for_position(position);
++position;
@@ -380,8 +380,8 @@
if (present_tokens >= min_tokens)
{
if (!opt.value.empty() && max_tokens == 0) {
- throw invalid_command_line_syntax(opt.string_key,
- invalid_command_line_syntax::extra_parameter);
+ boost::throw_exception(invalid_command_line_syntax(opt.string_key,
+ invalid_command_line_syntax::extra_parameter));
}
// If an option wants, at minimum, N tokens, we grab them
@@ -406,8 +406,8 @@
}
else
{
- throw invalid_command_line_syntax(opt.string_key,
- invalid_command_line_syntax::missing_parameter);
+ boost::throw_exception(invalid_command_line_syntax(opt.string_key,
+ invalid_command_line_syntax::missing_parameter));
}
}
@@ -427,8 +427,8 @@
name = tok.substr(2, p-2);
adjacent = tok.substr(p+1);
if (adjacent.empty())
- throw invalid_command_line_syntax(name,
- invalid_command_line_syntax::empty_adjacent_parameter);
+ boost::throw_exception( invalid_command_line_syntax(name,
+ invalid_command_line_syntax::empty_adjacent_parameter));
}
else
{
Modified: branches/release/libs/program_options/src/parsers.cpp
==============================================================================
--- branches/release/libs/program_options/src/parsers.cpp (original)
+++ branches/release/libs/program_options/src/parsers.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -67,10 +67,16 @@
woption result;
result.string_key = opt.string_key;
result.position_key = opt.position_key;
+ result.unregistered = opt.unregistered;
std::transform(opt.value.begin(), opt.value.end(),
back_inserter(result.value),
- bind(from_utf8, _1));
+ boost::bind(from_utf8, _1));
+
+ std::transform(opt.original_tokens.begin(),
+ opt.original_tokens.end(),
+ back_inserter(result.original_tokens),
+ boost::bind(from_utf8, _1));
return result;
}
}
Modified: branches/release/libs/program_options/src/variables_map.cpp
==============================================================================
--- branches/release/libs/program_options/src/variables_map.cpp (original)
+++ branches/release/libs/program_options/src/variables_map.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -74,11 +74,13 @@
try {
d.semantic()->parse(v.value(), options.options[i].value, utf8);
}
+#ifndef BOOST_NO_EXCEPTIONS
catch(validation_error& e)
{
e.set_option_name(name);
throw;
}
+#endif
v.m_value_semantic = d.semantic();
// The option is not composing, and the value is explicitly
@@ -133,7 +135,16 @@
k != vm.end();
++k)
{
- k->second.m_value_semantic->notify(k->second.value());
+ /* Users might wish to use variables_map to store their own values
+ that are not parsed, and therefore will not have value_semantics
+ defined. Do no crash on such values. In multi-module programs,
+ one module might add custom values, and the 'notify' function
+ will be called after that, so we check that value_sematics is
+ not NULL. See:
+ https://svn.boost.org/trac/boost/ticket/2782
+ */
+ if (k->second.m_value_semantic)
+ k->second.m_value_semantic->notify(k->second.value());
}
}
Modified: branches/release/libs/program_options/test/unicode_test.cpp
==============================================================================
--- branches/release/libs/program_options/test/unicode_test.cpp (original)
+++ branches/release/libs/program_options/test/unicode_test.cpp 2009-07-11 08:00:18 EDT (Sat, 11 Jul 2009)
@@ -34,9 +34,13 @@
args.push_back(L"--foo=\x044F");
variables_map vm;
- store(wcommand_line_parser(args).options(desc).run(), vm);
-
- BOOST_CHECK(vm["foo"].as<wstring>() == L"\x044F");
+ basic_parsed_options<wchar_t> parsed =
+ wcommand_line_parser(args).options(desc).run();
+ store(parsed, vm);
+
+ BOOST_CHECK(vm["foo"].as<wstring>() == L"\x044F");
+ BOOST_CHECK(parsed.options[0].original_tokens.size() == 1);
+ BOOST_CHECK(parsed.options[0].original_tokens[0] == L"--foo=\x044F");
}
// Test that unicode input is property converted into
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk