Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Copyright (C) 1997-2015 Free Software Foundation, Inc.
  2. //
  3. // This file is part of the GNU ISO C++ Library.  This library is free
  4. // software; you can redistribute it and/or modify it under the
  5. // terms of the GNU General Public License as published by the
  6. // Free Software Foundation; either version 3, or (at your option)
  7. // any later version.
  8.  
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13.  
  14. // Under Section 7 of GPL version 3, you are granted additional
  15. // permissions described in the GCC Runtime Library Exception, version
  16. // 3.1, as published by the Free Software Foundation.
  17.  
  18. // You should have received a copy of the GNU General Public License and
  19. // a copy of the GCC Runtime Library Exception along with this program;
  20. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  21. // <http://www.gnu.org/licenses/>.
  22.  
  23. #include <locale>
  24. #include <cstdlib>
  25. #include <cstring>
  26.  
  27. namespace std _GLIBCXX_VISIBILITY(default)
  28. {
  29. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  30.  
  31.   // Definitions for static const data members of ctype_base.
  32.   const ctype_base::mask ctype_base::space;
  33.   const ctype_base::mask ctype_base::print;
  34.   const ctype_base::mask ctype_base::cntrl;
  35.   const ctype_base::mask ctype_base::upper;
  36.   const ctype_base::mask ctype_base::lower;
  37.   const ctype_base::mask ctype_base::alpha;
  38.   const ctype_base::mask ctype_base::digit;
  39.   const ctype_base::mask ctype_base::punct;
  40.   const ctype_base::mask ctype_base::xdigit;
  41.   const ctype_base::mask ctype_base::alnum;
  42.   const ctype_base::mask ctype_base::graph;
  43.   const ctype_base::mask ctype_base::blank;
  44.  
  45.   // Definitions for locale::id of standard facets that are specialized.
  46.   locale::id ctype<char>::id;
  47.  
  48. #ifdef _GLIBCXX_USE_WCHAR_T  
  49.   locale::id ctype<wchar_t>::id;
  50. #endif
  51.  
  52.   const size_t ctype<char>::table_size;
  53.  
  54.   ctype<char>::~ctype()
  55.   {
  56.     _S_destroy_c_locale(_M_c_locale_ctype);
  57.     if (_M_del)
  58.       delete[] this->table();
  59.   }
  60.  
  61.   // Fill in the narrowing cache and flag whether all values are
  62.   // valid or not.  _M_narrow_ok is set to 2 if memcpy can't
  63.   // be used.
  64.   void
  65.   ctype<char>::
  66.   _M_narrow_init() const
  67.   {
  68.     char __tmp[sizeof(_M_narrow)];
  69.     for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i)
  70.       __tmp[__i] = __i;
  71.     do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow);
  72.    
  73.     _M_narrow_ok = 1;
  74.     if (__builtin_memcmp(__tmp, _M_narrow, sizeof(_M_narrow)))
  75.       _M_narrow_ok = 2;
  76.     else
  77.       {
  78.         // Deal with the special case of zero: renarrow with a
  79.         // different default and compare.
  80.         char __c;
  81.         do_narrow(__tmp, __tmp + 1, 1, &__c);
  82.         if (__c == 1)
  83.           _M_narrow_ok = 2;
  84.       }
  85.   }
  86.  
  87.   void
  88.   ctype<char>::
  89.   _M_widen_init() const
  90.   {
  91.     char __tmp[sizeof(_M_widen)];
  92.     for (size_t __i = 0; __i < sizeof(_M_widen); ++__i)
  93.       __tmp[__i] = __i;
  94.     do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen);
  95.    
  96.     _M_widen_ok = 1;
  97.     // Set _M_widen_ok to 2 if memcpy can't be used.
  98.     if (__builtin_memcmp(__tmp, _M_widen, sizeof(_M_widen)))
  99.       _M_widen_ok = 2;
  100.   }
  101.  
  102. #ifdef _GLIBCXX_USE_WCHAR_T
  103.   ctype<wchar_t>::ctype(size_t __refs)
  104.   : __ctype_abstract_base<wchar_t>(__refs),
  105.   _M_c_locale_ctype(_S_get_c_locale()), _M_narrow_ok(false)
  106.   { _M_initialize_ctype(); }
  107.  
  108.   ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs)
  109.   : __ctype_abstract_base<wchar_t>(__refs),
  110.   _M_c_locale_ctype(_S_clone_c_locale(__cloc)), _M_narrow_ok(false)
  111.   { _M_initialize_ctype(); }
  112.  
  113.   ctype<wchar_t>::~ctype()
  114.   { _S_destroy_c_locale(_M_c_locale_ctype); }
  115.  
  116.   ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs)
  117.   : ctype<wchar_t>(__refs)
  118.   {            
  119.     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
  120.       {
  121.         this->_S_destroy_c_locale(this->_M_c_locale_ctype);
  122.         this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
  123.         this->_M_initialize_ctype();
  124.       }
  125.   }
  126.  
  127.   ctype_byname<wchar_t>::~ctype_byname()
  128.   { }
  129.  
  130. #endif
  131.  
  132. _GLIBCXX_END_NAMESPACE_VERSION
  133. } // namespace
  134.