diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.8/205-uclibc-locale-update.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.8/205-uclibc-locale-update.patch | 521 |
1 files changed, 521 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.8/205-uclibc-locale-update.patch b/meta/recipes-devtools/gcc/gcc-4.8/205-uclibc-locale-update.patch new file mode 100644 index 0000000000..743017b4d3 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.8/205-uclibc-locale-update.patch | |||
@@ -0,0 +1,521 @@ | |||
1 | Upstream-Status: Pending | ||
2 | |||
3 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c_locale.cc | ||
4 | =================================================================== | ||
5 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc | ||
6 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c_locale.cc | ||
7 | @@ -39,23 +39,20 @@ | ||
8 | #include <langinfo.h> | ||
9 | #include <bits/c++locale_internal.h> | ||
10 | |||
11 | -namespace std | ||
12 | -{ | ||
13 | +_GLIBCXX_BEGIN_NAMESPACE(std) | ||
14 | + | ||
15 | template<> | ||
16 | void | ||
17 | __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, | ||
18 | const __c_locale& __cloc) | ||
19 | { | ||
20 | - if (!(__err & ios_base::failbit)) | ||
21 | - { | ||
22 | - char* __sanity; | ||
23 | - errno = 0; | ||
24 | - float __f = __strtof_l(__s, &__sanity, __cloc); | ||
25 | - if (__sanity != __s && errno != ERANGE) | ||
26 | - __v = __f; | ||
27 | - else | ||
28 | - __err |= ios_base::failbit; | ||
29 | - } | ||
30 | + char* __sanity; | ||
31 | + errno = 0; | ||
32 | + float __f = __strtof_l(__s, &__sanity, __cloc); | ||
33 | + if (__sanity != __s && errno != ERANGE) | ||
34 | + __v = __f; | ||
35 | + else | ||
36 | + __err |= ios_base::failbit; | ||
37 | } | ||
38 | |||
39 | template<> | ||
40 | @@ -63,16 +60,13 @@ namespace std | ||
41 | __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, | ||
42 | const __c_locale& __cloc) | ||
43 | { | ||
44 | - if (!(__err & ios_base::failbit)) | ||
45 | - { | ||
46 | - char* __sanity; | ||
47 | - errno = 0; | ||
48 | - double __d = __strtod_l(__s, &__sanity, __cloc); | ||
49 | - if (__sanity != __s && errno != ERANGE) | ||
50 | - __v = __d; | ||
51 | - else | ||
52 | - __err |= ios_base::failbit; | ||
53 | - } | ||
54 | + char* __sanity; | ||
55 | + errno = 0; | ||
56 | + double __d = __strtod_l(__s, &__sanity, __cloc); | ||
57 | + if (__sanity != __s && errno != ERANGE) | ||
58 | + __v = __d; | ||
59 | + else | ||
60 | + __err |= ios_base::failbit; | ||
61 | } | ||
62 | |||
63 | template<> | ||
64 | @@ -80,16 +74,13 @@ namespace std | ||
65 | __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, | ||
66 | const __c_locale& __cloc) | ||
67 | { | ||
68 | - if (!(__err & ios_base::failbit)) | ||
69 | - { | ||
70 | - char* __sanity; | ||
71 | - errno = 0; | ||
72 | - long double __ld = __strtold_l(__s, &__sanity, __cloc); | ||
73 | - if (__sanity != __s && errno != ERANGE) | ||
74 | - __v = __ld; | ||
75 | - else | ||
76 | - __err |= ios_base::failbit; | ||
77 | - } | ||
78 | + char* __sanity; | ||
79 | + errno = 0; | ||
80 | + long double __ld = __strtold_l(__s, &__sanity, __cloc); | ||
81 | + if (__sanity != __s && errno != ERANGE) | ||
82 | + __v = __ld; | ||
83 | + else | ||
84 | + __err |= ios_base::failbit; | ||
85 | } | ||
86 | |||
87 | void | ||
88 | @@ -110,17 +101,18 @@ namespace std | ||
89 | void | ||
90 | locale::facet::_S_destroy_c_locale(__c_locale& __cloc) | ||
91 | { | ||
92 | - if (_S_get_c_locale() != __cloc) | ||
93 | + if (__cloc && _S_get_c_locale() != __cloc) | ||
94 | __freelocale(__cloc); | ||
95 | } | ||
96 | |||
97 | __c_locale | ||
98 | locale::facet::_S_clone_c_locale(__c_locale& __cloc) | ||
99 | { return __duplocale(__cloc); } | ||
100 | -} // namespace std | ||
101 | |||
102 | -namespace __gnu_cxx | ||
103 | -{ | ||
104 | +_GLIBCXX_END_NAMESPACE | ||
105 | + | ||
106 | +_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) | ||
107 | + | ||
108 | const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = | ||
109 | { | ||
110 | "LC_CTYPE", | ||
111 | @@ -138,9 +130,11 @@ namespace __gnu_cxx | ||
112 | "LC_IDENTIFICATION" | ||
113 | #endif | ||
114 | }; | ||
115 | -} | ||
116 | |||
117 | -namespace std | ||
118 | -{ | ||
119 | +_GLIBCXX_END_NAMESPACE | ||
120 | + | ||
121 | +_GLIBCXX_BEGIN_NAMESPACE(std) | ||
122 | + | ||
123 | const char* const* const locale::_S_categories = __gnu_cxx::category_names; | ||
124 | -} // namespace std | ||
125 | + | ||
126 | +_GLIBCXX_END_NAMESPACE | ||
127 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc | ||
128 | =================================================================== | ||
129 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc | ||
130 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc | ||
131 | @@ -33,16 +33,20 @@ | ||
132 | |||
133 | // Written by Benjamin Kosnik <bkoz@redhat.com> | ||
134 | |||
135 | +#include <features.h> | ||
136 | +#ifdef __UCLIBC_HAS_LOCALE__ | ||
137 | #define _LIBC | ||
138 | #include <locale> | ||
139 | #undef _LIBC | ||
140 | +#else | ||
141 | +#include <locale> | ||
142 | +#endif | ||
143 | #include <bits/c++locale_internal.h> | ||
144 | |||
145 | -namespace std | ||
146 | -{ | ||
147 | +_GLIBCXX_BEGIN_NAMESPACE(std) | ||
148 | + | ||
149 | // NB: The other ctype<char> specializations are in src/locale.cc and | ||
150 | // various /config/os/* files. | ||
151 | - template<> | ||
152 | ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) | ||
153 | : ctype<char>(0, false, __refs) | ||
154 | { | ||
155 | @@ -57,6 +61,8 @@ namespace std | ||
156 | #endif | ||
157 | } | ||
158 | } | ||
159 | + ctype_byname<char>::~ctype_byname() | ||
160 | + { } | ||
161 | |||
162 | #ifdef _GLIBCXX_USE_WCHAR_T | ||
163 | ctype<wchar_t>::__wmask_type | ||
164 | @@ -138,17 +144,33 @@ namespace std | ||
165 | ctype<wchar_t>:: | ||
166 | do_is(mask __m, wchar_t __c) const | ||
167 | { | ||
168 | - // Highest bitmask in ctype_base == 10, but extra in "C" | ||
169 | - // library for blank. | ||
170 | + // The case of __m == ctype_base::space is particularly important, | ||
171 | + // due to its use in many istream functions. Therefore we deal with | ||
172 | + // it first, exploiting the knowledge that on GNU systems _M_bit[5] | ||
173 | + // is the mask corresponding to ctype_base::space. NB: an encoding | ||
174 | + // change would not affect correctness! | ||
175 | + | ||
176 | bool __ret = false; | ||
177 | - const size_t __bitmasksize = 11; | ||
178 | - for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
179 | - if (__m & _M_bit[__bitcur] | ||
180 | - && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
181 | - { | ||
182 | - __ret = true; | ||
183 | - break; | ||
184 | - } | ||
185 | + if (__m == _M_bit[5]) | ||
186 | + __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); | ||
187 | + else | ||
188 | + { | ||
189 | + // Highest bitmask in ctype_base == 10, but extra in "C" | ||
190 | + // library for blank. | ||
191 | + const size_t __bitmasksize = 11; | ||
192 | + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
193 | + if (__m & _M_bit[__bitcur]) | ||
194 | + { | ||
195 | + if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
196 | + { | ||
197 | + __ret = true; | ||
198 | + break; | ||
199 | + } | ||
200 | + else if (__m == _M_bit[__bitcur]) | ||
201 | + break; | ||
202 | + } | ||
203 | + } | ||
204 | + | ||
205 | return __ret; | ||
206 | } | ||
207 | |||
208 | @@ -290,4 +312,5 @@ namespace std | ||
209 | #endif | ||
210 | } | ||
211 | #endif // _GLIBCXX_USE_WCHAR_T | ||
212 | -} | ||
213 | + | ||
214 | +_GLIBCXX_END_NAMESPACE | ||
215 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/messages_members.h | ||
216 | =================================================================== | ||
217 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/messages_members.h | ||
218 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/messages_members.h | ||
219 | @@ -53,12 +53,16 @@ | ||
220 | template<typename _CharT> | ||
221 | messages<_CharT>::messages(__c_locale __cloc, const char* __s, | ||
222 | size_t __refs) | ||
223 | - : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), | ||
224 | - _M_name_messages(__s) | ||
225 | + : facet(__refs), _M_c_locale_messages(NULL), | ||
226 | + _M_name_messages(NULL) | ||
227 | { | ||
228 | - char* __tmp = new char[std::strlen(__s) + 1]; | ||
229 | - std::strcpy(__tmp, __s); | ||
230 | + const size_t __len = std::strlen(__s) + 1; | ||
231 | + char* __tmp = new char[__len]; | ||
232 | + std::memcpy(__tmp, __s, __len); | ||
233 | _M_name_messages = __tmp; | ||
234 | + | ||
235 | + // Last to avoid leaking memory if new throws. | ||
236 | + _M_c_locale_messages = _S_clone_c_locale(__cloc); | ||
237 | } | ||
238 | |||
239 | template<typename _CharT> | ||
240 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc | ||
241 | =================================================================== | ||
242 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc | ||
243 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc | ||
244 | @@ -33,9 +33,14 @@ | ||
245 | |||
246 | // Written by Benjamin Kosnik <bkoz@redhat.com> | ||
247 | |||
248 | +#include <features.h> | ||
249 | +#ifdef __UCLIBC_HAS_LOCALE__ | ||
250 | #define _LIBC | ||
251 | #include <locale> | ||
252 | #undef _LIBC | ||
253 | +#else | ||
254 | +#include <locale> | ||
255 | +#endif | ||
256 | #include <bits/c++locale_internal.h> | ||
257 | |||
258 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
259 | @@ -206,7 +211,7 @@ namespace std | ||
260 | } | ||
261 | break; | ||
262 | default: | ||
263 | - ; | ||
264 | + __ret = pattern(); | ||
265 | } | ||
266 | return __ret; | ||
267 | } | ||
268 | @@ -390,7 +395,9 @@ namespace std | ||
269 | __c_locale __old = __uselocale(__cloc); | ||
270 | #else | ||
271 | // Switch to named locale so that mbsrtowcs will work. | ||
272 | - char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
273 | + char* __old = setlocale(LC_ALL, NULL); | ||
274 | + const size_t __llen = strlen(__old) + 1; | ||
275 | + char* __sav = new char[__llen]; | ||
276 | setlocale(LC_ALL, __name); | ||
277 | #endif | ||
278 | |||
279 | @@ -477,8 +484,8 @@ namespace std | ||
280 | #ifdef __UCLIBC_HAS_XLOCALE__ | ||
281 | __uselocale(__old); | ||
282 | #else | ||
283 | - setlocale(LC_ALL, __old); | ||
284 | - free(__old); | ||
285 | + setlocale(LC_ALL, __sav); | ||
286 | + delete [] __sav; | ||
287 | #endif | ||
288 | __throw_exception_again; | ||
289 | } | ||
290 | @@ -498,8 +505,8 @@ namespace std | ||
291 | #ifdef __UCLIBC_HAS_XLOCALE__ | ||
292 | __uselocale(__old); | ||
293 | #else | ||
294 | - setlocale(LC_ALL, __old); | ||
295 | - free(__old); | ||
296 | + setlocale(LC_ALL, __sav); | ||
297 | + delete [] __sav; | ||
298 | #endif | ||
299 | } | ||
300 | } | ||
301 | @@ -545,8 +552,11 @@ namespace std | ||
302 | __c_locale __old = __uselocale(__cloc); | ||
303 | #else | ||
304 | // Switch to named locale so that mbsrtowcs will work. | ||
305 | - char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
306 | - setlocale(LC_ALL, __name); | ||
307 | + char* __old = setlocale(LC_ALL, NULL); | ||
308 | + const size_t __llen = strlen(__old) + 1; | ||
309 | + char* __sav = new char[__llen]; | ||
310 | + memcpy(__sav, __old, __llen); | ||
311 | + setlocale(LC_ALL, __name); | ||
312 | #endif | ||
313 | |||
314 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
315 | @@ -633,8 +643,8 @@ namespace std | ||
316 | #ifdef __UCLIBC_HAS_XLOCALE__ | ||
317 | __uselocale(__old); | ||
318 | #else | ||
319 | - setlocale(LC_ALL, __old); | ||
320 | - free(__old); | ||
321 | + setlocale(LC_ALL, __sav); | ||
322 | + delete [] __sav; | ||
323 | #endif | ||
324 | __throw_exception_again; | ||
325 | } | ||
326 | @@ -653,8 +663,8 @@ namespace std | ||
327 | #ifdef __UCLIBC_HAS_XLOCALE__ | ||
328 | __uselocale(__old); | ||
329 | #else | ||
330 | - setlocale(LC_ALL, __old); | ||
331 | - free(__old); | ||
332 | + setlocale(LC_ALL, __sav); | ||
333 | + delete [] __sav; | ||
334 | #endif | ||
335 | } | ||
336 | } | ||
337 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc | ||
338 | =================================================================== | ||
339 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc | ||
340 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc | ||
341 | @@ -33,9 +33,14 @@ | ||
342 | |||
343 | // Written by Benjamin Kosnik <bkoz@redhat.com> | ||
344 | |||
345 | +#include <features.h> | ||
346 | +#ifdef __UCLIBC_HAS_LOCALE__ | ||
347 | #define _LIBC | ||
348 | #include <locale> | ||
349 | #undef _LIBC | ||
350 | +#else | ||
351 | +#include <locale> | ||
352 | +#endif | ||
353 | #include <bits/c++locale_internal.h> | ||
354 | |||
355 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
356 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/time_members.h | ||
357 | =================================================================== | ||
358 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/time_members.h | ||
359 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/time_members.h | ||
360 | @@ -50,12 +50,21 @@ | ||
361 | __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | ||
362 | size_t __refs) | ||
363 | : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), | ||
364 | - _M_name_timepunct(__s) | ||
365 | + _M_name_timepunct(NULL) | ||
366 | { | ||
367 | - char* __tmp = new char[std::strlen(__s) + 1]; | ||
368 | - std::strcpy(__tmp, __s); | ||
369 | + const size_t __len = std::strlen(__s) + 1; | ||
370 | + char* __tmp = new char[__len]; | ||
371 | + std::memcpy(__tmp, __s, __len); | ||
372 | _M_name_timepunct = __tmp; | ||
373 | - _M_initialize_timepunct(__cloc); | ||
374 | + | ||
375 | + try | ||
376 | + { _M_initialize_timepunct(__cloc); } | ||
377 | + catch(...) | ||
378 | + { | ||
379 | + delete [] _M_name_timepunct; | ||
380 | + __throw_exception_again; | ||
381 | + } | ||
382 | + | ||
383 | } | ||
384 | |||
385 | template<typename _CharT> | ||
386 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c_locale.h | ||
387 | =================================================================== | ||
388 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/c_locale.h | ||
389 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c_locale.h | ||
390 | @@ -39,21 +39,23 @@ | ||
391 | #pragma GCC system_header | ||
392 | |||
393 | #include <cstring> // get std::strlen | ||
394 | -#include <cstdio> // get std::snprintf or std::sprintf | ||
395 | +#include <cstdio> // get std::vsnprintf or std::vsprintf | ||
396 | #include <clocale> | ||
397 | #include <langinfo.h> // For codecvt | ||
398 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
399 | #warning fix this | ||
400 | #endif | ||
401 | -#ifdef __UCLIBC_HAS_LOCALE__ | ||
402 | +#ifdef _GLIBCXX_USE_ICONV | ||
403 | #include <iconv.h> // For codecvt using iconv, iconv_t | ||
404 | #endif | ||
405 | -#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
406 | -#include <libintl.h> // For messages | ||
407 | +#ifdef HAVE_LIBINTL_H | ||
408 | +#include <libintl.h> // For messages | ||
409 | #endif | ||
410 | +#include <cstdarg> | ||
411 | |||
412 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
413 | #warning what is _GLIBCXX_C_LOCALE_GNU for | ||
414 | +// psm: used in os/gnu-linux/ctype_noninline.h | ||
415 | #endif | ||
416 | #define _GLIBCXX_C_LOCALE_GNU 1 | ||
417 | |||
418 | @@ -78,23 +80,25 @@ namespace std | ||
419 | #else | ||
420 | typedef int* __c_locale; | ||
421 | #endif | ||
422 | - | ||
423 | - // Convert numeric value of type _Tv to string and return length of | ||
424 | - // string. If snprintf is available use it, otherwise fall back to | ||
425 | - // the unsafe sprintf which, in general, can be dangerous and should | ||
426 | + // Convert numeric value of type double to string and return length of | ||
427 | + // string. If vsnprintf is available use it, otherwise fall back to | ||
428 | + // the unsafe vsprintf which, in general, can be dangerous and should | ||
429 | // be avoided. | ||
430 | - template<typename _Tv> | ||
431 | - int | ||
432 | - __convert_from_v(char* __out, | ||
433 | - const int __size __attribute__ ((__unused__)), | ||
434 | - const char* __fmt, | ||
435 | -#ifdef __UCLIBC_HAS_XCLOCALE__ | ||
436 | - _Tv __v, const __c_locale& __cloc, int __prec) | ||
437 | + inline int | ||
438 | + __convert_from_v(const __c_locale& | ||
439 | +#ifndef __UCLIBC_HAS_XCLOCALE__ | ||
440 | + __cloc __attribute__ ((__unused__)) | ||
441 | +#endif | ||
442 | + , | ||
443 | + char* __out, | ||
444 | + const int __size, | ||
445 | + const char* __fmt, ...) | ||
446 | { | ||
447 | + va_list __args; | ||
448 | +#ifdef __UCLIBC_HAS_XCLOCALE__ | ||
449 | + | ||
450 | __c_locale __old = __gnu_cxx::__uselocale(__cloc); | ||
451 | #else | ||
452 | - _Tv __v, const __c_locale&, int __prec) | ||
453 | - { | ||
454 | # ifdef __UCLIBC_HAS_LOCALE__ | ||
455 | char* __old = std::setlocale(LC_ALL, NULL); | ||
456 | char* __sav = new char[std::strlen(__old) + 1]; | ||
457 | @@ -103,7 +107,9 @@ namespace std | ||
458 | # endif | ||
459 | #endif | ||
460 | |||
461 | - const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); | ||
462 | + va_start(__args, __fmt); | ||
463 | + const int __ret = std::vsnprintf(__out, __size, __fmt, __args); | ||
464 | + va_end(__args); | ||
465 | |||
466 | #ifdef __UCLIBC_HAS_XCLOCALE__ | ||
467 | __gnu_cxx::__uselocale(__old); | ||
468 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/time_members.cc | ||
469 | =================================================================== | ||
470 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/time_members.cc | ||
471 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/time_members.cc | ||
472 | @@ -53,11 +53,14 @@ namespace std | ||
473 | const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, | ||
474 | _M_c_locale_timepunct); | ||
475 | #else | ||
476 | - char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
477 | + char* __old = setlocale(LC_ALL, NULL); | ||
478 | + const size_t __llen = strlen(__old) + 1; | ||
479 | + char* __sav = new char[__llen]; | ||
480 | + memcpy(__sav, __old, __llen); | ||
481 | setlocale(LC_ALL, _M_name_timepunct); | ||
482 | const size_t __len = strftime(__s, __maxlen, __format, __tm); | ||
483 | - setlocale(LC_ALL, __old); | ||
484 | - free(__old); | ||
485 | + setlocale(LC_ALL, __sav); | ||
486 | + delete [] __sav; | ||
487 | #endif | ||
488 | // Make sure __s is null terminated. | ||
489 | if (__len == 0) | ||
490 | @@ -207,11 +210,14 @@ namespace std | ||
491 | const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, | ||
492 | _M_c_locale_timepunct); | ||
493 | #else | ||
494 | - char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
495 | + char* __old = setlocale(LC_ALL, NULL); | ||
496 | + const size_t __llen = strlen(__old) + 1; | ||
497 | + char* __sav = new char[__llen]; | ||
498 | + memcpy(__sav, __old, __llen); | ||
499 | setlocale(LC_ALL, _M_name_timepunct); | ||
500 | const size_t __len = wcsftime(__s, __maxlen, __format, __tm); | ||
501 | - setlocale(LC_ALL, __old); | ||
502 | - free(__old); | ||
503 | + setlocale(LC_ALL, __sav); | ||
504 | + delete [] __sav; | ||
505 | #endif | ||
506 | // Make sure __s is null terminated. | ||
507 | if (__len == 0) | ||
508 | Index: gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h | ||
509 | =================================================================== | ||
510 | --- gcc-4.6.0.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h | ||
511 | +++ gcc-4.6.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h | ||
512 | @@ -31,6 +31,9 @@ | ||
513 | |||
514 | #include <bits/c++config.h> | ||
515 | #include <clocale> | ||
516 | +#include <cstdlib> | ||
517 | +#include <cstring> | ||
518 | +#include <cstddef> | ||
519 | |||
520 | #ifdef __UCLIBC_MJN3_ONLY__ | ||
521 | #warning clean this up | ||