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#include "stlport_prefix.h" 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale> 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm> 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <typeinfo> 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h" 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "aligned_buffer.h" 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "acquire_release.h" 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "locale_impl.h" 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 317eced231853cc34e9f2710a81664dee108176317Andrew Hsiehstatic const char _Nameless[] = "*"; 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic inline bool is_C_locale_name (const char* name) 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return ((name[0] == 'C') && (name[1] == 0)); } 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::facet * _STLP_CALL _get_facet(locale::facet *f) 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (f != 0) 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f->_M_incr(); 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return f; 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _release_facet(locale::facet *&f) 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ((f != 0) && (f->_M_decr() == 0)) { 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete f; 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f = 0; 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottsize_t locale::id::_S_max = 27; 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Stl_loc_assign_ids(); 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic _Stl_aligned_buffer<_Locale_impl::Init> __Loc_init_buf; 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::Init::Init() { 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_count()._M_incr() == 1) { 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl::_S_initialize(); 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::Init::~Init() { 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_count()._M_decr() == 0) { 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl::_S_uninitialize(); 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Refcount_Base& _Locale_impl::Init::_M_count() const { 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _Refcount_Base _S_count(0); 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return _S_count; 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::_Locale_impl(const char* s) 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _Refcount_Base(0), name(s), facets_vec() { 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott facets_vec.reserve( locale::id::_S_max ); 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new (&__Loc_init_buf) Init(); 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::_Locale_impl( _Locale_impl const& locimpl ) 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _Refcount_Base(0), name(locimpl.name), facets_vec() { 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for_each( locimpl.facets_vec.begin(), locimpl.facets_vec.end(), _get_facet); 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott facets_vec = locimpl.facets_vec; 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new (&__Loc_init_buf) Init(); 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::_Locale_impl( size_t n, const char* s) 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : _Refcount_Base(0), name(s), facets_vec(n, 0) { 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new (&__Loc_init_buf) Init(); 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_impl::~_Locale_impl() { 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (&__Loc_init_buf)->~Init(); 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for_each( facets_vec.begin(), facets_vec.end(), _release_facet); 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Initialization of the locale system. This must be called before 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// any locales are constructed. (Meaning that it must be called when 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// the I/O library itself is initialized.) 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _Locale_impl::_S_initialize() { 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_loc_assign_ids(); 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott make_classic_locale(); 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Release of the classic locale ressources. Has to be called after the last 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// locale destruction and not only after the classic locale destruction as 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// the facets can be shared between different facets. 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _Locale_impl::_S_uninitialize() { 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Not necessary anymore as classic facets are now 'normal' dynamically allocated 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //facets with a reference counter telling to _release_facet when the facet can be 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //deleted. 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //free_classic_locale(); 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// _Locale_impl non-inline member functions. 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _Locale_impl::_M_throw_bad_cast() { 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW(bad_cast()); 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_impl::insert(_Locale_impl *from, const locale::id& n) { 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (n._M_index > 0 && n._M_index < from->size()) { 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(from->facets_vec[n._M_index], n); 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::facet* _Locale_impl::insert(locale::facet *f, const locale::id& n) { 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (f == 0 || n._M_index == 0) 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return 0; 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (n._M_index >= facets_vec.size()) { 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott facets_vec.resize(n._M_index + 1); 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (f != facets_vec[n._M_index]) 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _release_facet(facets_vec[n._M_index]); 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott facets_vec[n._M_index] = _get_facet(f); 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return f; 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// <locale> content which is dependent on the name 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* Six functions, one for each category. Each of them takes a 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * a name, constructs that appropriate category facets by name, 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * and inserts them into the locale. */ 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_ctype_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_ctype_default(buf); 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, ctype<char>::id); 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, codecvt<char, char, mbstate_t>::id); 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, ctype<wchar_t>::id); 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, codecvt<wchar_t, char, mbstate_t>::id); 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else { 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* ct = 0; 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* cvt = 0; 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* wct = 0; 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* wcvt = 0; 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_ctype *__lct = _STLP_PRIV __acquire_ctype(name, buf, hint, &__err_code); 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__lct) { 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::_M_throw_on_creation_failure(__err_code, name, "ctype"); 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (hint == 0) hint = _Locale_get_ctype_hint(__lct); 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ct = new ctype_byname<char>(__lct); 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_ctype(__lct)); 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cvt = new codecvt_byname<char, char, mbstate_t>(name); 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete ct); 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_ctype *__lwct = _STLP_PRIV __acquire_ctype(name, buf, hint, &__err_code); 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__lwct) { 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::_M_throw_on_creation_failure(__err_code, name, "ctype"); 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wct = new ctype_byname<wchar_t>(__lwct); 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_ctype(__lwct)); 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_codecvt *__lwcvt = _STLP_PRIV __acquire_codecvt(name, buf, hint, &__err_code); 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__lwcvt) { 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wcvt = new codecvt_byname<wchar_t, char, mbstate_t>(__lwcvt); 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_codecvt(__lwcvt); delete wct); 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete cvt; delete ct); 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(ct, ctype<char>::id); 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(cvt, codecvt<char, char, mbstate_t>::id); 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(wct, ctype<wchar_t>::id); 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (wcvt) this->insert(wcvt, codecvt<wchar_t, char, mbstate_t>::id); 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_numeric_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_numeric_default(buf); 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // We first insert name independant facets taken from the classic locale instance: 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, numpunct<char>::id); 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, numpunct<wchar_t>::id); 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* punct = 0; 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* wpunct = 0; 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_numeric *__lpunct = _STLP_PRIV __acquire_numeric(name, buf, hint, &__err_code); 254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__lpunct) { 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::_M_throw_on_creation_failure(__err_code, name, "numpunct"); 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (hint == 0) hint = _Locale_get_numeric_hint(__lpunct); 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott punct = new numpunct_byname<char>(__lpunct); 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_numeric(__lpunct)); 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_numeric *__lwpunct = _STLP_PRIV __acquire_numeric(name, buf, hint, &__err_code); 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__lwpunct) { 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete punct; 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::_M_throw_on_creation_failure(__err_code, name, "numpunct"); 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__lwpunct) { 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wpunct = new numpunct_byname<wchar_t>(__lwpunct); 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_numeric(__lwpunct); delete punct); 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(punct, numpunct<char>::id); 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(wpunct, numpunct<wchar_t>::id); 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_time_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_time_default(buf); 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else { 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *get = 0; 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *put = 0; 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *wget = 0; 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *wput = 0; 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_time *__time = _STLP_PRIV __acquire_time(name, buf, hint, &__err_code); 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__time) { 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // time facets category is not mandatory for correct stream behavior so if platform 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // do not support it we do not generate a runtime_error exception. 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!hint) hint = _Locale_get_time_hint(__time); 324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott get = new time_get_byname<char, istreambuf_iterator<char, char_traits<char> > >(__time); 326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott put = new time_put_byname<char, ostreambuf_iterator<char, char_traits<char> > >(__time); 327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wget = new time_get_byname<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(__time); 329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wput = new time_put_byname<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(__time); 330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete wget; delete put; delete get; _STLP_PRIV __release_time(__time)); 334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete get; _STLP_PRIV __release_time(__time)); 336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_PRIV __release_time(__time); 339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(get, time_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(put, time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(wget, time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(wput, time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_collate_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_collate_default(buf); 353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, collate<char>::id); 357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, collate<wchar_t>::id); 359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *col = 0; 363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *wcol = 0; 365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_collate *__coll = _STLP_PRIV __acquire_collate(name, buf, hint, &__err_code); 369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__coll) { 370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (hint == 0) hint = _Locale_get_collate_hint(__coll); 377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott col = new collate_byname<char>(__coll); 379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_collate(__coll)); 381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_collate *__wcoll = _STLP_PRIV __acquire_collate(name, buf, hint, &__err_code); 384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__wcoll) { 385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete col; 387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__wcoll) { 391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wcol = new collate_byname<wchar_t>(__wcoll); 393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_collate(__wcoll); delete col); 395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(col, collate<char>::id); 399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (wcol) this->insert(wcol, collate<wchar_t>::id); 401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_monetary_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_monetary_default(buf); 409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // We first insert name independant facets taken from the classic locale instance: 413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, money_get<char, istreambuf_iterator<char, char_traits<char> > >::id); 414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id); 415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id); 418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, moneypunct<char, false>::id); 422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, moneypunct<char, true>::id); 423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, moneypunct<wchar_t, false>::id); 425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, moneypunct<wchar_t, true>::id); 426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *punct = 0; 430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *ipunct = 0; 431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* wpunct = 0; 434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* wipunct = 0; 435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_monetary *__mon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code); 439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__mon) { 440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (hint == 0) hint = _Locale_get_monetary_hint(__mon); 447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott punct = new moneypunct_byname<char, false>(__mon); 450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_monetary(__mon)); 452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_monetary *__imon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code); 454e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__imon) { 455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete punct; 456e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 458e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 460e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 461e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 462e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ipunct = new moneypunct_byname<char, true>(__imon); 464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_monetary(__imon); delete punct); 466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_monetary *__wmon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code); 470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__wmon) { 471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__wmon) { 477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wpunct = new moneypunct_byname<wchar_t, false>(__wmon); 479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_monetary(__wmon)); 481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_monetary *__wimon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code); 483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__wimon) { 484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete wpunct; 485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wpunct = 0; 489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wipunct = new moneypunct_byname<wchar_t, true>(__wimon); 493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_monetary(__wimon); delete wpunct); 495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete ipunct; delete punct); 499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(punct, moneypunct<char, false>::id); 502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(ipunct, moneypunct<char, true>::id); 503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (wpunct) this->insert(wpunct, moneypunct<wchar_t, false>::id); 505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (wipunct) this->insert(wipunct, moneypunct<wchar_t, true>::id); 506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 507e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 508e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Locale_name_hint* _Locale_impl::insert_messages_facets(const char* &name, char *buf, _Locale_name_hint* hint) { 512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name[0] == 0) 513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott name = _Locale_messages_default(buf); 514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 515e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (name == 0 || name[0] == 0 || is_C_locale_name(name)) { 516e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl* i2 = locale::classic()._M_impl; 517e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, messages<char>::id); 518e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 519e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(i2, messages<wchar_t>::id); 520e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *msg = 0; 524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 525e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet *wmsg = 0; 526e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 527e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 528e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __err_code; 529e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_messages *__msg = _STLP_PRIV __acquire_messages(name, buf, hint, &__err_code); 530e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__msg) { 531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 532e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 533e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 534e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott msg = new messages_byname<char>(__msg); 539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_messages(__msg)); 541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 543e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 544e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_messages *__wmsg = _STLP_PRIV __acquire_messages(name, buf, hint, &__err_code); 545e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!__wmsg) { 546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__err_code == _STLP_LOC_NO_MEMORY) { 547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 548e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 549e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 551e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__wmsg) { 552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_TRY { 553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wmsg = new messages_byname<wchar_t>(__wmsg); 554e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 555e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(_STLP_PRIV __release_messages(__wmsg)); 556e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 557e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 558e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_UNWIND(delete msg); 559e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 561e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott this->insert(msg, messages<char>::id); 562e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 563e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (wmsg) this->insert(wmsg, messages<wchar_t>::id); 564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 565e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 566e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return hint; 567e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 568e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 569e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Stl_loc_assign_ids() { 570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // This assigns ids to every facet that is a member of a category, 571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // and also to money_get/put, num_get/put, and time_get/put 572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // instantiated using ordinary pointers as the input/output 573e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // iterators. (The default is [io]streambuf_iterator.) 574e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 575e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott money_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 8; 576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 9; 577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 10; 578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 11; 579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 12; 580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 13; 581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 582e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 21; 584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 22; 585e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 23; 586e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > ::id._M_index = 24; 587e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 25; 588e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 26; 589e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 590e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // locale::id::_S_max = 27; 591e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// To access those static instance use the getter below, they guaranty 594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// a correct initialization. 595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic locale *_Stl_classic_locale = 0; 596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic locale *_Stl_global_locale = 0; 597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale* _Stl_get_classic_locale() { 599e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _Locale_impl::Init init; 600e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return _Stl_classic_locale; 601e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 602e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale* _Stl_get_global_locale() { 604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _Locale_impl::Init init; 605e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return _Stl_global_locale; 606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MSVC) || defined (__ICL) || defined (__ISCPP__) || defined (__DMC__) 609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * The following static variable needs to be initialized before STLport 611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * users static variable in order for him to be able to use Standard 612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * streams in its variable initialization. 613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This variable is here because MSVC do not allow to change the initialization 614e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * segment in a given translation unit, iostream.cpp already contains an 615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * initialization segment specification. 616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# pragma warning (disable : 4073) 618e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# pragma init_seg(lib) 619e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic ios_base::Init _IosInit; 622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _Locale_impl::make_classic_locale() { 624e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // This funcion will be called once: during build classic _Locale_impl 625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // The classic locale contains every facet that belongs to a category. 627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _Stl_aligned_buffer<_Locale_impl> _Locale_classic_impl_buf; 628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl *classic = new(&_Locale_classic_impl_buf) _Locale_impl("C"); 629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 630e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::facet* classic_facets[] = { 631e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 0, 632e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new collate<char>(1), 633e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new ctype<char>(0, false, 1), 634e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new codecvt<char, char, mbstate_t>(1), 635e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new moneypunct<char, true>(1), 636e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new moneypunct<char, false>(1), 637e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new numpunct<char>(1), 638e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new messages<char>(1), 639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new money_get<char, istreambuf_iterator<char, char_traits<char> > >(1), 640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new money_put<char, ostreambuf_iterator<char, char_traits<char> > >(1), 641e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new num_get<char, istreambuf_iterator<char, char_traits<char> > >(1), 642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new num_put<char, ostreambuf_iterator<char, char_traits<char> > >(1), 643e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new time_get<char, istreambuf_iterator<char, char_traits<char> > >(1), 644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new time_put<char, ostreambuf_iterator<char, char_traits<char> > >(1), 645e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new collate<wchar_t>(1), 647e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new ctype<wchar_t>(1), 648e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new codecvt<wchar_t, char, mbstate_t>(1), 649e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new moneypunct<wchar_t, true>(1), 650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new moneypunct<wchar_t, false>(1), 651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new numpunct<wchar_t>(1), 652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new messages<wchar_t>(1), 653e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 654e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 657e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 658e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott new time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1), 659e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 0 661e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott }; 662e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 663e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const size_t nb_classic_facets = sizeof(classic_facets) / sizeof(locale::facet *); 664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott classic->facets_vec.reserve(nb_classic_facets); 665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott classic->facets_vec.assign(&classic_facets[0], &classic_facets[0] + nb_classic_facets); 666e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 667e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static locale _Locale_classic(classic); 668e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_classic_locale = &_Locale_classic; 669e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 670e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static locale _Locale_global(classic); 671e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Stl_global_locale = &_Locale_global; 672e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 673e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 674e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Declarations of (non-template) facets' static data members 675e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// size_t locale::id::_S_max = 27; // made before 676e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 677e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id collate<char>::id = { 1 }; 678e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id ctype<char>::id = { 2 }; 679e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id codecvt<char, char, mbstate_t>::id = { 3 }; 680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id moneypunct<char, true>::id = { 4 }; 681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id moneypunct<char, false>::id = { 5 }; 682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id numpunct<char>::id = { 6 } ; 683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id messages<char>::id = { 7 }; 684e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 685e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 686e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id collate<wchar_t>::id = { 14 }; 687e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id ctype<wchar_t>::id = { 15 }; 688e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id codecvt<wchar_t, char, mbstate_t>::id = { 16 }; 689e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id moneypunct<wchar_t, true>::id = { 17 } ; 690e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id moneypunct<wchar_t, false>::id = { 18 } ; 691e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id numpunct<wchar_t>::id = { 19 }; 692e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id messages<wchar_t>::id = { 20 }; 693e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 694e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 695e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Locale_impl* _STLP_CALL _get_Locale_impl(_Locale_impl *loc) 696e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 697e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_ASSERT( loc != 0 ); 698e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc->_M_incr(); 699e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return loc; 700e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 702e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL _release_Locale_impl(_Locale_impl *& loc) 703e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_ASSERT( loc != 0 ); 705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (loc->_M_decr() == 0) { 706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (*loc != *_Stl_classic_locale) 707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott delete loc; 708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else 709e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc->~_Locale_impl(); 710e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = 0; 711e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 713e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Locale_impl* _STLP_CALL _copy_Nameless_Locale_impl(_Locale_impl *loc) 715e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 716e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_ASSERT( loc != 0 ); 717e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_impl *loc_new = new _Locale_impl(*loc); 718e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc_new->name = _Nameless; 719e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return loc_new; 720e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 721e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 722e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* _GetFacetId implementation have to be here in order to be in the same translation unit 723e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * as where id are initialize (in _Stl_loc_assign_ids) */ 724e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE 725e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 726e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<char, istreambuf_iterator<char, char_traits<char> > >*) 727e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return money_get<char, istreambuf_iterator<char, char_traits<char> > >::id; } 728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<char, ostreambuf_iterator<char, char_traits<char> > >*) 729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; } 730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 732e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 733e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 737e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<char, istreambuf_iterator<char, char_traits<char> > >*) 738e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return num_get<char, istreambuf_iterator<char, char_traits<char> > >::id; } 739e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 740e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 741e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 742e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 743e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 744e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<char, ostreambuf_iterator<char, char_traits<char> > >*) 745e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; } 746e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 747e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 748e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 749e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 750e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<char, istreambuf_iterator<char, char_traits<char> > >*) 752e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return time_get<char, istreambuf_iterator<char, char_traits<char> > >::id; } 753e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<char, ostreambuf_iterator<char, char_traits<char> > >*) 754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; } 755e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T 756e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 758e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*) 759e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; } 760e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 761e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 762e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE 763e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 764e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 765e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 766