diff options
Diffstat (limited to 'contrib/libstdc++/config/locale/gnu/monetary_members.cc')
-rw-r--r-- | contrib/libstdc++/config/locale/gnu/monetary_members.cc | 532 |
1 files changed, 326 insertions, 206 deletions
diff --git a/contrib/libstdc++/config/locale/gnu/monetary_members.cc b/contrib/libstdc++/config/locale/gnu/monetary_members.cc index b3ef13b..38d9c39 100644 --- a/contrib/libstdc++/config/locale/gnu/monetary_members.cc +++ b/contrib/libstdc++/config/locale/gnu/monetary_members.cc @@ -1,6 +1,6 @@ // std::moneypunct implementation details, GNU version -*- C++ -*- -// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -63,22 +63,21 @@ namespace std case 0: case 1: // 1 The sign precedes the value and symbol. + __ret.field[0] = sign; if (__space) { // Pattern starts with sign. if (__precedes) { __ret.field[1] = symbol; - __ret.field[2] = space; __ret.field[3] = value; } else { __ret.field[1] = value; - __ret.field[2] = space; __ret.field[3] = symbol; } - __ret.field[0] = sign; + __ret.field[2] = space; } else { @@ -93,7 +92,6 @@ namespace std __ret.field[1] = value; __ret.field[2] = symbol; } - __ret.field[0] = sign; __ret.field[3] = none; } break; @@ -105,15 +103,14 @@ namespace std if (__precedes) { __ret.field[0] = symbol; - __ret.field[1] = space; __ret.field[2] = value; } else { __ret.field[0] = value; - __ret.field[1] = space; __ret.field[2] = symbol; } + __ret.field[1] = space; __ret.field[3] = sign; } else @@ -135,78 +132,70 @@ namespace std break; case 3: // 3 The sign immediately precedes the symbol. - if (__space) + if (__precedes) { - // Have space. - if (__precedes) + __ret.field[0] = sign; + __ret.field[1] = symbol; + if (__space) { - __ret.field[0] = sign; - __ret.field[1] = symbol; __ret.field[2] = space; __ret.field[3] = value; } else { - __ret.field[0] = value; - __ret.field[1] = space; - __ret.field[2] = sign; - __ret.field[3] = symbol; + __ret.field[2] = value; + __ret.field[3] = none; } } else { - // Have none. - if (__precedes) + __ret.field[0] = value; + if (__space) { - __ret.field[0] = sign; - __ret.field[1] = symbol; - __ret.field[2] = value; + __ret.field[1] = space; + __ret.field[2] = sign; + __ret.field[3] = symbol; } else { - __ret.field[0] = value; __ret.field[1] = sign; __ret.field[2] = symbol; + __ret.field[3] = none; } - __ret.field[3] = none; } break; case 4: - // 4 The sign immediately follows the symbol. - if (__space) + // 4 The sign immediately follows the symbol. + if (__precedes) { - // Have space. - if (__precedes) + __ret.field[0] = symbol; + __ret.field[1] = sign; + if (__space) { - __ret.field[0] = symbol; - __ret.field[1] = sign; __ret.field[2] = space; __ret.field[3] = value; } else { - __ret.field[0] = value; - __ret.field[1] = space; - __ret.field[2] = symbol; - __ret.field[3] = sign; + __ret.field[2] = value; + __ret.field[3] = none; } } else { - // Have none. - if (__precedes) + __ret.field[0] = value; + if (__space) { - __ret.field[0] = symbol; - __ret.field[1] = sign; - __ret.field[2] = value; + __ret.field[1] = space; + __ret.field[2] = symbol; + __ret.field[3] = sign; } else { - __ret.field[0] = value; __ret.field[1] = symbol; __ret.field[2] = sign; + __ret.field[3] = none; } - __ret.field[3] = none; } break; default: @@ -220,43 +209,63 @@ namespace std moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, const char*) { + if (!_M_data) + _M_data = new __moneypunct_cache<char, true>; + if (!__cloc) { // "C" locale - _M_decimal_point = '.'; - _M_thousands_sep = ','; - _M_grouping = ""; - _M_curr_symbol = ""; - _M_positive_sign = ""; - _M_negative_sign = ""; - _M_frac_digits = 0; - _M_pos_format = money_base::_S_default_pattern; - _M_neg_format = money_base::_S_default_pattern; + _M_data->_M_decimal_point = '.'; + _M_data->_M_thousands_sep = ','; + _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; + _M_data->_M_curr_symbol = ""; + _M_data->_M_curr_symbol_size = 0; + _M_data->_M_positive_sign = ""; + _M_data->_M_positive_sign_size = 0; + _M_data->_M_negative_sign = ""; + _M_data->_M_negative_sign_size = 0; + _M_data->_M_frac_digits = 0; + _M_data->_M_pos_format = money_base::_S_default_pattern; + _M_data->_M_neg_format = money_base::_S_default_pattern; + + for (size_t __i = 0; __i < money_base::_S_end; ++__i) + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; } else { // Named locale. - _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); - _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); - _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); - _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, + __cloc)); + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, + __cloc)); + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); if (!__nposn) - _M_negative_sign = "()"; + _M_data->_M_negative_sign = "()"; else - _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, + __cloc); + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); // _Intl == true - _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); - _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); + _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, + __cloc)); char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); - _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, + __pposn); char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); - _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, + __nposn); } } @@ -265,55 +274,74 @@ namespace std moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, const char*) { + if (!_M_data) + _M_data = new __moneypunct_cache<char, false>; + if (!__cloc) { // "C" locale - _M_decimal_point = '.'; - _M_thousands_sep = ','; - _M_grouping = ""; - _M_curr_symbol = ""; - _M_positive_sign = ""; - _M_negative_sign = ""; - _M_frac_digits = 0; - _M_pos_format = money_base::_S_default_pattern; - _M_neg_format = money_base::_S_default_pattern; + _M_data->_M_decimal_point = '.'; + _M_data->_M_thousands_sep = ','; + _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; + _M_data->_M_curr_symbol = ""; + _M_data->_M_curr_symbol_size = 0; + _M_data->_M_positive_sign = ""; + _M_data->_M_positive_sign_size = 0; + _M_data->_M_negative_sign = ""; + _M_data->_M_negative_sign_size = 0; + _M_data->_M_frac_digits = 0; + _M_data->_M_pos_format = money_base::_S_default_pattern; + _M_data->_M_neg_format = money_base::_S_default_pattern; + + for (size_t __i = 0; __i < money_base::_S_end; ++__i) + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; } else { // Named locale. - _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); - _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); - _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); - _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, + __cloc)); + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, + __cloc)); + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); if (!__nposn) - _M_negative_sign = "()"; + _M_data->_M_negative_sign = "()"; else - _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, + __cloc); + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); // _Intl == false - _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); - _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); + _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); - _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, + __pposn); char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); - _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, + __nposn); } } template<> moneypunct<char, true>::~moneypunct() - { } + { delete _M_data; } template<> moneypunct<char, false>::~moneypunct() - { } + { delete _M_data; } -#ifdef _GLIBCPP_USE_WCHAR_T +#ifdef _GLIBCXX_USE_WCHAR_T template<> void moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, @@ -323,18 +351,33 @@ namespace std const char* __name) #endif { + if (!_M_data) + _M_data = new __moneypunct_cache<wchar_t, true>; + if (!__cloc) { // "C" locale - _M_decimal_point = L'.'; - _M_thousands_sep = L','; - _M_grouping = ""; - _M_curr_symbol = L""; - _M_positive_sign = L""; - _M_negative_sign = L""; - _M_frac_digits = 0; - _M_pos_format = money_base::_S_default_pattern; - _M_neg_format = money_base::_S_default_pattern; + _M_data->_M_decimal_point = L'.'; + _M_data->_M_thousands_sep = L','; + _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; + _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = 0; + _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = 0; + _M_data->_M_negative_sign = L""; + _M_data->_M_negative_sign_size = 0; + _M_data->_M_frac_digits = 0; + _M_data->_M_pos_format = money_base::_S_default_pattern; + _M_data->_M_neg_format = money_base::_S_default_pattern; + + // Use ctype::widen code without the facet... + unsigned char uc; + for (size_t __i = 0; __i < money_base::_S_end; ++__i) + { + uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); + _M_data->_M_atoms[__i] = btowc(uc); + } } else { @@ -347,64 +390,93 @@ namespace std setlocale(LC_ALL, __name); #endif - _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); + union __s_and_w { const char *__s; unsigned int __w; } __u; + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); + _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); - _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); - _M_grouping = __nl_langinfo_l(GROUPING, __cloc); + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); + _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); - mbstate_t __state; - size_t __len = strlen(__cpossign); - if (__len) + wchar_t* __wcs_ps = 0; + wchar_t* __wcs_ns = 0; + const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); + try { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__cpossign, __len, &__state); - _M_positive_sign = __wcs; - } - else - _M_positive_sign = L""; - - char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); - __len = strlen(__cnegsign); - if (!__nposn) - _M_negative_sign = L"()"; - else if (__len) - { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__cnegsign, __len, &__state); - _M_negative_sign = __wcs; + mbstate_t __state; + size_t __len = strlen(__cpossign); + if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + __wcs_ps = new wchar_t[__len]; + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); + _M_data->_M_positive_sign = __wcs_ps; + } + else + _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); + + __len = strlen(__cnegsign); + if (!__nposn) + _M_data->_M_negative_sign = L"()"; + else if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + __wcs_ns = new wchar_t[__len]; + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); + _M_data->_M_negative_sign = __wcs_ns; + } + else + _M_data->_M_negative_sign = L""; + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); + + // _Intl == true. + __len = strlen(__ccurr); + if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + wchar_t* __wcs = new wchar_t[__len]; + mbsrtowcs(__wcs, &__ccurr, __len, &__state); + _M_data->_M_curr_symbol = __wcs; + } + else + _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); } - else - _M_negative_sign = L""; - - // _Intl == true. - __len = strlen(__ccurr); - if (__len) + catch (...) { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__ccurr, __len, &__state); - _M_curr_symbol = __wcs; - } - else - _M_curr_symbol = L""; - - _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); + delete _M_data; + _M_data = 0; + delete __wcs_ps; + delete __wcs_ns; +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __uselocale(__old); +#else + setlocale(LC_ALL, __old); + free(__old); +#endif + __throw_exception_again; + } + + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, + __cloc)); char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); - _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, + __pposn); char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); - _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, + __nposn); #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __uselocale(__old); @@ -416,26 +488,41 @@ namespace std } template<> - void - moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) - const char*) + void + moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + const char*) #else - const char* __name) + const char* __name) #endif - { - if (!__cloc) + { + if (!_M_data) + _M_data = new __moneypunct_cache<wchar_t, false>; + + if (!__cloc) { // "C" locale - _M_decimal_point = L'.'; - _M_thousands_sep = L','; - _M_grouping = ""; - _M_curr_symbol = L""; - _M_positive_sign = L""; - _M_negative_sign = L""; - _M_frac_digits = 0; - _M_pos_format = money_base::_S_default_pattern; - _M_neg_format = money_base::_S_default_pattern; + _M_data->_M_decimal_point = L'.'; + _M_data->_M_thousands_sep = L','; + _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; + _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = 0; + _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = 0; + _M_data->_M_negative_sign = L""; + _M_data->_M_negative_sign_size = 0; + _M_data->_M_frac_digits = 0; + _M_data->_M_pos_format = money_base::_S_default_pattern; + _M_data->_M_neg_format = money_base::_S_default_pattern; + + // Use ctype::widen code without the facet... + unsigned char uc; + for (size_t __i = 0; __i < money_base::_S_end; ++__i) + { + uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); + _M_data->_M_atoms[__i] = btowc(uc); + } } else { @@ -448,64 +535,93 @@ namespace std setlocale(LC_ALL, __name); #endif - _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); - _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); - _M_grouping = __nl_langinfo_l(GROUPING, __cloc); + union __s_and_w { const char *__s; unsigned int __w; } __u; + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); + _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); + + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); + _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); - mbstate_t __state; - size_t __len; - __len = strlen(__cpossign); - if (__len) - { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__cpossign, __len, &__state); - _M_positive_sign = __wcs; + wchar_t* __wcs_ps = 0; + wchar_t* __wcs_ns = 0; + const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); + try + { + mbstate_t __state; + size_t __len; + __len = strlen(__cpossign); + if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + __wcs_ps = new wchar_t[__len]; + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); + _M_data->_M_positive_sign = __wcs_ps; + } + else + _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); + + __len = strlen(__cnegsign); + if (!__nposn) + _M_data->_M_negative_sign = L"()"; + else if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + __wcs_ns = new wchar_t[__len]; + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); + _M_data->_M_negative_sign = __wcs_ns; + } + else + _M_data->_M_negative_sign = L""; + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); + + // _Intl == true. + __len = strlen(__ccurr); + if (__len) + { + ++__len; + memset(&__state, 0, sizeof(mbstate_t)); + wchar_t* __wcs = new wchar_t[__len]; + mbsrtowcs(__wcs, &__ccurr, __len, &__state); + _M_data->_M_curr_symbol = __wcs; + } + else + _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); } - else - _M_positive_sign = L""; - - char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); - __len = strlen(__cnegsign); - if (!__nposn) - _M_negative_sign = L"()"; - else if (__len) - { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__cnegsign, __len, &__state); - _M_negative_sign = __wcs; - } - else - _M_negative_sign = L""; - - // _Intl == true. - __len = strlen(__ccurr); - if (__len) + catch (...) { - ++__len; - memset(&__state, 0, sizeof(mbstate_t)); - wchar_t* __wcs = new wchar_t[__len]; - mbsrtowcs(__wcs, &__ccurr, __len, &__state); - _M_curr_symbol = __wcs; + delete _M_data; + _M_data = 0; + delete __wcs_ps; + delete __wcs_ns; +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __uselocale(__old); +#else + setlocale(LC_ALL, __old); + free(__old); +#endif + __throw_exception_again; } - else - _M_curr_symbol = L""; - _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); - _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, + __pposn); char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); - _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, + __nposn); #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __uselocale(__old); @@ -519,23 +635,27 @@ namespace std template<> moneypunct<wchar_t, true>::~moneypunct() { - if (wcslen(_M_positive_sign)) - delete [] _M_positive_sign; - if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) - delete [] _M_negative_sign; - if (wcslen(_M_curr_symbol)) - delete [] _M_curr_symbol; + if (_M_data->_M_positive_sign_size) + delete [] _M_data->_M_positive_sign; + if (_M_data->_M_negative_sign_size + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) + delete [] _M_data->_M_negative_sign; + if (_M_data->_M_curr_symbol_size) + delete [] _M_data->_M_curr_symbol; + delete _M_data; } template<> moneypunct<wchar_t, false>::~moneypunct() { - if (wcslen(_M_positive_sign)) - delete [] _M_positive_sign; - if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) - delete [] _M_negative_sign; - if (wcslen(_M_curr_symbol)) - delete [] _M_curr_symbol; + if (_M_data->_M_positive_sign_size) + delete [] _M_data->_M_positive_sign; + if (_M_data->_M_negative_sign_size + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) + delete [] _M_data->_M_negative_sign; + if (_M_data->_M_curr_symbol_size) + delete [] _M_data->_M_curr_symbol; + delete _M_data; } #endif } |