Merge pull request #22 from NuxiNL/develop

Don't use thread unsafe wide character processing functions.
This commit is contained in:
Robert Ramey
2015-10-02 13:29:48 -06:00
3 changed files with 30 additions and 31 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}