1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h" 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale> 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stdexcept> 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h" 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "locale_impl.h" 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 297eced231853cc34e9f2710a81664dee108176317Andrew Hsieh#define _NAMELESS "*" 307eced231853cc34e9f2710a81664dee108176317Andrew Hsiehstatic const char _Nameless[] = _NAMELESS; 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic inline bool is_C_locale_name (const char* name) 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ((name[0] == 'C') && (name[1] == 0)); } 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale* _Stl_get_classic_locale(); 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale* _Stl_get_global_locale(); 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) || \ 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott defined (_STLP_SIGNAL_RUNTIME_COMPATIBILITY) || defined (_STLP_CHECK_RUNTIME_COMPATIBILITY) 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define locale _STLP_NO_MEM_T_NAME(loc) 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::facet::~facet() {} 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MEMBER_TEMPLATES) || defined (_STLP_INLINE_MEMBER_TEMPLATES) 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// members that fail to be templates 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool locale::operator()(const string& __x, 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const string& __y) const 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __locale_do_operator_call(*this, __x, __y); } 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (_STLP_NO_WCHAR_T) 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool locale::operator()(const wstring& __x, 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const wstring& __y) const 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return __locale_do_operator_call(*this, __x, __y); } 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL locale::_M_throw_on_null_name() 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_THROW(runtime_error("Invalid null locale name")); } 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL locale::_M_throw_on_combine_error(const string& name) { 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string what = "Unable to find facet"; 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " in "; 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += name.empty() ? "system" : name.c_str(); 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " locale"; 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW(runtime_error(what.c_str())); 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL locale::_M_throw_on_creation_failure(int __err_code, 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* name, const char* facet) { 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string what; 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott switch (__err_code) { 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case _STLP_LOC_UNSUPPORTED_FACET_CATEGORY: 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what = "No platform localization support for "; 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += facet; 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " facet category, unable to create facet for "; 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += name[0] == 0 ? "system" : name; 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " locale"; 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case _STLP_LOC_NO_PLATFORM_SUPPORT: 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what = "No platform localization support, unable to create "; 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += name[0] == 0 ? "system" : name; 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " locale"; 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott default: 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case _STLP_LOC_UNKNOWN_NAME: 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what = "Unable to create facet "; 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += facet; 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += " from name '"; 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += name; 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott what += "'"; 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott case _STLP_LOC_NO_MEMORY: 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW(runtime_error(what.c_str())); 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Takes a reference to a locale::id, assign a numeric index if not already 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// affected and returns it. The returned index is always positive. 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const locale::id& _Stl_loc_get_index(locale::id& id) { 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (id._M_index == 0) { 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_ATOMIC_INCREMENT) && !defined (_STLP_WIN95_LIKE) 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _STLP_VOLATILE __stl_atomic_t _S_index = __STATIC_CAST(__stl_atomic_t, locale::id::_S_max); 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott id._M_index = _STLP_ATOMIC_INCREMENT(&_S_index); 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _STLP_STATIC_MUTEX _Index_lock _STLP_MUTEX_INITIALIZER; 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_auto_lock sentry(_Index_lock); 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t new_index = locale::id::_S_max++; 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott id._M_index = new_index; 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return id; 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Default constructor: create a copy of the global locale. 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale() _STLP_NOTHROW 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_impl(_get_Locale_impl(_Stl_get_global_locale()->_M_impl)) 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{} 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Copy constructor 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale(const locale& L) _STLP_NOTHROW 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_impl( _get_Locale_impl( L._M_impl ) ) 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{} 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid locale::_M_insert(facet* f, locale::id& n) { 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (f) 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl->insert(f, _Stl_loc_get_index(n)); 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale( _Locale_impl* impl ) : 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl( _get_Locale_impl( impl ) ) 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{} 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Create a locale from a name. 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale(const char* name) 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_impl(0) { 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!name) 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_throw_on_null_name(); 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (is_C_locale_name(name)) { 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl = _get_Locale_impl( locale::classic()._M_impl ); 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* impl = 0; 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl = new _Locale_impl(locale::id::_S_max, name); 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Insert categories one at a time. 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_name_hint *hint = 0; 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* ctype_name = name; 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char ctype_buf[_Locale_MAX_SIMPLE_NAME]; 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* numeric_name = name; 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char numeric_buf[_Locale_MAX_SIMPLE_NAME]; 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* time_name = name; 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char time_buf[_Locale_MAX_SIMPLE_NAME]; 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* collate_name = name; 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char collate_buf[_Locale_MAX_SIMPLE_NAME]; 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* monetary_name = name; 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char monetary_buf[_Locale_MAX_SIMPLE_NAME]; 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* messages_name = name; 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char messages_buf[_Locale_MAX_SIMPLE_NAME]; 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_ctype_facets(ctype_name, ctype_buf, hint); 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_numeric_facets(numeric_name, numeric_buf, hint); 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_time_facets(time_name, time_buf, hint); 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_collate_facets(collate_name, collate_buf, hint); 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_monetary_facets(monetary_name, monetary_buf, hint); 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert_messages_facets(messages_name, messages_buf, hint); 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Try to use a normalize locale name in order to have the == operator 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // to behave correctly: 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (strcmp(ctype_name, numeric_name) == 0 && 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, time_name) == 0 && 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, collate_name) == 0 && 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, monetary_name) == 0 && 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, messages_name) == 0) { 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->name = ctype_name; 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // else we keep current name. 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // reassign impl 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl = _get_Locale_impl( impl ); 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete impl); 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Stl_loc_combine_names_aux(_Locale_impl* L, 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* name, 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* ctype_name, const char* time_name, const char* numeric_name, 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* collate_name, const char* monetary_name, const char* messages_name, 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::category c) { 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // This function is only called when names has been validated so using _Locale_extract_*_name 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // can't fail. 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char buf[_Locale_MAX_SIMPLE_NAME]; 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name = string("LC_CTYPE=") + _Locale_extract_ctype_name((c & locale::ctype) ? ctype_name : name, buf, 0, &__err_code) + ";"; 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name += string("LC_TIME=") + _Locale_extract_time_name((c & locale::time) ? time_name : name, buf, 0, &__err_code) + ";"; 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name += string("LC_NUMERIC=") + _Locale_extract_numeric_name((c & locale::numeric) ? numeric_name : name, buf, 0, &__err_code) + ";"; 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name += string("LC_COLLATE=") + _Locale_extract_collate_name((c & locale::collate) ? collate_name : name, buf, 0, &__err_code) + ";"; 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name += string("LC_MONETARY=") + _Locale_extract_monetary_name((c & locale::monetary) ? monetary_name : name, buf, 0, &__err_code) + ";"; 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name += string("LC_MESSAGES=") + _Locale_extract_messages_name((c & locale::messages) ? messages_name : name, buf, 0, &__err_code); 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Give L a name where all facets except those in category c 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// are taken from name1, and those in category c are taken from name2. 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Stl_loc_combine_names(_Locale_impl* L, 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* name1, const char* name2, 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::category c) { 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ((c & locale::all) == 0 || strcmp(name1, name1) == 0) 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name = name1; 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else if ((c & locale::all) == locale::all) 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name = name2; 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_loc_combine_names_aux(L, name1, name2, name2, name2, name2, name2, name2, c); 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Stl_loc_combine_names(_Locale_impl* L, 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* name, 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* ctype_name, const char* time_name, const char* numeric_name, 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* collate_name, const char* monetary_name, const char* messages_name, 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::category c) { 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ((c & locale::all) == 0 || (strcmp(name, ctype_name) == 0 && 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(name, time_name) == 0 && 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(name, numeric_name) == 0 && 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(name, collate_name) == 0 && 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(name, monetary_name) == 0 && 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(name, messages_name) == 0)) 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name = name; 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else if ((c & locale::all) == locale::all && strcmp(ctype_name, time_name) == 0 && 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, numeric_name) == 0 && 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, collate_name) == 0 && 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, monetary_name) == 0 && 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strcmp(ctype_name, messages_name) == 0) 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott L->name = ctype_name; 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_loc_combine_names_aux(L, name, ctype_name, time_name, numeric_name, collate_name, monetary_name, messages_name, c); 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Create a locale that's a copy of L, except that all of the facets 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// in category c are instead constructed by name. 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale(const locale& L, const char* name, locale::category c) 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_impl(0) { 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!name) 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_throw_on_null_name(); 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 2520e7a705cd6f755153c1f2cceb09af1e515ca9f1dMark Salyzyn if (!::strcmp(_Nameless, name)) { 2537eced231853cc34e9f2710a81664dee108176317Andrew Hsieh _STLP_THROW(runtime_error("Invalid locale name '" _NAMELESS "'")); 2540e7a705cd6f755153c1f2cceb09af1e515ca9f1dMark Salyzyn } 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* impl = 0; 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl = new _Locale_impl(*L._M_impl); 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_name_hint *hint = 0; 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* ctype_name = name; 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char ctype_buf[_Locale_MAX_SIMPLE_NAME]; 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* numeric_name = name; 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char numeric_buf[_Locale_MAX_SIMPLE_NAME]; 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* time_name = name; 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char time_buf[_Locale_MAX_SIMPLE_NAME]; 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* collate_name = name; 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char collate_buf[_Locale_MAX_SIMPLE_NAME]; 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* monetary_name = name; 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char monetary_buf[_Locale_MAX_SIMPLE_NAME]; 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* messages_name = name; 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char messages_buf[_Locale_MAX_SIMPLE_NAME]; 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::ctype) 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_ctype_facets(ctype_name, ctype_buf, hint); 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::numeric) 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_numeric_facets(numeric_name, numeric_buf, hint); 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::time) 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_time_facets(time_name, time_buf, hint); 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::collate) 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_collate_facets(collate_name, collate_buf, hint); 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::monetary) 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott hint = impl->insert_monetary_facets(monetary_name, monetary_buf,hint); 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & locale::messages) 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert_messages_facets(messages_name, messages_buf, hint); 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_loc_combine_names(impl, L._M_impl->name.c_str(), 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ctype_name, time_name, numeric_name, 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott collate_name, monetary_name, messages_name, c); 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl = _get_Locale_impl( impl ); 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete impl) 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Contruct a new locale where all facets that aren't in category c 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// come from L1, and all those that are in category c come from L2. 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::locale(const locale& L1, const locale& L2, category c) 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _M_impl(0) { 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* impl = new _Locale_impl(*L1._M_impl); 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = L2._M_impl; 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (L1.name() != _Nameless && L2.name() != _Nameless) 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_loc_combine_names(impl, L1._M_impl->name.c_str(), L2._M_impl->name.c_str(), c); 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->name = _Nameless; 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & collate) { 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::collate<char>::id); 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::collate<wchar_t>::id); 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & ctype) { 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::ctype<char>::id); 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::codecvt<char, char, mbstate_t>::id); 318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::ctype<wchar_t>::id); 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::codecvt<wchar_t, char, mbstate_t>::id); 321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & monetary) { 324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::moneypunct<char, true>::id); 325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::moneypunct<char, false>::id); 326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::money_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::moneypunct<wchar_t, true>::id); 330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::moneypunct<wchar_t, false>::id); 331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & numeric) { 336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::numpunct<char>::id); 337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::num_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::numpunct<wchar_t>::id); 341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & time) { 346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::time_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (c & messages) { 354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::messages<char>::id); 355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott impl->insert( i2, _STLP_STD::messages<wchar_t>::id); 357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl = _get_Locale_impl( impl ); 360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Destructor. 363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::~locale() _STLP_NOTHROW { 364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_impl) 365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _release_Locale_impl(_M_impl); 366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Assignment operator. Much like the copy constructor: just a bit of 369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// pointer twiddling. 370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale& locale::operator=(const locale& L) _STLP_NOTHROW { 371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (this->_M_impl != L._M_impl) { 372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (this->_M_impl) 373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _release_Locale_impl(this->_M_impl); 374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->_M_impl = _get_Locale_impl(L._M_impl); 375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return *this; 377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::facet* locale::_M_get_facet(const locale::id& n) const { 380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return n._M_index < _M_impl->size() ? _M_impl->facets_vec[n._M_index] : 0; 381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::facet* locale::_M_use_facet(const locale::id& n) const { 384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* f = (n._M_index < _M_impl->size() ? _M_impl->facets_vec[n._M_index] : 0); 385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!f) 386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_impl->_M_throw_bad_cast(); 387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return f; 388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring locale::name() const { 391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return _M_impl->name; 392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Compare two locales for equality. 395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool locale::operator==(const locale& L) const { 396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return this->_M_impl == L._M_impl || 397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (this->name() == L.name() && this->name() != _Nameless); 398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool locale::operator!=(const locale& L) const { 401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return !(*this == L); 402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// static data members. 405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale& _STLP_CALL locale::classic() { 407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return *_Stl_get_classic_locale(); 408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) 411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale _STLP_CALL locale::global(const locale& L) { 412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl* _STLP_CALL locale::global(const locale& L) { 414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale old(_Stl_get_global_locale()->_M_impl); 416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_Stl_get_global_locale()->_M_impl != L._M_impl) { 417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _release_Locale_impl(_Stl_get_global_locale()->_M_impl); 418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // this assign should be atomic, should be fixed here: 419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_get_global_locale()->_M_impl = _get_Locale_impl(L._M_impl); 420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Set the global C locale, if appropriate. 422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined(_STLP_NO_LOCALE_SUPPORT) 423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (L.name() != _Nameless) 424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott setlocale(LC_ALL, L.name().c_str()); 425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) 429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return old; 430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return old._M_impl; 432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_STATIC_CONST_INIT_BUG) && !defined (_STLP_NO_STATIC_CONST_DEFINITION) 436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::none; 437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::collate; 438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::ctype; 439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::monetary; 440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::numeric; 441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::time; 442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::messages; 443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst locale::category locale::all; 444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 448