OSDN Git Service

2007-05-24 Paolo Carlini <pcarlini@suse.de>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / config / locale / gnu / c_locale.h
index fae7ffe..67ecb7d 100644 (file)
@@ -45,7 +45,6 @@
 #pragma GCC system_header
 
 #include <clocale>
-#include <cstdarg>
 #include <cstddef>
 
 #define _GLIBCXX_C_LOCALE_GNU 1
@@ -77,15 +76,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     __c_locale __old = __gnu_cxx::__uselocale(__cloc);
 #else
-    char* __old = std::setlocale(LC_ALL, NULL);
-    const size_t __len = __builtin_strlen(__old) + 1;
-    char* __sav = new char[__len];
-    __builtin_memcpy(__sav, __old, __len);
-    std::setlocale(LC_ALL, "C");
+    char* __old = std::setlocale(LC_NUMERIC, NULL);
+    char* __sav = NULL;
+    if (__builtin_strcmp(__old, "C"))
+      {
+       const size_t __len = __builtin_strlen(__old) + 1;
+       char* __sav = new char[__len];
+       __builtin_memcpy(__sav, __old, __len);
+       std::setlocale(LC_NUMERIC, "C");
+      }
 #endif
 
-    va_list __args;
-    va_start(__args, __fmt);
+    __builtin_va_list __args;
+    __builtin_va_start(__args, __fmt);
 
 #ifdef _GLIBCXX_USE_C99
     const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
@@ -93,13 +96,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     const int __ret = __builtin_vsprintf(__out, __fmt, __args);
 #endif
 
-    va_end(__args);
+    __builtin_va_end(__args);
 
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     __gnu_cxx::__uselocale(__old);
 #else
-    std::setlocale(LC_ALL, __sav);
-    delete [] __sav;
+    if (__sav)
+      {
+       std::setlocale(LC_NUMERIC, __sav);
+       delete [] __sav;
+      }
 #endif
     return __ret;
   }