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   }