1 // Locale support -*- C++ -*- 2 3 // Copyright (C) 2014-2021 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 /** @file ctype_configure_char.cc */ 26 27 // 28 // ISO C++ 14882: 22.1 Locales 29 // 30 31 #include <locale> 32 #include <cstdlib> 33 #include <cstring> 34 35 namespace std _GLIBCXX_VISIBILITY(default) 36 { 37 _GLIBCXX_BEGIN_NAMESPACE_VERSION 38 39 // Information as gleaned from /usr/include/ctype.h 40 41 const ctype_base::mask* classic_table()42 ctype<char>::classic_table() throw() 43 { return NULL; } 44 ctype(__c_locale,const mask * __table,bool __del,size_t __refs)45 ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 46 size_t __refs) 47 : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 48 _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) 49 { 50 char* __old = setlocale(LC_CTYPE, NULL); 51 char* __sav = NULL; 52 if (strcmp(__old, "C")) 53 { 54 const size_t __len = strlen(__old) + 1; 55 __sav = new char[__len]; 56 memcpy(__sav, __old, __len); 57 setlocale(LC_CTYPE, "C"); 58 } 59 _M_toupper = NULL; 60 _M_tolower = NULL; 61 _M_table = __table ? __table : classic_table(); 62 if (__sav) 63 { 64 setlocale(LC_CTYPE, __sav); 65 delete [] __sav; 66 } 67 memset(_M_widen, 0, sizeof(_M_widen)); 68 memset(_M_narrow, 0, sizeof(_M_narrow)); 69 } 70 ctype(const mask * __table,bool __del,size_t __refs)71 ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 72 : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 73 _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) 74 { 75 char* __old = setlocale(LC_CTYPE, NULL); 76 char* __sav = NULL; 77 if (strcmp(__old, "C")) 78 { 79 const size_t __len = strlen(__old) + 1; 80 __sav = new char[__len]; 81 memcpy(__sav, __old, __len); 82 setlocale(LC_CTYPE, "C"); 83 } 84 _M_toupper = NULL; 85 _M_tolower = NULL; 86 _M_table = __table ? __table : classic_table(); 87 if (__sav) 88 { 89 setlocale(LC_CTYPE, __sav); 90 delete [] __sav; 91 } 92 memset(_M_widen, 0, sizeof(_M_widen)); 93 memset(_M_narrow, 0, sizeof(_M_narrow)); 94 } 95 96 char do_toupper(char __c) const97 ctype<char>::do_toupper(char __c) const 98 { return ::toupper((int) __c); } 99 100 const char* do_toupper(char * __low,const char * __high) const101 ctype<char>::do_toupper(char* __low, const char* __high) const 102 { 103 while (__low < __high) 104 { 105 *__low = ::toupper((int) *__low); 106 ++__low; 107 } 108 return __high; 109 } 110 111 char do_tolower(char __c) const112 ctype<char>::do_tolower(char __c) const 113 { return ::tolower((int) __c); } 114 115 const char* do_tolower(char * __low,const char * __high) const116 ctype<char>::do_tolower(char* __low, const char* __high) const 117 { 118 while (__low < __high) 119 { 120 *__low = ::tolower((int) *__low); 121 ++__low; 122 } 123 return __high; 124 } 125 126 _GLIBCXX_END_NAMESPACE_VERSION 127 } // namespace 128