patches/gcc/4.2.4/150-uclibc-locale-update.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 17:54:21 2011 +0200 (2011-07-17)
changeset 2888 dd71df95903a
parent 687 b2b6b1d46aa1
permissions -rw-r--r--
cc/gcc: pass the companion libs prefix to cc_core

In case of canadian-cross, the companion libraries are not the same for
the core cc (they run on 'build') as they are for the final cc (they run
on 'host').

Prepare for this differentiation (coming later), while retaining the
current behavior (to use the same compblibs).

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