This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Re: iostream changes locale to format a number


pcarlini> > Are you willing to contribute a patch against the current mainline 
pcarlini> > libstdc++-v3 sources for public discussion (that setlocale ... 
pcarlini> > setlocale pattern is present in quite a few different places) ?

  I wrote the patch listed below, which seems to work fine for the test case.
Your sugesstion helped me a lot.
Actually, without strdup(), the patch did not work.
(Sometimes it works without strdup(), but I could not figure out
what is happening.)

  Anyway, the following patch uses strdup() and free().

---
	Takeshi Kobayakawa
	tskoba@mte.biglobe.ne.jp


--- Patch for setlocale() begins

diff -u -r -p gcc/libstdc++-v3/ChangeLog gcc.setlocale.patched/libstdc++-v3/ChangeLog
--- gcc/libstdc++-v3/ChangeLog	Fri May  3 20:09:48 2002
+++ gcc.setlocale.patched/libstdc++-v3/ChangeLog	Sat May  4 15:55:33 2002
@@ -1,3 +1,12 @@
+2002-05-04  Takeshi Kobayakawa  <tskoba@mte.biglobe.ne.jp>
+
+	* config/locale/generic/c_locale.cc: Fix using setlocale
+	* config/locale/generic/time_members.cc: Likewise.
+	* config/locale/gnu/messages_members.cc: Likewise.
+	* config/locale/gnu/messages_members.h: Likewise.
+	* config/locale/gnu/time_members.cc: Likewise.
+	* include/bits/locale_facets.tcc: Likewise.
+
 2002-05-03  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
 	* configure.in: Update local install.html, configopts.html paths.
diff -u -r -p gcc/libstdc++-v3/config/locale/generic/c_locale.cc gcc.setlocale.patched/libstdc++-v3/config/locale/generic/c_locale.cc
--- gcc/libstdc++-v3/config/locale/generic/c_locale.cc	Tue Apr 16 09:45:17 2002
+++ gcc.setlocale.patched/libstdc++-v3/config/locale/generic/c_locale.cc	Sat May  4 15:55:52 2002
@@ -120,7 +120,8 @@ namespace std 
       if (!(__err & ios_base::failbit))
 	{
 	  // Assumes __s formatted for "C" locale.
-	  const char* __old = setlocale(LC_ALL, "C");
+	  char* __old = strdup(setlocale(LC_ALL, NULL));
+	  setlocale(LC_ALL, "C");
 	  char* __sanity;
 	  errno = 0;
 #if defined(_GLIBCPP_USE_C99)
@@ -147,6 +148,7 @@ namespace std 
 	  else
 	    __err |= ios_base::failbit;
 	  setlocale(LC_ALL, __old);
+	  free(__old);
 	}
     }
 
@@ -158,7 +160,8 @@ namespace std 
       if (!(__err & ios_base::failbit))
 	{
 	  // Assumes __s formatted for "C" locale.
-	  const char* __old = setlocale(LC_ALL, "C");
+	  char* __old = strdup(setlocale(LC_ALL, NULL));
+	  setlocale(LC_ALL, "C");
 	  char* __sanity;
 	  errno = 0;
 	  double __d = strtod(__s, &__sanity);
@@ -167,6 +170,7 @@ namespace std 
 	  else
 	    __err |= ios_base::failbit;
 	  setlocale(LC_ALL, __old);
+	  free(__old);
 	}
     }
 
@@ -178,7 +182,8 @@ namespace std 
       if (!(__err & ios_base::failbit))
 	{
 	  // Assumes __s formatted for "C" locale.
-	  const char* __old = setlocale(LC_ALL, "C");
+	  char* __old = strdup(setlocale(LC_ALL, NULL));
+	  setlocale(LC_ALL, "C");
 #if defined(_GLIBCPP_USE_C99)
 	  char* __sanity;
 	  errno = 0;
@@ -202,6 +207,7 @@ namespace std 
 	  else
 	    __err |= ios_base::failbit;
 	  setlocale(LC_ALL, __old);
+	  free(__old);
 	}
     }
 
diff -u -r -p gcc/libstdc++-v3/config/locale/generic/time_members.cc gcc.setlocale.patched/libstdc++-v3/config/locale/generic/time_members.cc
--- gcc/libstdc++-v3/config/locale/generic/time_members.cc	Tue Apr 16 09:45:17 2002
+++ gcc.setlocale.patched/libstdc++-v3/config/locale/generic/time_members.cc	Sat May  4 15:55:52 2002
@@ -51,9 +51,11 @@ namespace std
     _M_put(char* __s, size_t __maxlen, const char* __format, 
 	   const tm* __tm) const
     {
-      const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_timepunct);
       strftime(__s, __maxlen, __format, __tm);
       setlocale(LC_ALL, __old);
+      free(__old);
     }
 
   template<> 
@@ -132,9 +134,11 @@ namespace std
     _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
 	   const tm* __tm) const
     {
-      const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_timepunct);
       wcsftime(__s, __maxlen, __format, __tm);
       setlocale(LC_ALL, __old);
+      free(__old);
     }
 
   template<> 
diff -u -r -p gcc/libstdc++-v3/config/locale/gnu/messages_members.cc gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/messages_members.cc
--- gcc/libstdc++-v3/config/locale/gnu/messages_members.cc	Tue Apr 16 09:45:18 2002
+++ gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/messages_members.cc	Sat May  4 15:55:52 2002
@@ -48,9 +48,11 @@ namespace std
       __uselocale(__old);
       return string(__msg);
 #else
-      const char* __old = setlocale(LC_ALL, _M_name_messages);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_messages);
       const char* __msg = gettext(__dfault.c_str());
       setlocale(LC_ALL, __old);
+      free(__old);
       return string(__msg);
 #endif
     }
diff -u -r -p gcc/libstdc++-v3/config/locale/gnu/messages_members.h gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/messages_members.h
--- gcc/libstdc++-v3/config/locale/gnu/messages_members.h	Tue Mar 26 05:20:34 2002
+++ gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/messages_members.h	Sat May  4 15:55:52 2002
@@ -65,9 +65,11 @@
       __uselocale(__old);
       return _M_convert_from_char(__msg);
 #else
-      const char* __old = setlocale(LC_ALL, _M_name_messages);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_messages);
       char* __msg = gettext(_M_convert_to_char(__dfault));
       setlocale(LC_ALL, __old);
+      free(__old);
       return _M_convert_from_char(__msg);
 #endif
     }
diff -u -r -p gcc/libstdc++-v3/config/locale/gnu/time_members.cc gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/time_members.cc
--- gcc/libstdc++-v3/config/locale/gnu/time_members.cc	Tue Apr 16 09:45:18 2002
+++ gcc.setlocale.patched/libstdc++-v3/config/locale/gnu/time_members.cc	Sat May  4 15:55:52 2002
@@ -54,9 +54,11 @@ namespace std
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
       __strftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
 #else
-      const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_timepunct);
       strftime(__s, __maxlen, __format, __tm);
       setlocale(LC_ALL, __old);
+      free(__old);
 #endif
     }
 
@@ -202,9 +204,11 @@ namespace std
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
       __wcsftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
 #else
-      const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, _M_name_timepunct);
       wcsftime(__s, __maxlen, __format, __tm);
       setlocale(LC_ALL, __old);
+      free(__old);
 #endif
     }
 
diff -u -r -p gcc/libstdc++-v3/include/bits/locale_facets.tcc gcc.setlocale.patched/libstdc++-v3/include/bits/locale_facets.tcc
--- gcc/libstdc++-v3/include/bits/locale_facets.tcc	Tue Apr 16 09:45:25 2002
+++ gcc.setlocale.patched/libstdc++-v3/include/bits/locale_facets.tcc	Sat May  4 15:55:52 2002
@@ -1959,12 +1959,14 @@ namespace std
 		     _Tv __v, const __c_locale&, int __prec = -1)
     {
       int __ret;
-      const char* __old = setlocale(LC_ALL, "C");
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, "C");
       if (__prec >= 0)
         __ret = snprintf(__out, __size, __fmt, __prec, __v);
       else
         __ret = snprintf(__out, __size, __fmt, __v);
       setlocale(LC_ALL, __old);
+      free(__old);
       return __ret;
     }
 #else
@@ -1974,12 +1976,14 @@ namespace std
 		     const __c_locale&, int __prec = -1)
     {
       int __ret;
-      const char* __old = setlocale(LC_ALL, "C");
+      char* __old = strdup(setlocale(LC_ALL, NULL));
+      setlocale(LC_ALL, "C");
       if (__prec >= 0)
         __ret = sprintf(__out, __fmt, __prec, __v);
       else
         __ret = sprintf(__out, __fmt, __v);
       setlocale(LC_ALL, __old);
+      free(__old);
       return __ret;
     }
 #endif


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]