From 40f6cfcc84a2cbba2f2fe2a8a3bacc1c8c96a448 Mon Sep 17 00:00:00 2001 From: Robert Ramey Date: Fri, 2 Oct 2015 15:03:02 -0700 Subject: [PATCH] Fixed problems with new wchar/mbchar conversion bumped archive version number --- .../boost/archive/impl/xml_iarchive_impl.ipp | 47 ++++++++++--------- .../boost/archive/iterators/wchar_from_mb.hpp | 8 ++-- src/basic_archive.cpp | 3 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/include/boost/archive/impl/xml_iarchive_impl.ipp b/include/boost/archive/impl/xml_iarchive_impl.ipp index 957edee5..bf947749 100644 --- a/include/boost/archive/impl/xml_iarchive_impl.ipp +++ b/include/boost/archive/impl/xml_iarchive_impl.ipp @@ -66,22 +66,21 @@ xml_iarchive_impl::load(std::wstring &ws){ #endif ws.resize(0); std::mbstate_t mbs; - std::mbrtowc(0, 0, 0, &mbs); const char * start = s.data(); const char * end = start + s.size(); while(start < end){ wchar_t wc; - int resultx = std::mbrtowc(&wc, start, end - start, &mbs); - if(0 < resultx){ - start += resultx; - ws += wc; + std::size_t result = std::mbrtowc(&wc, start, end - start, &mbs); + if(result == static_cast(-1)) + boost::serialization::throw_exception( + iterators::dataflow_exception( + iterators::dataflow_exception::invalid_conversion + ) + ); + if(result == static_cast(-2)) continue; - } - boost::serialization::throw_exception( - iterators::dataflow_exception( - iterators::dataflow_exception::invalid_conversion - ) - ); + start += result; + ws += wc; } } #endif // BOOST_NO_STD_WSTRING @@ -94,26 +93,28 @@ xml_iarchive_impl::load(wchar_t * ws){ bool result = gimpl->parse_string(is, s); if(! result) boost::serialization::throw_exception( - xml_archive_exception(xml_archive_exception::xml_archive_parsing_error) + xml_archive_exception( + xml_archive_exception::xml_archive_parsing_error + ) ); std::mbstate_t mbs; - std::mbrtowc(0, 0, 0, &mbs); const char * start = s.data(); const char * end = start + s.size(); while(start < end){ wchar_t wc; - int length = std::mbrtowc(&wc, start, end - start, &mbs); - if(0 < length){ - start += length; - *ws++ = wc; + std::size_t length = std::mbrtowc(&wc, start, end - start, &mbs); + if(static_cast(-1) == length) + boost::serialization::throw_exception( + iterators::dataflow_exception( + iterators::dataflow_exception::invalid_conversion + ) + ); + if(static_cast(-2) == length) continue; - } - boost::serialization::throw_exception( - iterators::dataflow_exception( - iterators::dataflow_exception::invalid_conversion - ) - ); + + start += length; + *ws++ = wc; } *ws = L'\0'; } diff --git a/include/boost/archive/iterators/wchar_from_mb.hpp b/include/boost/archive/iterators/wchar_from_mb.hpp index ee93bd5f..998a4686 100644 --- a/include/boost/archive/iterators/wchar_from_mb.hpp +++ b/include/boost/archive/iterators/wchar_from_mb.hpp @@ -102,18 +102,16 @@ public: template wchar_t wchar_from_mb::drain(){ std::mbstate_t mbs; - std::mbrtowc(0, 0, 0, &mbs); wchar_t retval; - int result; + std::size_t result; do { char val = *this->base_reference(); result = std::mbrtowc(&retval, &val, 1, &mbs); - if(result == -1) + if(result == static_cast(-1)) boost::serialization::throw_exception(iterators::dataflow_exception( iterators::dataflow_exception::invalid_conversion )); - ++(this->base_reference()); - } while (result == -2); + } while (result == static_cast(-2)); return retval; } diff --git a/src/basic_archive.cpp b/src/basic_archive.cpp index 1a7b57d1..52566fa6 100644 --- a/src/basic_archive.cpp +++ b/src/basic_archive.cpp @@ -74,10 +74,11 @@ BOOST_ARCHIVE_SIGNATURE(){ // 11- not changes // 12- improved serialization of collections // 13- simplified visibility, removed Borland, removed pfto +// 14- improved visibility, refactor map/set BOOST_SYMBOL_VISIBLE library_version_type BOOST_ARCHIVE_VERSION(){ - return library_version_type(13); + return library_version_type(14); } } // namespace archive