This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] locale::_M_names change


Remove a set size array of locale names. This has changed in the past,
as more locale categories are found. By constructing locales in this
way, the number of categories will not be part of the ABI, and more
flexibility is achieved. Especially for non-gnu models.

tested x86/linux
tested x86/linux --enable-clocale=generic

2003-04-27  Benjamin Kosnik  <bkoz at redhat dot com>

	* include/bits/locale_classes.h (locale::_Impl): Change _M_names
	from fixed size array.
	(locale): Change _S_categories as well.
	Formatting tweaks.
	* include/bits/locale_facets.tcc: Tweak.
	* config/locale/gnu/c_locale.cc: Assign _S_categories.
	* config/locale/generic/c_locale.cc: Same.
	* src/locale.cc: Tweak.
	* src/globals.cc: Change facet_name to name_vec, add names_c.
	* src/localename.cc: Use them.
	(locale::_Impl::~_Impl): Destroy _M_names.
	(locale::_Impl::_Impl): Create _M_names.

Index: config/locale/generic/c_locale.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/generic/c_locale.cc,v
retrieving revision 1.8
diff -c -p -r1.8 c_locale.cc
*** config/locale/generic/c_locale.cc	25 Apr 2003 17:23:21 -0000	1.8
--- config/locale/generic/c_locale.cc	28 Apr 2003 03:36:04 -0000
*************** namespace std 
*** 227,234 ****
    __c_locale
    locale::facet::_S_clone_c_locale(__c_locale&)
    { return __c_locale(); }
  
!   const char* locale::_S_categories[_S_categories_size] = 
      {
        "LC_CTYPE", 
        "LC_NUMERIC",
--- 227,237 ----
    __c_locale
    locale::facet::_S_clone_c_locale(__c_locale&)
    { return __c_locale(); }
+ } // namespace std
  
! namespace __gnu_cxx
! {
!   const char* category_names[6 + _GLIBCPP_NUM_CATEGORIES] =
      {
        "LC_CTYPE", 
        "LC_NUMERIC",
*************** namespace std 
*** 237,240 ****
--- 240,248 ----
        "LC_MONETARY",
        "LC_MESSAGES"
      };
+ }  
+ 
+ namespace std
+ {
+   const char** locale::_S_categories = __gnu_cxx::category_names;
  }  // namespace std
Index: config/locale/gnu/c_locale.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/gnu/c_locale.cc,v
retrieving revision 1.8
diff -c -p -r1.8 c_locale.cc
*** config/locale/gnu/c_locale.cc	25 Apr 2003 17:23:21 -0000	1.8
--- config/locale/gnu/c_locale.cc	28 Apr 2003 03:36:04 -0000
*************** namespace std 
*** 186,193 ****
    __c_locale
    locale::facet::_S_clone_c_locale(__c_locale& __cloc)
    { return __duplocale(__cloc); }
  
!   const char* locale::_S_categories[_S_categories_size] =
      {
        "LC_CTYPE", 
        "LC_NUMERIC",
--- 186,196 ----
    __c_locale
    locale::facet::_S_clone_c_locale(__c_locale& __cloc)
    { return __duplocale(__cloc); }
+ } // namespace std
  
! namespace __gnu_cxx
! {
!   const char* category_names[6 + _GLIBCPP_NUM_CATEGORIES] =
      {
        "LC_CTYPE", 
        "LC_NUMERIC",
*************** namespace std 
*** 202,205 ****
--- 205,213 ----
        "LC_MEASUREMENT", 
        "LC_IDENTIFICATION" 
      };
+ }
+ 
+ namespace std
+ {
+   const char** locale::_S_categories = __gnu_cxx::category_names;
  }  // namespace std
Index: include/bits/locale_classes.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/locale_classes.h,v
retrieving revision 1.4
diff -c -p -r1.4 locale_classes.h
*** include/bits/locale_classes.h	25 Apr 2003 17:23:21 -0000	1.4
--- include/bits/locale_classes.h	28 Apr 2003 03:36:04 -0000
*************** namespace std
*** 157,163 ****
      // NB: locale::global() has to know how to modify all the
      // underlying categories, not just the ones required by the C++
      // standard.
!     static const char* 	_S_categories[_S_categories_size]; 
  
      explicit 
      locale(_Impl*) throw();
--- 157,163 ----
      // NB: locale::global() has to know how to modify all the
      // underlying categories, not just the ones required by the C++
      // standard.
!     static const char** _S_categories;
  
      explicit 
      locale(_Impl*) throw();
*************** namespace std
*** 198,204 ****
      _Atomic_word			_M_references;
      const facet**			_M_facets;
      size_t 				_M_facets_size;
!     char* 				_M_names[_S_categories_size];
      static const locale::id* const 	_S_id_ctype[];
      static const locale::id* const 	_S_id_numeric[];
      static const locale::id* const 	_S_id_collate[];
--- 198,204 ----
      _Atomic_word			_M_references;
      const facet**			_M_facets;
      size_t 				_M_facets_size;
!     char** 				_M_names;
      static const locale::id* const 	_S_id_ctype[];
      static const locale::id* const 	_S_id_numeric[];
      static const locale::id* const 	_S_id_collate[];
*************** namespace std
*** 266,272 ****
      {
        _M_impl = new _Impl(*__other._M_impl, 1);
        _M_impl->_M_install_facet(&_Facet::id, __f);
!       for (size_t __i = 0; __i < _S_categories_size ; ++__i)
  	{
  	  delete [] _M_impl->_M_names[__i];
  	  char* __new = new char[2];
--- 266,272 ----
      {
        _M_impl = new _Impl(*__other._M_impl, 1);
        _M_impl->_M_install_facet(&_Facet::id, __f);
!       for (size_t __i = 0; __i < _S_categories_size; ++__i)
  	{
  	  delete [] _M_impl->_M_names[__i];
  	  char* __new = new char[2];
Index: include/bits/locale_facets.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/locale_facets.tcc,v
retrieving revision 1.95
diff -c -p -r1.95 locale_facets.tcc
*** include/bits/locale_facets.tcc	8 Mar 2003 09:11:04 -0000	1.95
--- include/bits/locale_facets.tcc	28 Apr 2003 03:36:08 -0000
*************** namespace std
*** 2279,2285 ****
  	}
        if (__builtin_expect(has_facet<ctype<_CharT> >(__loc), true))
  	{
! 	  const ctype<_CharT>& __ct = use_facet< ctype<_CharT> >(__loc);
  	  __ct.widen(__num_base::_S_atoms_out,
  		     __num_base::_S_atoms_out + __num_base::_S_end, 
  		     _M_literals);
--- 2279,2285 ----
  	}
        if (__builtin_expect(has_facet<ctype<_CharT> >(__loc), true))
  	{
! 	  const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
  	  __ct.widen(__num_base::_S_atoms_out,
  		     __num_base::_S_atoms_out + __num_base::_S_end, 
  		     _M_literals);
Index: src/globals.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/globals.cc,v
retrieving revision 1.14
diff -c -p -r1.14 globals.cc
*** src/globals.cc	5 Mar 2003 06:02:15 -0000	1.14
--- src/globals.cc	28 Apr 2003 03:36:08 -0000
*************** namespace __gnu_cxx
*** 95,104 ****
    fake_wfilebuf buf_wcerr;
  #endif
  
-   typedef char fake_facet_name[sizeof(char*)]
-   __attribute__ ((aligned(__alignof__(char*))));
-   fake_facet_name facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
- 
    typedef char fake_locale_Impl[sizeof(locale::_Impl)]
    __attribute__ ((aligned(__alignof__(locale::_Impl))));
    fake_locale_Impl c_locale_impl;
--- 95,100 ----
*************** namespace __gnu_cxx
*** 106,111 ****
--- 102,115 ----
    typedef char fake_locale[sizeof(locale)]
    __attribute__ ((aligned(__alignof__(locale))));
    fake_locale c_locale;
+ 
+   typedef char fake_name_vec[sizeof(char*)]
+   __attribute__ ((aligned(__alignof__(char*))));
+   fake_name_vec name_vec[6 + _GLIBCPP_NUM_CATEGORIES];
+ 
+   typedef char fake_names[sizeof(char[2])]
+   __attribute__ ((aligned(__alignof__(char[2]))));
+   fake_names name_c[6 + _GLIBCPP_NUM_CATEGORIES];
  
    typedef char fake_facet_vec[sizeof(locale::facet*)]
    __attribute__ ((aligned(__alignof__(locale::facet*))));
Index: src/locale.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/locale.cc,v
retrieving revision 1.79
diff -c -p -r1.79 locale.cc
*** src/locale.cc	25 Apr 2003 17:23:21 -0000	1.79
--- src/locale.cc	28 Apr 2003 03:36:09 -0000
*************** namespace std 
*** 207,213 ****
  		// different from LANG.
  		size_t __i = 0;
  		if (strcmp(__res, "C") == 0)
! 		  for (; __i < _S_categories_size ; ++__i)
  		    {
  		      __env = getenv(_S_categories[__i]);
  		      if (__env && strcmp(__env, "") != 0 
--- 207,213 ----
  		// different from LANG.
  		size_t __i = 0;
  		if (strcmp(__res, "C") == 0)
! 		  for (; __i < _S_categories_size; ++__i)
  		    {
  		      __env = getenv(_S_categories[__i]);
  		      if (__env && strcmp(__env, "") != 0 
*************** namespace std 
*** 216,222 ****
  			break;
  		    }
  		else
! 		  for (; __i < _S_categories_size ; ++__i)
  		    {
  		      __env = getenv(_S_categories[__i]);
  		      if (__env && strcmp(__env, "") != 0 
--- 216,222 ----
  			break;
  		    }
  		else
! 		  for (; __i < _S_categories_size; ++__i)
  		    {
  		      __env = getenv(_S_categories[__i]);
  		      if (__env && strcmp(__env, "") != 0 
*************** namespace std 
*** 241,247 ****
  		    __str += __env;
  		    __str += ';';
  		    __i++;
! 		    for (; __i < _S_categories_size ; ++__i)
  		      {
  			__env = getenv(_S_categories[__i]);
  			if (!__env || strcmp(__env, "") == 0)
--- 241,247 ----
  		    __str += __env;
  		    __str += ';';
  		    __i++;
! 		    for (; __i < _S_categories_size; ++__i)
  		      {
  			__env = getenv(_S_categories[__i]);
  			if (!__env || strcmp(__env, "") == 0)
*************** namespace std 
*** 345,351 ****
  	__ret += _S_categories[0];
  	__ret += '=';
  	__ret += _M_impl->_M_names[0]; 
! 	for (size_t __i = 1; __i < _S_categories_size ; ++__i)
  	  {
  	    __ret += ';';
  	    __ret += _S_categories[__i];
--- 345,351 ----
  	__ret += _S_categories[0];
  	__ret += '=';
  	__ret += _M_impl->_M_names[0]; 
! 	for (size_t __i = 1; __i < _S_categories_size; ++__i)
  	  {
  	    __ret += ';';
  	    __ret += _S_categories[__i];
Index: src/localename.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/localename.cc,v
retrieving revision 1.37
diff -c -p -r1.37 localename.cc
*** src/localename.cc	25 Apr 2003 17:23:21 -0000	1.37
--- src/localename.cc	28 Apr 2003 03:36:09 -0000
*************** namespace __gnu_cxx
*** 36,42 ****
  
    // Defined in globals.cc.
    extern locale::facet* facet_vec[_GLIBCPP_NUM_FACETS];
!   extern char* facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
  
    extern std::ctype<char>			ctype_c;
    extern std::collate<char> 			collate_c;
--- 36,43 ----
  
    // Defined in globals.cc.
    extern locale::facet* facet_vec[_GLIBCPP_NUM_FACETS];
!   extern char* name_vec[6 + _GLIBCPP_NUM_CATEGORIES];
!   extern char name_c[6 + _GLIBCPP_NUM_CATEGORIES][2];
  
    extern std::ctype<char>			ctype_c;
    extern std::collate<char> 			collate_c;
*************** namespace std
*** 82,89 ****
  	_M_facets[__i]->_M_remove_reference();
      delete [] _M_facets;
  
!     for (size_t __i = 0; __i < _S_categories_size ; ++__i)
        delete [] _M_names[__i];  
    }
  
    // Clone existing _Impl object.
--- 83,91 ----
  	_M_facets[__i]->_M_remove_reference();
      delete [] _M_facets;
  
!     for (size_t __i = 0; __i < _S_categories_size; ++__i)
        delete [] _M_names[__i];  
+     delete [] _M_names;
    }
  
    // Clone existing _Impl object.
*************** namespace std
*** 108,114 ****
  	if (_M_facets[__i])
  	  _M_facets[__i]->_M_add_reference();
        }
!     for (size_t __i = 0; __i < _S_categories_size ; ++__i)
        {
  	char* __new = new char[strlen(__imp._M_names[__i]) + 1];
  	strcpy(__new, __imp._M_names[__i]);
--- 110,126 ----
  	if (_M_facets[__i])
  	  _M_facets[__i]->_M_add_reference();
        }
! 
!     try 
!       {
!       	_M_names = new char*[_S_categories_size];
!       }
!     catch(...)
!       {
! 	delete [] _M_names;
! 	__throw_exception_again;
!       }
!     for (size_t __i = 0; __i < _S_categories_size; ++__i)
        {
  	char* __new = new char[strlen(__imp._M_names[__i]) + 1];
  	strcpy(__new, __imp._M_names[__i]);
*************** namespace std
*** 139,148 ****
        }
  
      // Name all the categories.
      size_t __len = strlen(__s);
      if (!strchr(__s, ';'))
        {
! 	for (size_t __i = 0; __i < _S_categories_size ; ++__i)
  	  {
  	    _M_names[__i] = new char[__len + 1];
  	    strcpy(_M_names[__i], __s);
--- 151,169 ----
        }
  
      // Name all the categories.
+     try 
+       {
+       	_M_names = new char*[_S_categories_size];
+       }
+     catch(...)
+       {
+ 	delete [] _M_names;
+ 	__throw_exception_again;
+       }
      size_t __len = strlen(__s);
      if (!strchr(__s, ';'))
        {
! 	for (size_t __i = 0; __i < _S_categories_size; ++__i)
  	  {
  	    _M_names[__i] = new char[__len + 1];
  	    strcpy(_M_names[__i], __s);
*************** namespace std
*** 151,157 ****
      else
        {
  	const char* __beg = __s;
! 	for (size_t __i = 0; __i < _S_categories_size ; ++__i)
  	  {
  	    __beg = strchr(__beg, '=') + 1;
  	    const char* __end = strchr(__beg, ';');
--- 172,178 ----
      else
        {
  	const char* __beg = __s;
! 	for (size_t __i = 0; __i < _S_categories_size; ++__i)
  	  {
  	    __beg = strchr(__beg, '=') + 1;
  	    const char* __end = strchr(__beg, ';');
*************** namespace std
*** 210,223 ****
      locale::facet::_S_create_c_locale(locale::facet::_S_c_locale, 
  				      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;
  
      // Name all the categories.
!     for (size_t __i = 0; __i < _S_categories_size ; ++__i)
        {
! 	_M_names[__i] = new (&facet_name[__i]) char[2];
  	strcpy(_M_names[__i], locale::facet::_S_c_name);
        }
  
--- 231,245 ----
      locale::facet::_S_create_c_locale(locale::facet::_S_c_locale, 
  				      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;
  
      // 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);
        }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]