diff --git a/include/boost/archive/impl/xml_iarchive_impl.ipp b/include/boost/archive/impl/xml_iarchive_impl.ipp index 7639ecb3..957edee5 100644 --- a/include/boost/archive/impl/xml_iarchive_impl.ipp +++ b/include/boost/archive/impl/xml_iarchive_impl.ipp @@ -18,10 +18,11 @@ namespace std{ #endif #ifndef BOOST_NO_CWCHAR -#include // mbtowc +#include // mbstate_t and mbrtowc #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ - using ::mbtowc; + using ::mbstate_t; + using ::mbrtowc; } // namespace std #endif #endif // BOOST_NO_CWCHAR @@ -64,11 +65,13 @@ xml_iarchive_impl::load(std::wstring &ws){ if(NULL != ws.data()) #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::mbtowc(&wc, start, end - start); + int resultx = std::mbrtowc(&wc, start, end - start, &mbs); if(0 < resultx){ start += resultx; ws += wc; @@ -94,11 +97,13 @@ xml_iarchive_impl::load(wchar_t * ws){ 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::mbtowc(&wc, start, end - start); + int length = std::mbrtowc(&wc, start, end - start, &mbs); if(0 < length){ start += length; *ws++ = wc; diff --git a/include/boost/archive/iterators/mb_from_wchar.hpp b/include/boost/archive/iterators/mb_from_wchar.hpp index deb798f6..d76eb3e2 100644 --- a/include/boost/archive/iterators/mb_from_wchar.hpp +++ b/include/boost/archive/iterators/mb_from_wchar.hpp @@ -18,13 +18,14 @@ #include #include // size_t -#include // for wctomb() +#include // for mbstate_t and wcrtomb() #include #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ using ::size_t; - using ::wctomb; + using ::mbstate_t; + using ::wcrtomb; } // namespace std #endif @@ -82,13 +83,10 @@ class mb_from_wchar } void fill(){ + std::mbstate_t mbs; + std::wcrtomb(0, 0, &mbs); wchar_t value = * this->base_reference(); - #if (defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 3) \ - || ((__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION >= 8)))) - m_bend = std::wcrtomb(m_buffer, value,0); - #else - m_bend = std::wctomb(m_buffer, value); - #endif + m_bend = std::wcrtomb(m_buffer, value, &mbs); BOOST_ASSERT(-1 != m_bend); BOOST_ASSERT((std::size_t)m_bend <= sizeof(m_buffer)); BOOST_ASSERT(m_bend > 0); diff --git a/include/boost/archive/iterators/wchar_from_mb.hpp b/include/boost/archive/iterators/wchar_from_mb.hpp index ad1d4cbb..ee93bd5f 100644 --- a/include/boost/archive/iterators/wchar_from_mb.hpp +++ b/include/boost/archive/iterators/wchar_from_mb.hpp @@ -19,13 +19,13 @@ #include #include #include // size_t -#include // mblen +#include // mbstate_t and mbrtowc #include #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ - using ::mblen; - using ::mbtowc; + using ::mbstate_t; + using ::mbrtowc; } // namespace std #endif @@ -101,23 +101,19 @@ public: template wchar_t wchar_from_mb::drain(){ - char buffer[9]; - char * bptr = buffer; - char val; - for(std::size_t i = 0; i++ < (unsigned)MB_CUR_MAX;){ - val = * this->base_reference(); - *bptr++ = val; - int result = std::mblen(buffer, i); - if(-1 != result) - break; - ++(this->base_reference()); - } + std::mbstate_t mbs; + std::mbrtowc(0, 0, 0, &mbs); wchar_t retval; - int result = std::mbtowc(& retval, buffer, MB_CUR_MAX); - if(0 >= result) - boost::serialization::throw_exception(iterators::dataflow_exception( - iterators::dataflow_exception::invalid_conversion - )); + int result; + do { + char val = *this->base_reference(); + result = std::mbrtowc(&retval, &val, 1, &mbs); + if(result == -1) + boost::serialization::throw_exception(iterators::dataflow_exception( + iterators::dataflow_exception::invalid_conversion + )); + ++(this->base_reference()); + } while (result == -2); return retval; }