void _Locale_impl::insert_messages_facets(const char* pname) { _Locale_impl* i2 = locale::classic()._M_impl; messages<char> *msg = 0; #ifndef _STLP_NO_WCHAR_T messages<wchar_t> *wmsg = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (pname == 0 || pname[0] == 0) pname = _Locale_messages_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { this->insert(i2, messages<char>::id); #ifndef _STLP_NO_WCHAR_T this->insert(i2, messages<wchar_t>::id); #endif } else { _STLP_TRY { msg = new messages_byname<char>(pname); #ifndef _STLP_NO_WCHAR_T wmsg = new messages_byname<wchar_t>(pname); #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete msg; delete wmsg); #else _STLP_UNWIND(delete msg); #endif _Locale_insert(this,msg); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wmsg); #endif } }
// Create a locale from a name. locale::locale(const char* name) : _M_impl(0) { if (!name) _M_throw_runtime_error(0); if (is_C_locale_name(name)) { _M_impl = _get_Locale_impl( locale::classic()._M_impl ); return; } _Locale_impl* impl = 0; _STLP_TRY { impl = new _Locale_impl(locale::id::_S_max, name); // Insert categories one at a time. impl->insert_ctype_facets(name); impl->insert_numeric_facets(name); impl->insert_time_facets(name); impl->insert_collate_facets(name); impl->insert_monetary_facets(name); impl->insert_messages_facets(name); // reassign impl _M_impl = _get_Locale_impl( impl ); } _STLP_UNWIND(delete impl); }
void _Locale_impl::insert_numeric_facets(const char* pname) { _Locale_impl* i2 = locale::classic()._M_impl; numpunct<char>* punct = 0; num_get<char, istreambuf_iterator<char, char_traits<char> > > *get = 0; num_put<char, ostreambuf_iterator<char, char_traits<char> > > *put = 0; #ifndef _STLP_NO_WCHAR_T numpunct<wchar_t>* wpunct = 0; num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wget = 0; num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wput = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (pname == 0 || pname[0] == 0) pname = _Locale_numeric_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { this->insert(i2, numpunct<char>::id); 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, numpunct<wchar_t>::id); 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 } else { _STLP_TRY { punct = new numpunct_byname<char>(pname); get = new num_get<char, istreambuf_iterator<char, char_traits<char> > >; put = new num_put<char, ostreambuf_iterator<char, char_traits<char> > >; #ifndef _STLP_NO_WCHAR_T wpunct = new numpunct_byname<wchar_t>(pname); wget = new num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >; wput = new num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >; #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete punct; delete wpunct; delete get; delete wget; delete put; delete wput); #else _STLP_UNWIND(delete punct; delete get;delete put); #endif _Locale_insert(this,punct); _Locale_insert(this,get); _Locale_insert(this,put); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wpunct); _Locale_insert(this,wget); _Locale_insert(this,wput); #endif } }
_Locale_name_hint* _Locale_impl::insert_time_facets(const char* pname, _Locale_name_hint* hint) { _Locale_impl* i2 = locale::classic()._M_impl; time_get<char, istreambuf_iterator<char, char_traits<char> > > *get = 0; time_put<char, ostreambuf_iterator<char, char_traits<char> > > *put = 0; #ifndef _STLP_NO_WCHAR_T time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wget = 0; time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wput = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (pname == 0 || pname[0] == 0) pname = _Locale_time_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { 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 { _STLP_TRY { time_get_byname<char, istreambuf_iterator<char, char_traits<char> > > *getbn = _CHECK_PTR(new time_get_byname<char, istreambuf_iterator<char, char_traits<char> > >(pname, 0, hint)); get = getbn; #if !defined (__DMC__) if (hint == 0) hint = _Locale_time_extract_hint(getbn); #endif put = _CHECK_PTR(new time_put_byname<char, ostreambuf_iterator<char, char_traits<char> > >(pname, 0, hint)); #ifndef _STLP_NO_WCHAR_T wget = _CHECK_PTR(new time_get_byname<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >(pname, 0, hint)); wput = _CHECK_PTR(new time_put_byname<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >(pname, 0, hint)); #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete get; delete wget; delete put; delete wput); #else _STLP_UNWIND(delete get; delete put); #endif _Locale_insert(this,get); _Locale_insert(this,put); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wget); _Locale_insert(this,wput); #endif } return hint; }
// Create a locale from a name. locale::locale(const char* name) : _M_impl(0) { if (!name) _M_throw_on_null_name(); if (is_C_locale_name(name)) { _M_impl = _get_Locale_impl( locale::classic()._M_impl ); return; } _Locale_impl* impl = 0; _STLP_TRY { impl = new _Locale_impl(locale::id::_S_max, name); // Insert categories one at a time. _Locale_name_hint *hint = 0; const char* ctype_name = name; char ctype_buf[_Locale_MAX_SIMPLE_NAME]; const char* numeric_name = name; char numeric_buf[_Locale_MAX_SIMPLE_NAME]; const char* time_name = name; char time_buf[_Locale_MAX_SIMPLE_NAME]; const char* collate_name = name; char collate_buf[_Locale_MAX_SIMPLE_NAME]; const char* monetary_name = name; char monetary_buf[_Locale_MAX_SIMPLE_NAME]; const char* messages_name = name; char messages_buf[_Locale_MAX_SIMPLE_NAME]; hint = impl->insert_ctype_facets(ctype_name, ctype_buf, hint); hint = impl->insert_numeric_facets(numeric_name, numeric_buf, hint); hint = impl->insert_time_facets(time_name, time_buf, hint); hint = impl->insert_collate_facets(collate_name, collate_buf, hint); hint = impl->insert_monetary_facets(monetary_name, monetary_buf, hint); impl->insert_messages_facets(messages_name, messages_buf, hint); // Try to use a normalize locale name in order to have the == operator // to behave correctly: if (strcmp(ctype_name, numeric_name) == 0 && strcmp(ctype_name, time_name) == 0 && strcmp(ctype_name, collate_name) == 0 && strcmp(ctype_name, monetary_name) == 0 && strcmp(ctype_name, messages_name) == 0) { impl->name = ctype_name; } // else we keep current name. // reassign impl _M_impl = _get_Locale_impl( impl ); } _STLP_UNWIND(delete impl); }
_Locale_name_hint* _Locale_impl::insert_collate_facets(const char* nam, _Locale_name_hint* hint) { _Locale_impl* i2 = locale::classic()._M_impl; collate<char> *col = 0; #ifndef _STLP_NO_WCHAR_T collate<wchar_t> *wcol = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (nam == 0 || nam[0] == 0) nam = _Locale_collate_default(buf); if (nam == 0 || nam[0] == 0 || is_C_locale_name(nam)) { this->insert(i2, collate<char>::id); #ifndef _STLP_NO_WCHAR_T this->insert(i2, collate<wchar_t>::id); #endif } else { _STLP_TRY { collate_byname<char> *colbn = _CHECK_PTR(new collate_byname<char>(nam, 0, hint)); col = colbn; #if !defined (__DMC__) if (hint == 0) hint = _Locale_extract_hint(colbn); #endif #ifndef _STLP_NO_WCHAR_T wcol = _CHECK_PTR(new collate_byname<wchar_t>(nam, 0, hint)); #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete col; delete wcol); #else _STLP_UNWIND(delete col); #endif _Locale_insert(this,col); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wcol); #endif } return hint; }
void _Locale_impl::insert_collate_facets(const char* nam) { _Locale_impl* i2 = locale::classic()._M_impl; collate<char> *col = 0; #ifndef _STLP_NO_WCHAR_T collate<wchar_t> *wcol = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (nam == 0 || nam[0] == 0) nam = _Locale_collate_default(buf); if (nam == 0 || nam[0] == 0 || is_C_locale_name(nam)) { this->insert(i2, collate<char>::id); #ifndef _STLP_NO_WCHAR_T this->insert(i2, collate<wchar_t>::id); #endif } else { _STLP_TRY { col = new collate_byname<char>(nam); #ifndef _STLP_NO_WCHAR_T wcol = new collate_byname<wchar_t>(nam); #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete col; delete wcol); #else _STLP_UNWIND(delete col); #endif _Locale_insert(this,col); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wcol); #endif } }
_Locale_name_hint* _Locale_impl::insert_monetary_facets(const char* pname, _Locale_name_hint* hint) { _Locale_impl* i2 = locale::classic()._M_impl; moneypunct<char, false> *punct = 0; moneypunct<char, true> *ipunct = 0; money_get<char, istreambuf_iterator<char, char_traits<char> > > *get = 0; money_put<char, ostreambuf_iterator<char, char_traits<char> > > *put = 0; #ifndef _STLP_NO_WCHAR_T moneypunct<wchar_t, false>* wpunct = 0; moneypunct<wchar_t, true>* wipunct = 0; money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wget = 0; money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > *wput = 0; #endif char buf[_Locale_MAX_SIMPLE_NAME]; if (pname == 0 || pname[0] == 0) pname = _Locale_monetary_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { this->insert(i2, moneypunct<char, false>::id); this->insert(i2, moneypunct<char, true>::id); 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, moneypunct<wchar_t, false>::id); this->insert(i2, moneypunct<wchar_t, true>::id); 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 } else { _STLP_TRY { moneypunct_byname<char, false>* punctbn = new moneypunct_byname<char, false>(pname, 0, hint); punct = punctbn; #if !defined (__DMC__) if (hint == 0) hint = _Locale_extract_hint(punctbn); #endif ipunct = _CHECK_PTR(new moneypunct_byname<char, true>(pname, 0, hint)); get = _CHECK_PTR(new money_get<char, istreambuf_iterator<char, char_traits<char> > >); put = _CHECK_PTR(new money_put<char, ostreambuf_iterator<char, char_traits<char> > >); #ifndef _STLP_NO_WCHAR_T wpunct = _CHECK_PTR(new moneypunct_byname<wchar_t, false>(pname, 0, hint)); wipunct = _CHECK_PTR(new moneypunct_byname<wchar_t, true>(pname, 0, hint)); wget = _CHECK_PTR(new money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >); wput = _CHECK_PTR(new money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >); #endif } #ifndef _STLP_NO_WCHAR_T _STLP_UNWIND(delete punct; delete ipunct; delete wpunct; delete wipunct; delete get; delete wget; delete put; delete wput); #else _STLP_UNWIND(delete punct; delete ipunct; delete get; delete put); #endif _Locale_insert(this,punct); _Locale_insert(this,ipunct); _Locale_insert(this,get); _Locale_insert(this,put); #ifndef _STLP_NO_WCHAR_T _Locale_insert(this,wget); _Locale_insert(this,wpunct); _Locale_insert(this,wipunct); _Locale_insert(this,wput); #endif } return hint; }
/* * Six functions, one for each category. Each of them takes a * _Locale* and 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* pname, _Locale_name_hint* hint) { char buf[_Locale_MAX_SIMPLE_NAME]; _Locale_impl* i2 = locale::classic()._M_impl; if (pname == 0 || pname[0] == 0) pname = _Locale_ctype_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { this->insert(i2, ctype<char>::id); #ifndef _STLP_NO_MBSTATE_T this->insert(i2, codecvt<char, char, mbstate_t>::id); #endif #ifndef _STLP_NO_WCHAR_T this->insert(i2, ctype<wchar_t>::id); # ifndef _STLP_NO_MBSTATE_T this->insert(i2, codecvt<wchar_t, char, mbstate_t>::id); # endif #endif } else { ctype<char>* ct = 0; #ifndef _STLP_NO_MBSTATE_T codecvt<char, char, mbstate_t>* cvt = 0; #endif #ifndef _STLP_NO_WCHAR_T ctype<wchar_t>* wct = 0; codecvt<wchar_t, char, mbstate_t>* wcvt = 0; #endif _STLP_TRY { ctype_byname<char> *ctbn = _CHECK_PTR(new ctype_byname<char>(pname, 0, hint)); ct = ctbn; #if !defined (__DMC__) if (hint == 0) hint = _Locale_extract_hint(ctbn); #endif #ifndef _STLP_NO_MBSTATE_T cvt = _CHECK_PTR(new codecvt_byname<char, char, mbstate_t>(pname)); #endif #ifndef _STLP_NO_WCHAR_T wct = _CHECK_PTR(new ctype_byname<wchar_t>(pname, 0, hint)); wcvt = _CHECK_PTR(new codecvt_byname<wchar_t, char, mbstate_t>(pname, 0, hint)); #endif } #ifndef _STLP_NO_WCHAR_T # ifdef _STLP_NO_MBSTATE_T _STLP_UNWIND(delete ct; delete wct; delete wcvt); # else _STLP_UNWIND(delete ct; delete wct; delete cvt; delete wcvt); # endif #else # ifdef _STLP_NO_MBSTATE_T _STLP_UNWIND(delete ct); # else _STLP_UNWIND(delete ct; delete cvt); # endif #endif _Locale_insert(this, ct); #ifndef _STLP_NO_MBSTATE_T _Locale_insert(this, cvt); #endif #ifndef _STLP_NO_WCHAR_T _Locale_insert(this, wct); _Locale_insert(this, wcvt); #endif } return hint; }
/* * Six functions, one for each category. Each of them takes a * _Locale* and a name, constructs that appropriate category * facets by name, and inserts them into the locale. */ void _Locale_impl::insert_ctype_facets(const char* pname) { char buf[_Locale_MAX_SIMPLE_NAME]; _Locale_impl* i2 = locale::classic()._M_impl; if (pname == 0 || pname[0] == 0) pname = _Locale_ctype_default(buf); if (pname == 0 || pname[0] == 0 || is_C_locale_name(pname)) { this->insert(i2, ctype<char>::id); #ifndef _STLP_NO_MBSTATE_T this->insert(i2, codecvt<char, char, mbstate_t>::id); #endif #ifndef _STLP_NO_WCHAR_T this->insert(i2, ctype<wchar_t>::id); # ifndef _STLP_NO_MBSTATE_T this->insert(i2, codecvt<wchar_t, char, mbstate_t>::id); # endif #endif } else { ctype<char>* ct = 0; #ifndef _STLP_NO_MBSTATE_T codecvt<char, char, mbstate_t>* cvt = 0; #endif #ifndef _STLP_NO_WCHAR_T ctype<wchar_t>* wct = 0; codecvt<wchar_t, char, mbstate_t>* wcvt = 0; #endif _STLP_TRY { ct = new ctype_byname<char>(pname); #ifndef _STLP_NO_MBSTATE_T cvt = new codecvt_byname<char, char, mbstate_t>(pname); #endif #ifndef _STLP_NO_WCHAR_T wct = new ctype_byname<wchar_t>(pname); wcvt = new codecvt_byname<wchar_t, char, mbstate_t>(pname); #endif } #ifndef _STLP_NO_WCHAR_T # ifdef _STLP_NO_MBSTATE_T _STLP_UNWIND(delete ct; delete wct; delete wcvt); # else _STLP_UNWIND(delete ct; delete wct; delete cvt; delete wcvt); # endif #else # ifdef _STLP_NO_MBSTATE_T _STLP_UNWIND(delete ct); # else _STLP_UNWIND(delete ct; delete cvt); # endif #endif _Locale_insert(this, ct); #ifndef _STLP_NO_MBSTATE_T _Locale_insert(this, cvt); #endif #ifndef _STLP_NO_WCHAR_T _Locale_insert(this, wct); _Locale_insert(this, wcvt); #endif } }