patches/gcc/4.2.2/205-uclibc-locale-update.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 313 patches/gcc/4.2.1/205-uclibc-locale-update.patch@2f223aafc7cb
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
yann@313
     1
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.cc
yann@313
     2
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc	2007-08-03 20:30:53.000000000 +0200
yann@313
     3
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.cc	2007-08-03 20:31:54.000000000 +0200
yann@313
     4
@@ -46,16 +46,13 @@
yann@313
     5
     __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
yann@313
     6
 		   const __c_locale& __cloc)
yann@313
     7
     {
yann@313
     8
-      if (!(__err & ios_base::failbit))
yann@313
     9
-	{
yann@313
    10
-	  char* __sanity;
yann@313
    11
-	  errno = 0;
yann@313
    12
-	  float __f = __strtof_l(__s, &__sanity, __cloc);
yann@313
    13
-          if (__sanity != __s && errno != ERANGE)
yann@313
    14
-	    __v = __f;
yann@313
    15
-	  else
yann@313
    16
-	    __err |= ios_base::failbit;
yann@313
    17
-	}
yann@313
    18
+      char* __sanity;
yann@313
    19
+      errno = 0;
yann@313
    20
+      float __f = __strtof_l(__s, &__sanity, __cloc);
yann@313
    21
+      if (__sanity != __s && errno != ERANGE)
yann@313
    22
+	__v = __f;
yann@313
    23
+      else
yann@313
    24
+	__err |= ios_base::failbit;
yann@313
    25
     }
yann@313
    26
 
yann@313
    27
   template<>
yann@313
    28
@@ -63,16 +60,13 @@
yann@313
    29
     __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
yann@313
    30
 		   const __c_locale& __cloc)
yann@313
    31
     {
yann@313
    32
-      if (!(__err & ios_base::failbit))
yann@313
    33
-	{
yann@313
    34
-	  char* __sanity;
yann@313
    35
-	  errno = 0;
yann@313
    36
-	  double __d = __strtod_l(__s, &__sanity, __cloc);
yann@313
    37
-          if (__sanity != __s && errno != ERANGE)
yann@313
    38
-	    __v = __d;
yann@313
    39
-	  else
yann@313
    40
-	    __err |= ios_base::failbit;
yann@313
    41
-	}
yann@313
    42
+      char* __sanity;
yann@313
    43
+      errno = 0;
yann@313
    44
+      double __d = __strtod_l(__s, &__sanity, __cloc);
yann@313
    45
+      if (__sanity != __s && errno != ERANGE)
yann@313
    46
+	__v = __d;
yann@313
    47
+      else
yann@313
    48
+	__err |= ios_base::failbit;
yann@313
    49
     }
yann@313
    50
 
yann@313
    51
   template<>
yann@313
    52
@@ -80,16 +74,13 @@
yann@313
    53
     __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
yann@313
    54
 		   const __c_locale& __cloc)
yann@313
    55
     {
yann@313
    56
-      if (!(__err & ios_base::failbit))
yann@313
    57
-	{
yann@313
    58
-	  char* __sanity;
yann@313
    59
-	  errno = 0;
yann@313
    60
-	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
yann@313
    61
-          if (__sanity != __s && errno != ERANGE)
yann@313
    62
-	    __v = __ld;
yann@313
    63
-	  else
yann@313
    64
-	    __err |= ios_base::failbit;
yann@313
    65
-	}
yann@313
    66
+      char* __sanity;
yann@313
    67
+      errno = 0;
yann@313
    68
+      long double __ld = __strtold_l(__s, &__sanity, __cloc);
yann@313
    69
+      if (__sanity != __s && errno != ERANGE)
yann@313
    70
+	__v = __ld;
yann@313
    71
+      else
yann@313
    72
+	__err |= ios_base::failbit;
yann@313
    73
     }
yann@313
    74
 
yann@313
    75
   void
yann@313
    76
@@ -110,7 +101,7 @@
yann@313
    77
   void
yann@313
    78
   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
yann@313
    79
   {
yann@313
    80
-    if (_S_get_c_locale() != __cloc)
yann@313
    81
+    if (__cloc && _S_get_c_locale() != __cloc)
yann@313
    82
       __freelocale(__cloc); 
yann@313
    83
   }
yann@313
    84
 
yann@313
    85
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.h
yann@313
    86
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.h	2007-08-03 20:30:53.000000000 +0200
yann@313
    87
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.h	2007-08-03 20:31:54.000000000 +0200
yann@313
    88
@@ -39,21 +39,23 @@
yann@313
    89
 #pragma GCC system_header
yann@313
    90
 
yann@313
    91
 #include <cstring>              // get std::strlen
yann@313
    92
-#include <cstdio>               // get std::snprintf or std::sprintf
yann@313
    93
+#include <cstdio>               // get std::vsnprintf or std::vsprintf
yann@313
    94
 #include <clocale>
yann@313
    95
 #include <langinfo.h>		// For codecvt
yann@313
    96
 #ifdef __UCLIBC_MJN3_ONLY__
yann@313
    97
 #warning fix this
yann@313
    98
 #endif
yann@313
    99
-#ifdef __UCLIBC_HAS_LOCALE__
yann@313
   100
+#ifdef _GLIBCXX_USE_ICONV
yann@313
   101
 #include <iconv.h>		// For codecvt using iconv, iconv_t
yann@313
   102
 #endif
yann@313
   103
-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
yann@313
   104
-#include <libintl.h> 		// For messages
yann@313
   105
+#ifdef HAVE_LIBINTL_H
yann@313
   106
+#include <libintl.h>		// For messages
yann@313
   107
 #endif
yann@313
   108
+#include <cstdarg>
yann@313
   109
 
yann@313
   110
 #ifdef __UCLIBC_MJN3_ONLY__
yann@313
   111
 #warning what is _GLIBCXX_C_LOCALE_GNU for
yann@313
   112
+// psm: used in os/gnu-linux/ctype_noninline.h
yann@313
   113
 #endif
yann@313
   114
 #define _GLIBCXX_C_LOCALE_GNU 1
yann@313
   115
 
yann@313
   116
@@ -62,7 +64,7 @@
yann@313
   117
 #endif
yann@313
   118
 // #define _GLIBCXX_NUM_CATEGORIES 6
yann@313
   119
 #define _GLIBCXX_NUM_CATEGORIES 0
yann@313
   120
- 
yann@313
   121
+
yann@313
   122
 #ifdef __UCLIBC_HAS_XLOCALE__
yann@313
   123
 namespace __gnu_cxx
yann@313
   124
 {
yann@313
   125
@@ -79,22 +81,24 @@
yann@313
   126
   typedef int*			__c_locale;
yann@313
   127
 #endif
yann@313
   128
 
yann@313
   129
-  // Convert numeric value of type _Tv to string and return length of
yann@313
   130
-  // string.  If snprintf is available use it, otherwise fall back to
yann@313
   131
-  // the unsafe sprintf which, in general, can be dangerous and should
yann@313
   132
+  // Convert numeric value of type double to string and return length of
yann@313
   133
+  // string.  If vsnprintf is available use it, otherwise fall back to
yann@313
   134
+  // the unsafe vsprintf which, in general, can be dangerous and should
yann@313
   135
   // be avoided.
yann@313
   136
-  template<typename _Tv>
yann@313
   137
-    int
yann@313
   138
-    __convert_from_v(char* __out, 
yann@313
   139
-		     const int __size __attribute__ ((__unused__)),
yann@313
   140
-		     const char* __fmt,
yann@313
   141
-#ifdef __UCLIBC_HAS_XCLOCALE__
yann@313
   142
-		     _Tv __v, const __c_locale& __cloc, int __prec)
yann@313
   143
+    inline int
yann@313
   144
+    __convert_from_v(const __c_locale&
yann@313
   145
+#ifndef __UCLIBC_HAS_XCLOCALE__
yann@313
   146
+					__cloc __attribute__ ((__unused__))
yann@313
   147
+#endif
yann@313
   148
+		     ,
yann@313
   149
+		     char* __out,
yann@313
   150
+		     const int __size,
yann@313
   151
+		     const char* __fmt, ...)
yann@313
   152
     {
yann@313
   153
+      va_list __args;
yann@313
   154
+#ifdef __UCLIBC_HAS_XCLOCALE__
yann@313
   155
       __c_locale __old = __gnu_cxx::__uselocale(__cloc);
yann@313
   156
 #else
yann@313
   157
-		     _Tv __v, const __c_locale&, int __prec)
yann@313
   158
-    {
yann@313
   159
 # ifdef __UCLIBC_HAS_LOCALE__
yann@313
   160
       char* __old = std::setlocale(LC_ALL, NULL);
yann@313
   161
       char* __sav = new char[std::strlen(__old) + 1];
yann@313
   162
@@ -103,7 +107,9 @@
yann@313
   163
 # endif
yann@313
   164
 #endif
yann@313
   165
 
yann@313
   166
-      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
yann@313
   167
+      va_start(__args, __fmt);
yann@313
   168
+      const int __ret = std::vsnprintf(__out, __size, __fmt, __args);
yann@313
   169
+      va_end(__args);
yann@313
   170
 
yann@313
   171
 #ifdef __UCLIBC_HAS_XCLOCALE__
yann@313
   172
       __gnu_cxx::__uselocale(__old);
yann@313
   173
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc
yann@313
   174
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2007-08-03 20:30:53.000000000 +0200
yann@313
   175
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2007-08-03 20:31:54.000000000 +0200
yann@313
   176
@@ -33,9 +33,14 @@
yann@313
   177
 
yann@313
   178
 // Written by Benjamin Kosnik <bkoz@redhat.com>
yann@313
   179
 
yann@313
   180
+#include <features.h>
yann@313
   181
+#ifdef __UCLIBC_HAS_LOCALE__
yann@313
   182
 #define _LIBC
yann@313
   183
 #include <locale>
yann@313
   184
 #undef _LIBC
yann@313
   185
+#else
yann@313
   186
+#include <locale>
yann@313
   187
+#endif
yann@313
   188
 #include <bits/c++locale_internal.h>
yann@313
   189
 
yann@313
   190
 namespace std
yann@313
   191
@@ -138,20 +143,34 @@
yann@313
   192
   ctype<wchar_t>::
yann@313
   193
   do_is(mask __m, wchar_t __c) const
yann@313
   194
   { 
yann@313
   195
-    // Highest bitmask in ctype_base == 10, but extra in "C"
yann@313
   196
-    // library for blank.
yann@313
   197
+    // The case of __m == ctype_base::space is particularly important,
yann@313
   198
+    // due to its use in many istream functions.  Therefore we deal with
yann@313
   199
+    // it first, exploiting the knowledge that on GNU systems _M_bit[5]
yann@313
   200
+    // is the mask corresponding to ctype_base::space.  NB: an encoding
yann@313
   201
+    // change would not affect correctness!
yann@313
   202
     bool __ret = false;
yann@313
   203
-    const size_t __bitmasksize = 11; 
yann@313
   204
-    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
yann@313
   205
-      if (__m & _M_bit[__bitcur]
yann@313
   206
-	  && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
yann@313
   207
-	{
yann@313
   208
-	  __ret = true;
yann@313
   209
-	  break;
yann@313
   210
-	}
yann@313
   211
+    if (__m == _M_bit[5])
yann@313
   212
+      __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
yann@313
   213
+    else
yann@313
   214
+      {
yann@313
   215
+	// Highest bitmask in ctype_base == 10, but extra in "C"
yann@313
   216
+	// library for blank.
yann@313
   217
+	const size_t __bitmasksize = 11;
yann@313
   218
+	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
yann@313
   219
+	  if (__m & _M_bit[__bitcur])
yann@313
   220
+	    {
yann@313
   221
+	      if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
yann@313
   222
+		{
yann@313
   223
+		  __ret = true;
yann@313
   224
+		  break;
yann@313
   225
+		}
yann@313
   226
+	      else if (__m == _M_bit[__bitcur])
yann@313
   227
+		break;
yann@313
   228
+	    }
yann@313
   229
+      }
yann@313
   230
     return __ret;    
yann@313
   231
   }
yann@313
   232
-  
yann@313
   233
+
yann@313
   234
   const wchar_t* 
yann@313
   235
   ctype<wchar_t>::
yann@313
   236
   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
yann@313
   237
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.h
yann@313
   238
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.h	2007-08-03 20:30:53.000000000 +0200
yann@313
   239
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.h	2007-08-03 20:31:54.000000000 +0200
yann@313
   240
@@ -47,18 +47,21 @@
yann@313
   241
   template<typename _CharT>
yann@313
   242
      messages<_CharT>::messages(size_t __refs)
yann@313
   243
      : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
yann@313
   244
-     _M_name_messages(_S_get_c_name())
yann@313
   245
+       _M_name_messages(_S_get_c_name())
yann@313
   246
      { }
yann@313
   247
 
yann@313
   248
   template<typename _CharT>
yann@313
   249
      messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
yann@313
   250
 				size_t __refs) 
yann@313
   251
-     : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
yann@313
   252
-     _M_name_messages(__s)
yann@313
   253
+     : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL)
yann@313
   254
      {
yann@313
   255
-       char* __tmp = new char[std::strlen(__s) + 1];
yann@313
   256
-       std::strcpy(__tmp, __s);
yann@313
   257
+       const size_t __len = std::strlen(__s) + 1;
yann@313
   258
+       char* __tmp = new char[__len];
yann@313
   259
+       std::memcpy(__tmp, __s, __len);
yann@313
   260
        _M_name_messages = __tmp;
yann@313
   261
+
yann@313
   262
+       // Last to avoid leaking memory if new throws.
yann@313
   263
+       _M_c_locale_messages = _S_clone_c_locale(__cloc);
yann@313
   264
      }
yann@313
   265
 
yann@313
   266
   template<typename _CharT>
yann@313
   267
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc
yann@313
   268
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2007-08-03 20:31:24.000000000 +0200
yann@313
   269
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2007-08-03 20:31:54.000000000 +0200
yann@313
   270
@@ -33,9 +33,14 @@
yann@313
   271
 
yann@313
   272
 // Written by Benjamin Kosnik <bkoz@redhat.com>
yann@313
   273
 
yann@313
   274
+#include <features.h>
yann@313
   275
+#ifdef __UCLIBC_HAS_LOCALE__
yann@313
   276
 #define _LIBC
yann@313
   277
 #include <locale>
yann@313
   278
 #undef _LIBC
yann@313
   279
+#else
yann@313
   280
+#include <locale>
yann@313
   281
+#endif
yann@313
   282
 #include <bits/c++locale_internal.h>
yann@313
   283
 
yann@313
   284
 #ifdef __UCLIBC_MJN3_ONLY__
yann@313
   285
@@ -206,7 +211,7 @@
yann@313
   286
 	  }
yann@313
   287
 	break;
yann@313
   288
       default:
yann@313
   289
-	;
yann@313
   290
+	__ret = pattern();
yann@313
   291
       }
yann@313
   292
     return __ret;
yann@313
   293
   }
yann@313
   294
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc
yann@313
   295
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2007-08-03 20:31:24.000000000 +0200
yann@313
   296
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2007-08-03 20:31:54.000000000 +0200
yann@313
   297
@@ -33,9 +33,14 @@
yann@313
   298
 
yann@313
   299
 // Written by Benjamin Kosnik <bkoz@redhat.com>
yann@313
   300
 
yann@313
   301
+#include <features.h>
yann@313
   302
+#ifdef __UCLIBC_HAS_LOCALE__
yann@313
   303
 #define _LIBC
yann@313
   304
 #include <locale>
yann@313
   305
 #undef _LIBC
yann@313
   306
+#else
yann@313
   307
+#include <locale>
yann@313
   308
+#endif
yann@313
   309
 #include <bits/c++locale_internal.h>
yann@313
   310
 
yann@313
   311
 #ifdef __UCLIBC_MJN3_ONLY__
yann@313
   312
diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.h
yann@313
   313
--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.h	2007-08-03 20:30:21.000000000 +0200
yann@313
   314
+++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.h	2007-08-03 20:31:54.000000000 +0200
yann@313
   315
@@ -37,25 +37,33 @@
yann@313
   316
   template<typename _CharT>
yann@313
   317
     __timepunct<_CharT>::__timepunct(size_t __refs) 
yann@313
   318
     : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
yann@313
   319
-    _M_name_timepunct(_S_get_c_name())
yann@313
   320
+      _M_name_timepunct(_S_get_c_name())
yann@313
   321
     { _M_initialize_timepunct(); }
yann@313
   322
 
yann@313
   323
   template<typename _CharT>
yann@313
   324
     __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
yann@313
   325
     : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
yann@313
   326
-    _M_name_timepunct(_S_get_c_name())
yann@313
   327
+      _M_name_timepunct(_S_get_c_name())
yann@313
   328
     { _M_initialize_timepunct(); }
yann@313
   329
 
yann@313
   330
   template<typename _CharT>
yann@313
   331
     __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
yann@313
   332
 				     size_t __refs) 
yann@313
   333
     : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
yann@313
   334
-    _M_name_timepunct(__s)
yann@313
   335
+      _M_name_timepunct(NULL)
yann@313
   336
     { 
yann@313
   337
-      char* __tmp = new char[std::strlen(__s) + 1];
yann@313
   338
-      std::strcpy(__tmp, __s);
yann@313
   339
+      const size_t __len = std::strlen(__s) + 1;
yann@313
   340
+      char* __tmp = new char[__len];
yann@313
   341
+      std::memcpy(__tmp, __s, __len);
yann@313
   342
       _M_name_timepunct = __tmp;
yann@313
   343
-      _M_initialize_timepunct(__cloc); 
yann@313
   344
+
yann@313
   345
+      try
yann@313
   346
+	{ _M_initialize_timepunct(__cloc); }
yann@313
   347
+      catch(...)
yann@313
   348
+	{
yann@313
   349
+	  delete [] _M_name_timepunct;
yann@313
   350
+	  __throw_exception_again;
yann@313
   351
+	}
yann@313
   352
     }
yann@313
   353
 
yann@313
   354
   template<typename _CharT>