mirror of
https://github.com/boostorg/regex.git
synced 2025-07-18 14:52:08 +02:00
Revised tentative fix for VC11/12 failures which occur when calling wcsxfrm for "\0".
This commit is contained in:
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user