Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libstdc++-v3 / config / locale / dragonfly / ctype_members.cc
blob7ec2c9d6a2852335127fcd347d50d8148cee72b8
1 // std::ctype implementation details, DragonFly version -*- C++ -*-
3 // Copyright (C) 2014-2018 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.
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.
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.
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/>.
26 // ISO C++ 14882: 22.2.1.1.2 ctype virtual functions.
29 // Written by Benjamin Kosnik <bkoz@redhat.com>
30 // Modified for DragonFly by John Marino <gnugcc@marino.st>
32 #include <locale>
33 #include <cstring>
34 #include <cstdio>
36 #ifndef _ISbit
37 #define _ISbit(bit) ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))
38 #endif
40 namespace std _GLIBCXX_VISIBILITY(default)
42 _GLIBCXX_BEGIN_NAMESPACE_VERSION
44 // NB: The other ctype<char> specializations are in src/locale.cc and
45 // various /config/os/* files.
46 ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
47 : ctype<char>(0, false, __refs)
49 if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
51 this->_S_destroy_c_locale(this->_M_c_locale_ctype);
52 this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
56 ctype_byname<char>::~ctype_byname()
57 { }
59 #ifdef _GLIBCXX_USE_WCHAR_T
60 ctype<wchar_t>::__wmask_type
61 ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const throw()
63 __wmask_type __ret;
64 switch (__m)
66 case space:
67 __ret = wctype_l("space", (locale_t)_M_c_locale_ctype);
68 break;
69 case print:
70 __ret = wctype_l("print", (locale_t)_M_c_locale_ctype);
71 break;
72 case cntrl:
73 __ret = wctype_l("cntrl", (locale_t)_M_c_locale_ctype);
74 break;
75 case upper:
76 __ret = wctype_l("upper", (locale_t)_M_c_locale_ctype);
77 break;
78 case lower:
79 __ret = wctype_l("lower", (locale_t)_M_c_locale_ctype);
80 break;
81 case alpha:
82 __ret = wctype_l("alpha", (locale_t)_M_c_locale_ctype);
83 break;
84 case digit:
85 __ret = wctype_l("digit", (locale_t)_M_c_locale_ctype);
86 break;
87 case punct:
88 __ret = wctype_l("punct", (locale_t)_M_c_locale_ctype);
89 break;
90 case xdigit:
91 __ret = wctype_l("xdigit", (locale_t)_M_c_locale_ctype);
92 break;
93 case alnum:
94 __ret = wctype_l("alnum", (locale_t)_M_c_locale_ctype);
95 break;
96 case graph:
97 __ret = wctype_l("graph", (locale_t)_M_c_locale_ctype);
98 break;
99 case blank:
100 __ret = wctype_l("blank", (locale_t)_M_c_locale_ctype);
101 break;
102 default:
103 __ret = __wmask_type();
105 return __ret;
108 wchar_t
109 ctype<wchar_t>::do_toupper(wchar_t __c) const
110 { return towupper_l(__c, (locale_t)_M_c_locale_ctype); }
112 const wchar_t*
113 ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
115 while (__lo < __hi)
117 *__lo = towupper_l(*__lo, (locale_t)_M_c_locale_ctype);
118 ++__lo;
120 return __hi;
123 wchar_t
124 ctype<wchar_t>::do_tolower(wchar_t __c) const
125 { return towlower_l(__c, (locale_t)_M_c_locale_ctype); }
127 const wchar_t*
128 ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
130 while (__lo < __hi)
132 *__lo = towlower_l(*__lo, (locale_t)_M_c_locale_ctype);
133 ++__lo;
135 return __hi;
138 wchar_t
139 ctype<wchar_t>::
140 do_widen(char __c) const
141 { return _M_widen[static_cast<unsigned char>(__c)]; }
143 const char*
144 ctype<wchar_t>::
145 do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
147 while (__lo < __hi)
149 *__dest = _M_widen[static_cast<unsigned char>(*__lo)];
150 ++__lo;
151 ++__dest;
153 return __hi;
156 char
157 ctype<wchar_t>::
158 do_narrow(wchar_t __wc, char __dfault) const
160 if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
161 return _M_narrow[__wc];
162 __c_locale __old = (__c_locale)uselocale((locale_t)_M_c_locale_ctype);
163 const int __c = wctob(__wc);
164 uselocale((locale_t)__old);
165 return (__c == EOF ? __dfault : static_cast<char>(__c));
168 const wchar_t*
169 ctype<wchar_t>::
170 do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
171 char* __dest) const
173 __c_locale __old = (__c_locale)uselocale((locale_t)_M_c_locale_ctype);
174 if (_M_narrow_ok)
175 while (__lo < __hi)
177 if (*__lo >= 0 && *__lo < 128)
178 *__dest = _M_narrow[*__lo];
179 else
181 const int __c = wctob(*__lo);
182 *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
184 ++__lo;
185 ++__dest;
187 else
188 while (__lo < __hi)
190 const int __c = wctob(*__lo);
191 *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
192 ++__lo;
193 ++__dest;
195 uselocale((locale_t)__old);
196 return __hi;
199 void
200 ctype<wchar_t>::_M_initialize_ctype() throw()
202 __c_locale __old = (__c_locale)uselocale((locale_t)_M_c_locale_ctype);
203 wint_t __i;
204 for (__i = 0; __i < 128; ++__i)
206 const int __c = wctob(__i);
207 if (__c == EOF)
208 break;
209 else
210 _M_narrow[__i] = static_cast<char>(__c);
212 if (__i == 128)
213 _M_narrow_ok = true;
214 else
215 _M_narrow_ok = false;
216 for (size_t __j = 0;
217 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
218 _M_widen[__j] = btowc(__j);
220 for (size_t __k = 0; __k <= 11; ++__k)
222 _M_bit[__k] = static_cast<mask>(_ISbit(__k));
223 _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
225 uselocale((locale_t)__old);
227 #endif // _GLIBCXX_USE_WCHAR_T
229 _GLIBCXX_END_NAMESPACE_VERSION
230 } // namespace