Revised tentative fix for VC11/12 failures which occur when calling wcsxfrm for "\0".

This commit is contained in:
jzmaddock
2014-01-22 19:00:40 +00:00
parent 8ee162b2af
commit 88107e2c7b
3 changed files with 45 additions and 7 deletions

View File

@ -508,12 +508,18 @@ typename cpp_regex_traits_implementation<charT>::string_type
// we adhere to gcc's (buggy) preconditions... // we adhere to gcc's (buggy) preconditions...
// //
BOOST_ASSERT(*p2 == 0); BOOST_ASSERT(*p2 == 0);
if(p1 == p2)
{
return string_type(p1, p2);
}
string_type result; string_type result;
#if defined(_CPPLIB_VER)
//
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
// to std::collate::transform, but only for certain locales :-(
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
//
if(*p1 == 0)
{
return string_type(1, charT(0));
}
#endif
// //
// swallowing all exceptions here is a bad idea // swallowing all exceptions here is a bad idea
// however at least one std lib will always throw // however at least one std lib will always throw
@ -588,11 +594,17 @@ typename cpp_regex_traits_implementation<charT>::string_type
// std::bad_alloc for certain arguments... // std::bad_alloc for certain arguments...
// //
string_type result, result2; string_type result, result2;
if(p1 == p2) #if defined(_CPPLIB_VER)
//
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
// to std::collate::transform, but only for certain locales :-(
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
//
if(*p1 == 0)
{ {
result.assign(p1, p2);
return result; return result;
} }
#endif
#ifndef BOOST_NO_EXCEPTIONS #ifndef BOOST_NO_EXCEPTIONS
try{ try{
#endif #endif

View File

@ -54,6 +54,19 @@ c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::transfo
std::string src(p1, p2); std::string src(p1, p2);
while(s < (r = std::strxfrm(&*result.begin(), src.c_str(), s))) while(s < (r = std::strxfrm(&*result.begin(), src.c_str(), s)))
{ {
#if defined(_CPPLIB_VER)
//
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
// to std::strxfrm, but only for certain locales :-(
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
//
if(r == INT_MAX)
{
result.erase();
result.insert(result.begin(), static_cast<char>(0));
return result;
}
#endif
result.append(r - s + 3, ' '); result.append(r - s + 3, ' ');
s = result.size(); s = result.size();
} }

View File

@ -94,6 +94,19 @@ c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::t
std::wstring result(s, L' '); std::wstring result(s, L' ');
while(s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s))) while(s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s)))
{ {
#if defined(_CPPLIB_VER)
//
// A bug in VC11 and 12 causes the program to hang if we pass a null-string
// to std::strxfrm, but only for certain locales :-(
// Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
//
if(r == INT_MAX)
{
result.erase();
result.insert(result.begin(), static_cast<wchar_t>(0));
return result;
}
#endif
result.append(r - s + 3, L' '); result.append(r - s + 3, L' ');
s = result.size(); s = result.size();
} }