c++locale.h
Go to the documentation of this file.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 #ifndef _GLIBCXX_CXX_LOCALE_H
00038 #define _GLIBCXX_CXX_LOCALE_H 1
00039
00040 #pragma GCC system_header
00041
00042 #include <clocale>
00043 #include <cstddef>
00044
00045 #define _GLIBCXX_C_LOCALE_GNU 1
00046
00047 #define _GLIBCXX_NUM_CATEGORIES 6
00048
00049 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
00050 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
00051
00052 extern "C" __typeof(uselocale) __uselocale;
00053
00054 _GLIBCXX_END_NAMESPACE
00055 #endif
00056
00057 _GLIBCXX_BEGIN_NAMESPACE(std)
00058
00059 typedef __locale_t __c_locale;
00060
00061
00062
00063
00064
00065 inline int
00066 __convert_from_v(const __c_locale& __cloc __attribute__ ((__unused__)),
00067 char* __out,
00068 const int __size __attribute__ ((__unused__)),
00069 const char* __fmt, ...)
00070 {
00071 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
00072 __c_locale __old = __gnu_cxx::__uselocale(__cloc);
00073 #else
00074 char* __old = std::setlocale(LC_NUMERIC, NULL);
00075 char* __sav = NULL;
00076 if (__builtin_strcmp(__old, "C"))
00077 {
00078 const size_t __len = __builtin_strlen(__old) + 1;
00079 __sav = new char[__len];
00080 __builtin_memcpy(__sav, __old, __len);
00081 std::setlocale(LC_NUMERIC, "C");
00082 }
00083 #endif
00084
00085 __builtin_va_list __args;
00086 __builtin_va_start(__args, __fmt);
00087
00088 #ifdef _GLIBCXX_USE_C99
00089 const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
00090 #else
00091 const int __ret = __builtin_vsprintf(__out, __fmt, __args);
00092 #endif
00093
00094 __builtin_va_end(__args);
00095
00096 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
00097 __gnu_cxx::__uselocale(__old);
00098 #else
00099 if (__sav)
00100 {
00101 std::setlocale(LC_NUMERIC, __sav);
00102 delete [] __sav;
00103 }
00104 #endif
00105 return __ret;
00106 }
00107
00108 _GLIBCXX_END_NAMESPACE
00109
00110 #endif