00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
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 }