ctype_noninline.h

00001 // Locale support -*- C++ -*- 00002 00003 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 00004 // Free Software Foundation, Inc. 00005 // 00006 // This file is part of the GNU ISO C++ Library. This library is free 00007 // software; you can redistribute it and/or modify it under the 00008 // terms of the GNU General Public License as published by the 00009 // Free Software Foundation; either version 2, or (at your option) 00010 // any later version. 00011 00012 // This library is distributed in the hope that it will be useful, 00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 // GNU General Public License for more details. 00016 00017 // You should have received a copy of the GNU General Public License along 00018 // with this library; see the file COPYING. If not, write to the Free 00019 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00020 // USA. 00021 00022 // As a special exception, you may use this file as part of a free software 00023 // library without restriction. Specifically, if other files instantiate 00024 // templates or use macros or inline functions from this file, or you compile 00025 // this file and link it with other files to produce an executable, this 00026 // file does not by itself cause the resulting executable to be covered by 00027 // the GNU General Public License. This exception does not however 00028 // invalidate any other reasons why the executable file might be covered by 00029 // the GNU General Public License. 00030 00031 // 00032 // ISO C++ 14882: 22.1 Locales 00033 // 00034 00035 // Information as gleaned from /usr/include/ctype.h 00036 00037 #if _GLIBCXX_C_LOCALE_GNU 00038 const ctype_base::mask* 00039 ctype<char>::classic_table() throw() 00040 { return _S_get_c_locale()->__ctype_b; } 00041 #else 00042 const ctype_base::mask* 00043 ctype<char>::classic_table() throw() 00044 { 00045 const ctype_base::mask* __ret; 00046 char* __old = strdup(setlocale(LC_CTYPE, NULL)); 00047 setlocale(LC_CTYPE, "C"); 00048 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) 00049 __ret = *__ctype_b_loc(); 00050 #else 00051 __ret = __ctype_b; 00052 #endif 00053 setlocale(LC_CTYPE, __old); 00054 free(__old); 00055 return __ret; 00056 } 00057 #endif 00058 00059 #if _GLIBCXX_C_LOCALE_GNU 00060 ctype<char>::ctype(__c_locale __cloc, const mask* __table, bool __del, 00061 size_t __refs) 00062 : facet(__refs), _M_c_locale_ctype(_S_clone_c_locale(__cloc)), 00063 _M_del(__table != 0 && __del), 00064 _M_toupper(_M_c_locale_ctype->__ctype_toupper), 00065 _M_tolower(_M_c_locale_ctype->__ctype_tolower), 00066 _M_table(__table ? __table : _M_c_locale_ctype->__ctype_b), 00067 _M_widen_ok(0), _M_narrow_ok(0) 00068 { 00069 memset(_M_widen, 0, sizeof(_M_widen)); 00070 memset(_M_narrow, 0, sizeof(_M_narrow)); 00071 } 00072 #else 00073 ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 00074 size_t __refs) 00075 : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 00076 _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) 00077 { 00078 char* __old=strdup(setlocale(LC_CTYPE, NULL)); 00079 setlocale(LC_CTYPE, "C"); 00080 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) 00081 _M_toupper = *__ctype_toupper_loc(); 00082 _M_tolower = *__ctype_tolower_loc(); 00083 _M_table = __table ? __table : *__ctype_b_loc(); 00084 #else 00085 _M_toupper = __ctype_toupper; 00086 _M_tolower = __ctype_tolower; 00087 _M_table = __table ? __table : __ctype_b; 00088 #endif 00089 setlocale(LC_CTYPE, __old); 00090 free(__old); 00091 memset(_M_widen, 0, sizeof(_M_widen)); 00092 memset(_M_narrow, 0, sizeof(_M_narrow)); 00093 } 00094 #endif 00095 00096 #if _GLIBCXX_C_LOCALE_GNU 00097 ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 00098 : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 00099 _M_del(__table != 0 && __del), 00100 _M_toupper(_M_c_locale_ctype->__ctype_toupper), 00101 _M_tolower(_M_c_locale_ctype->__ctype_tolower), 00102 _M_table(__table ? __table : _M_c_locale_ctype->__ctype_b), 00103 _M_widen_ok(0), _M_narrow_ok(0) 00104 { 00105 memset(_M_widen, 0, sizeof(_M_widen)); 00106 memset(_M_narrow, 0, sizeof(_M_narrow)); 00107 } 00108 #else 00109 ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 00110 : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 00111 _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) 00112 { 00113 char* __old=strdup(setlocale(LC_CTYPE, NULL)); 00114 setlocale(LC_CTYPE, "C"); 00115 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) 00116 _M_toupper = *__ctype_toupper_loc(); 00117 _M_tolower = *__ctype_tolower_loc(); 00118 _M_table = __table ? __table : *__ctype_b_loc(); 00119 #else 00120 _M_toupper = __ctype_toupper; 00121 _M_tolower = __ctype_tolower; 00122 _M_table = __table ? __table : __ctype_b; 00123 #endif 00124 setlocale(LC_CTYPE, __old); 00125 free(__old); 00126 memset(_M_widen, 0, sizeof(_M_widen)); 00127 memset(_M_narrow, 0, sizeof(_M_narrow)); 00128 } 00129 #endif 00130 00131 char 00132 ctype<char>::do_toupper(char __c) const 00133 { return _M_toupper[static_cast<unsigned char>(__c)]; } 00134 00135 const char* 00136 ctype<char>::do_toupper(char* __low, const char* __high) const 00137 { 00138 while (__low < __high) 00139 { 00140 *__low = _M_toupper[static_cast<unsigned char>(*__low)]; 00141 ++__low; 00142 } 00143 return __high; 00144 } 00145 00146 char 00147 ctype<char>::do_tolower(char __c) const 00148 { return _M_tolower[static_cast<unsigned char>(__c)]; } 00149 00150 const char* 00151 ctype<char>::do_tolower(char* __low, const char* __high) const 00152 { 00153 while (__low < __high) 00154 { 00155 *__low = _M_tolower[static_cast<unsigned char>(*__low)]; 00156 ++__low; 00157 } 00158 return __high; 00159 }

Generated on Wed Jun 9 11:18:17 2004 for libstdc++-v3 Source by doxygen 1.3.7