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