diff options
Diffstat (limited to 'libstdc++-v3/src/localename.cc')
-rw-r--r-- | libstdc++-v3/src/localename.cc | 156 |
1 files changed, 75 insertions, 81 deletions
diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index d428290b438..866e8979a65 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -44,7 +44,7 @@ namespace __gnu_cxx extern numpunct<char> numpunct_c; extern num_get<char> num_get_c; extern num_put<char> num_put_c; -extern codecvt<char, char, mbstate_t> codecvt_c; + extern codecvt<char, char, mbstate_t> codecvt_c; extern moneypunct<char, false> moneypunct_cf; extern moneypunct<char, true> moneypunct_ct; extern money_get<char> money_get_c; @@ -111,55 +111,48 @@ namespace std _Impl(const _Impl& __imp, size_t __refs) : _M_references(__refs), _M_facets_size(__imp._M_facets_size) { + _M_facets = _M_caches = 0; + _M_names = 0; try - { + { _M_facets = new const facet*[_M_facets_size]; - for (size_t __i = 0; __i < _M_facets_size; ++__i) - _M_facets[__i] = 0; + _M_caches = new const facet*[_M_facets_size]; + _M_names = new char*[_S_categories_size]; } - catch(...) + catch(...) { delete [] _M_facets; + delete [] _M_caches; __throw_exception_again; } + for (size_t __i = 0; __i < _M_facets_size; ++__i) { _M_facets[__i] = __imp._M_facets[__i]; + _M_caches[__i] = __imp._M_caches[__i]; if (_M_facets[__i]) _M_facets[__i]->_M_add_reference(); - } - - try - { - _M_caches = new const facet*[_M_facets_size]; - } - catch(...) - { - delete [] _M_caches; - __throw_exception_again; - } - for (size_t __i = 0; __i < _M_facets_size; ++__i) - { - _M_caches[__i] = __imp._M_caches[__i]; if (_M_caches[__i]) - _M_caches[__i]->_M_add_reference(); + _M_caches[__i]->_M_add_reference(); } - try + // Name all the categories. + for (size_t __i = 0; __i < _S_categories_size; ++__i) + _M_names[__i] = 0; + try { - _M_names = new char*[_S_categories_size]; + for (size_t __i = 0; __i < _S_categories_size; ++__i) + { + char* __new = new char[std::strlen(__imp._M_names[__i]) + 1]; + std::strcpy(__new, __imp._M_names[__i]); + _M_names[__i] = __new; + } } catch(...) { - delete [] _M_names; + this->~_Impl(); __throw_exception_again; } - for (size_t __i = 0; __i < _S_categories_size; ++__i) - { - char* __new = new char[strlen(__imp._M_names[__i]) + 1]; - std::strcpy(__new, __imp._M_names[__i]); - _M_names[__i] = __new; - } } // Construct named _Impl. @@ -172,66 +165,61 @@ namespace std __c_locale __cloc; locale::facet::_S_create_c_locale(__cloc, __s); + _M_facets = _M_caches = 0; + _M_names = 0; try - { - _M_facets = new const facet*[_M_facets_size]; - for (size_t __i = 0; __i < _M_facets_size; ++__i) - _M_facets[__i] = 0; - } - catch(...) { - delete [] _M_facets; - __throw_exception_again; - } - - try - { - _M_caches = new const facet*[_M_facets_size]; - for (size_t __i = 0; __i < _M_facets_size; ++__i) - _M_caches[__i] = 0; + _M_facets = new const facet*[_M_facets_size]; + _M_caches = new const facet*[_M_facets_size]; + _M_names = new char*[_S_categories_size]; } catch(...) { + delete [] _M_facets; delete [] _M_caches; __throw_exception_again; - } + } + + for (size_t __i = 0; __i < _M_facets_size; ++__i) + _M_facets[__i] = _M_caches[__i] = 0; // Name all the categories. - try - { - _M_names = new char*[_S_categories_size]; - } - catch(...) - { - delete [] _M_names; - __throw_exception_again; - } - size_t __len = std::strlen(__s); - if (!std::strchr(__s, ';')) + for (size_t __i = 0; __i < _S_categories_size; ++__i) + _M_names[__i] = 0; + try { - for (size_t __i = 0; __i < _S_categories_size; ++__i) + const size_t __len = std::strlen(__s); + if (!std::strchr(__s, ';')) { - _M_names[__i] = new char[__len + 1]; - std::strcpy(_M_names[__i], __s); + for (size_t __i = 0; __i < _S_categories_size; ++__i) + { + _M_names[__i] = new char[__len + 1]; + std::strcpy(_M_names[__i], __s); + } } - } - else - { - const char* __beg = __s; - for (size_t __i = 0; __i < _S_categories_size; ++__i) + else { - __beg = std::strchr(__beg, '=') + 1; - const char* __end = std::strchr(__beg, ';'); - if (!__end) - __end = __s + __len; - char* __new = new char[__end - __beg + 1]; - std::memcpy(__new, __beg, __end - __beg); - __new[__end - __beg] = '\0'; - _M_names[__i] = __new; + const char* __beg = __s; + for (size_t __i = 0; __i < _S_categories_size; ++__i) + { + __beg = std::strchr(__beg, '=') + 1; + const char* __end = std::strchr(__beg, ';'); + if (!__end) + __end = __s + __len; + char* __new = new char[__end - __beg + 1]; + std::memcpy(__new, __beg, __end - __beg); + __new[__end - __beg] = '\0'; + _M_names[__i] = __new; + } } } + catch(...) + { + this->~_Impl(); + __throw_exception_again; + } - // Construct all standard facets and add them to _M_facets. + // Construct all standard facets and add them to _M_facets. _M_init_facet(new std::ctype<char>(__cloc, 0, false)); _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc)); _M_init_facet(new numpunct<char>(__cloc)); @@ -263,6 +251,7 @@ namespace std _M_init_facet(new time_put<wchar_t>); _M_init_facet(new std::messages<wchar_t>(__cloc, __s)); #endif + locale::facet::_S_destroy_c_locale(__cloc); } @@ -278,19 +267,16 @@ namespace std locale::facet::_S_c_name); _M_facets = new (&facet_vec) const facet*[_M_facets_size]; - for (size_t __i = 0; __i < _M_facets_size; ++__i) - _M_facets[__i] = 0; - _M_caches = new (&cache_vec) const facet*[_M_facets_size]; for (size_t __i = 0; __i < _M_facets_size; ++__i) - _M_caches[__i] = 0; + _M_facets[__i] = _M_caches[__i] = 0; // Name all the categories. _M_names = new (&name_vec) char*[_S_categories_size]; for (size_t __i = 0; __i < _S_categories_size; ++__i) { _M_names[__i] = new (&name_c[__i]) char[2]; - strcpy(_M_names[__i], locale::facet::_S_c_name); + std::strcpy(_M_names[__i], locale::facet::_S_c_name); } // This is needed as presently the C++ version of "C" locales @@ -357,7 +343,7 @@ namespace std _M_init_facet(new (&time_put_w) time_put<wchar_t>(1)); _M_init_facet(new (&messages_w) std::messages<wchar_t>(1)); #endif - + // This locale is safe to pre-cache, after all the facets have // been created and installed. _M_caches[numpunct<char>::id._M_id()] = __npc; @@ -388,9 +374,9 @@ namespace std if (std::strcmp(_M_names[__ix], "*") != 0 && std::strcmp(__imp->_M_names[__ix], "*") != 0) { - delete [] _M_names[__ix]; char* __new = new char[std::strlen(__imp->_M_names[__ix]) + 1]; std::strcpy(__new, __imp->_M_names[__ix]); + delete [] _M_names[__ix]; _M_names[__ix] = __new; } } @@ -440,7 +426,15 @@ namespace std // New cache array. const facet** __oldc = _M_caches; const facet** __newc; - __newc = new const facet*[__new_size]; + try + { + __newc = new const facet*[__new_size]; + } + catch(...) + { + delete [] __newf; + __throw_exception_again; + } for (size_t __i = 0; __i < _M_facets_size; ++__i) __newc[__i] = _M_caches[__i]; for (size_t __i2 = _M_facets_size; __i2 < __new_size; ++__i2) |