Import gcc-4.4.1
[dragonfly.git] / contrib / gcc-4.4 / libstdc++-v3 / src / ctype.cc
1 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005,
2 // 2006, 2007, 2008, 2009
3 // Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 #include <locale>
26 #include <cstdlib>
27 #include <cstring>
28
29 _GLIBCXX_BEGIN_NAMESPACE(std)
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
44   // Definitions for locale::id of standard facets that are specialized.
45   locale::id ctype<char>::id;
46
47 #ifdef _GLIBCXX_USE_WCHAR_T  
48   locale::id ctype<wchar_t>::id;
49 #endif
50
51   // XXX At some point, just rename this file to ctype_configure_char.cc
52   // and compile it as a separate file instead of including it here.
53   // Platform-specific initialization code for ctype tables.
54 #include <bits/ctype_noninline.h>
55
56   const size_t ctype<char>::table_size;
57
58   ctype<char>::~ctype()
59   { 
60     _S_destroy_c_locale(_M_c_locale_ctype);
61     if (_M_del) 
62       delete[] this->table(); 
63   }
64
65   // Fill in the narrowing cache and flag whether all values are
66   // valid or not.  _M_narrow_ok is set to 2 if memcpy can't
67   // be used.
68   void
69   ctype<char>::
70   _M_narrow_init() const
71   {
72     char __tmp[sizeof(_M_narrow)];
73     for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i)
74       __tmp[__i] = __i;
75     do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow);
76     
77     _M_narrow_ok = 1;
78     if (__builtin_memcmp(__tmp, _M_narrow, sizeof(_M_narrow)))
79       _M_narrow_ok = 2;
80     else
81       {
82         // Deal with the special case of zero: renarrow with a
83         // different default and compare.
84         char __c;
85         do_narrow(__tmp, __tmp + 1, 1, &__c);
86         if (__c == 1)
87           _M_narrow_ok = 2;
88       }
89   }
90
91   void
92   ctype<char>::
93   _M_widen_init() const
94   {
95     char __tmp[sizeof(_M_widen)];
96     for (size_t __i = 0; __i < sizeof(_M_widen); ++__i)
97       __tmp[__i] = __i;
98     do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen);
99     
100     _M_widen_ok = 1;
101     // Set _M_widen_ok to 2 if memcpy can't be used.
102     if (__builtin_memcmp(__tmp, _M_widen, sizeof(_M_widen)))
103       _M_widen_ok = 2;
104   }
105
106 #ifdef _GLIBCXX_USE_WCHAR_T
107   ctype<wchar_t>::ctype(size_t __refs) 
108   : __ctype_abstract_base<wchar_t>(__refs), 
109   _M_c_locale_ctype(_S_get_c_locale()), _M_narrow_ok(false)
110   { _M_initialize_ctype(); }
111
112   ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs) 
113   : __ctype_abstract_base<wchar_t>(__refs),
114   _M_c_locale_ctype(_S_clone_c_locale(__cloc)), _M_narrow_ok(false)
115   { _M_initialize_ctype(); }
116
117   ctype<wchar_t>::~ctype() 
118   { _S_destroy_c_locale(_M_c_locale_ctype); }
119
120   ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs)
121   : ctype<wchar_t>(__refs) 
122   {             
123     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
124       {
125         this->_S_destroy_c_locale(this->_M_c_locale_ctype);
126         this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
127         this->_M_initialize_ctype();
128       }
129   }
130
131   ctype_byname<wchar_t>::~ctype_byname() 
132   { }
133
134 #endif
135
136 _GLIBCXX_END_NAMESPACE