diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4a976be6ccb83231090e630b2cc00b955fa0a73c..a2c78c0e6b5b1bfeca36c4db8ec1a3df8e5e6ea5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2004-01-04 Paolo Carlini <pcarlini@suse.de> + + * config/locale/generic/numeric_members.cc (_M_initialize_numpunct): + Avoid unnecessarily zero terminating _M_atoms_out and _M_atoms_in; + always use double underscored names. + * config/locale/gnu/numeric_members.cc (_M_initialize_numpunct): + Likewise. + * include/bits/locale_facets.h (struct __numpunct_cache): + Dimension _M_atoms_out and _M_atoms_in one position smaller. + (__numpunct_cache<>::_M_cache): Don't zero terminate _M_atoms_out + and _M_atoms_in. + 2003-12-31 Paolo Carlini <pcarlini@suse.de> * include/bits/locale_facets.tcc (num_get::_M_extract_int, diff --git a/libstdc++-v3/config/locale/generic/numeric_members.cc b/libstdc++-v3/config/locale/generic/numeric_members.cc index 09af14703b18bcda3217d043d0d0fd845a9ed183..8af127b8644fa56f18ccafecda858c304fa9c5e9 100644 --- a/libstdc++-v3/config/locale/generic/numeric_members.cc +++ b/libstdc++-v3/config/locale/generic/numeric_members.cc @@ -1,6 +1,6 @@ // std::numpunct 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 @@ -51,13 +51,11 @@ namespace std _M_data->_M_decimal_point = '.'; _M_data->_M_thousands_sep = ','; - for (size_t i = 0; i < __num_base::_S_oend; ++i) - _M_data->_M_atoms_out[i] = __num_base::_S_atoms_out[i]; - _M_data->_M_atoms_out[__num_base::_S_oend] = char(); + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) + _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; - 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_atoms_in[__num_base::_S_iend] = char(); + 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_truename = "true"; _M_data->_M_falsename = "false"; @@ -84,19 +82,17 @@ namespace std // Use ctype::widen code without the facet... unsigned char uc; - for (size_t i = 0; i < __num_base::_S_oend; ++i) + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) { - uc = static_cast<unsigned char>(__num_base::_S_atoms_out[i]); - _M_data->_M_atoms_out[i] = btowc(uc); + uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); + _M_data->_M_atoms_out[__i] = btowc(uc); } - _M_data->_M_atoms_out[__num_base::_S_oend] = wchar_t(); - for (size_t i = 0; i < __num_base::_S_iend; ++i) + for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) { - uc = static_cast<unsigned char>(__num_base::_S_atoms_in[i]); - _M_data->_M_atoms_in[i] = btowc(uc); + uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__i]); + _M_data->_M_atoms_in[__i] = btowc(uc); } - _M_data->_M_atoms_in[__num_base::_S_iend] = wchar_t(); _M_data->_M_truename = L"true"; _M_data->_M_falsename = L"false"; diff --git a/libstdc++-v3/config/locale/gnu/numeric_members.cc b/libstdc++-v3/config/locale/gnu/numeric_members.cc index d97f0dc6f5000c77d29a2636caf1da71f2bd285d..bc7711a7e55bdcddde1c29cfe0ab1b9ddecdb63a 100644 --- a/libstdc++-v3/config/locale/gnu/numeric_members.cc +++ b/libstdc++-v3/config/locale/gnu/numeric_members.cc @@ -1,6 +1,6 @@ // std::numpunct implementation details, GNU 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 @@ -54,13 +54,11 @@ namespace std _M_data->_M_decimal_point = '.'; _M_data->_M_thousands_sep = ','; - for (size_t i = 0; i < __num_base::_S_oend; ++i) - _M_data->_M_atoms_out[i] = __num_base::_S_atoms_out[i]; - _M_data->_M_atoms_out[__num_base::_S_oend] = char(); + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) + _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; - 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_atoms_in[__num_base::_S_iend] = char(); + for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) + _M_data->_M_atoms_in[__i] = __num_base::_S_atoms_in[__i]; } else { @@ -107,19 +105,17 @@ namespace std #endif // Use ctype::widen code without the facet... unsigned char uc; - for (size_t i = 0; i < __num_base::_S_oend; ++i) + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) { - uc = static_cast<unsigned char>(__num_base::_S_atoms_out[i]); - _M_data->_M_atoms_out[i] = btowc(uc); + uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); + _M_data->_M_atoms_out[__i] = btowc(uc); } - _M_data->_M_atoms_out[__num_base::_S_oend] = wchar_t(); - for (size_t i = 0; i < __num_base::_S_iend; ++i) + for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) { - uc = static_cast<unsigned char>(__num_base::_S_atoms_in[i]); - _M_data->_M_atoms_in[i] = btowc(uc); + uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__i]); + _M_data->_M_atoms_in[__i] = btowc(uc); } - _M_data->_M_atoms_in[__num_base::_S_iend] = wchar_t(); #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __uselocale(__old); #endif diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h index 2d3f776b26f1ad469ac90c68423fa0db19acd9ef..bf642780193b9f815f20801f75f504aa9600c2ba 100644 --- a/libstdc++-v3/include/bits/locale_facets.h +++ b/libstdc++-v3/include/bits/locale_facets.h @@ -1,6 +1,6 @@ // Locale support -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -1612,13 +1612,13 @@ namespace std // "C" locale, this is "-+xX0123456789abcdef0123456789ABCDEF". // This array contains the chars after having been passed // through the current locale's ctype<_CharT>.widen(). - _CharT _M_atoms_out[__num_base::_S_oend + 1]; + _CharT _M_atoms_out[__num_base::_S_oend]; // A list of valid numeric literals for input: in the standard // "C" locale, this is "-+xX0123456789abcdefABCDEF" // This array contains the chars after having been passed // through the current locale's ctype<_CharT>.widen(). - _CharT _M_atoms_in[__num_base::_S_iend + 1]; + _CharT _M_atoms_in[__num_base::_S_iend]; bool _M_allocated; @@ -1668,10 +1668,8 @@ namespace std const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc); __ct.widen(__num_base::_S_atoms_out, __num_base::_S_atoms_out + __num_base::_S_oend, _M_atoms_out); - _M_atoms_out[__num_base::_S_oend] = _CharT(); __ct.widen(__num_base::_S_atoms_in, __num_base::_S_atoms_in + __num_base::_S_iend, _M_atoms_in); - _M_atoms_in[__num_base::_S_iend] = _CharT(); } template<typename _CharT>