mirror of
https://github.com/boostorg/serialization.git
synced 2026-02-26 04:52:27 +00:00
Merge pull request #22 from NuxiNL/develop
Don't use thread unsafe wide character processing functions.
This commit is contained in:
@@ -18,10 +18,11 @@ namespace std{
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_NO_CWCHAR
|
||||
#include <cstdlib> // mbtowc
|
||||
#include <cwchar> // 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<Archive>::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<Archive>::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;
|
||||
|
||||
@@ -18,13 +18,14 @@
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <cstddef> // size_t
|
||||
#include <cstdlib> // for wctomb()
|
||||
#include <cwchar> // for mbstate_t and wcrtomb()
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#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);
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
#include <boost/assert.hpp>
|
||||
#include <cctype>
|
||||
#include <cstddef> // size_t
|
||||
#include <cstdlib> // mblen
|
||||
#include <cwchar> // mbstate_t and mbrtowc
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#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<class Base>
|
||||
wchar_t wchar_from_mb<Base>::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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user