|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r66165 - in branches/release: . boost boost/algorithm/string boost/archive boost/bimap boost/config boost/detail boost/filesystem boost/functional/hash boost/fusion boost/gil boost/graph boost/integer boost/interprocess boost/intrusive boost/io boost/iostreams boost/math boost/msm boost/numeric/ublas boost/program_options boost/property_tree boost/python boost/range boost/regex boost/serialization boost/signals boost/signals2 boost/spirit boost/spirit/home boost/spirit/home/karma boost/spirit/home/support boost/spirit/home/support/detail/lexer boost/spirit/home/support/detail/lexer/parser boost/statechart boost/system boost/thread boost/tr1 boost/type_traits boost/typeof boost/unordered boost/utility boost/uuid boost/variant boost/wave boost/wave/util doc libs libs/algorithm/string libs/array/doc libs/array/test libs/bimap libs/config libs/filesystem libs/functional/hash libs/fusion libs/graph_parallel libs/integer libs/interprocess libs/intrusive libs/iostreams libs/math libs/math/doc/sf_and_dist libs/mpi/build libs/mpl/doc/refmanual libs/mpl/doc/src/refmanual libs/msm libs/numeric/ublas libs/numeric/ublas/doc libs/program_options libs/property_tree libs/python libs/range libs/regex libs/serialization libs/serialization/doc libs/serialization/test libs/signals libs/signals2 libs/spirit libs/spirit/classic/example libs/spirit/doc libs/spirit/doc/qi libs/spirit/example libs/spirit/phoenix libs/spirit/test libs/spirit/test/karma libs/spirit/test/qi libs/statechart libs/static_assert libs/system libs/thread libs/timer libs/tr1 libs/type_traits libs/type_traits/doc libs/typeof/doc libs/unordered libs/utility libs/utility/swap/test libs/uuid libs/wave libs/wave/build more more/getting_started status tools tools/bcp tools/boostbook tools/build/v2 tools/inspect tools/quickbook tools/regression tools/regression/src tools/release tools/wave
From: hartmut.kaiser_at_[hidden]
Date: 2010-10-24 18:20:05
Author: hkaiser
Date: 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
New Revision: 66165
URL: http://svn.boost.org/trac/boost/changeset/66165
Log:
Wave, Spirit: merging from trunk
Properties modified:
branches/release/ (props changed)
branches/release/INSTALL (props changed)
branches/release/Jamroot (props changed)
branches/release/LICENSE_1_0.txt (props changed)
branches/release/boost/ (props changed)
branches/release/boost-build.jam (props changed)
branches/release/boost.css (props changed)
branches/release/boost.png (props changed)
branches/release/boost/algorithm/string/ (props changed)
branches/release/boost/archive/ (props changed)
branches/release/boost/archive/basic_archive.hpp (props changed)
branches/release/boost/array.hpp (props changed)
branches/release/boost/bimap/ (props changed)
branches/release/boost/config/ (props changed)
branches/release/boost/config.hpp (props changed)
branches/release/boost/detail/ (props changed)
branches/release/boost/detail/endian.hpp (props changed)
branches/release/boost/filesystem/ (props changed)
branches/release/boost/filesystem.hpp (props changed)
branches/release/boost/functional/hash/ (props changed)
branches/release/boost/fusion/ (props changed)
branches/release/boost/gil/ (props changed)
branches/release/boost/graph/ (props changed)
branches/release/boost/integer/ (props changed)
branches/release/boost/interprocess/ (props changed)
branches/release/boost/intrusive/ (props changed)
branches/release/boost/io/ (props changed)
branches/release/boost/iostreams/ (props changed)
branches/release/boost/math/ (props changed)
branches/release/boost/math_fwd.hpp (props changed)
branches/release/boost/msm/ (props changed)
branches/release/boost/numeric/ublas/ (props changed)
branches/release/boost/numeric/ublas/functional.hpp (props changed)
branches/release/boost/program_options/ (props changed)
branches/release/boost/property_tree/ (props changed)
branches/release/boost/python/ (props changed)
branches/release/boost/range/ (props changed)
branches/release/boost/regex/ (props changed)
branches/release/boost/serialization/ (props changed)
branches/release/boost/signals/ (props changed)
branches/release/boost/signals2/ (props changed)
branches/release/boost/signals2.hpp (props changed)
branches/release/boost/spirit/ (props changed)
branches/release/boost/spirit/home/ (props changed)
branches/release/boost/spirit/home/karma/ (props changed)
branches/release/boost/spirit/home/support/attributes.hpp (props changed)
branches/release/boost/statechart/ (props changed)
branches/release/boost/system/ (props changed)
branches/release/boost/thread/ (props changed)
branches/release/boost/thread.hpp (props changed)
branches/release/boost/tr1/ (props changed)
branches/release/boost/type_traits/ (props changed)
branches/release/boost/typeof/message.hpp (props changed)
branches/release/boost/typeof/register_functions.hpp (props changed)
branches/release/boost/typeof/register_functions_iterate.hpp (props changed)
branches/release/boost/typeof/typeof.hpp (props changed)
branches/release/boost/typeof/unsupported.hpp (props changed)
branches/release/boost/unordered/ (props changed)
branches/release/boost/utility/ (props changed)
branches/release/boost/utility/value_init.hpp (props changed)
branches/release/boost/uuid/ (props changed)
branches/release/boost/variant/ (props changed)
branches/release/boost/version.hpp (props changed)
branches/release/boost/wave/ (props changed)
branches/release/bootstrap.bat (props changed)
branches/release/bootstrap.sh (props changed)
branches/release/doc/ (props changed)
branches/release/index.htm (props changed)
branches/release/index.html (props changed)
branches/release/libs/ (props changed)
branches/release/libs/algorithm/string/ (props changed)
branches/release/libs/array/doc/array.xml (props changed)
branches/release/libs/array/test/array0.cpp (props changed)
branches/release/libs/array/test/array2.cpp (props changed)
branches/release/libs/bimap/ (props changed)
branches/release/libs/config/ (props changed)
branches/release/libs/filesystem/ (props changed)
branches/release/libs/functional/hash/ (props changed)
branches/release/libs/fusion/ (props changed)
branches/release/libs/graph_parallel/ (props changed)
branches/release/libs/integer/ (props changed)
branches/release/libs/interprocess/ (props changed)
branches/release/libs/intrusive/ (props changed)
branches/release/libs/iostreams/ (props changed)
branches/release/libs/libraries.htm (props changed)
branches/release/libs/maintainers.txt (props changed)
branches/release/libs/math/ (props changed)
branches/release/libs/math/doc/sf_and_dist/ (props changed)
branches/release/libs/mpi/build/ (props changed)
branches/release/libs/mpl/doc/refmanual/broken-compiler-workarounds.html (props changed)
branches/release/libs/mpl/doc/refmanual/categorized-index-concepts.html (props changed)
branches/release/libs/mpl/doc/refmanual/cfg-no-preprocessed-headers.html (props changed)
branches/release/libs/mpl/doc/refmanual/composition-and-argument-binding.html (props changed)
branches/release/libs/mpl/doc/refmanual/data-types-concepts.html (props changed)
branches/release/libs/mpl/doc/refmanual/data-types-miscellaneous.html (props changed)
branches/release/libs/mpl/doc/refmanual/extensible-associative-sequence.html (props changed)
branches/release/libs/mpl/doc/refmanual/inserter-class.html (props changed)
branches/release/libs/mpl/doc/refmanual/tag-dispatched-metafunction.html (props changed)
branches/release/libs/mpl/doc/refmanual/trivial-metafunctions-summary.html (props changed)
branches/release/libs/mpl/doc/src/refmanual/Iterators-Iterator.rst (props changed)
branches/release/libs/msm/ (props changed)
branches/release/libs/numeric/ublas/ (props changed)
branches/release/libs/numeric/ublas/doc/ (props changed)
branches/release/libs/program_options/ (props changed)
branches/release/libs/property_tree/ (props changed)
branches/release/libs/python/ (props changed)
branches/release/libs/range/ (props changed)
branches/release/libs/regex/ (props changed)
branches/release/libs/serialization/ (props changed)
branches/release/libs/serialization/doc/ (props changed)
branches/release/libs/serialization/test/ (props changed)
branches/release/libs/serialization/test/A.cpp (props changed)
branches/release/libs/serialization/test/A.hpp (props changed)
branches/release/libs/serialization/test/A.ipp (props changed)
branches/release/libs/serialization/test/B.hpp (props changed)
branches/release/libs/serialization/test/C.hpp (props changed)
branches/release/libs/serialization/test/D.hpp (props changed)
branches/release/libs/serialization/test/J.hpp (props changed)
branches/release/libs/serialization/test/Jamfile.v2 (props changed)
branches/release/libs/serialization/test/base.hpp (props changed)
branches/release/libs/serialization/test/binary_archive.hpp (props changed)
branches/release/libs/serialization/test/binary_warchive.hpp (props changed)
branches/release/libs/serialization/test/derived2.hpp (props changed)
branches/release/libs/serialization/test/dll_a.cpp (props changed)
branches/release/libs/serialization/test/dll_base.cpp (props changed)
branches/release/libs/serialization/test/dll_derived2.cpp (props changed)
branches/release/libs/serialization/test/polymorphic_array_binary_archive.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_base.cpp (props changed)
branches/release/libs/serialization/test/polymorphic_base.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_binary_archive.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_derived1.cpp (props changed)
branches/release/libs/serialization/test/polymorphic_derived1.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_derived2.cpp (props changed)
branches/release/libs/serialization/test/polymorphic_derived2.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_text_archive.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_text_warchive.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_xml_archive.hpp (props changed)
branches/release/libs/serialization/test/polymorphic_xml_warchive.hpp (props changed)
branches/release/libs/serialization/test/portable_binary_archive.hpp (props changed)
branches/release/libs/serialization/test/test_array.cpp (props changed)
branches/release/libs/serialization/test/test_binary.cpp (props changed)
branches/release/libs/serialization/test/test_bitset.cpp (props changed)
branches/release/libs/serialization/test/test_check.cpp (props changed)
branches/release/libs/serialization/test/test_class_info_load.cpp (props changed)
branches/release/libs/serialization/test/test_class_info_save.cpp (props changed)
branches/release/libs/serialization/test/test_codecvt_null.cpp (props changed)
branches/release/libs/serialization/test/test_complex.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail1.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail1_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail2.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail2_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail3.cpp (props changed)
branches/release/libs/serialization/test/test_const_load_fail3_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_pass.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn1.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn1_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn2.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn2_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn3.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn3_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn4.cpp (props changed)
branches/release/libs/serialization/test/test_const_save_warn4_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_contained_class.cpp (props changed)
branches/release/libs/serialization/test/test_cyclic_ptrs.cpp (props changed)
branches/release/libs/serialization/test/test_decl.hpp (props changed)
branches/release/libs/serialization/test/test_delete_pointer.cpp (props changed)
branches/release/libs/serialization/test/test_deque.cpp (props changed)
branches/release/libs/serialization/test/test_derived.cpp (props changed)
branches/release/libs/serialization/test/test_derived_class.cpp (props changed)
branches/release/libs/serialization/test/test_derived_class_ptr.cpp (props changed)
branches/release/libs/serialization/test/test_diamond.cpp (props changed)
branches/release/libs/serialization/test/test_diamond_complex.cpp (props changed)
branches/release/libs/serialization/test/test_dll_exported.cpp (props changed)
branches/release/libs/serialization/test/test_dll_plugin.cpp (props changed)
branches/release/libs/serialization/test/test_dll_simple.cpp (props changed)
branches/release/libs/serialization/test/test_exported.cpp (props changed)
branches/release/libs/serialization/test/test_inclusion.cpp (props changed)
branches/release/libs/serialization/test/test_iterators.cpp (props changed)
branches/release/libs/serialization/test/test_iterators_base64.cpp (props changed)
branches/release/libs/serialization/test/test_list.cpp (props changed)
branches/release/libs/serialization/test/test_list_ptrs.cpp (props changed)
branches/release/libs/serialization/test/test_map.cpp (props changed)
branches/release/libs/serialization/test/test_mi.cpp (props changed)
branches/release/libs/serialization/test/test_mult_archive_types.cpp (props changed)
branches/release/libs/serialization/test/test_multiple_inheritance.cpp (props changed)
branches/release/libs/serialization/test/test_multiple_ptrs.cpp (props changed)
branches/release/libs/serialization/test/test_new_operator.cpp (props changed)
branches/release/libs/serialization/test/test_no_rtti.cpp (props changed)
branches/release/libs/serialization/test/test_non_default_ctor.cpp (props changed)
branches/release/libs/serialization/test/test_non_default_ctor2.cpp (props changed)
branches/release/libs/serialization/test/test_non_intrusive.cpp (props changed)
branches/release/libs/serialization/test/test_not_serializable.cpp (props changed)
branches/release/libs/serialization/test/test_null_ptr.cpp (props changed)
branches/release/libs/serialization/test/test_nvp.cpp (props changed)
branches/release/libs/serialization/test/test_object.cpp (props changed)
branches/release/libs/serialization/test/test_optional.cpp (props changed)
branches/release/libs/serialization/test/test_pimpl.cpp (props changed)
branches/release/libs/serialization/test/test_polymorphic.cpp (props changed)
branches/release/libs/serialization/test/test_polymorphic2.cpp (props changed)
branches/release/libs/serialization/test/test_polymorphic2.hpp (props changed)
branches/release/libs/serialization/test/test_polymorphic2imp.cpp (props changed)
branches/release/libs/serialization/test/test_polymorphic_A.cpp (props changed)
branches/release/libs/serialization/test/test_polymorphic_A.hpp (props changed)
branches/release/libs/serialization/test/test_primitive.cpp (props changed)
branches/release/libs/serialization/test/test_private_base.cpp (props changed)
branches/release/libs/serialization/test/test_private_ctor.cpp (props changed)
branches/release/libs/serialization/test/test_recursion.cpp (props changed)
branches/release/libs/serialization/test/test_registered.cpp (props changed)
branches/release/libs/serialization/test/test_reset_object_address.cpp (props changed)
branches/release/libs/serialization/test/test_set.cpp (props changed)
branches/release/libs/serialization/test/test_shared_ptr.cpp (props changed)
branches/release/libs/serialization/test/test_shared_ptr_132.cpp (props changed)
branches/release/libs/serialization/test/test_shared_ptr_multi_base.cpp (props changed)
branches/release/libs/serialization/test/test_simple_class.cpp (props changed)
branches/release/libs/serialization/test/test_simple_class_ptr.cpp (props changed)
branches/release/libs/serialization/test/test_singleton.cpp (props changed)
branches/release/libs/serialization/test/test_smart_cast.cpp (props changed)
branches/release/libs/serialization/test/test_split.cpp (props changed)
branches/release/libs/serialization/test/test_static_warning.cpp (props changed)
branches/release/libs/serialization/test/test_tools.hpp (props changed)
branches/release/libs/serialization/test/test_tracking.cpp (props changed)
branches/release/libs/serialization/test/test_traits_fail.cpp (props changed)
branches/release/libs/serialization/test/test_traits_pass.cpp (props changed)
branches/release/libs/serialization/test/test_unregistered.cpp (props changed)
branches/release/libs/serialization/test/test_utf8_codecvt.cpp (props changed)
branches/release/libs/serialization/test/test_valarray.cpp (props changed)
branches/release/libs/serialization/test/test_variant.cpp (props changed)
branches/release/libs/serialization/test/test_vector.cpp (props changed)
branches/release/libs/serialization/test/test_void_cast.cpp (props changed)
branches/release/libs/serialization/test/text_archive.hpp (props changed)
branches/release/libs/serialization/test/text_warchive.hpp (props changed)
branches/release/libs/serialization/test/xml_archive.hpp (props changed)
branches/release/libs/serialization/test/xml_warchive.hpp (props changed)
branches/release/libs/signals/ (props changed)
branches/release/libs/signals2/ (props changed)
branches/release/libs/spirit/ (props changed)
branches/release/libs/spirit/classic/example/ (props changed)
branches/release/libs/spirit/doc/ (props changed)
branches/release/libs/spirit/example/ (props changed)
branches/release/libs/spirit/phoenix/ (props changed)
branches/release/libs/spirit/test/ (props changed)
branches/release/libs/spirit/test/qi/optional.cpp (props changed)
branches/release/libs/statechart/ (props changed)
branches/release/libs/static_assert/ (props changed)
branches/release/libs/system/ (props changed)
branches/release/libs/thread/ (props changed)
branches/release/libs/timer/ (props changed)
branches/release/libs/tr1/ (props changed)
branches/release/libs/type_traits/ (props changed)
branches/release/libs/type_traits/doc/ (props changed)
branches/release/libs/typeof/doc/typeof.qbk (props changed)
branches/release/libs/unordered/ (props changed)
branches/release/libs/utility/ (props changed)
branches/release/libs/utility/swap.html (props changed)
branches/release/libs/utility/swap/test/std_bitset.cpp (props changed)
branches/release/libs/utility/value_init.htm (props changed)
branches/release/libs/utility/value_init_test.cpp (props changed)
branches/release/libs/uuid/ (props changed)
branches/release/libs/wave/ (props changed)
branches/release/more/ (props changed)
branches/release/more/getting_started/ (props changed)
branches/release/rst.css (props changed)
branches/release/status/ (props changed)
branches/release/status/Jamfile.v2 (props changed)
branches/release/status/explicit-failures-markup.xml (props changed)
branches/release/tools/ (props changed)
branches/release/tools/bcp/ (props changed)
branches/release/tools/boostbook/ (props changed)
branches/release/tools/build/v2/ (props changed)
branches/release/tools/inspect/ (props changed)
branches/release/tools/quickbook/ (props changed)
branches/release/tools/regression/ (props changed)
branches/release/tools/regression/src/library_status.cpp (props changed)
branches/release/tools/release/ (props changed)
branches/release/tools/wave/ (props changed)
Text files modified:
branches/release/boost/spirit/home/support/detail/lexer/consts.hpp | 3
branches/release/boost/spirit/home/support/detail/lexer/parser/parser.hpp | 12
branches/release/boost/wave/cpp_throw.hpp | 261 +++++++++++++++++++++------------------
branches/release/boost/wave/util/cpp_iterator.hpp | 18 +
branches/release/boost/wave/util/cpp_macromap.hpp | 6
branches/release/boost/wave/util/interpret_pragma.hpp | 13 +
branches/release/libs/spirit/doc/qi/concepts.qbk | 4
branches/release/libs/spirit/test/karma/pattern2.cpp | 4
branches/release/libs/spirit/test/karma/sequence.cpp | 2
branches/release/libs/spirit/test/qi/rule.cpp | 4
branches/release/libs/wave/ChangeLog | 2
branches/release/libs/wave/build/Jamfile.v2 | 1
branches/release/tools/wave/trace_macro_expansion.hpp | 24 ++-
13 files changed, 200 insertions(+), 154 deletions(-)
Modified: branches/release/boost/spirit/home/support/detail/lexer/consts.hpp
==============================================================================
--- branches/release/boost/spirit/home/support/detail/lexer/consts.hpp (original)
+++ branches/release/boost/spirit/home/support/detail/lexer/consts.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -26,7 +26,8 @@
// by adding one to comparison.
const std::size_t num_wchar_ts =
(boost::integer_traits<wchar_t>::const_max < 0x110000) ?
- boost::integer_traits<wchar_t>::const_max + std::size_t(1) : 0x110000;
+ boost::integer_traits<wchar_t>::const_max +
+ static_cast<std::size_t> (1) : 0x110000;
const std::size_t null_token = static_cast<std::size_t> (~0);
const std::size_t bol_token = static_cast<std::size_t> (~1);
const std::size_t eol_token = static_cast<std::size_t> (~2);
Modified: branches/release/boost/spirit/home/support/detail/lexer/parser/parser.hpp
==============================================================================
--- branches/release/boost/spirit/home/support/detail/lexer/parser/parser.hpp (original)
+++ branches/release/boost/spirit/home/support/detail/lexer/parser/parser.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -452,7 +452,7 @@
for (std::size_t i_ = 2; i_ < top_; ++i_)
{
curr_ = prev_->copy (node_ptr_vector_);
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
sequence (node_ptr_vector_, tree_node_stack_);
prev_ = curr_;
@@ -463,7 +463,7 @@
if (token_._min > 1)
{
curr_ = prev_->copy (node_ptr_vector_);
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
sequence (node_ptr_vector_, tree_node_stack_);
prev_ = curr_;
@@ -471,7 +471,7 @@
if (token_._comma && token_._max)
{
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
optional (greedy_, node_ptr_vector_, tree_node_stack_);
prev_ = tree_node_stack_.top ();
@@ -482,7 +482,7 @@
for (std::size_t i_ = 1; i_ < count_; ++i_)
{
curr_ = prev_->copy (node_ptr_vector_);
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
sequence (node_ptr_vector_, tree_node_stack_);
prev_ = curr_;
@@ -490,7 +490,7 @@
}
else
{
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
zero_or_more (greedy_, node_ptr_vector_, tree_node_stack_);
prev_ = tree_node_stack_.top ();
@@ -498,7 +498,7 @@
}
}
- tree_node_stack_.push (static_cast<node*>(0));
+ tree_node_stack_.push (static_cast<node *>(0));
tree_node_stack_.top () = prev_;
sequence (node_ptr_vector_, tree_node_stack_);
}
Modified: branches/release/boost/wave/cpp_throw.hpp
==============================================================================
--- branches/release/boost/wave/cpp_throw.hpp (original)
+++ branches/release/boost/wave/cpp_throw.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -14,142 +14,167 @@
#include <string>
#include <boost/throw_exception.hpp>
-///////////////////////////////////////////////////////////////////////////////
-// helper macro for throwing exceptions
-#if !defined(BOOST_WAVE_THROW)
#ifdef BOOST_NO_STRINGSTREAM
#include <strstream>
-#define BOOST_WAVE_THROW(cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::strstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- std::string throwmsg = stream.str(); stream.freeze(false); \
- boost::throw_exception(cls(throwmsg.c_str(), cls::code, \
- (act_pos).get_line(), (act_pos).get_column(), \
- (act_pos).get_file().c_str())); \
- } \
- /**/
-#define BOOST_WAVE_THROW_CTX(ctx, cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::strstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- std::string throwmsg = stream.str(); stream.freeze(false); \
- ctx.get_hooks().throw_exception(ctx.derived(), cls(throwmsg.c_str(), \
- cls::code, (act_pos).get_line(), (act_pos).get_column(), \
- (act_pos).get_file().c_str())); \
- } \
- /**/
#else
#include <sstream>
+#endif
+
+namespace boost { namespace wave { namespace util
+{
+#ifdef BOOST_NO_STRINGSTREAM
+ template <typename Exception, typename S1, typename Pos>
+ void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
+ {
+ std::strstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str(); stream.freeze(false);
+ boost::throw_exception(Exception(throwmsg.c_str(), code,
+ pos.get_line(), pos.get_column(), pos.get_file().c_str()));
+ }
+
+ template <typename Exception, typename Context, typename S1, typename Pos>
+ void throw_(Context& ctx, typename Exception::error_code code,
+ S1 msg, Pos const& pos)
+ {
+ std::strstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str(); stream.freeze(false);
+ ctx.get_hooks().throw_exception(ctx.derived(),
+ Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
+ pos.get_file().c_str()));
+ }
+
+ template <typename Exception, typename S1, typename Pos, typename S2>
+ void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
+ S2 name)
+ {
+ std::strstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str(); stream.freeze(false);
+ boost::throw_exception(Exception(throwmsg.c_str(), code,
+ pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
+ }
+
+ template <typename Exception, typename Context, typename S1, typename Pos,
+ typename S2>
+ void throw_(Context& ctx, typename Exception::error_code code,
+ S1 msg, Pos const& pos, S2 name)
+ {
+ std::strstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str(); stream.freeze(false);
+ ctx.get_hooks().throw_exception(ctx.derived(),
+ Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
+ pos.get_file().c_str(), name));
+ }
+#else
+ template <typename Exception, typename S1, typename Pos>
+ void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
+ {
+ std::stringstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str();
+ boost::throw_exception(Exception(throwmsg.c_str(), code,
+ pos.get_line(), pos.get_column(), pos.get_file().c_str()));
+ }
+
+ template <typename Exception, typename Context, typename S1, typename Pos>
+ void throw_(Context& ctx, typename Exception::error_code code,
+ S1 msg, Pos const& pos)
+ {
+ std::stringstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str();
+ ctx.get_hooks().throw_exception(ctx.derived(),
+ Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
+ pos.get_file().c_str()));
+ }
+
+ template <typename Exception, typename S1, typename Pos, typename S2>
+ void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
+ S2 name)
+ {
+ std::stringstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str();
+ boost::throw_exception(Exception(throwmsg.c_str(), code,
+ pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
+ }
+
+ template <typename Exception, typename Context, typename S1, typename Pos1,
+ typename S2>
+ void throw_(Context& ctx, typename Exception::error_code code,
+ S1 msg, Pos1 const& pos, S2 name)
+ {
+ std::stringstream stream;
+ stream << Exception::severity_text(code) << ": "
+ << Exception::error_text(code);
+ if (msg[0] != 0)
+ stream << ": " << msg;
+ stream << std::ends;
+ std::string throwmsg = stream.str();
+ ctx.get_hooks().throw_exception(ctx.derived(),
+ Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
+ pos.get_file().c_str(), name));
+ }
+#endif
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// helper macro for throwing exceptions
+#if !defined(BOOST_WAVE_THROW)
#define BOOST_WAVE_THROW(cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::stringstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- boost::throw_exception(cls(stream.str().c_str(), cls::code, \
- (act_pos).get_line(), (act_pos).get_column(), \
- (act_pos).get_file().c_str())); \
- } \
+ boost::wave::util::throw_<cls>(cls::code, msg, act_pos) \
/**/
+
#define BOOST_WAVE_THROW_CTX(ctx, cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::stringstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- ctx.get_hooks().throw_exception(ctx.derived(), \
- cls(stream.str().c_str(), cls::code, (act_pos).get_line(), \
- (act_pos).get_column(), (act_pos).get_file().c_str())); \
- } \
+ boost::wave::util::throw_<cls>(ctx, cls::code, msg, act_pos) \
/**/
-#endif // BOOST_NO_STRINGSTREAM
#endif // BOOST_WAVE_THROW
///////////////////////////////////////////////////////////////////////////////
// helper macro for throwing exceptions with additional parameter
-#if !defined(BOOST_WAVE_THROW_NAME)
-#ifdef BOOST_NO_STRINGSTREAM
-#include <strstream>
-#define BOOST_WAVE_THROW_NAME_CTX(ctx, cls, code, msg, act_pos, name) \
- { \
- using namespace boost::wave; \
- std::strstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- std::string throwmsg = stream.str(); stream.freeze(false); \
- ctx.get_hooks().throw_exception(ctx.derived(), cls(throwmsg.c_str(), \
- cls::code, (act_pos).get_line(), (act_pos).get_column(), \
- (act_pos).get_file().c_str(), (name))); \
- } \
- /**/
-#else
-#include <sstream>
+#if !defined(BOOST_WAVE_THROW_NAME_CTX)
#define BOOST_WAVE_THROW_NAME_CTX(ctx, cls, code, msg, act_pos, name) \
- { \
- using namespace boost::wave; \
- std::stringstream stream; \
- stream << cls::severity_text(cls::code) << ": " \
- << cls::error_text(cls::code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- ctx.get_hooks().throw_exception(ctx.derived(), \
- cls(stream.str().c_str(), cls::code, (act_pos).get_line(), \
- (act_pos).get_column(), (act_pos).get_file().c_str(), (name))); \
- } \
+ boost::wave::util::throw_<cls>(cls::code, msg, act_pos, name) \
/**/
-#endif // BOOST_NO_STRINGSTREAM
-#endif // BOOST_WAVE_THROW_NAME
+#endif // BOOST_WAVE_THROW_NAME_CTX
///////////////////////////////////////////////////////////////////////////////
// helper macro for throwing exceptions with additional parameter
-#if !defined(BOOST_WAVE_THROW_VAR)
-#ifdef BOOST_NO_STRINGSTREAM
-#include <strstream>
-#define BOOST_WAVE_THROW_VAR_CTX(ctx, cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::strstream stream; \
- stream << cls::severity_text(code) << ": " \
- << cls::error_text(code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- std::string throwmsg = stream.str(); stream.freeze(false); \
- ctx.get_hooks().throw_exception(ctx.derived(), cls(throwmsg.c_str(), \
- code, (act_pos).get_line(), (act_pos).get_column(), \
- (act_pos).get_file().c_str())); \
- } \
- /**/
-#else
-#include <sstream>
+#if !defined(BOOST_WAVE_THROW_VAR_CTX)
#define BOOST_WAVE_THROW_VAR_CTX(ctx, cls, code, msg, act_pos) \
- { \
- using namespace boost::wave; \
- std::stringstream stream; \
- stream << cls::severity_text(code) << ": " \
- << cls::error_text(code); \
- if ((msg)[0] != 0) stream << ": " << (msg); \
- stream << std::ends; \
- ctx.get_hooks().throw_exception(ctx.derived(), \
- cls(stream.str().c_str(), code, (act_pos).get_line(), \
- (act_pos).get_column(), (act_pos).get_file().c_str())); \
- } \
+ boost::wave::util::throw_<cls>(ctx, code, msg, act_pos) \
/**/
-#endif // BOOST_NO_STRINGSTREAM
-#endif // BOOST_WAVE_THROW_VAR
+#endif // BOOST_WAVE_THROW_VAR_CTX
#endif // !defined(BOOST_WAVE_CPP_THROW_HPP_INCLUDED)
Modified: branches/release/boost/wave/util/cpp_iterator.hpp
==============================================================================
--- branches/release/boost/wave/util/cpp_iterator.hpp (original)
+++ branches/release/boost/wave/util/cpp_iterator.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -440,8 +440,9 @@
// report unbalanced #if/#endif now to make it possible to recover properly
if (iter_ctx->if_block_depth != ctx.get_if_block_depth()) {
using boost::wave::util::impl::escape_lit;
+ BOOST_WAVE_STRINGTYPE msg(escape_lit(oldfile));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, unbalanced_if_endif,
- escape_lit(oldfile).c_str(), old_pos);
+ msg.c_str(), old_pos);
}
return true;
}
@@ -1135,6 +1136,7 @@
}
else {
util::call_skipped_token_hook(ctx, *it);
+ ++it;
}
}
else {
@@ -2260,8 +2262,10 @@
if (!impl::retrieve_line_info(expanded.begin(), expanded.end(),
line, file_name, error))
{
+ typename ContextT::string_type msg(
+ boost::wave::util::impl::as_string(expanded));
BOOST_WAVE_THROW_VAR_CTX(ctx, preprocess_exception, error,
- boost::wave::util::impl::as_string(expanded).c_str(), act_pos)
+ msg.c_str(), act_pos);
return;
}
@@ -2284,8 +2288,10 @@
// diagnose possible error in detected line directive
if (error != preprocess_exception::no_error) {
+ typename ContextT::string_type msg(
+ boost::wave::util::impl::as_string(expanded));
BOOST_WAVE_THROW_VAR_CTX(ctx, preprocess_exception, error,
- boost::wave::util::impl::as_string(expanded).c_str(), act_pos)
+ msg.c_str(), act_pos);
return;
}
@@ -2340,8 +2346,9 @@
#endif
{
// report the corresponding error
+ BOOST_WAVE_STRINGTYPE msg(boost::wave::util::impl::as_string(expanded));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, error_directive,
- boost::wave::util::impl::as_string(expanded).c_str(), act_pos);
+ msg.c_str(), act_pos);
}
}
@@ -2388,8 +2395,9 @@
#endif
{
// report the corresponding error
+ BOOST_WAVE_STRINGTYPE msg(boost::wave::util::impl::as_string(expanded));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, warning_directive,
- boost::wave::util::impl::as_string(expanded).c_str(), act_pos);
+ msg.c_str(), act_pos);
}
}
#endif // BOOST_WAVE_SUPPORT_WARNING_DIRECTIVE != 0
Modified: branches/release/boost/wave/util/cpp_macromap.hpp
==============================================================================
--- branches/release/boost/wave/util/cpp_macromap.hpp (original)
+++ branches/release/boost/wave/util/cpp_macromap.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -421,8 +421,9 @@
!IS_EXTCATEGORY(id, OperatorTokenType|AltExtTokenType) &&
!IS_CATEGORY(id, BoolLiteralTokenType))
{
+ std::string msg(impl::get_full_name(begin, end));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, invalid_macroname,
- impl::get_full_name(begin, end).c_str(), main_pos);
+ msg.c_str(), main_pos);
return false;
}
@@ -432,8 +433,9 @@
if (++it != end) {
// there should be only one token as the inspected name
+ std::string msg(impl::get_full_name(begin, end));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, invalid_macroname,
- impl::get_full_name(begin, end).c_str(), main_pos);
+ msg.c_str(), main_pos);
return false;
}
return is_defined(name, cit, 0);
Modified: branches/release/boost/wave/util/interpret_pragma.hpp
==============================================================================
--- branches/release/boost/wave/util/interpret_pragma.hpp (original)
+++ branches/release/boost/wave/util/interpret_pragma.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -107,10 +107,11 @@
)[spirit_assign_actor(values)],
pattern_p(WhiteSpaceTokenType, TokenTypeMask|PPTokenFlag)).hit)
{
+ typename ContextT::string_type msg(
+ impl::as_string<string_type>(it, end));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
ill_formed_pragma_option,
- impl::as_string<string_type>(it, end).c_str(),
- act_token.get_position());
+ msg.c_str(), act_token.get_position());
return false;
}
@@ -169,10 +170,11 @@
).hit
)
{
+ typename ContextT::string_type msg(
+ impl::as_string<string_type>(it, end));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
ill_formed_pragma_message,
- impl::as_string<string_type>(it, end).c_str(),
- act_token.get_position());
+ msg.c_str(), act_token.get_position());
return false;
}
@@ -184,9 +186,10 @@
}
// output the message itself
+ typename ContextT::string_type msg(impl::as_string(values));
BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
pragma_message_directive,
- impl::as_string(values).c_str(), act_token.get_position());
+ msg.c_str(), act_token.get_position());
return false;
}
#endif
Modified: branches/release/libs/spirit/doc/qi/concepts.qbk
==============================================================================
--- branches/release/libs/spirit/doc/qi/concepts.qbk (original)
+++ branches/release/libs/spirit/doc/qi/concepts.qbk 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -22,8 +22,8 @@
[heading Description]
The /Parser/ is the most fundamental concept. A Parser has a member
-function, `parse`, that accepts a first-last __fwditer__ pair andreturns bool as its result. The iterators delimit the data being parsed.function `parse`, that accepts a first-last __fwditer__ pair and
-returns `bool` as its result. The iterators delimit the data being parsed.
+function, `parse`, that accepts a first-last __fwditer__ pair and returns
+bool as its result. The iterators delimit the data being parsed.
The Parser's `parse` member function returns `true` if the parse
succeeds, in which case the first iterator is advanced accordingly. Each
Parser can represent a specific pattern or algorithm, or it can be a
Modified: branches/release/libs/spirit/test/karma/pattern2.cpp
==============================================================================
--- branches/release/libs/spirit/test/karma/pattern2.cpp (original)
+++ branches/release/libs/spirit/test/karma/pattern2.cpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -105,7 +105,7 @@
using boost::fusion::vector;
karma::rule<outiter_type, vector<int>()> r = int_;
- vector<int> v = 1;
+ vector<int> v(1);
BOOST_TEST(test("1", r, v));
}
@@ -113,7 +113,7 @@
using boost::fusion::vector;
karma::rule<outiter_type, space_type, vector<int>()> r = int_;
- vector<int> v = 1;
+ vector<int> v(1);
BOOST_TEST(test_delimited("1 ", r, v, space));
}
Modified: branches/release/libs/spirit/test/karma/sequence.cpp
==============================================================================
--- branches/release/libs/spirit/test/karma/sequence.cpp (original)
+++ branches/release/libs/spirit/test/karma/sequence.cpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -80,7 +80,7 @@
{
// a single element fusion sequence
- fusion::vector<char> attr = 'a';
+ fusion::vector<char> attr('a');
BOOST_TEST((test("ab", char_ << 'b', attr)));
}
Modified: branches/release/libs/spirit/test/qi/rule.cpp
==============================================================================
--- branches/release/libs/spirit/test/qi/rule.cpp (original)
+++ branches/release/libs/spirit/test/qi/rule.cpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -471,7 +471,7 @@
using boost::fusion::at_c;
rule<const char*, vector<int>()> r = int_;
- vector<int> v = 0;
+ vector<int> v(0);
BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
}
@@ -480,7 +480,7 @@
using boost::fusion::at_c;
rule<const char*, vector<unsigned int>()> r = uint_;
- vector<unsigned int> v = 0;
+ vector<unsigned int> v(0);
BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
}
Modified: branches/release/libs/wave/ChangeLog
==============================================================================
--- branches/release/libs/wave/ChangeLog (original)
+++ branches/release/libs/wave/ChangeLog 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -35,6 +35,8 @@
- Fixed a problem with the pp hooks 'expanding_object_like_macro' and
'expanding_function_like_macro', which when returning true were stopping all
preprocessing instead of just inhibiting the expansion of the macro.
+- Fixed a duplicated call to the pp hook skipped_token for preprocessing
+ directives inside inactive conditional branches.
Boost V1.44.0
- V2.0.6
Modified: branches/release/libs/wave/build/Jamfile.v2
==============================================================================
--- branches/release/libs/wave/build/Jamfile.v2 (original)
+++ branches/release/libs/wave/build/Jamfile.v2 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -11,6 +11,7 @@
project boost/wave
: requirements
<link>shared:<define>BOOST_ALL_DYN_LINK=1
+ <link>static:<define>BOOST_THREAD_USE_LIB=1
<toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE
<toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE
: source-location ../src
Modified: branches/release/tools/wave/trace_macro_expansion.hpp
==============================================================================
--- branches/release/tools/wave/trace_macro_expansion.hpp (original)
+++ branches/release/tools/wave/trace_macro_expansion.hpp 2010-10-24 18:20:01 EDT (Sun, 24 Oct 2010)
@@ -30,6 +30,7 @@
#include <boost/wave/preprocessing_hooks.hpp>
#include <boost/wave/whitespace_handling.hpp>
#include <boost/wave/language_support.hpp>
+#include <boost/wave/cpp_exceptions.hpp>
#include "stop_watch.hpp"
@@ -69,7 +70,8 @@
{
public:
enum error_code {
- pragma_system_not_enabled = boost::wave::preprocess_exception::last_error_number + 1,
+ pragma_system_not_enabled =
+ boost::wave::preprocess_exception::last_error_number + 1,
pragma_mismatched_push_pop,
};
@@ -510,10 +512,11 @@
if (!enable_system_command) {
// if the #pragma wave system() directive is not enabled, throw
// a corresponding error (actually its a remark),
+ typename ContextT::string_type msg(
+ boost::wave::util::impl::as_string(values));
BOOST_WAVE_THROW_CTX(ctx, bad_pragma_exception,
pragma_system_not_enabled,
- boost::wave::util::impl::as_string(values).c_str(),
- act_token.get_position());
+ msg.c_str(), act_token.get_position());
return false;
}
@@ -523,9 +526,10 @@
}
if (option.get_value() == "stop") {
// stop the execution and output the argument
- BOOST_WAVE_THROW_CTX(ctx, preprocess_exception, error_directive,
- boost::wave::util::impl::as_string(values).c_str(),
- act_token.get_position());
+ typename ContextT::string_type msg(
+ boost::wave::util::impl::as_string(values));
+ BOOST_WAVE_THROW_CTX(ctx, boost::wave::preprocess_exception,
+ error_directive, msg.c_str(), act_token.get_position());
return false;
}
if (option.get_value() == "option") {
@@ -828,7 +832,7 @@
option_str += boost::wave::util::impl::as_string(values);
option_str += ")";
}
- BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
+ BOOST_WAVE_THROW_CTX(ctx, boost::wave::preprocess_exception,
ill_formed_pragma_option, option_str.c_str(),
act_token.get_position());
return false;
@@ -1000,7 +1004,7 @@
// open the new file
outputstrm.open(fpath.string().c_str(), mode);
if (!outputstrm.is_open()) {
- BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
+ BOOST_WAVE_THROW_CTX(ctx, boost::wave::preprocess_exception,
could_not_open_output_file,
fpath.string().c_str(), act_token.get_position());
return false;
@@ -1153,7 +1157,7 @@
option_str += util::impl::as_string(values);
option_str += ")";
}
- BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
+ BOOST_WAVE_THROW_CTX(ctx, boost::wave::preprocess_exception,
ill_formed_pragma_option,
option_str.c_str(), act_token.get_position());
return false;
@@ -1190,7 +1194,7 @@
string_type error_str("unable to spawn command: ");
error_str += native_cmd;
- BOOST_WAVE_THROW_CTX(ctx, preprocess_exception,
+ BOOST_WAVE_THROW_CTX(ctx, boost::wave::preprocess_exception,
ill_formed_pragma_option,
error_str.c_str(), act_token.get_position());
return false;
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