diff options
Diffstat (limited to 'libstdc++-v3/config/locale')
4 files changed, 115 insertions, 25 deletions
diff --git a/libstdc++-v3/config/locale/generic/monetary_members.cc b/libstdc++-v3/config/locale/generic/monetary_members.cc index 51bbe0b..957a326 100644 --- a/libstdc++-v3/config/locale/generic/monetary_members.cc +++ b/libstdc++-v3/config/locale/generic/monetary_members.cc @@ -1,6 +1,6 @@ // std::moneypunct implementation details, generic version -*- C++ -*- -// Copyright (C) 2001, 2002, 2003 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 @@ -49,17 +49,24 @@ namespace std { // "C" locale. if (!_M_data) - _M_data = new __moneypunct_cache<char>; + _M_data = new __moneypunct_cache<char, true>; _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]; } template<> @@ -68,17 +75,24 @@ namespace std { // "C" locale. if (!_M_data) - _M_data = new __moneypunct_cache<char>; + _M_data = new __moneypunct_cache<char, false>; _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]; } template<> @@ -97,17 +111,28 @@ namespace std { // "C" locale if (!_M_data) - _M_data = new __moneypunct_cache<wchar_t>; + _M_data = new __moneypunct_cache<wchar_t, true>; _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; + + 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); + } } template<> @@ -117,17 +142,28 @@ namespace std { // "C" locale if (!_M_data) - _M_data = new __moneypunct_cache<wchar_t>; + _M_data = new __moneypunct_cache<wchar_t, false>; _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; + + 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); + } } template<> diff --git a/libstdc++-v3/config/locale/generic/numeric_members.cc b/libstdc++-v3/config/locale/generic/numeric_members.cc index 0645865..e2afed9 100644 --- a/libstdc++-v3/config/locale/generic/numeric_members.cc +++ b/libstdc++-v3/config/locale/generic/numeric_members.cc @@ -46,6 +46,7 @@ namespace std _M_data = new __numpunct_cache<char>; _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; _M_data->_M_use_grouping = false; _M_data->_M_decimal_point = '.'; @@ -57,8 +58,6 @@ namespace std for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) _M_data->_M_atoms_in[__i] = __num_base::_S_atoms_in[__i]; - _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); - _M_data->_M_truename = "true"; _M_data->_M_truename_size = strlen(_M_data->_M_truename); _M_data->_M_falsename = "false"; @@ -79,6 +78,7 @@ namespace std _M_data = new __numpunct_cache<wchar_t>; _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; _M_data->_M_use_grouping = false; _M_data->_M_decimal_point = L'.'; @@ -98,8 +98,6 @@ namespace std _M_data->_M_atoms_in[__i] = btowc(uc); } - _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); - _M_data->_M_truename = L"true"; _M_data->_M_truename_size = wcslen(_M_data->_M_truename); _M_data->_M_falsename = L"false"; diff --git a/libstdc++-v3/config/locale/gnu/monetary_members.cc b/libstdc++-v3/config/locale/gnu/monetary_members.cc index a2aa0c5..63bcdd8 100644 --- a/libstdc++-v3/config/locale/gnu/monetary_members.cc +++ b/libstdc++-v3/config/locale/gnu/monetary_members.cc @@ -210,7 +210,7 @@ namespace std const char*) { if (!_M_data) - _M_data = new __moneypunct_cache<char>; + _M_data = new __moneypunct_cache<char, true>; if (!__cloc) { @@ -218,12 +218,19 @@ namespace std _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 { @@ -233,7 +240,9 @@ namespace std _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) @@ -241,9 +250,11 @@ namespace std else _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_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)); @@ -264,7 +275,7 @@ namespace std const char*) { if (!_M_data) - _M_data = new __moneypunct_cache<char>; + _M_data = new __moneypunct_cache<char, false>; if (!__cloc) { @@ -272,12 +283,19 @@ namespace std _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 { @@ -287,17 +305,21 @@ namespace std _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_data->_M_negative_sign = "()"; else - _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, + _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_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)); @@ -330,7 +352,7 @@ namespace std #endif { if (!_M_data) - _M_data = new __moneypunct_cache<wchar_t>; + _M_data = new __moneypunct_cache<wchar_t, true>; if (!__cloc) { @@ -338,12 +360,24 @@ namespace std _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 { @@ -363,6 +397,7 @@ namespace std __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); _M_data->_M_grouping = __nl_langinfo_l(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); @@ -385,6 +420,7 @@ namespace std } else _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); __len = strlen(__cnegsign); if (!__nposn) @@ -399,6 +435,7 @@ namespace std } else _M_data->_M_negative_sign = L""; + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); // _Intl == true. __len = strlen(__ccurr); @@ -412,6 +449,7 @@ namespace std } else _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); } catch (...) { @@ -459,7 +497,7 @@ namespace std #endif { if (!_M_data) - _M_data = new __moneypunct_cache<wchar_t>; + _M_data = new __moneypunct_cache<wchar_t, false>; if (!__cloc) { @@ -467,12 +505,24 @@ namespace std _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 { @@ -492,6 +542,7 @@ namespace std __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); _M_data->_M_grouping = __nl_langinfo_l(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); @@ -515,6 +566,7 @@ namespace std } else _M_data->_M_positive_sign = L""; + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); __len = strlen(__cnegsign); if (!__nposn) @@ -529,7 +581,8 @@ namespace std } 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) @@ -542,6 +595,7 @@ namespace std } else _M_data->_M_curr_symbol = L""; + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); } catch (...) { @@ -581,12 +635,12 @@ namespace std template<> moneypunct<wchar_t, true>::~moneypunct() { - if (wcslen(_M_data->_M_positive_sign)) + if (_M_data->_M_positive_sign_size) delete [] _M_data->_M_positive_sign; - if (wcslen(_M_data->_M_negative_sign) - && (wcscmp(_M_data->_M_negative_sign, L"()") != 0)) + if (_M_data->_M_negative_sign_size + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) delete [] _M_data->_M_negative_sign; - if (wcslen(_M_data->_M_curr_symbol)) + if (_M_data->_M_curr_symbol_size) delete [] _M_data->_M_curr_symbol; delete _M_data; } @@ -594,12 +648,12 @@ namespace std template<> moneypunct<wchar_t, false>::~moneypunct() { - if (wcslen(_M_data->_M_positive_sign)) + if (_M_data->_M_positive_sign_size) delete [] _M_data->_M_positive_sign; - if (wcslen(_M_data->_M_negative_sign) - && (wcscmp(_M_data->_M_negative_sign, L"()") != 0)) + if (_M_data->_M_negative_sign_size + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) delete [] _M_data->_M_negative_sign; - if (wcslen(_M_data->_M_curr_symbol)) + if (_M_data->_M_curr_symbol_size) delete [] _M_data->_M_curr_symbol; delete _M_data; } diff --git a/libstdc++-v3/config/locale/gnu/numeric_members.cc b/libstdc++-v3/config/locale/gnu/numeric_members.cc index debee10..e2bb089 100644 --- a/libstdc++-v3/config/locale/gnu/numeric_members.cc +++ b/libstdc++-v3/config/locale/gnu/numeric_members.cc @@ -49,6 +49,7 @@ namespace std { // "C" locale _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; _M_data->_M_use_grouping = false; _M_data->_M_decimal_point = '.'; @@ -71,8 +72,8 @@ namespace std _M_data->_M_grouping = ""; else _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); } - _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); // NB: There is no way to extact this info from posix locales. // _M_truename = __nl_langinfo_l(YESSTR, __cloc); @@ -99,6 +100,7 @@ namespace std { // "C" locale _M_data->_M_grouping = ""; + _M_data->_M_grouping_size = 0; _M_data->_M_use_grouping = false; _M_data->_M_decimal_point = L'.'; @@ -138,8 +140,8 @@ namespace std _M_data->_M_grouping = ""; else _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); } - _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); // NB: There is no way to extact this info from posix locales. // _M_truename = __nl_langinfo_l(YESSTR, __cloc); |