mirror of
https://github.com/boostorg/regex.git
synced 2025-07-16 22:02:08 +02:00
Fix for broken std::setlocale implementations (MacOS X ?)
[SVN r17575]
This commit is contained in:
@ -54,6 +54,17 @@ void c_regex_adopted_no_longer_needed_loop_shutter_upper() { }
|
|||||||
|
|
||||||
namespace{
|
namespace{
|
||||||
|
|
||||||
|
//
|
||||||
|
// helper function to get the locale name,
|
||||||
|
// works around possibly broken setlocale implementations:
|
||||||
|
//
|
||||||
|
const char* getlocale(int id)
|
||||||
|
{
|
||||||
|
static const char* def = "Unknown";
|
||||||
|
const char* pl = std::setlocale(id, 0);
|
||||||
|
return pl ? pl : def;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// character classes:
|
// character classes:
|
||||||
//
|
//
|
||||||
@ -237,9 +248,9 @@ void BOOST_REGEX_CALL re_free_classes()
|
|||||||
void BOOST_REGEX_CALL re_update_classes()
|
void BOOST_REGEX_CALL re_update_classes()
|
||||||
{
|
{
|
||||||
BOOST_RE_GUARD_STACK
|
BOOST_RE_GUARD_STACK
|
||||||
if(*re_cls_name != std::setlocale(LC_CTYPE, 0))
|
if(*re_cls_name != getlocale(LC_CTYPE))
|
||||||
{
|
{
|
||||||
*re_cls_name = std::setlocale(LC_CTYPE, 0);
|
*re_cls_name = getlocale(LC_CTYPE);
|
||||||
char buf[256];
|
char buf[256];
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for(i = 0; i < re_classes_max; ++i)
|
for(i = 0; i < re_classes_max; ++i)
|
||||||
@ -286,9 +297,9 @@ void BOOST_REGEX_CALL re_free_collate()
|
|||||||
void BOOST_REGEX_CALL re_update_collate()
|
void BOOST_REGEX_CALL re_update_collate()
|
||||||
{
|
{
|
||||||
BOOST_RE_GUARD_STACK
|
BOOST_RE_GUARD_STACK
|
||||||
if(*re_coll_name != std::setlocale(LC_COLLATE, 0))
|
if(*re_coll_name != getlocale(LC_COLLATE))
|
||||||
{
|
{
|
||||||
*re_coll_name = std::setlocale(LC_COLLATE, 0);
|
*re_coll_name = getlocale(LC_COLLATE);
|
||||||
char buf[256];
|
char buf[256];
|
||||||
unsigned int i = 400;
|
unsigned int i = 400;
|
||||||
re_get_message(buf, 256, i);
|
re_get_message(buf, 256, i);
|
||||||
@ -350,7 +361,7 @@ void BOOST_REGEX_CALL re_message_update()
|
|||||||
//
|
//
|
||||||
// called whenever the global locale changes:
|
// called whenever the global locale changes:
|
||||||
//
|
//
|
||||||
std::string l(std::setlocale(LC_MESSAGES, 0));
|
std::string l(getlocale(LC_MESSAGES));
|
||||||
if(*mess_locale != l)
|
if(*mess_locale != l)
|
||||||
{
|
{
|
||||||
*mess_locale = l;
|
*mess_locale = l;
|
||||||
@ -641,15 +652,15 @@ void BOOST_REGEX_CALL c_regex_traits<char>::update()
|
|||||||
re_detail::cs_guard g(*re_detail::p_re_lock);
|
re_detail::cs_guard g(*re_detail::p_re_lock);
|
||||||
#endif
|
#endif
|
||||||
re_message_update();
|
re_message_update();
|
||||||
if(*collate_name != std::setlocale(LC_COLLATE, 0))
|
if(*collate_name != getlocale(LC_COLLATE))
|
||||||
{
|
{
|
||||||
do_update_collate();
|
do_update_collate();
|
||||||
*collate_name = std::setlocale(LC_COLLATE, 0);
|
*collate_name = getlocale(LC_COLLATE);
|
||||||
}
|
}
|
||||||
if(*ctype_name != std::setlocale(LC_CTYPE, 0))
|
if(*ctype_name != getlocale(LC_CTYPE))
|
||||||
{
|
{
|
||||||
do_update_ctype();
|
do_update_ctype();
|
||||||
*ctype_name = std::setlocale(LC_CTYPE, 0);
|
*ctype_name = getlocale(LC_CTYPE);
|
||||||
}
|
}
|
||||||
sort_type = re_detail::find_sort_syntax(&i, &sort_delim);
|
sort_type = re_detail::find_sort_syntax(&i, &sort_delim);
|
||||||
}
|
}
|
||||||
@ -838,7 +849,7 @@ void BOOST_REGEX_CALL c_regex_traits<wchar_t>::update()
|
|||||||
re_message_update();
|
re_message_update();
|
||||||
re_update_classes();
|
re_update_classes();
|
||||||
re_update_collate();
|
re_update_collate();
|
||||||
std::string l(std::setlocale(LC_CTYPE, 0));
|
std::string l(getlocale(LC_CTYPE));
|
||||||
if(*wlocale_name != l)
|
if(*wlocale_name != l)
|
||||||
{
|
{
|
||||||
*wlocale_name = l;
|
*wlocale_name = l;
|
||||||
|
Reference in New Issue
Block a user