123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765 |
- /*
- * Copyright (c) 1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Copyright (c) 1999
- * Boris Fomitchev
- *
- * This material is provided "as is", with absolutely no warranty expressed
- * or implied. Any use is at your own risk.
- *
- * Permission to use or copy this software for any purpose is hereby granted
- * without fee, provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
- */
- #include "stlport_prefix.h"
- #include <locale>
- #include <algorithm>
- #include <typeinfo>
- #include "c_locale.h"
- #include "aligned_buffer.h"
- #include "acquire_release.h"
- #include "locale_impl.h"
- _STLP_BEGIN_NAMESPACE
- static const string _Nameless("*");
- static inline bool is_C_locale_name (const char* name)
- { return ((name[0] == 'C') && (name[1] == 0)); }
- locale::facet * _STLP_CALL _get_facet(locale::facet *f)
- {
- if (f != 0)
- f->_M_incr();
- return f;
- }
- void _STLP_CALL _release_facet(locale::facet *&f)
- {
- if ((f != 0) && (f->_M_decr() == 0)) {
- delete f;
- f = 0;
- }
- }
- size_t locale::id::_S_max = 27;
- static void _Stl_loc_assign_ids();
- static _Stl_aligned_buffer<_Locale_impl::Init> __Loc_init_buf;
- _Locale_impl::Init::Init() {
- if (_M_count()._M_incr() == 1) {
- _Locale_impl::_S_initialize();
- }
- }
- _Locale_impl::Init::~Init() {
- if (_M_count()._M_decr() == 0) {
- _Locale_impl::_S_uninitialize();
- }
- }
- _Refcount_Base& _Locale_impl::Init::_M_count() const {
- static _Refcount_Base _S_count(0);
- return _S_count;
- }
- _Locale_impl::_Locale_impl(const char* s)
- : _Refcount_Base(0), name(s), facets_vec() {
- facets_vec.reserve( locale::id::_S_max );
- new (&__Loc_init_buf) Init();
- }
- _Locale_impl::_Locale_impl( _Locale_impl const& locimpl )
- : _Refcount_Base(0), name(locimpl.name), facets_vec() {
- for_each( locimpl.facets_vec.begin(), locimpl.facets_vec.end(), _get_facet);
- facets_vec = locimpl.facets_vec;
- new (&__Loc_init_buf) Init();
- }
- _Locale_impl::_Locale_impl( size_t n, const char* s)
- : _Refcount_Base(0), name(s), facets_vec(n, 0) {
- new (&__Loc_init_buf) Init();
- }
- _Locale_impl::~_Locale_impl() {
- (&__Loc_init_buf)->~Init();
- for_each( facets_vec.begin(), facets_vec.end(), _release_facet);
- }
- // Initialization of the locale system. This must be called before
- // any locales are constructed. (Meaning that it must be called when
- // the I/O library itself is initialized.)
- void _STLP_CALL _Locale_impl::_S_initialize() {
- _Stl_loc_assign_ids();
- make_classic_locale();
- }
- // Release of the classic locale ressources. Has to be called after the last
- // locale destruction and not only after the classic locale destruction as
- // the facets can be shared between different facets.
- void _STLP_CALL _Locale_impl::_S_uninitialize() {
- //Not necessary anymore as classic facets are now 'normal' dynamically allocated
- //facets with a reference counter telling to _release_facet when the facet can be
- //deleted.
- //free_classic_locale();
- }
- // _Locale_impl non-inline member functions.
- void _STLP_CALL _Locale_impl::_M_throw_bad_cast() {
- _STLP_THROW(bad_cast());
- }
- void _Locale_impl::insert(_Locale_impl *from, const locale::id& n) {
- if (n._M_index > 0 && n._M_index < from->size()) {
- this->insert(from->facets_vec[n._M_index], n);
- }
- }
- locale::facet* _Locale_impl::insert(locale::facet *f, const locale::id& n) {
- if (f == 0 || n._M_index == 0)
- return 0;
- if (n._M_index >= facets_vec.size()) {
- facets_vec.resize(n._M_index + 1);
- }
- if (f != facets_vec[n._M_index])
- {
- _release_facet(facets_vec[n._M_index]);
- facets_vec[n._M_index] = _get_facet(f);
- }
- return f;
- }
- //
- // <locale> content which is dependent on the name
- //
- /* Six functions, one for each category. Each of them takes a
- * a name, constructs that appropriate category facets by name,
- * and inserts them into the locale. */
- _Locale_name_hint* _Locale_impl::insert_ctype_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_ctype_default(buf);
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- _Locale_impl* i2 = locale::classic()._M_impl;
- this->insert(i2, ctype<char>::id);
- this->insert(i2, codecvt<char, char, mbstate_t>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, ctype<wchar_t>::id);
- this->insert(i2, codecvt<wchar_t, char, mbstate_t>::id);
- #endif
- } else {
- locale::facet* ct = 0;
- locale::facet* cvt = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet* wct = 0;
- locale::facet* wcvt = 0;
- #endif
- int __err_code;
- _Locale_ctype *__lct = _STLP_PRIV __acquire_ctype(name, buf, hint, &__err_code);
- if (!__lct) {
- locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
- return hint;
- }
- if (hint == 0) hint = _Locale_get_ctype_hint(__lct);
- _STLP_TRY {
- ct = new ctype_byname<char>(__lct);
- }
- _STLP_UNWIND(_STLP_PRIV __release_ctype(__lct));
- _STLP_TRY {
- cvt = new codecvt_byname<char, char, mbstate_t>(name);
- }
- _STLP_UNWIND(delete ct);
- #ifndef _STLP_NO_WCHAR_T
- _STLP_TRY {
- _Locale_ctype *__lwct = _STLP_PRIV __acquire_ctype(name, buf, hint, &__err_code);
- if (!__lwct) {
- locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
- return hint;
- }
- _STLP_TRY {
- wct = new ctype_byname<wchar_t>(__lwct);
- }
- _STLP_UNWIND(_STLP_PRIV __release_ctype(__lwct));
-
- _Locale_codecvt *__lwcvt = _STLP_PRIV __acquire_codecvt(name, buf, hint, &__err_code);
- if (__lwcvt) {
- _STLP_TRY {
- wcvt = new codecvt_byname<wchar_t, char, mbstate_t>(__lwcvt);
- }
- _STLP_UNWIND(_STLP_PRIV __release_codecvt(__lwcvt); delete wct);
- }
- }
- _STLP_UNWIND(delete cvt; delete ct);
- #endif
- this->insert(ct, ctype<char>::id);
- this->insert(cvt, codecvt<char, char, mbstate_t>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(wct, ctype<wchar_t>::id);
- if (wcvt) this->insert(wcvt, codecvt<wchar_t, char, mbstate_t>::id);
- #endif
- }
- return hint;
- }
- _Locale_name_hint* _Locale_impl::insert_numeric_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_numeric_default(buf);
- _Locale_impl* i2 = locale::classic()._M_impl;
- // We first insert name independant facets taken from the classic locale instance:
- this->insert(i2,
- num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id);
- this->insert(i2,
- num_get<char, istreambuf_iterator<char, char_traits<char> > >::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2,
- num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- this->insert(i2,
- num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- #endif
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- this->insert(i2, numpunct<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, numpunct<wchar_t>::id);
- #endif
- }
- else {
- locale::facet* punct = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet* wpunct = 0;
- #endif
- int __err_code;
- _Locale_numeric *__lpunct = _STLP_PRIV __acquire_numeric(name, buf, hint, &__err_code);
- if (!__lpunct) {
- locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
- return hint;
- }
- if (hint == 0) hint = _Locale_get_numeric_hint(__lpunct);
- _STLP_TRY {
- punct = new numpunct_byname<char>(__lpunct);
- }
- _STLP_UNWIND(_STLP_PRIV __release_numeric(__lpunct));
- #ifndef _STLP_NO_WCHAR_T
- _Locale_numeric *__lwpunct = _STLP_PRIV __acquire_numeric(name, buf, hint, &__err_code);
- if (!__lwpunct) {
- delete punct;
- locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
- return hint;
- }
- if (__lwpunct) {
- _STLP_TRY {
- wpunct = new numpunct_byname<wchar_t>(__lwpunct);
- }
- _STLP_UNWIND(_STLP_PRIV __release_numeric(__lwpunct); delete punct);
- }
- #endif
- this->insert(punct, numpunct<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(wpunct, numpunct<wchar_t>::id);
- #endif
- }
- return hint;
- }
- _Locale_name_hint* _Locale_impl::insert_time_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_time_default(buf);
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- _Locale_impl* i2 = locale::classic()._M_impl;
- this->insert(i2,
- time_get<char, istreambuf_iterator<char, char_traits<char> > >::id);
- this->insert(i2,
- time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2,
- time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- this->insert(i2,
- time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- #endif
- } else {
- locale::facet *get = 0;
- locale::facet *put = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet *wget = 0;
- locale::facet *wput = 0;
- #endif
- int __err_code;
- _Locale_time *__time = _STLP_PRIV __acquire_time(name, buf, hint, &__err_code);
- if (!__time) {
- // time facets category is not mandatory for correct stream behavior so if platform
- // do not support it we do not generate a runtime_error exception.
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- return hint;
- }
- if (!hint) hint = _Locale_get_time_hint(__time);
- _STLP_TRY {
- get = new time_get_byname<char, istreambuf_iterator<char, char_traits<char> > >(__time);
- put = new time_put_byname<char, ostreambuf_iterator<char, char_traits<char> > >(__time);
- #ifndef _STLP_NO_WCHAR_T
- wget = new time_get_byname<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(__time);
- wput = new time_put_byname<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(__time);
- #endif
- }
- #ifndef _STLP_NO_WCHAR_T
- _STLP_UNWIND(delete wget; delete put; delete get; _STLP_PRIV __release_time(__time));
- #else
- _STLP_UNWIND(delete get; _STLP_PRIV __release_time(__time));
- #endif
- _STLP_PRIV __release_time(__time);
- this->insert(get, time_get<char, istreambuf_iterator<char, char_traits<char> > >::id);
- this->insert(put, time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(wget, time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- this->insert(wput, time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- #endif
- }
- return hint;
- }
- _Locale_name_hint* _Locale_impl::insert_collate_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_collate_default(buf);
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- _Locale_impl* i2 = locale::classic()._M_impl;
- this->insert(i2, collate<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, collate<wchar_t>::id);
- #endif
- }
- else {
- locale::facet *col = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet *wcol = 0;
- #endif
- int __err_code;
- _Locale_collate *__coll = _STLP_PRIV __acquire_collate(name, buf, hint, &__err_code);
- if (!__coll) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- return hint;
- }
- if (hint == 0) hint = _Locale_get_collate_hint(__coll);
- _STLP_TRY {
- col = new collate_byname<char>(__coll);
- }
- _STLP_UNWIND(_STLP_PRIV __release_collate(__coll));
- #ifndef _STLP_NO_WCHAR_T
- _Locale_collate *__wcoll = _STLP_PRIV __acquire_collate(name, buf, hint, &__err_code);
- if (!__wcoll) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- delete col;
- _STLP_THROW_BAD_ALLOC;
- }
- }
- if (__wcoll) {
- _STLP_TRY {
- wcol = new collate_byname<wchar_t>(__wcoll);
- }
- _STLP_UNWIND(_STLP_PRIV __release_collate(__wcoll); delete col);
- }
- #endif
- this->insert(col, collate<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- if (wcol) this->insert(wcol, collate<wchar_t>::id);
- #endif
- }
- return hint;
- }
- _Locale_name_hint* _Locale_impl::insert_monetary_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_monetary_default(buf);
- _Locale_impl* i2 = locale::classic()._M_impl;
- // We first insert name independant facets taken from the classic locale instance:
- this->insert(i2, money_get<char, istreambuf_iterator<char, char_traits<char> > >::id);
- this->insert(i2, money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- this->insert(i2, money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id);
- #endif
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- this->insert(i2, moneypunct<char, false>::id);
- this->insert(i2, moneypunct<char, true>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, moneypunct<wchar_t, false>::id);
- this->insert(i2, moneypunct<wchar_t, true>::id);
- #endif
- }
- else {
- locale::facet *punct = 0;
- locale::facet *ipunct = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet* wpunct = 0;
- locale::facet* wipunct = 0;
- #endif
- int __err_code;
- _Locale_monetary *__mon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code);
- if (!__mon) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- return hint;
- }
- if (hint == 0) hint = _Locale_get_monetary_hint(__mon);
- _STLP_TRY {
- punct = new moneypunct_byname<char, false>(__mon);
- }
- _STLP_UNWIND(_STLP_PRIV __release_monetary(__mon));
- _Locale_monetary *__imon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code);
- if (!__imon) {
- delete punct;
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- return hint;
- }
- _STLP_TRY {
- ipunct = new moneypunct_byname<char, true>(__imon);
- }
- _STLP_UNWIND(_STLP_PRIV __release_monetary(__imon); delete punct);
- #ifndef _STLP_NO_WCHAR_T
- _STLP_TRY {
- _Locale_monetary *__wmon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code);
- if (!__wmon) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- }
- if (__wmon) {
- _STLP_TRY {
- wpunct = new moneypunct_byname<wchar_t, false>(__wmon);
- }
- _STLP_UNWIND(_STLP_PRIV __release_monetary(__wmon));
-
- _Locale_monetary *__wimon = _STLP_PRIV __acquire_monetary(name, buf, hint, &__err_code);
- if (!__wimon) {
- delete wpunct;
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- wpunct = 0;
- }
- else {
- _STLP_TRY {
- wipunct = new moneypunct_byname<wchar_t, true>(__wimon);
- }
- _STLP_UNWIND(_STLP_PRIV __release_monetary(__wimon); delete wpunct);
- }
- }
- }
- _STLP_UNWIND(delete ipunct; delete punct);
- #endif
- this->insert(punct, moneypunct<char, false>::id);
- this->insert(ipunct, moneypunct<char, true>::id);
- #ifndef _STLP_NO_WCHAR_T
- if (wpunct) this->insert(wpunct, moneypunct<wchar_t, false>::id);
- if (wipunct) this->insert(wipunct, moneypunct<wchar_t, true>::id);
- #endif
- }
- return hint;
- }
- _Locale_name_hint* _Locale_impl::insert_messages_facets(const char* &name, char *buf, _Locale_name_hint* hint) {
- if (name[0] == 0)
- name = _Locale_messages_default(buf);
- if (name == 0 || name[0] == 0 || is_C_locale_name(name)) {
- _Locale_impl* i2 = locale::classic()._M_impl;
- this->insert(i2, messages<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- this->insert(i2, messages<wchar_t>::id);
- #endif
- }
- else {
- locale::facet *msg = 0;
- #ifndef _STLP_NO_WCHAR_T
- locale::facet *wmsg = 0;
- #endif
- int __err_code;
- _Locale_messages *__msg = _STLP_PRIV __acquire_messages(name, buf, hint, &__err_code);
- if (!__msg) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- return hint;
- }
- _STLP_TRY {
- msg = new messages_byname<char>(__msg);
- }
- _STLP_UNWIND(_STLP_PRIV __release_messages(__msg));
- #ifndef _STLP_NO_WCHAR_T
- _STLP_TRY {
- _Locale_messages *__wmsg = _STLP_PRIV __acquire_messages(name, buf, hint, &__err_code);
- if (!__wmsg) {
- if (__err_code == _STLP_LOC_NO_MEMORY) {
- _STLP_THROW_BAD_ALLOC;
- }
- }
- if (__wmsg) {
- _STLP_TRY {
- wmsg = new messages_byname<wchar_t>(__wmsg);
- }
- _STLP_UNWIND(_STLP_PRIV __release_messages(__wmsg));
- }
- }
- _STLP_UNWIND(delete msg);
- #endif
- this->insert(msg, messages<char>::id);
- #ifndef _STLP_NO_WCHAR_T
- if (wmsg) this->insert(wmsg, messages<wchar_t>::id);
- #endif
- }
- return hint;
- }
- static void _Stl_loc_assign_ids() {
- // This assigns ids to every facet that is a member of a category,
- // and also to money_get/put, num_get/put, and time_get/put
- // instantiated using ordinary pointers as the input/output
- // iterators. (The default is [io]streambuf_iterator.)
- money_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 8;
- money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 9;
- num_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 10;
- num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 11;
- time_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 12;
- time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 13;
- #ifndef _STLP_NO_WCHAR_T
- money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 21;
- money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 22;
- num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 23;
- num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > ::id._M_index = 24;
- time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 25;
- time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 26;
- #endif
- // locale::id::_S_max = 27;
- }
- // To access those static instance use the getter below, they guaranty
- // a correct initialization.
- static locale *_Stl_classic_locale = 0;
- static locale *_Stl_global_locale = 0;
- locale* _Stl_get_classic_locale() {
- static _Locale_impl::Init init;
- return _Stl_classic_locale;
- }
- locale* _Stl_get_global_locale() {
- static _Locale_impl::Init init;
- return _Stl_global_locale;
- }
- #if defined (_STLP_MSVC) || defined (__ICL) || defined (__ISCPP__) || defined (__DMC__)
- /*
- * The following static variable needs to be initialized before STLport
- * users static variable in order for him to be able to use Standard
- * streams in its variable initialization.
- * This variable is here because MSVC do not allow to change the initialization
- * segment in a given translation unit, iostream.cpp already contains an
- * initialization segment specification.
- */
- # pragma warning (disable : 4073)
- # pragma init_seg(lib)
- #endif
- static ios_base::Init _IosInit;
- void _Locale_impl::make_classic_locale() {
- // This funcion will be called once: during build classic _Locale_impl
- // The classic locale contains every facet that belongs to a category.
- static _Stl_aligned_buffer<_Locale_impl> _Locale_classic_impl_buf;
- _Locale_impl *classic = new(&_Locale_classic_impl_buf) _Locale_impl("C");
- locale::facet* classic_facets[] = {
- 0,
- new collate<char>(1),
- new ctype<char>(0, false, 1),
- new codecvt<char, char, mbstate_t>(1),
- new moneypunct<char, true>(1),
- new moneypunct<char, false>(1),
- new numpunct<char>(1),
- new messages<char>(1),
- new money_get<char, istreambuf_iterator<char, char_traits<char> > >(1),
- new money_put<char, ostreambuf_iterator<char, char_traits<char> > >(1),
- new num_get<char, istreambuf_iterator<char, char_traits<char> > >(1),
- new num_put<char, ostreambuf_iterator<char, char_traits<char> > >(1),
- new time_get<char, istreambuf_iterator<char, char_traits<char> > >(1),
- new time_put<char, ostreambuf_iterator<char, char_traits<char> > >(1),
- #ifndef _STLP_NO_WCHAR_T
- new collate<wchar_t>(1),
- new ctype<wchar_t>(1),
- new codecvt<wchar_t, char, mbstate_t>(1),
- new moneypunct<wchar_t, true>(1),
- new moneypunct<wchar_t, false>(1),
- new numpunct<wchar_t>(1),
- new messages<wchar_t>(1),
- new money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- new money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- new num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- new num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- new time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- new time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(1),
- #endif
- 0
- };
- const size_t nb_classic_facets = sizeof(classic_facets) / sizeof(locale::facet *);
- classic->facets_vec.reserve(nb_classic_facets);
- classic->facets_vec.assign(&classic_facets[0], &classic_facets[0] + nb_classic_facets);
- static locale _Locale_classic(classic);
- _Stl_classic_locale = &_Locale_classic;
- static locale _Locale_global(classic);
- _Stl_global_locale = &_Locale_global;
- }
- // Declarations of (non-template) facets' static data members
- // size_t locale::id::_S_max = 27; // made before
- locale::id collate<char>::id = { 1 };
- locale::id ctype<char>::id = { 2 };
- locale::id codecvt<char, char, mbstate_t>::id = { 3 };
- locale::id moneypunct<char, true>::id = { 4 };
- locale::id moneypunct<char, false>::id = { 5 };
- locale::id numpunct<char>::id = { 6 } ;
- locale::id messages<char>::id = { 7 };
- #ifndef _STLP_NO_WCHAR_T
- locale::id collate<wchar_t>::id = { 14 };
- locale::id ctype<wchar_t>::id = { 15 };
- locale::id codecvt<wchar_t, char, mbstate_t>::id = { 16 };
- locale::id moneypunct<wchar_t, true>::id = { 17 } ;
- locale::id moneypunct<wchar_t, false>::id = { 18 } ;
- locale::id numpunct<wchar_t>::id = { 19 };
- locale::id messages<wchar_t>::id = { 20 };
- #endif
- _STLP_DECLSPEC _Locale_impl* _STLP_CALL _get_Locale_impl(_Locale_impl *loc)
- {
- _STLP_ASSERT( loc != 0 );
- loc->_M_incr();
- return loc;
- }
- void _STLP_CALL _release_Locale_impl(_Locale_impl *& loc)
- {
- _STLP_ASSERT( loc != 0 );
- if (loc->_M_decr() == 0) {
- if (*loc != *_Stl_classic_locale)
- delete loc;
- else
- loc->~_Locale_impl();
- loc = 0;
- }
- }
- _STLP_DECLSPEC _Locale_impl* _STLP_CALL _copy_Nameless_Locale_impl(_Locale_impl *loc)
- {
- _STLP_ASSERT( loc != 0 );
- _Locale_impl *loc_new = new _Locale_impl(*loc);
- loc_new->name = _Nameless;
- return loc_new;
- }
- /* _GetFacetId implementation have to be here in order to be in the same translation unit
- * as where id are initialize (in _Stl_loc_assign_ids) */
- _STLP_MOVE_TO_PRIV_NAMESPACE
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<char, istreambuf_iterator<char, char_traits<char> > >*)
- { return money_get<char, istreambuf_iterator<char, char_traits<char> > >::id; }
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<char, ostreambuf_iterator<char, char_traits<char> > >*)
- { return money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; }
- #ifndef _STLP_NO_WCHAR_T
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- #endif
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<char, istreambuf_iterator<char, char_traits<char> > >*)
- { return num_get<char, istreambuf_iterator<char, char_traits<char> > >::id; }
- #ifndef _STLP_NO_WCHAR_T
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- #endif
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<char, ostreambuf_iterator<char, char_traits<char> > >*)
- { return num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; }
- #ifndef _STLP_NO_WCHAR_T
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- #endif
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<char, istreambuf_iterator<char, char_traits<char> > >*)
- { return time_get<char, istreambuf_iterator<char, char_traits<char> > >::id; }
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<char, ostreambuf_iterator<char, char_traits<char> > >*)
- { return time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id; }
- #ifndef _STLP_NO_WCHAR_T
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- _STLP_DECLSPEC locale::id& _STLP_CALL _GetFacetId(const time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >*)
- { return time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id; }
- #endif
- _STLP_MOVE_TO_STD_NAMESPACE
- _STLP_END_NAMESPACE
|