blob: 656265a28504a2e4561f18caff80748f620c42c7 [file] [log] [blame]
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001From bd9dd472d162fc72522f96f70f6391c7c63d2bf7 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:41:39 +0400
4Subject: [PATCH 04/46] uclibc-locale
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/acinclude.m4 | 37 ++
11 .../config/locale/uclibc/c++locale_internal.h | 63 ++
12 libstdc++-v3/config/locale/uclibc/c_locale.cc | 160 +++++
13 libstdc++-v3/config/locale/uclibc/c_locale.h | 117 ++++
14 .../config/locale/uclibc/codecvt_members.cc | 308 +++++++++
15 .../config/locale/uclibc/collate_members.cc | 80 +++
16 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 300 +++++++++
17 .../config/locale/uclibc/messages_members.cc | 100 +++
18 .../config/locale/uclibc/messages_members.h | 118 ++++
19 .../config/locale/uclibc/monetary_members.cc | 692 +++++++++++++++++++++
20 .../config/locale/uclibc/numeric_members.cc | 160 +++++
21 libstdc++-v3/config/locale/uclibc/time_members.cc | 406 ++++++++++++
22 libstdc++-v3/config/locale/uclibc/time_members.h | 68 ++
23 libstdc++-v3/configure | 75 +++
24 libstdc++-v3/include/c_compatibility/wchar.h | 2 +
25 libstdc++-v3/include/c_std/cwchar | 2 +
26 16 files changed, 2688 insertions(+)
27 create mode 100644 libstdc++-v3/config/locale/uclibc/c++locale_internal.h
28 create mode 100644 libstdc++-v3/config/locale/uclibc/c_locale.cc
29 create mode 100644 libstdc++-v3/config/locale/uclibc/c_locale.h
30 create mode 100644 libstdc++-v3/config/locale/uclibc/codecvt_members.cc
31 create mode 100644 libstdc++-v3/config/locale/uclibc/collate_members.cc
32 create mode 100644 libstdc++-v3/config/locale/uclibc/ctype_members.cc
33 create mode 100644 libstdc++-v3/config/locale/uclibc/messages_members.cc
34 create mode 100644 libstdc++-v3/config/locale/uclibc/messages_members.h
35 create mode 100644 libstdc++-v3/config/locale/uclibc/monetary_members.cc
36 create mode 100644 libstdc++-v3/config/locale/uclibc/numeric_members.cc
37 create mode 100644 libstdc++-v3/config/locale/uclibc/time_members.cc
38 create mode 100644 libstdc++-v3/config/locale/uclibc/time_members.h
39
40diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
41index 826ef86..79cc716 100644
42--- a/libstdc++-v3/acinclude.m4
43+++ b/libstdc++-v3/acinclude.m4
44@@ -2029,6 +2029,9 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
45 # Default to "generic".
46 if test $enable_clocale_flag = auto; then
47 case ${target_os} in
48+ *-uclibc*)
49+ enable_clocale_flag=uclibc
50+ ;;
51 linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
52 enable_clocale_flag=gnu
53 ;;
54@@ -2213,6 +2216,40 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
55 CTIME_CC=config/locale/generic/time_members.cc
56 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
57 ;;
58+ uclibc)
59+ AC_MSG_RESULT(uclibc)
60+
61+ # Declare intention to use gettext, and add support for specific
62+ # languages.
63+ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
64+ ALL_LINGUAS="de fr"
65+
66+ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
67+ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
68+ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
69+ USE_NLS=yes
70+ fi
71+ # Export the build objects.
72+ for ling in $ALL_LINGUAS; do \
73+ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
74+ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
75+ done
76+ AC_SUBST(glibcxx_MOFILES)
77+ AC_SUBST(glibcxx_POFILES)
78+
79+ CLOCALE_H=config/locale/uclibc/c_locale.h
80+ CLOCALE_CC=config/locale/uclibc/c_locale.cc
81+ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
82+ CCOLLATE_CC=config/locale/uclibc/collate_members.cc
83+ CCTYPE_CC=config/locale/uclibc/ctype_members.cc
84+ CMESSAGES_H=config/locale/uclibc/messages_members.h
85+ CMESSAGES_CC=config/locale/uclibc/messages_members.cc
86+ CMONEY_CC=config/locale/uclibc/monetary_members.cc
87+ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
88+ CTIME_H=config/locale/uclibc/time_members.h
89+ CTIME_CC=config/locale/uclibc/time_members.cc
90+ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
91+ ;;
92 esac
93
94 # This is where the testsuite looks for locale catalogs, using the
95diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
96new file mode 100644
97index 0000000..2ae3e4a
98--- /dev/null
99+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
100@@ -0,0 +1,63 @@
101+// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
102+
103+// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
104+//
105+// This file is part of the GNU ISO C++ Library. This library is free
106+// software; you can redistribute it and/or modify it under the
107+// terms of the GNU General Public License as published by the
108+// Free Software Foundation; either version 2, or (at your option)
109+// any later version.
110+
111+// This library is distributed in the hope that it will be useful,
112+// but WITHOUT ANY WARRANTY; without even the implied warranty of
113+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
114+// GNU General Public License for more details.
115+
116+// You should have received a copy of the GNU General Public License along
117+// with this library; see the file COPYING. If not, write to the Free
118+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
119+// USA.
120+
121+// As a special exception, you may use this file as part of a free software
122+// library without restriction. Specifically, if other files instantiate
123+// templates or use macros or inline functions from this file, or you compile
124+// this file and link it with other files to produce an executable, this
125+// file does not by itself cause the resulting executable to be covered by
126+// the GNU General Public License. This exception does not however
127+// invalidate any other reasons why the executable file might be covered by
128+// the GNU General Public License.
129+
130+// Written by Jakub Jelinek <jakub@redhat.com>
131+
132+#include <bits/c++config.h>
133+#include <clocale>
134+
135+#ifdef __UCLIBC_MJN3_ONLY__
136+#warning clean this up
137+#endif
138+
139+#ifdef __UCLIBC_HAS_XLOCALE__
140+
141+extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
142+extern "C" __typeof(strcoll_l) __strcoll_l;
143+extern "C" __typeof(strftime_l) __strftime_l;
144+extern "C" __typeof(strtod_l) __strtod_l;
145+extern "C" __typeof(strtof_l) __strtof_l;
146+extern "C" __typeof(strtold_l) __strtold_l;
147+extern "C" __typeof(strxfrm_l) __strxfrm_l;
148+extern "C" __typeof(newlocale) __newlocale;
149+extern "C" __typeof(freelocale) __freelocale;
150+extern "C" __typeof(duplocale) __duplocale;
151+extern "C" __typeof(uselocale) __uselocale;
152+
153+#ifdef _GLIBCXX_USE_WCHAR_T
154+extern "C" __typeof(iswctype_l) __iswctype_l;
155+extern "C" __typeof(towlower_l) __towlower_l;
156+extern "C" __typeof(towupper_l) __towupper_l;
157+extern "C" __typeof(wcscoll_l) __wcscoll_l;
158+extern "C" __typeof(wcsftime_l) __wcsftime_l;
159+extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
160+extern "C" __typeof(wctype_l) __wctype_l;
161+#endif
162+
163+#endif // GLIBC 2.3 and later
164diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
165new file mode 100644
166index 0000000..5081dc1
167--- /dev/null
168+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
169@@ -0,0 +1,160 @@
170+// Wrapper for underlying C-language localization -*- C++ -*-
171+
172+// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
173+//
174+// This file is part of the GNU ISO C++ Library. This library is free
175+// software; you can redistribute it and/or modify it under the
176+// terms of the GNU General Public License as published by the
177+// Free Software Foundation; either version 2, or (at your option)
178+// any later version.
179+
180+// This library is distributed in the hope that it will be useful,
181+// but WITHOUT ANY WARRANTY; without even the implied warranty of
182+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
183+// GNU General Public License for more details.
184+
185+// You should have received a copy of the GNU General Public License along
186+// with this library; see the file COPYING. If not, write to the Free
187+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
188+// USA.
189+
190+// As a special exception, you may use this file as part of a free software
191+// library without restriction. Specifically, if other files instantiate
192+// templates or use macros or inline functions from this file, or you compile
193+// this file and link it with other files to produce an executable, this
194+// file does not by itself cause the resulting executable to be covered by
195+// the GNU General Public License. This exception does not however
196+// invalidate any other reasons why the executable file might be covered by
197+// the GNU General Public License.
198+
199+//
200+// ISO C++ 14882: 22.8 Standard locale categories.
201+//
202+
203+// Written by Benjamin Kosnik <bkoz@redhat.com>
204+
205+#include <cerrno> // For errno
206+#include <locale>
207+#include <stdexcept>
208+#include <langinfo.h>
209+#include <bits/c++locale_internal.h>
210+
211+#ifndef __UCLIBC_HAS_XLOCALE__
212+#define __strtol_l(S, E, B, L) strtol((S), (E), (B))
213+#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B))
214+#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B))
215+#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B))
216+#define __strtof_l(S, E, L) strtof((S), (E))
217+#define __strtod_l(S, E, L) strtod((S), (E))
218+#define __strtold_l(S, E, L) strtold((S), (E))
219+#warning should dummy __newlocale check for C|POSIX ?
220+#define __newlocale(a, b, c) NULL
221+#define __freelocale(a) ((void)0)
222+#define __duplocale(a) __c_locale()
223+#endif
224+
225+namespace std
226+{
227+ template<>
228+ void
229+ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
230+ const __c_locale& __cloc)
231+ {
232+ if (!(__err & ios_base::failbit))
233+ {
234+ char* __sanity;
235+ errno = 0;
236+ float __f = __strtof_l(__s, &__sanity, __cloc);
237+ if (__sanity != __s && errno != ERANGE)
238+ __v = __f;
239+ else
240+ __err |= ios_base::failbit;
241+ }
242+ }
243+
244+ template<>
245+ void
246+ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
247+ const __c_locale& __cloc)
248+ {
249+ if (!(__err & ios_base::failbit))
250+ {
251+ char* __sanity;
252+ errno = 0;
253+ double __d = __strtod_l(__s, &__sanity, __cloc);
254+ if (__sanity != __s && errno != ERANGE)
255+ __v = __d;
256+ else
257+ __err |= ios_base::failbit;
258+ }
259+ }
260+
261+ template<>
262+ void
263+ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
264+ const __c_locale& __cloc)
265+ {
266+ if (!(__err & ios_base::failbit))
267+ {
268+ char* __sanity;
269+ errno = 0;
270+ long double __ld = __strtold_l(__s, &__sanity, __cloc);
271+ if (__sanity != __s && errno != ERANGE)
272+ __v = __ld;
273+ else
274+ __err |= ios_base::failbit;
275+ }
276+ }
277+
278+ void
279+ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,
280+ __c_locale __old)
281+ {
282+ __cloc = __newlocale(1 << LC_ALL, __s, __old);
283+#ifdef __UCLIBC_HAS_XLOCALE__
284+ if (!__cloc)
285+ {
286+ // This named locale is not supported by the underlying OS.
287+ __throw_runtime_error(__N("locale::facet::_S_create_c_locale "
288+ "name not valid"));
289+ }
290+#endif
291+ }
292+
293+ void
294+ locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
295+ {
296+ if (_S_get_c_locale() != __cloc)
297+ __freelocale(__cloc);
298+ }
299+
300+ __c_locale
301+ locale::facet::_S_clone_c_locale(__c_locale& __cloc)
302+ { return __duplocale(__cloc); }
303+} // namespace std
304+
305+namespace __gnu_cxx
306+{
307+ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
308+ {
309+ "LC_CTYPE",
310+ "LC_NUMERIC",
311+ "LC_TIME",
312+ "LC_COLLATE",
313+ "LC_MONETARY",
314+ "LC_MESSAGES",
315+#if _GLIBCXX_NUM_CATEGORIES != 0
316+ "LC_PAPER",
317+ "LC_NAME",
318+ "LC_ADDRESS",
319+ "LC_TELEPHONE",
320+ "LC_MEASUREMENT",
321+ "LC_IDENTIFICATION"
322+#endif
323+ };
324+}
325+
326+namespace std
327+{
328+ const char* const* const locale::_S_categories = __gnu_cxx::category_names;
329+} // namespace std
330diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
331new file mode 100644
332index 0000000..da07c1f
333--- /dev/null
334+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
335@@ -0,0 +1,117 @@
336+// Wrapper for underlying C-language localization -*- C++ -*-
337+
338+// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
339+//
340+// This file is part of the GNU ISO C++ Library. This library is free
341+// software; you can redistribute it and/or modify it under the
342+// terms of the GNU General Public License as published by the
343+// Free Software Foundation; either version 2, or (at your option)
344+// any later version.
345+
346+// This library is distributed in the hope that it will be useful,
347+// but WITHOUT ANY WARRANTY; without even the implied warranty of
348+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
349+// GNU General Public License for more details.
350+
351+// You should have received a copy of the GNU General Public License along
352+// with this library; see the file COPYING. If not, write to the Free
353+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
354+// USA.
355+
356+// As a special exception, you may use this file as part of a free software
357+// library without restriction. Specifically, if other files instantiate
358+// templates or use macros or inline functions from this file, or you compile
359+// this file and link it with other files to produce an executable, this
360+// file does not by itself cause the resulting executable to be covered by
361+// the GNU General Public License. This exception does not however
362+// invalidate any other reasons why the executable file might be covered by
363+// the GNU General Public License.
364+
365+//
366+// ISO C++ 14882: 22.8 Standard locale categories.
367+//
368+
369+// Written by Benjamin Kosnik <bkoz@redhat.com>
370+
371+#ifndef _C_LOCALE_H
372+#define _C_LOCALE_H 1
373+
374+#pragma GCC system_header
375+
376+#include <cstring> // get std::strlen
377+#include <cstdio> // get std::snprintf or std::sprintf
378+#include <clocale>
379+#include <langinfo.h> // For codecvt
380+#ifdef __UCLIBC_MJN3_ONLY__
381+#warning fix this
382+#endif
383+#ifdef __UCLIBC_HAS_LOCALE__
384+#include <iconv.h> // For codecvt using iconv, iconv_t
385+#endif
386+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
387+#include <libintl.h> // For messages
388+#endif
389+
390+#ifdef __UCLIBC_MJN3_ONLY__
391+#warning what is _GLIBCXX_C_LOCALE_GNU for
392+#endif
393+#define _GLIBCXX_C_LOCALE_GNU 1
394+
395+#ifdef __UCLIBC_MJN3_ONLY__
396+#warning fix categories
397+#endif
398+// #define _GLIBCXX_NUM_CATEGORIES 6
399+#define _GLIBCXX_NUM_CATEGORIES 0
400+
401+#ifdef __UCLIBC_HAS_XLOCALE__
402+namespace __gnu_cxx
403+{
404+ extern "C" __typeof(uselocale) __uselocale;
405+}
406+#endif
407+
408+namespace std
409+{
410+#ifdef __UCLIBC_HAS_XLOCALE__
411+ typedef __locale_t __c_locale;
412+#else
413+ typedef int* __c_locale;
414+#endif
415+
416+ // Convert numeric value of type _Tv to string and return length of
417+ // string. If snprintf is available use it, otherwise fall back to
418+ // the unsafe sprintf which, in general, can be dangerous and should
419+ // be avoided.
420+ template<typename _Tv>
421+ int
422+ __convert_from_v(char* __out,
423+ const int __size __attribute__ ((__unused__)),
424+ const char* __fmt,
425+#ifdef __UCLIBC_HAS_XCLOCALE__
426+ _Tv __v, const __c_locale& __cloc, int __prec)
427+ {
428+ __c_locale __old = __gnu_cxx::__uselocale(__cloc);
429+#else
430+ _Tv __v, const __c_locale&, int __prec)
431+ {
432+# ifdef __UCLIBC_HAS_LOCALE__
433+ char* __old = std::setlocale(LC_ALL, NULL);
434+ char* __sav = new char[std::strlen(__old) + 1];
435+ std::strcpy(__sav, __old);
436+ std::setlocale(LC_ALL, "C");
437+# endif
438+#endif
439+
440+ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
441+
442+#ifdef __UCLIBC_HAS_XCLOCALE__
443+ __gnu_cxx::__uselocale(__old);
444+#elif defined __UCLIBC_HAS_LOCALE__
445+ std::setlocale(LC_ALL, __sav);
446+ delete [] __sav;
447+#endif
448+ return __ret;
449+ }
450+}
451+
452+#endif
453diff --git a/libstdc++-v3/config/locale/uclibc/codecvt_members.cc b/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
454new file mode 100644
455index 0000000..64aa962
456--- /dev/null
457+++ b/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
458@@ -0,0 +1,308 @@
459+// std::codecvt implementation details, GNU version -*- C++ -*-
460+
461+// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
462+//
463+// This file is part of the GNU ISO C++ Library. This library is free
464+// software; you can redistribute it and/or modify it under the
465+// terms of the GNU General Public License as published by the
466+// Free Software Foundation; either version 2, or (at your option)
467+// any later version.
468+
469+// This library is distributed in the hope that it will be useful,
470+// but WITHOUT ANY WARRANTY; without even the implied warranty of
471+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
472+// GNU General Public License for more details.
473+
474+// You should have received a copy of the GNU General Public License along
475+// with this library; see the file COPYING. If not, write to the Free
476+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
477+// USA.
478+
479+// As a special exception, you may use this file as part of a free software
480+// library without restriction. Specifically, if other files instantiate
481+// templates or use macros or inline functions from this file, or you compile
482+// this file and link it with other files to produce an executable, this
483+// file does not by itself cause the resulting executable to be covered by
484+// the GNU General Public License. This exception does not however
485+// invalidate any other reasons why the executable file might be covered by
486+// the GNU General Public License.
487+
488+//
489+// ISO C++ 14882: 22.2.1.5 - Template class codecvt
490+//
491+
492+// Written by Benjamin Kosnik <bkoz@redhat.com>
493+
494+#include <locale>
495+#include <cstdlib> // For MB_CUR_MAX
496+#include <climits> // For MB_LEN_MAX
497+#include <bits/c++locale_internal.h>
498+
499+namespace std
500+{
501+ // Specializations.
502+#ifdef _GLIBCXX_USE_WCHAR_T
503+ codecvt_base::result
504+ codecvt<wchar_t, char, mbstate_t>::
505+ do_out(state_type& __state, const intern_type* __from,
506+ const intern_type* __from_end, const intern_type*& __from_next,
507+ extern_type* __to, extern_type* __to_end,
508+ extern_type*& __to_next) const
509+ {
510+ result __ret = ok;
511+ state_type __tmp_state(__state);
512+
513+#ifdef __UCLIBC_HAS_XLOCALE__
514+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
515+#endif
516+
517+ // wcsnrtombs is *very* fast but stops if encounters NUL characters:
518+ // in case we fall back to wcrtomb and then continue, in a loop.
519+ // NB: wcsnrtombs is a GNU extension
520+ for (__from_next = __from, __to_next = __to;
521+ __from_next < __from_end && __to_next < __to_end
522+ && __ret == ok;)
523+ {
524+ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
525+ __from_end - __from_next);
526+ if (!__from_chunk_end)
527+ __from_chunk_end = __from_end;
528+
529+ __from = __from_next;
530+ const size_t __conv = wcsnrtombs(__to_next, &__from_next,
531+ __from_chunk_end - __from_next,
532+ __to_end - __to_next, &__state);
533+ if (__conv == static_cast<size_t>(-1))
534+ {
535+ // In case of error, in order to stop at the exact place we
536+ // have to start again from the beginning with a series of
537+ // wcrtomb.
538+ for (; __from < __from_next; ++__from)
539+ __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
540+ __state = __tmp_state;
541+ __ret = error;
542+ }
543+ else if (__from_next && __from_next < __from_chunk_end)
544+ {
545+ __to_next += __conv;
546+ __ret = partial;
547+ }
548+ else
549+ {
550+ __from_next = __from_chunk_end;
551+ __to_next += __conv;
552+ }
553+
554+ if (__from_next < __from_end && __ret == ok)
555+ {
556+ extern_type __buf[MB_LEN_MAX];
557+ __tmp_state = __state;
558+ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
559+ if (__conv > static_cast<size_t>(__to_end - __to_next))
560+ __ret = partial;
561+ else
562+ {
563+ memcpy(__to_next, __buf, __conv);
564+ __state = __tmp_state;
565+ __to_next += __conv;
566+ ++__from_next;
567+ }
568+ }
569+ }
570+
571+#ifdef __UCLIBC_HAS_XLOCALE__
572+ __uselocale(__old);
573+#endif
574+
575+ return __ret;
576+ }
577+
578+ codecvt_base::result
579+ codecvt<wchar_t, char, mbstate_t>::
580+ do_in(state_type& __state, const extern_type* __from,
581+ const extern_type* __from_end, const extern_type*& __from_next,
582+ intern_type* __to, intern_type* __to_end,
583+ intern_type*& __to_next) const
584+ {
585+ result __ret = ok;
586+ state_type __tmp_state(__state);
587+
588+#ifdef __UCLIBC_HAS_XLOCALE__
589+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
590+#endif
591+
592+ // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
593+ // in case we store a L'\0' and then continue, in a loop.
594+ // NB: mbsnrtowcs is a GNU extension
595+ for (__from_next = __from, __to_next = __to;
596+ __from_next < __from_end && __to_next < __to_end
597+ && __ret == ok;)
598+ {
599+ const extern_type* __from_chunk_end;
600+ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
601+ __from_end
602+ - __from_next));
603+ if (!__from_chunk_end)
604+ __from_chunk_end = __from_end;
605+
606+ __from = __from_next;
607+ size_t __conv = mbsnrtowcs(__to_next, &__from_next,
608+ __from_chunk_end - __from_next,
609+ __to_end - __to_next, &__state);
610+ if (__conv == static_cast<size_t>(-1))
611+ {
612+ // In case of error, in order to stop at the exact place we
613+ // have to start again from the beginning with a series of
614+ // mbrtowc.
615+ for (;; ++__to_next, __from += __conv)
616+ {
617+ __conv = mbrtowc(__to_next, __from, __from_end - __from,
618+ &__tmp_state);
619+ if (__conv == static_cast<size_t>(-1)
620+ || __conv == static_cast<size_t>(-2))
621+ break;
622+ }
623+ __from_next = __from;
624+ __state = __tmp_state;
625+ __ret = error;
626+ }
627+ else if (__from_next && __from_next < __from_chunk_end)
628+ {
629+ // It is unclear what to return in this case (see DR 382).
630+ __to_next += __conv;
631+ __ret = partial;
632+ }
633+ else
634+ {
635+ __from_next = __from_chunk_end;
636+ __to_next += __conv;
637+ }
638+
639+ if (__from_next < __from_end && __ret == ok)
640+ {
641+ if (__to_next < __to_end)
642+ {
643+ // XXX Probably wrong for stateful encodings
644+ __tmp_state = __state;
645+ ++__from_next;
646+ *__to_next++ = L'\0';
647+ }
648+ else
649+ __ret = partial;
650+ }
651+ }
652+
653+#ifdef __UCLIBC_HAS_XLOCALE__
654+ __uselocale(__old);
655+#endif
656+
657+ return __ret;
658+ }
659+
660+ int
661+ codecvt<wchar_t, char, mbstate_t>::
662+ do_encoding() const throw()
663+ {
664+ // XXX This implementation assumes that the encoding is
665+ // stateless and is either single-byte or variable-width.
666+ int __ret = 0;
667+#ifdef __UCLIBC_HAS_XLOCALE__
668+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
669+#endif
670+ if (MB_CUR_MAX == 1)
671+ __ret = 1;
672+#ifdef __UCLIBC_HAS_XLOCALE__
673+ __uselocale(__old);
674+#endif
675+ return __ret;
676+ }
677+
678+ int
679+ codecvt<wchar_t, char, mbstate_t>::
680+ do_max_length() const throw()
681+ {
682+#ifdef __UCLIBC_HAS_XLOCALE__
683+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
684+#endif
685+ // XXX Probably wrong for stateful encodings.
686+ int __ret = MB_CUR_MAX;
687+#ifdef __UCLIBC_HAS_XLOCALE__
688+ __uselocale(__old);
689+#endif
690+ return __ret;
691+ }
692+
693+ int
694+ codecvt<wchar_t, char, mbstate_t>::
695+ do_length(state_type& __state, const extern_type* __from,
696+ const extern_type* __end, size_t __max) const
697+ {
698+ int __ret = 0;
699+ state_type __tmp_state(__state);
700+
701+#ifdef __UCLIBC_HAS_XLOCALE__
702+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
703+#endif
704+
705+ // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
706+ // in case we advance past it and then continue, in a loop.
707+ // NB: mbsnrtowcs is a GNU extension
708+
709+ // A dummy internal buffer is needed in order for mbsnrtocws to consider
710+ // its fourth parameter (it wouldn't with NULL as first parameter).
711+ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t)
712+ * __max));
713+ while (__from < __end && __max)
714+ {
715+ const extern_type* __from_chunk_end;
716+ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
717+ __end
718+ - __from));
719+ if (!__from_chunk_end)
720+ __from_chunk_end = __end;
721+
722+ const extern_type* __tmp_from = __from;
723+ size_t __conv = mbsnrtowcs(__to, &__from,
724+ __from_chunk_end - __from,
725+ __max, &__state);
726+ if (__conv == static_cast<size_t>(-1))
727+ {
728+ // In case of error, in order to stop at the exact place we
729+ // have to start again from the beginning with a series of
730+ // mbrtowc.
731+ for (__from = __tmp_from;; __from += __conv)
732+ {
733+ __conv = mbrtowc(NULL, __from, __end - __from,
734+ &__tmp_state);
735+ if (__conv == static_cast<size_t>(-1)
736+ || __conv == static_cast<size_t>(-2))
737+ break;
738+ }
739+ __state = __tmp_state;
740+ __ret += __from - __tmp_from;
741+ break;
742+ }
743+ if (!__from)
744+ __from = __from_chunk_end;
745+
746+ __ret += __from - __tmp_from;
747+ __max -= __conv;
748+
749+ if (__from < __end && __max)
750+ {
751+ // XXX Probably wrong for stateful encodings
752+ __tmp_state = __state;
753+ ++__from;
754+ ++__ret;
755+ --__max;
756+ }
757+ }
758+
759+#ifdef __UCLIBC_HAS_XLOCALE__
760+ __uselocale(__old);
761+#endif
762+
763+ return __ret;
764+ }
765+#endif
766+}
767diff --git a/libstdc++-v3/config/locale/uclibc/collate_members.cc b/libstdc++-v3/config/locale/uclibc/collate_members.cc
768new file mode 100644
769index 0000000..c2664a7
770--- /dev/null
771+++ b/libstdc++-v3/config/locale/uclibc/collate_members.cc
772@@ -0,0 +1,80 @@
773+// std::collate implementation details, GNU version -*- C++ -*-
774+
775+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
776+//
777+// This file is part of the GNU ISO C++ Library. This library is free
778+// software; you can redistribute it and/or modify it under the
779+// terms of the GNU General Public License as published by the
780+// Free Software Foundation; either version 2, or (at your option)
781+// any later version.
782+
783+// This library is distributed in the hope that it will be useful,
784+// but WITHOUT ANY WARRANTY; without even the implied warranty of
785+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
786+// GNU General Public License for more details.
787+
788+// You should have received a copy of the GNU General Public License along
789+// with this library; see the file COPYING. If not, write to the Free
790+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
791+// USA.
792+
793+// As a special exception, you may use this file as part of a free software
794+// library without restriction. Specifically, if other files instantiate
795+// templates or use macros or inline functions from this file, or you compile
796+// this file and link it with other files to produce an executable, this
797+// file does not by itself cause the resulting executable to be covered by
798+// the GNU General Public License. This exception does not however
799+// invalidate any other reasons why the executable file might be covered by
800+// the GNU General Public License.
801+
802+//
803+// ISO C++ 14882: 22.2.4.1.2 collate virtual functions
804+//
805+
806+// Written by Benjamin Kosnik <bkoz@redhat.com>
807+
808+#include <locale>
809+#include <bits/c++locale_internal.h>
810+
811+#ifndef __UCLIBC_HAS_XLOCALE__
812+#define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
813+#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
814+#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
815+#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
816+#endif
817+
818+namespace std
819+{
820+ // These are basically extensions to char_traits, and perhaps should
821+ // be put there instead of here.
822+ template<>
823+ int
824+ collate<char>::_M_compare(const char* __one, const char* __two) const
825+ {
826+ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
827+ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
828+ }
829+
830+ template<>
831+ size_t
832+ collate<char>::_M_transform(char* __to, const char* __from,
833+ size_t __n) const
834+ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
835+
836+#ifdef _GLIBCXX_USE_WCHAR_T
837+ template<>
838+ int
839+ collate<wchar_t>::_M_compare(const wchar_t* __one,
840+ const wchar_t* __two) const
841+ {
842+ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
843+ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
844+ }
845+
846+ template<>
847+ size_t
848+ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
849+ size_t __n) const
850+ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
851+#endif
852+}
853diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
854new file mode 100644
855index 0000000..7294e3a
856--- /dev/null
857+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
858@@ -0,0 +1,300 @@
859+// std::ctype implementation details, GNU version -*- C++ -*-
860+
861+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
862+//
863+// This file is part of the GNU ISO C++ Library. This library is free
864+// software; you can redistribute it and/or modify it under the
865+// terms of the GNU General Public License as published by the
866+// Free Software Foundation; either version 2, or (at your option)
867+// any later version.
868+
869+// This library is distributed in the hope that it will be useful,
870+// but WITHOUT ANY WARRANTY; without even the implied warranty of
871+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
872+// GNU General Public License for more details.
873+
874+// You should have received a copy of the GNU General Public License along
875+// with this library; see the file COPYING. If not, write to the Free
876+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
877+// USA.
878+
879+// As a special exception, you may use this file as part of a free software
880+// library without restriction. Specifically, if other files instantiate
881+// templates or use macros or inline functions from this file, or you compile
882+// this file and link it with other files to produce an executable, this
883+// file does not by itself cause the resulting executable to be covered by
884+// the GNU General Public License. This exception does not however
885+// invalidate any other reasons why the executable file might be covered by
886+// the GNU General Public License.
887+
888+//
889+// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions.
890+//
891+
892+// Written by Benjamin Kosnik <bkoz@redhat.com>
893+
894+#define _LIBC
895+#include <locale>
896+#undef _LIBC
897+#include <bits/c++locale_internal.h>
898+
899+#ifndef __UCLIBC_HAS_XLOCALE__
900+#define __wctype_l(S, L) wctype((S))
901+#define __towupper_l(C, L) towupper((C))
902+#define __towlower_l(C, L) towlower((C))
903+#define __iswctype_l(C, M, L) iswctype((C), (M))
904+#endif
905+
906+namespace std
907+{
908+ // NB: The other ctype<char> specializations are in src/locale.cc and
909+ // various /config/os/* files.
910+ template<>
911+ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
912+ : ctype<char>(0, false, __refs)
913+ {
914+ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
915+ {
916+ this->_S_destroy_c_locale(this->_M_c_locale_ctype);
917+ this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
918+#ifdef __UCLIBC_HAS_XLOCALE__
919+ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
920+ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
921+ this->_M_table = this->_M_c_locale_ctype->__ctype_b;
922+#endif
923+ }
924+ }
925+
926+#ifdef _GLIBCXX_USE_WCHAR_T
927+ ctype<wchar_t>::__wmask_type
928+ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
929+ {
930+ __wmask_type __ret;
931+ switch (__m)
932+ {
933+ case space:
934+ __ret = __wctype_l("space", _M_c_locale_ctype);
935+ break;
936+ case print:
937+ __ret = __wctype_l("print", _M_c_locale_ctype);
938+ break;
939+ case cntrl:
940+ __ret = __wctype_l("cntrl", _M_c_locale_ctype);
941+ break;
942+ case upper:
943+ __ret = __wctype_l("upper", _M_c_locale_ctype);
944+ break;
945+ case lower:
946+ __ret = __wctype_l("lower", _M_c_locale_ctype);
947+ break;
948+ case alpha:
949+ __ret = __wctype_l("alpha", _M_c_locale_ctype);
950+ break;
951+ case digit:
952+ __ret = __wctype_l("digit", _M_c_locale_ctype);
953+ break;
954+ case punct:
955+ __ret = __wctype_l("punct", _M_c_locale_ctype);
956+ break;
957+ case xdigit:
958+ __ret = __wctype_l("xdigit", _M_c_locale_ctype);
959+ break;
960+ case alnum:
961+ __ret = __wctype_l("alnum", _M_c_locale_ctype);
962+ break;
963+ case graph:
964+ __ret = __wctype_l("graph", _M_c_locale_ctype);
965+ break;
966+ default:
967+ __ret = __wmask_type();
968+ }
969+ return __ret;
970+ }
971+
972+ wchar_t
973+ ctype<wchar_t>::do_toupper(wchar_t __c) const
974+ { return __towupper_l(__c, _M_c_locale_ctype); }
975+
976+ const wchar_t*
977+ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
978+ {
979+ while (__lo < __hi)
980+ {
981+ *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
982+ ++__lo;
983+ }
984+ return __hi;
985+ }
986+
987+ wchar_t
988+ ctype<wchar_t>::do_tolower(wchar_t __c) const
989+ { return __towlower_l(__c, _M_c_locale_ctype); }
990+
991+ const wchar_t*
992+ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
993+ {
994+ while (__lo < __hi)
995+ {
996+ *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
997+ ++__lo;
998+ }
999+ return __hi;
1000+ }
1001+
1002+ bool
1003+ ctype<wchar_t>::
1004+ do_is(mask __m, wchar_t __c) const
1005+ {
1006+ // Highest bitmask in ctype_base == 10, but extra in "C"
1007+ // library for blank.
1008+ bool __ret = false;
1009+ const size_t __bitmasksize = 11;
1010+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
1011+ if (__m & _M_bit[__bitcur]
1012+ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
1013+ {
1014+ __ret = true;
1015+ break;
1016+ }
1017+ return __ret;
1018+ }
1019+
1020+ const wchar_t*
1021+ ctype<wchar_t>::
1022+ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
1023+ {
1024+ for (; __lo < __hi; ++__vec, ++__lo)
1025+ {
1026+ // Highest bitmask in ctype_base == 10, but extra in "C"
1027+ // library for blank.
1028+ const size_t __bitmasksize = 11;
1029+ mask __m = 0;
1030+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
1031+ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
1032+ __m |= _M_bit[__bitcur];
1033+ *__vec = __m;
1034+ }
1035+ return __hi;
1036+ }
1037+
1038+ const wchar_t*
1039+ ctype<wchar_t>::
1040+ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
1041+ {
1042+ while (__lo < __hi && !this->do_is(__m, *__lo))
1043+ ++__lo;
1044+ return __lo;
1045+ }
1046+
1047+ const wchar_t*
1048+ ctype<wchar_t>::
1049+ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
1050+ {
1051+ while (__lo < __hi && this->do_is(__m, *__lo) != 0)
1052+ ++__lo;
1053+ return __lo;
1054+ }
1055+
1056+ wchar_t
1057+ ctype<wchar_t>::
1058+ do_widen(char __c) const
1059+ { return _M_widen[static_cast<unsigned char>(__c)]; }
1060+
1061+ const char*
1062+ ctype<wchar_t>::
1063+ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
1064+ {
1065+ while (__lo < __hi)
1066+ {
1067+ *__dest = _M_widen[static_cast<unsigned char>(*__lo)];
1068+ ++__lo;
1069+ ++__dest;
1070+ }
1071+ return __hi;
1072+ }
1073+
1074+ char
1075+ ctype<wchar_t>::
1076+ do_narrow(wchar_t __wc, char __dfault) const
1077+ {
1078+ if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
1079+ return _M_narrow[__wc];
1080+#ifdef __UCLIBC_HAS_XLOCALE__
1081+ __c_locale __old = __uselocale(_M_c_locale_ctype);
1082+#endif
1083+ const int __c = wctob(__wc);
1084+#ifdef __UCLIBC_HAS_XLOCALE__
1085+ __uselocale(__old);
1086+#endif
1087+ return (__c == EOF ? __dfault : static_cast<char>(__c));
1088+ }
1089+
1090+ const wchar_t*
1091+ ctype<wchar_t>::
1092+ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
1093+ char* __dest) const
1094+ {
1095+#ifdef __UCLIBC_HAS_XLOCALE__
1096+ __c_locale __old = __uselocale(_M_c_locale_ctype);
1097+#endif
1098+ if (_M_narrow_ok)
1099+ while (__lo < __hi)
1100+ {
1101+ if (*__lo >= 0 && *__lo < 128)
1102+ *__dest = _M_narrow[*__lo];
1103+ else
1104+ {
1105+ const int __c = wctob(*__lo);
1106+ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
1107+ }
1108+ ++__lo;
1109+ ++__dest;
1110+ }
1111+ else
1112+ while (__lo < __hi)
1113+ {
1114+ const int __c = wctob(*__lo);
1115+ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
1116+ ++__lo;
1117+ ++__dest;
1118+ }
1119+#ifdef __UCLIBC_HAS_XLOCALE__
1120+ __uselocale(__old);
1121+#endif
1122+ return __hi;
1123+ }
1124+
1125+ void
1126+ ctype<wchar_t>::_M_initialize_ctype()
1127+ {
1128+#ifdef __UCLIBC_HAS_XLOCALE__
1129+ __c_locale __old = __uselocale(_M_c_locale_ctype);
1130+#endif
1131+ wint_t __i;
1132+ for (__i = 0; __i < 128; ++__i)
1133+ {
1134+ const int __c = wctob(__i);
1135+ if (__c == EOF)
1136+ break;
1137+ else
1138+ _M_narrow[__i] = static_cast<char>(__c);
1139+ }
1140+ if (__i == 128)
1141+ _M_narrow_ok = true;
1142+ else
1143+ _M_narrow_ok = false;
1144+ for (size_t __j = 0;
1145+ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
1146+ _M_widen[__j] = btowc(__j);
1147+
1148+ for (size_t __k = 0; __k <= 11; ++__k)
1149+ {
1150+ _M_bit[__k] = static_cast<mask>(_ISbit(__k));
1151+ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
1152+ }
1153+#ifdef __UCLIBC_HAS_XLOCALE__
1154+ __uselocale(__old);
1155+#endif
1156+ }
1157+#endif // _GLIBCXX_USE_WCHAR_T
1158+}
1159diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.cc b/libstdc++-v3/config/locale/uclibc/messages_members.cc
1160new file mode 100644
1161index 0000000..13594d9
1162--- /dev/null
1163+++ b/libstdc++-v3/config/locale/uclibc/messages_members.cc
1164@@ -0,0 +1,100 @@
1165+// std::messages implementation details, GNU version -*- C++ -*-
1166+
1167+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
1168+//
1169+// This file is part of the GNU ISO C++ Library. This library is free
1170+// software; you can redistribute it and/or modify it under the
1171+// terms of the GNU General Public License as published by the
1172+// Free Software Foundation; either version 2, or (at your option)
1173+// any later version.
1174+
1175+// This library is distributed in the hope that it will be useful,
1176+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1177+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1178+// GNU General Public License for more details.
1179+
1180+// You should have received a copy of the GNU General Public License along
1181+// with this library; see the file COPYING. If not, write to the Free
1182+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1183+// USA.
1184+
1185+// As a special exception, you may use this file as part of a free software
1186+// library without restriction. Specifically, if other files instantiate
1187+// templates or use macros or inline functions from this file, or you compile
1188+// this file and link it with other files to produce an executable, this
1189+// file does not by itself cause the resulting executable to be covered by
1190+// the GNU General Public License. This exception does not however
1191+// invalidate any other reasons why the executable file might be covered by
1192+// the GNU General Public License.
1193+
1194+//
1195+// ISO C++ 14882: 22.2.7.1.2 messages virtual functions
1196+//
1197+
1198+// Written by Benjamin Kosnik <bkoz@redhat.com>
1199+
1200+#include <locale>
1201+#include <bits/c++locale_internal.h>
1202+
1203+#ifdef __UCLIBC_MJN3_ONLY__
1204+#warning fix gettext stuff
1205+#endif
1206+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
1207+extern "C" char *__dcgettext(const char *domainname,
1208+ const char *msgid, int category);
1209+#undef gettext
1210+#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
1211+#else
1212+#undef gettext
1213+#define gettext(msgid) (msgid)
1214+#endif
1215+
1216+namespace std
1217+{
1218+ // Specializations.
1219+ template<>
1220+ string
1221+ messages<char>::do_get(catalog, int, int, const string& __dfault) const
1222+ {
1223+#ifdef __UCLIBC_HAS_XLOCALE__
1224+ __c_locale __old = __uselocale(_M_c_locale_messages);
1225+ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
1226+ __uselocale(__old);
1227+ return string(__msg);
1228+#elif defined __UCLIBC_HAS_LOCALE__
1229+ char* __old = strdup(setlocale(LC_ALL, NULL));
1230+ setlocale(LC_ALL, _M_name_messages);
1231+ const char* __msg = gettext(__dfault.c_str());
1232+ setlocale(LC_ALL, __old);
1233+ free(__old);
1234+ return string(__msg);
1235+#else
1236+ const char* __msg = gettext(__dfault.c_str());
1237+ return string(__msg);
1238+#endif
1239+ }
1240+
1241+#ifdef _GLIBCXX_USE_WCHAR_T
1242+ template<>
1243+ wstring
1244+ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
1245+ {
1246+# ifdef __UCLIBC_HAS_XLOCALE__
1247+ __c_locale __old = __uselocale(_M_c_locale_messages);
1248+ char* __msg = gettext(_M_convert_to_char(__dfault));
1249+ __uselocale(__old);
1250+ return _M_convert_from_char(__msg);
1251+# elif defined __UCLIBC_HAS_LOCALE__
1252+ char* __old = strdup(setlocale(LC_ALL, NULL));
1253+ setlocale(LC_ALL, _M_name_messages);
1254+ char* __msg = gettext(_M_convert_to_char(__dfault));
1255+ setlocale(LC_ALL, __old);
1256+ free(__old);
1257+ return _M_convert_from_char(__msg);
1258+# else
1259+ char* __msg = gettext(_M_convert_to_char(__dfault));
1260+ return _M_convert_from_char(__msg);
1261+# endif
1262+ }
1263+#endif
1264+}
1265diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
1266new file mode 100644
1267index 0000000..1424078
1268--- /dev/null
1269+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
1270@@ -0,0 +1,118 @@
1271+// std::messages implementation details, GNU version -*- C++ -*-
1272+
1273+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1274+//
1275+// This file is part of the GNU ISO C++ Library. This library is free
1276+// software; you can redistribute it and/or modify it under the
1277+// terms of the GNU General Public License as published by the
1278+// Free Software Foundation; either version 2, or (at your option)
1279+// any later version.
1280+
1281+// This library is distributed in the hope that it will be useful,
1282+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1283+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1284+// GNU General Public License for more details.
1285+
1286+// You should have received a copy of the GNU General Public License along
1287+// with this library; see the file COPYING. If not, write to the Free
1288+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1289+// USA.
1290+
1291+// As a special exception, you may use this file as part of a free software
1292+// library without restriction. Specifically, if other files instantiate
1293+// templates or use macros or inline functions from this file, or you compile
1294+// this file and link it with other files to produce an executable, this
1295+// file does not by itself cause the resulting executable to be covered by
1296+// the GNU General Public License. This exception does not however
1297+// invalidate any other reasons why the executable file might be covered by
1298+// the GNU General Public License.
1299+
1300+//
1301+// ISO C++ 14882: 22.2.7.1.2 messages functions
1302+//
1303+
1304+// Written by Benjamin Kosnik <bkoz@redhat.com>
1305+
1306+#ifdef __UCLIBC_MJN3_ONLY__
1307+#warning fix prototypes for *textdomain funcs
1308+#endif
1309+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
1310+extern "C" char *__textdomain(const char *domainname);
1311+extern "C" char *__bindtextdomain(const char *domainname,
1312+ const char *dirname);
1313+#else
1314+#undef __textdomain
1315+#undef __bindtextdomain
1316+#define __textdomain(D) ((void)0)
1317+#define __bindtextdomain(D,P) ((void)0)
1318+#endif
1319+
1320+ // Non-virtual member functions.
1321+ template<typename _CharT>
1322+ messages<_CharT>::messages(size_t __refs)
1323+ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()),
1324+ _M_name_messages(_S_get_c_name())
1325+ { }
1326+
1327+ template<typename _CharT>
1328+ messages<_CharT>::messages(__c_locale __cloc, const char* __s,
1329+ size_t __refs)
1330+ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
1331+ _M_name_messages(__s)
1332+ {
1333+ char* __tmp = new char[std::strlen(__s) + 1];
1334+ std::strcpy(__tmp, __s);
1335+ _M_name_messages = __tmp;
1336+ }
1337+
1338+ template<typename _CharT>
1339+ typename messages<_CharT>::catalog
1340+ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc,
1341+ const char* __dir) const
1342+ {
1343+ __bindtextdomain(__s.c_str(), __dir);
1344+ return this->do_open(__s, __loc);
1345+ }
1346+
1347+ // Virtual member functions.
1348+ template<typename _CharT>
1349+ messages<_CharT>::~messages()
1350+ {
1351+ if (_M_name_messages != _S_get_c_name())
1352+ delete [] _M_name_messages;
1353+ _S_destroy_c_locale(_M_c_locale_messages);
1354+ }
1355+
1356+ template<typename _CharT>
1357+ typename messages<_CharT>::catalog
1358+ messages<_CharT>::do_open(const basic_string<char>& __s,
1359+ const locale&) const
1360+ {
1361+ // No error checking is done, assume the catalog exists and can
1362+ // be used.
1363+ __textdomain(__s.c_str());
1364+ return 0;
1365+ }
1366+
1367+ template<typename _CharT>
1368+ void
1369+ messages<_CharT>::do_close(catalog) const
1370+ { }
1371+
1372+ // messages_byname
1373+ template<typename _CharT>
1374+ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
1375+ : messages<_CharT>(__refs)
1376+ {
1377+ if (this->_M_name_messages != locale::facet::_S_get_c_name())
1378+ delete [] this->_M_name_messages;
1379+ char* __tmp = new char[std::strlen(__s) + 1];
1380+ std::strcpy(__tmp, __s);
1381+ this->_M_name_messages = __tmp;
1382+
1383+ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
1384+ {
1385+ this->_S_destroy_c_locale(this->_M_c_locale_messages);
1386+ this->_S_create_c_locale(this->_M_c_locale_messages, __s);
1387+ }
1388+ }
1389diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
1390new file mode 100644
1391index 0000000..aa52731
1392--- /dev/null
1393+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
1394@@ -0,0 +1,692 @@
1395+// std::moneypunct implementation details, GNU version -*- C++ -*-
1396+
1397+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1398+//
1399+// This file is part of the GNU ISO C++ Library. This library is free
1400+// software; you can redistribute it and/or modify it under the
1401+// terms of the GNU General Public License as published by the
1402+// Free Software Foundation; either version 2, or (at your option)
1403+// any later version.
1404+
1405+// This library is distributed in the hope that it will be useful,
1406+// but WITHOUT ANY WARRANTY; without even the implied warranty of
1407+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1408+// GNU General Public License for more details.
1409+
1410+// You should have received a copy of the GNU General Public License along
1411+// with this library; see the file COPYING. If not, write to the Free
1412+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1413+// USA.
1414+
1415+// As a special exception, you may use this file as part of a free software
1416+// library without restriction. Specifically, if other files instantiate
1417+// templates or use macros or inline functions from this file, or you compile
1418+// this file and link it with other files to produce an executable, this
1419+// file does not by itself cause the resulting executable to be covered by
1420+// the GNU General Public License. This exception does not however
1421+// invalidate any other reasons why the executable file might be covered by
1422+// the GNU General Public License.
1423+
1424+//
1425+// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions
1426+//
1427+
1428+// Written by Benjamin Kosnik <bkoz@redhat.com>
1429+
1430+#define _LIBC
1431+#include <locale>
1432+#undef _LIBC
1433+#include <bits/c++locale_internal.h>
1434+
1435+#ifdef __UCLIBC_MJN3_ONLY__
1436+#warning optimize this for uclibc
1437+#warning tailor for stub locale support
1438+#endif
1439+
1440+#ifndef __UCLIBC_HAS_XLOCALE__
1441+#define __nl_langinfo_l(N, L) nl_langinfo((N))
1442+#endif
1443+
1444+namespace std
1445+{
1446+ // Construct and return valid pattern consisting of some combination of:
1447+ // space none symbol sign value
1448+ money_base::pattern
1449+ money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
1450+ {
1451+ pattern __ret;
1452+
1453+ // This insanely complicated routine attempts to construct a valid
1454+ // pattern for use with monyepunct. A couple of invariants:
1455+
1456+ // if (__precedes) symbol -> value
1457+ // else value -> symbol
1458+
1459+ // if (__space) space
1460+ // else none
1461+
1462+ // none == never first
1463+ // space never first or last
1464+
1465+ // Any elegant implementations of this are welcome.
1466+ switch (__posn)
1467+ {
1468+ case 0:
1469+ case 1:
1470+ // 1 The sign precedes the value and symbol.
1471+ __ret.field[0] = sign;
1472+ if (__space)
1473+ {
1474+ // Pattern starts with sign.
1475+ if (__precedes)
1476+ {
1477+ __ret.field[1] = symbol;
1478+ __ret.field[3] = value;
1479+ }
1480+ else
1481+ {
1482+ __ret.field[1] = value;
1483+ __ret.field[3] = symbol;
1484+ }
1485+ __ret.field[2] = space;
1486+ }
1487+ else
1488+ {
1489+ // Pattern starts with sign and ends with none.
1490+ if (__precedes)
1491+ {
1492+ __ret.field[1] = symbol;
1493+ __ret.field[2] = value;
1494+ }
1495+ else
1496+ {
1497+ __ret.field[1] = value;
1498+ __ret.field[2] = symbol;
1499+ }
1500+ __ret.field[3] = none;
1501+ }
1502+ break;
1503+ case 2:
1504+ // 2 The sign follows the value and symbol.
1505+ if (__space)
1506+ {
1507+ // Pattern either ends with sign.
1508+ if (__precedes)
1509+ {
1510+ __ret.field[0] = symbol;
1511+ __ret.field[2] = value;
1512+ }
1513+ else
1514+ {
1515+ __ret.field[0] = value;
1516+ __ret.field[2] = symbol;
1517+ }
1518+ __ret.field[1] = space;
1519+ __ret.field[3] = sign;
1520+ }
1521+ else
1522+ {
1523+ // Pattern ends with sign then none.
1524+ if (__precedes)
1525+ {
1526+ __ret.field[0] = symbol;
1527+ __ret.field[1] = value;
1528+ }
1529+ else
1530+ {
1531+ __ret.field[0] = value;
1532+ __ret.field[1] = symbol;
1533+ }
1534+ __ret.field[2] = sign;
1535+ __ret.field[3] = none;
1536+ }
1537+ break;
1538+ case 3:
1539+ // 3 The sign immediately precedes the symbol.
1540+ if (__precedes)
1541+ {
1542+ __ret.field[0] = sign;
1543+ __ret.field[1] = symbol;
1544+ if (__space)
1545+ {
1546+ __ret.field[2] = space;
1547+ __ret.field[3] = value;
1548+ }
1549+ else
1550+ {
1551+ __ret.field[2] = value;
1552+ __ret.field[3] = none;
1553+ }
1554+ }
1555+ else
1556+ {
1557+ __ret.field[0] = value;
1558+ if (__space)
1559+ {
1560+ __ret.field[1] = space;
1561+ __ret.field[2] = sign;
1562+ __ret.field[3] = symbol;
1563+ }
1564+ else
1565+ {
1566+ __ret.field[1] = sign;
1567+ __ret.field[2] = symbol;
1568+ __ret.field[3] = none;
1569+ }
1570+ }
1571+ break;
1572+ case 4:
1573+ // 4 The sign immediately follows the symbol.
1574+ if (__precedes)
1575+ {
1576+ __ret.field[0] = symbol;
1577+ __ret.field[1] = sign;
1578+ if (__space)
1579+ {
1580+ __ret.field[2] = space;
1581+ __ret.field[3] = value;
1582+ }
1583+ else
1584+ {
1585+ __ret.field[2] = value;
1586+ __ret.field[3] = none;
1587+ }
1588+ }
1589+ else
1590+ {
1591+ __ret.field[0] = value;
1592+ if (__space)
1593+ {
1594+ __ret.field[1] = space;
1595+ __ret.field[2] = symbol;
1596+ __ret.field[3] = sign;
1597+ }
1598+ else
1599+ {
1600+ __ret.field[1] = symbol;
1601+ __ret.field[2] = sign;
1602+ __ret.field[3] = none;
1603+ }
1604+ }
1605+ break;
1606+ default:
1607+ ;
1608+ }
1609+ return __ret;
1610+ }
1611+
1612+ template<>
1613+ void
1614+ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc,
1615+ const char*)
1616+ {
1617+ if (!_M_data)
1618+ _M_data = new __moneypunct_cache<char, true>;
1619+
1620+ if (!__cloc)
1621+ {
1622+ // "C" locale
1623+ _M_data->_M_decimal_point = '.';
1624+ _M_data->_M_thousands_sep = ',';
1625+ _M_data->_M_grouping = "";
1626+ _M_data->_M_grouping_size = 0;
1627+ _M_data->_M_curr_symbol = "";
1628+ _M_data->_M_curr_symbol_size = 0;
1629+ _M_data->_M_positive_sign = "";
1630+ _M_data->_M_positive_sign_size = 0;
1631+ _M_data->_M_negative_sign = "";
1632+ _M_data->_M_negative_sign_size = 0;
1633+ _M_data->_M_frac_digits = 0;
1634+ _M_data->_M_pos_format = money_base::_S_default_pattern;
1635+ _M_data->_M_neg_format = money_base::_S_default_pattern;
1636+
1637+ for (size_t __i = 0; __i < money_base::_S_end; ++__i)
1638+ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
1639+ }
1640+ else
1641+ {
1642+ // Named locale.
1643+ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT,
1644+ __cloc));
1645+ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP,
1646+ __cloc));
1647+ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
1648+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
1649+ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
1650+ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
1651+
1652+ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
1653+ if (!__nposn)
1654+ _M_data->_M_negative_sign = "()";
1655+ else
1656+ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
1657+ __cloc);
1658+ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
1659+
1660+ // _Intl == true
1661+ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
1662+ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
1663+ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS,
1664+ __cloc));
1665+ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
1666+ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
1667+ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
1668+ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace,
1669+ __pposn);
1670+ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
1671+ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
1672+ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
1673+ __nposn);
1674+ }
1675+ }
1676+
1677+ template<>
1678+ void
1679+ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc,
1680+ const char*)
1681+ {
1682+ if (!_M_data)
1683+ _M_data = new __moneypunct_cache<char, false>;
1684+
1685+ if (!__cloc)
1686+ {
1687+ // "C" locale
1688+ _M_data->_M_decimal_point = '.';
1689+ _M_data->_M_thousands_sep = ',';
1690+ _M_data->_M_grouping = "";
1691+ _M_data->_M_grouping_size = 0;
1692+ _M_data->_M_curr_symbol = "";
1693+ _M_data->_M_curr_symbol_size = 0;
1694+ _M_data->_M_positive_sign = "";
1695+ _M_data->_M_positive_sign_size = 0;
1696+ _M_data->_M_negative_sign = "";
1697+ _M_data->_M_negative_sign_size = 0;
1698+ _M_data->_M_frac_digits = 0;
1699+ _M_data->_M_pos_format = money_base::_S_default_pattern;
1700+ _M_data->_M_neg_format = money_base::_S_default_pattern;
1701+
1702+ for (size_t __i = 0; __i < money_base::_S_end; ++__i)
1703+ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
1704+ }
1705+ else
1706+ {
1707+ // Named locale.
1708+ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT,
1709+ __cloc));
1710+ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP,
1711+ __cloc));
1712+ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
1713+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
1714+ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
1715+ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
1716+
1717+ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
1718+ if (!__nposn)
1719+ _M_data->_M_negative_sign = "()";
1720+ else
1721+ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
1722+ __cloc);
1723+ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
1724+
1725+ // _Intl == false
1726+ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
1727+ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
1728+ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
1729+ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
1730+ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
1731+ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
1732+ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace,
1733+ __pposn);
1734+ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
1735+ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
1736+ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
1737+ __nposn);
1738+ }
1739+ }
1740+
1741+ template<>
1742+ moneypunct<char, true>::~moneypunct()
1743+ { delete _M_data; }
1744+
1745+ template<>
1746+ moneypunct<char, false>::~moneypunct()
1747+ { delete _M_data; }
1748+
1749+#ifdef _GLIBCXX_USE_WCHAR_T
1750+ template<>
1751+ void
1752+ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc,
1753+#ifdef __UCLIBC_HAS_XLOCALE__
1754+ const char*)
1755+#else
1756+ const char* __name)
1757+#endif
1758+ {
1759+ if (!_M_data)
1760+ _M_data = new __moneypunct_cache<wchar_t, true>;
1761+
1762+ if (!__cloc)
1763+ {
1764+ // "C" locale
1765+ _M_data->_M_decimal_point = L'.';
1766+ _M_data->_M_thousands_sep = L',';
1767+ _M_data->_M_grouping = "";
1768+ _M_data->_M_grouping_size = 0;
1769+ _M_data->_M_curr_symbol = L"";
1770+ _M_data->_M_curr_symbol_size = 0;
1771+ _M_data->_M_positive_sign = L"";
1772+ _M_data->_M_positive_sign_size = 0;
1773+ _M_data->_M_negative_sign = L"";
1774+ _M_data->_M_negative_sign_size = 0;
1775+ _M_data->_M_frac_digits = 0;
1776+ _M_data->_M_pos_format = money_base::_S_default_pattern;
1777+ _M_data->_M_neg_format = money_base::_S_default_pattern;
1778+
1779+ // Use ctype::widen code without the facet...
1780+ for (size_t __i = 0; __i < money_base::_S_end; ++__i)
1781+ _M_data->_M_atoms[__i] =
1782+ static_cast<wchar_t>(money_base::_S_atoms[__i]);
1783+ }
1784+ else
1785+ {
1786+ // Named locale.
1787+#ifdef __UCLIBC_HAS_XLOCALE__
1788+ __c_locale __old = __uselocale(__cloc);
1789+#else
1790+ // Switch to named locale so that mbsrtowcs will work.
1791+ char* __old = strdup(setlocale(LC_ALL, NULL));
1792+ setlocale(LC_ALL, __name);
1793+#endif
1794+
1795+#ifdef __UCLIBC_MJN3_ONLY__
1796+#warning fix this... should be monetary
1797+#endif
1798+#ifdef __UCLIBC__
1799+# ifdef __UCLIBC_HAS_XLOCALE__
1800+ _M_data->_M_decimal_point = __cloc->decimal_point_wc;
1801+ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
1802+# else
1803+ _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
1804+ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
1805+# endif
1806+#else
1807+ union { char *__s; wchar_t __w; } __u;
1808+ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
1809+ _M_data->_M_decimal_point = __u.__w;
1810+
1811+ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
1812+ _M_data->_M_thousands_sep = __u.__w;
1813+#endif
1814+ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
1815+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
1816+
1817+ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
1818+ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
1819+ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
1820+
1821+ wchar_t* __wcs_ps = 0;
1822+ wchar_t* __wcs_ns = 0;
1823+ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
1824+ try
1825+ {
1826+ mbstate_t __state;
1827+ size_t __len = strlen(__cpossign);
1828+ if (__len)
1829+ {
1830+ ++__len;
1831+ memset(&__state, 0, sizeof(mbstate_t));
1832+ __wcs_ps = new wchar_t[__len];
1833+ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
1834+ _M_data->_M_positive_sign = __wcs_ps;
1835+ }
1836+ else
1837+ _M_data->_M_positive_sign = L"";
1838+ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
1839+
1840+ __len = strlen(__cnegsign);
1841+ if (!__nposn)
1842+ _M_data->_M_negative_sign = L"()";
1843+ else if (__len)
1844+ {
1845+ ++__len;
1846+ memset(&__state, 0, sizeof(mbstate_t));
1847+ __wcs_ns = new wchar_t[__len];
1848+ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
1849+ _M_data->_M_negative_sign = __wcs_ns;
1850+ }
1851+ else
1852+ _M_data->_M_negative_sign = L"";
1853+ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
1854+
1855+ // _Intl == true.
1856+ __len = strlen(__ccurr);
1857+ if (__len)
1858+ {
1859+ ++__len;
1860+ memset(&__state, 0, sizeof(mbstate_t));
1861+ wchar_t* __wcs = new wchar_t[__len];
1862+ mbsrtowcs(__wcs, &__ccurr, __len, &__state);
1863+ _M_data->_M_curr_symbol = __wcs;
1864+ }
1865+ else
1866+ _M_data->_M_curr_symbol = L"";
1867+ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
1868+ }
1869+ catch (...)
1870+ {
1871+ delete _M_data;
1872+ _M_data = 0;
1873+ delete __wcs_ps;
1874+ delete __wcs_ns;
1875+#ifdef __UCLIBC_HAS_XLOCALE__
1876+ __uselocale(__old);
1877+#else
1878+ setlocale(LC_ALL, __old);
1879+ free(__old);
1880+#endif
1881+ __throw_exception_again;
1882+ }
1883+
1884+ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS,
1885+ __cloc));
1886+ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
1887+ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
1888+ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
1889+ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace,
1890+ __pposn);
1891+ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
1892+ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
1893+ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
1894+ __nposn);
1895+
1896+#ifdef __UCLIBC_HAS_XLOCALE__
1897+ __uselocale(__old);
1898+#else
1899+ setlocale(LC_ALL, __old);
1900+ free(__old);
1901+#endif
1902+ }
1903+ }
1904+
1905+ template<>
1906+ void
1907+ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
1908+#ifdef __UCLIBC_HAS_XLOCALE__
1909+ const char*)
1910+#else
1911+ const char* __name)
1912+#endif
1913+ {
1914+ if (!_M_data)
1915+ _M_data = new __moneypunct_cache<wchar_t, false>;
1916+
1917+ if (!__cloc)
1918+ {
1919+ // "C" locale
1920+ _M_data->_M_decimal_point = L'.';
1921+ _M_data->_M_thousands_sep = L',';
1922+ _M_data->_M_grouping = "";
1923+ _M_data->_M_grouping_size = 0;
1924+ _M_data->_M_curr_symbol = L"";
1925+ _M_data->_M_curr_symbol_size = 0;
1926+ _M_data->_M_positive_sign = L"";
1927+ _M_data->_M_positive_sign_size = 0;
1928+ _M_data->_M_negative_sign = L"";
1929+ _M_data->_M_negative_sign_size = 0;
1930+ _M_data->_M_frac_digits = 0;
1931+ _M_data->_M_pos_format = money_base::_S_default_pattern;
1932+ _M_data->_M_neg_format = money_base::_S_default_pattern;
1933+
1934+ // Use ctype::widen code without the facet...
1935+ for (size_t __i = 0; __i < money_base::_S_end; ++__i)
1936+ _M_data->_M_atoms[__i] =
1937+ static_cast<wchar_t>(money_base::_S_atoms[__i]);
1938+ }
1939+ else
1940+ {
1941+ // Named locale.
1942+#ifdef __UCLIBC_HAS_XLOCALE__
1943+ __c_locale __old = __uselocale(__cloc);
1944+#else
1945+ // Switch to named locale so that mbsrtowcs will work.
1946+ char* __old = strdup(setlocale(LC_ALL, NULL));
1947+ setlocale(LC_ALL, __name);
1948+#endif
1949+
1950+#ifdef __UCLIBC_MJN3_ONLY__
1951+#warning fix this... should be monetary
1952+#endif
1953+#ifdef __UCLIBC__
1954+# ifdef __UCLIBC_HAS_XLOCALE__
1955+ _M_data->_M_decimal_point = __cloc->decimal_point_wc;
1956+ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
1957+# else
1958+ _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
1959+ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
1960+# endif
1961+#else
1962+ union { char *__s; wchar_t __w; } __u;
1963+ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
1964+ _M_data->_M_decimal_point = __u.__w;
1965+
1966+ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
1967+ _M_data->_M_thousands_sep = __u.__w;
1968+#endif
1969+ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
1970+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
1971+
1972+ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
1973+ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
1974+ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
1975+
1976+ wchar_t* __wcs_ps = 0;
1977+ wchar_t* __wcs_ns = 0;
1978+ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
1979+ try
1980+ {
1981+ mbstate_t __state;
1982+ size_t __len;
1983+ __len = strlen(__cpossign);
1984+ if (__len)
1985+ {
1986+ ++__len;
1987+ memset(&__state, 0, sizeof(mbstate_t));
1988+ __wcs_ps = new wchar_t[__len];
1989+ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
1990+ _M_data->_M_positive_sign = __wcs_ps;
1991+ }
1992+ else
1993+ _M_data->_M_positive_sign = L"";
1994+ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
1995+
1996+ __len = strlen(__cnegsign);
1997+ if (!__nposn)
1998+ _M_data->_M_negative_sign = L"()";
1999+ else if (__len)
2000+ {
2001+ ++__len;
2002+ memset(&__state, 0, sizeof(mbstate_t));
2003+ __wcs_ns = new wchar_t[__len];
2004+ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
2005+ _M_data->_M_negative_sign = __wcs_ns;
2006+ }
2007+ else
2008+ _M_data->_M_negative_sign = L"";
2009+ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
2010+
2011+ // _Intl == true.
2012+ __len = strlen(__ccurr);
2013+ if (__len)
2014+ {
2015+ ++__len;
2016+ memset(&__state, 0, sizeof(mbstate_t));
2017+ wchar_t* __wcs = new wchar_t[__len];
2018+ mbsrtowcs(__wcs, &__ccurr, __len, &__state);
2019+ _M_data->_M_curr_symbol = __wcs;
2020+ }
2021+ else
2022+ _M_data->_M_curr_symbol = L"";
2023+ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
2024+ }
2025+ catch (...)
2026+ {
2027+ delete _M_data;
2028+ _M_data = 0;
2029+ delete __wcs_ps;
2030+ delete __wcs_ns;
2031+#ifdef __UCLIBC_HAS_XLOCALE__
2032+ __uselocale(__old);
2033+#else
2034+ setlocale(LC_ALL, __old);
2035+ free(__old);
2036+#endif
2037+ __throw_exception_again;
2038+ }
2039+
2040+ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
2041+ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
2042+ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
2043+ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
2044+ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace,
2045+ __pposn);
2046+ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
2047+ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
2048+ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
2049+ __nposn);
2050+
2051+#ifdef __UCLIBC_HAS_XLOCALE__
2052+ __uselocale(__old);
2053+#else
2054+ setlocale(LC_ALL, __old);
2055+ free(__old);
2056+#endif
2057+ }
2058+ }
2059+
2060+ template<>
2061+ moneypunct<wchar_t, true>::~moneypunct()
2062+ {
2063+ if (_M_data->_M_positive_sign_size)
2064+ delete [] _M_data->_M_positive_sign;
2065+ if (_M_data->_M_negative_sign_size
2066+ && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
2067+ delete [] _M_data->_M_negative_sign;
2068+ if (_M_data->_M_curr_symbol_size)
2069+ delete [] _M_data->_M_curr_symbol;
2070+ delete _M_data;
2071+ }
2072+
2073+ template<>
2074+ moneypunct<wchar_t, false>::~moneypunct()
2075+ {
2076+ if (_M_data->_M_positive_sign_size)
2077+ delete [] _M_data->_M_positive_sign;
2078+ if (_M_data->_M_negative_sign_size
2079+ && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
2080+ delete [] _M_data->_M_negative_sign;
2081+ if (_M_data->_M_curr_symbol_size)
2082+ delete [] _M_data->_M_curr_symbol;
2083+ delete _M_data;
2084+ }
2085+#endif
2086+}
2087diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
2088new file mode 100644
2089index 0000000..883ec1a
2090--- /dev/null
2091+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
2092@@ -0,0 +1,160 @@
2093+// std::numpunct implementation details, GNU version -*- C++ -*-
2094+
2095+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
2096+//
2097+// This file is part of the GNU ISO C++ Library. This library is free
2098+// software; you can redistribute it and/or modify it under the
2099+// terms of the GNU General Public License as published by the
2100+// Free Software Foundation; either version 2, or (at your option)
2101+// any later version.
2102+
2103+// This library is distributed in the hope that it will be useful,
2104+// but WITHOUT ANY WARRANTY; without even the implied warranty of
2105+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2106+// GNU General Public License for more details.
2107+
2108+// You should have received a copy of the GNU General Public License along
2109+// with this library; see the file COPYING. If not, write to the Free
2110+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
2111+// USA.
2112+
2113+// As a special exception, you may use this file as part of a free software
2114+// library without restriction. Specifically, if other files instantiate
2115+// templates or use macros or inline functions from this file, or you compile
2116+// this file and link it with other files to produce an executable, this
2117+// file does not by itself cause the resulting executable to be covered by
2118+// the GNU General Public License. This exception does not however
2119+// invalidate any other reasons why the executable file might be covered by
2120+// the GNU General Public License.
2121+
2122+//
2123+// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions
2124+//
2125+
2126+// Written by Benjamin Kosnik <bkoz@redhat.com>
2127+
2128+#define _LIBC
2129+#include <locale>
2130+#undef _LIBC
2131+#include <bits/c++locale_internal.h>
2132+
2133+#ifdef __UCLIBC_MJN3_ONLY__
2134+#warning tailor for stub locale support
2135+#endif
2136+#ifndef __UCLIBC_HAS_XLOCALE__
2137+#define __nl_langinfo_l(N, L) nl_langinfo((N))
2138+#endif
2139+
2140+namespace std
2141+{
2142+ template<>
2143+ void
2144+ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
2145+ {
2146+ if (!_M_data)
2147+ _M_data = new __numpunct_cache<char>;
2148+
2149+ if (!__cloc)
2150+ {
2151+ // "C" locale
2152+ _M_data->_M_grouping = "";
2153+ _M_data->_M_grouping_size = 0;
2154+ _M_data->_M_use_grouping = false;
2155+
2156+ _M_data->_M_decimal_point = '.';
2157+ _M_data->_M_thousands_sep = ',';
2158+
2159+ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
2160+ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
2161+
2162+ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
2163+ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
2164+ }
2165+ else
2166+ {
2167+ // Named locale.
2168+ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT,
2169+ __cloc));
2170+ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP,
2171+ __cloc));
2172+
2173+ // Check for NULL, which implies no grouping.
2174+ if (_M_data->_M_thousands_sep == '\0')
2175+ _M_data->_M_grouping = "";
2176+ else
2177+ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
2178+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
2179+ }
2180+
2181+ // NB: There is no way to extact this info from posix locales.
2182+ // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
2183+ _M_data->_M_truename = "true";
2184+ _M_data->_M_truename_size = 4;
2185+ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
2186+ _M_data->_M_falsename = "false";
2187+ _M_data->_M_falsename_size = 5;
2188+ }
2189+
2190+ template<>
2191+ numpunct<char>::~numpunct()
2192+ { delete _M_data; }
2193+
2194+#ifdef _GLIBCXX_USE_WCHAR_T
2195+ template<>
2196+ void
2197+ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
2198+ {
2199+ if (!_M_data)
2200+ _M_data = new __numpunct_cache<wchar_t>;
2201+
2202+ if (!__cloc)
2203+ {
2204+ // "C" locale
2205+ _M_data->_M_grouping = "";
2206+ _M_data->_M_grouping_size = 0;
2207+ _M_data->_M_use_grouping = false;
2208+
2209+ _M_data->_M_decimal_point = L'.';
2210+ _M_data->_M_thousands_sep = L',';
2211+
2212+ // Use ctype::widen code without the facet...
2213+ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
2214+ _M_data->_M_atoms_out[__i] =
2215+ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
2216+
2217+ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
2218+ _M_data->_M_atoms_in[__j] =
2219+ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
2220+ }
2221+ else
2222+ {
2223+ // Named locale.
2224+ // NB: In the GNU model wchar_t is always 32 bit wide.
2225+ union { char *__s; wchar_t __w; } __u;
2226+ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
2227+ _M_data->_M_decimal_point = __u.__w;
2228+
2229+ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
2230+ _M_data->_M_thousands_sep = __u.__w;
2231+
2232+ if (_M_data->_M_thousands_sep == L'\0')
2233+ _M_data->_M_grouping = "";
2234+ else
2235+ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
2236+ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
2237+ }
2238+
2239+ // NB: There is no way to extact this info from posix locales.
2240+ // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
2241+ _M_data->_M_truename = L"true";
2242+ _M_data->_M_truename_size = 4;
2243+ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
2244+ _M_data->_M_falsename = L"false";
2245+ _M_data->_M_falsename_size = 5;
2246+ }
2247+
2248+ template<>
2249+ numpunct<wchar_t>::~numpunct()
2250+ { delete _M_data; }
2251+ #endif
2252+}
2253diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
2254new file mode 100644
2255index 0000000..e0707d7
2256--- /dev/null
2257+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
2258@@ -0,0 +1,406 @@
2259+// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
2260+
2261+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
2262+//
2263+// This file is part of the GNU ISO C++ Library. This library is free
2264+// software; you can redistribute it and/or modify it under the
2265+// terms of the GNU General Public License as published by the
2266+// Free Software Foundation; either version 2, or (at your option)
2267+// any later version.
2268+
2269+// This library is distributed in the hope that it will be useful,
2270+// but WITHOUT ANY WARRANTY; without even the implied warranty of
2271+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2272+// GNU General Public License for more details.
2273+
2274+// You should have received a copy of the GNU General Public License along
2275+// with this library; see the file COPYING. If not, write to the Free
2276+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
2277+// USA.
2278+
2279+// As a special exception, you may use this file as part of a free software
2280+// library without restriction. Specifically, if other files instantiate
2281+// templates or use macros or inline functions from this file, or you compile
2282+// this file and link it with other files to produce an executable, this
2283+// file does not by itself cause the resulting executable to be covered by
2284+// the GNU General Public License. This exception does not however
2285+// invalidate any other reasons why the executable file might be covered by
2286+// the GNU General Public License.
2287+
2288+//
2289+// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
2290+// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
2291+//
2292+
2293+// Written by Benjamin Kosnik <bkoz@redhat.com>
2294+
2295+#include <locale>
2296+#include <bits/c++locale_internal.h>
2297+
2298+#ifdef __UCLIBC_MJN3_ONLY__
2299+#warning tailor for stub locale support
2300+#endif
2301+#ifndef __UCLIBC_HAS_XLOCALE__
2302+#define __nl_langinfo_l(N, L) nl_langinfo((N))
2303+#endif
2304+
2305+namespace std
2306+{
2307+ template<>
2308+ void
2309+ __timepunct<char>::
2310+ _M_put(char* __s, size_t __maxlen, const char* __format,
2311+ const tm* __tm) const
2312+ {
2313+#ifdef __UCLIBC_HAS_XLOCALE__
2314+ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
2315+ _M_c_locale_timepunct);
2316+#else
2317+ char* __old = strdup(setlocale(LC_ALL, NULL));
2318+ setlocale(LC_ALL, _M_name_timepunct);
2319+ const size_t __len = strftime(__s, __maxlen, __format, __tm);
2320+ setlocale(LC_ALL, __old);
2321+ free(__old);
2322+#endif
2323+ // Make sure __s is null terminated.
2324+ if (__len == 0)
2325+ __s[0] = '\0';
2326+ }
2327+
2328+ template<>
2329+ void
2330+ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
2331+ {
2332+ if (!_M_data)
2333+ _M_data = new __timepunct_cache<char>;
2334+
2335+ if (!__cloc)
2336+ {
2337+ // "C" locale
2338+ _M_c_locale_timepunct = _S_get_c_locale();
2339+
2340+ _M_data->_M_date_format = "%m/%d/%y";
2341+ _M_data->_M_date_era_format = "%m/%d/%y";
2342+ _M_data->_M_time_format = "%H:%M:%S";
2343+ _M_data->_M_time_era_format = "%H:%M:%S";
2344+ _M_data->_M_date_time_format = "";
2345+ _M_data->_M_date_time_era_format = "";
2346+ _M_data->_M_am = "AM";
2347+ _M_data->_M_pm = "PM";
2348+ _M_data->_M_am_pm_format = "";
2349+
2350+ // Day names, starting with "C"'s Sunday.
2351+ _M_data->_M_day1 = "Sunday";
2352+ _M_data->_M_day2 = "Monday";
2353+ _M_data->_M_day3 = "Tuesday";
2354+ _M_data->_M_day4 = "Wednesday";
2355+ _M_data->_M_day5 = "Thursday";
2356+ _M_data->_M_day6 = "Friday";
2357+ _M_data->_M_day7 = "Saturday";
2358+
2359+ // Abbreviated day names, starting with "C"'s Sun.
2360+ _M_data->_M_aday1 = "Sun";
2361+ _M_data->_M_aday2 = "Mon";
2362+ _M_data->_M_aday3 = "Tue";
2363+ _M_data->_M_aday4 = "Wed";
2364+ _M_data->_M_aday5 = "Thu";
2365+ _M_data->_M_aday6 = "Fri";
2366+ _M_data->_M_aday7 = "Sat";
2367+
2368+ // Month names, starting with "C"'s January.
2369+ _M_data->_M_month01 = "January";
2370+ _M_data->_M_month02 = "February";
2371+ _M_data->_M_month03 = "March";
2372+ _M_data->_M_month04 = "April";
2373+ _M_data->_M_month05 = "May";
2374+ _M_data->_M_month06 = "June";
2375+ _M_data->_M_month07 = "July";
2376+ _M_data->_M_month08 = "August";
2377+ _M_data->_M_month09 = "September";
2378+ _M_data->_M_month10 = "October";
2379+ _M_data->_M_month11 = "November";
2380+ _M_data->_M_month12 = "December";
2381+
2382+ // Abbreviated month names, starting with "C"'s Jan.
2383+ _M_data->_M_amonth01 = "Jan";
2384+ _M_data->_M_amonth02 = "Feb";
2385+ _M_data->_M_amonth03 = "Mar";
2386+ _M_data->_M_amonth04 = "Apr";
2387+ _M_data->_M_amonth05 = "May";
2388+ _M_data->_M_amonth06 = "Jun";
2389+ _M_data->_M_amonth07 = "Jul";
2390+ _M_data->_M_amonth08 = "Aug";
2391+ _M_data->_M_amonth09 = "Sep";
2392+ _M_data->_M_amonth10 = "Oct";
2393+ _M_data->_M_amonth11 = "Nov";
2394+ _M_data->_M_amonth12 = "Dec";
2395+ }
2396+ else
2397+ {
2398+ _M_c_locale_timepunct = _S_clone_c_locale(__cloc);
2399+
2400+ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
2401+ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
2402+ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
2403+ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
2404+ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
2405+ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
2406+ __cloc);
2407+ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
2408+ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
2409+ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
2410+
2411+ // Day names, starting with "C"'s Sunday.
2412+ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
2413+ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
2414+ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
2415+ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
2416+ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
2417+ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
2418+ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
2419+
2420+ // Abbreviated day names, starting with "C"'s Sun.
2421+ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
2422+ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
2423+ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
2424+ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
2425+ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
2426+ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
2427+ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
2428+
2429+ // Month names, starting with "C"'s January.
2430+ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
2431+ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
2432+ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
2433+ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
2434+ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
2435+ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
2436+ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
2437+ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
2438+ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
2439+ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
2440+ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
2441+ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
2442+
2443+ // Abbreviated month names, starting with "C"'s Jan.
2444+ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
2445+ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
2446+ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
2447+ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
2448+ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
2449+ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
2450+ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
2451+ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
2452+ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
2453+ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
2454+ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
2455+ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
2456+ }
2457+ }
2458+
2459+#ifdef _GLIBCXX_USE_WCHAR_T
2460+ template<>
2461+ void
2462+ __timepunct<wchar_t>::
2463+ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
2464+ const tm* __tm) const
2465+ {
2466+#ifdef __UCLIBC_HAS_XLOCALE__
2467+ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
2468+ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
2469+ _M_c_locale_timepunct);
2470+#else
2471+ char* __old = strdup(setlocale(LC_ALL, NULL));
2472+ setlocale(LC_ALL, _M_name_timepunct);
2473+ const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
2474+ setlocale(LC_ALL, __old);
2475+ free(__old);
2476+#endif
2477+ // Make sure __s is null terminated.
2478+ if (__len == 0)
2479+ __s[0] = L'\0';
2480+ }
2481+
2482+ template<>
2483+ void
2484+ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
2485+ {
2486+ if (!_M_data)
2487+ _M_data = new __timepunct_cache<wchar_t>;
2488+
2489+#warning wide time stuff
2490+// if (!__cloc)
2491+ {
2492+ // "C" locale
2493+ _M_c_locale_timepunct = _S_get_c_locale();
2494+
2495+ _M_data->_M_date_format = L"%m/%d/%y";
2496+ _M_data->_M_date_era_format = L"%m/%d/%y";
2497+ _M_data->_M_time_format = L"%H:%M:%S";
2498+ _M_data->_M_time_era_format = L"%H:%M:%S";
2499+ _M_data->_M_date_time_format = L"";
2500+ _M_data->_M_date_time_era_format = L"";
2501+ _M_data->_M_am = L"AM";
2502+ _M_data->_M_pm = L"PM";
2503+ _M_data->_M_am_pm_format = L"";
2504+
2505+ // Day names, starting with "C"'s Sunday.
2506+ _M_data->_M_day1 = L"Sunday";
2507+ _M_data->_M_day2 = L"Monday";
2508+ _M_data->_M_day3 = L"Tuesday";
2509+ _M_data->_M_day4 = L"Wednesday";
2510+ _M_data->_M_day5 = L"Thursday";
2511+ _M_data->_M_day6 = L"Friday";
2512+ _M_data->_M_day7 = L"Saturday";
2513+
2514+ // Abbreviated day names, starting with "C"'s Sun.
2515+ _M_data->_M_aday1 = L"Sun";
2516+ _M_data->_M_aday2 = L"Mon";
2517+ _M_data->_M_aday3 = L"Tue";
2518+ _M_data->_M_aday4 = L"Wed";
2519+ _M_data->_M_aday5 = L"Thu";
2520+ _M_data->_M_aday6 = L"Fri";
2521+ _M_data->_M_aday7 = L"Sat";
2522+
2523+ // Month names, starting with "C"'s January.
2524+ _M_data->_M_month01 = L"January";
2525+ _M_data->_M_month02 = L"February";
2526+ _M_data->_M_month03 = L"March";
2527+ _M_data->_M_month04 = L"April";
2528+ _M_data->_M_month05 = L"May";
2529+ _M_data->_M_month06 = L"June";
2530+ _M_data->_M_month07 = L"July";
2531+ _M_data->_M_month08 = L"August";
2532+ _M_data->_M_month09 = L"September";
2533+ _M_data->_M_month10 = L"October";
2534+ _M_data->_M_month11 = L"November";
2535+ _M_data->_M_month12 = L"December";
2536+
2537+ // Abbreviated month names, starting with "C"'s Jan.
2538+ _M_data->_M_amonth01 = L"Jan";
2539+ _M_data->_M_amonth02 = L"Feb";
2540+ _M_data->_M_amonth03 = L"Mar";
2541+ _M_data->_M_amonth04 = L"Apr";
2542+ _M_data->_M_amonth05 = L"May";
2543+ _M_data->_M_amonth06 = L"Jun";
2544+ _M_data->_M_amonth07 = L"Jul";
2545+ _M_data->_M_amonth08 = L"Aug";
2546+ _M_data->_M_amonth09 = L"Sep";
2547+ _M_data->_M_amonth10 = L"Oct";
2548+ _M_data->_M_amonth11 = L"Nov";
2549+ _M_data->_M_amonth12 = L"Dec";
2550+ }
2551+#if 0
2552+ else
2553+ {
2554+ _M_c_locale_timepunct = _S_clone_c_locale(__cloc);
2555+
2556+ union { char *__s; wchar_t *__w; } __u;
2557+
2558+ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
2559+ _M_data->_M_date_format = __u.__w;
2560+ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
2561+ _M_data->_M_date_era_format = __u.__w;
2562+ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
2563+ _M_data->_M_time_format = __u.__w;
2564+ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
2565+ _M_data->_M_time_era_format = __u.__w;
2566+ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
2567+ _M_data->_M_date_time_format = __u.__w;
2568+ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
2569+ _M_data->_M_date_time_era_format = __u.__w;
2570+ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
2571+ _M_data->_M_am = __u.__w;
2572+ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
2573+ _M_data->_M_pm = __u.__w;
2574+ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
2575+ _M_data->_M_am_pm_format = __u.__w;
2576+
2577+ // Day names, starting with "C"'s Sunday.
2578+ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
2579+ _M_data->_M_day1 = __u.__w;
2580+ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
2581+ _M_data->_M_day2 = __u.__w;
2582+ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
2583+ _M_data->_M_day3 = __u.__w;
2584+ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
2585+ _M_data->_M_day4 = __u.__w;
2586+ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
2587+ _M_data->_M_day5 = __u.__w;
2588+ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
2589+ _M_data->_M_day6 = __u.__w;
2590+ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
2591+ _M_data->_M_day7 = __u.__w;
2592+
2593+ // Abbreviated day names, starting with "C"'s Sun.
2594+ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
2595+ _M_data->_M_aday1 = __u.__w;
2596+ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
2597+ _M_data->_M_aday2 = __u.__w;
2598+ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
2599+ _M_data->_M_aday3 = __u.__w;
2600+ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
2601+ _M_data->_M_aday4 = __u.__w;
2602+ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
2603+ _M_data->_M_aday5 = __u.__w;
2604+ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
2605+ _M_data->_M_aday6 = __u.__w;
2606+ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
2607+ _M_data->_M_aday7 = __u.__w;
2608+
2609+ // Month names, starting with "C"'s January.
2610+ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
2611+ _M_data->_M_month01 = __u.__w;
2612+ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
2613+ _M_data->_M_month02 = __u.__w;
2614+ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
2615+ _M_data->_M_month03 = __u.__w;
2616+ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
2617+ _M_data->_M_month04 = __u.__w;
2618+ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
2619+ _M_data->_M_month05 = __u.__w;
2620+ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
2621+ _M_data->_M_month06 = __u.__w;
2622+ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
2623+ _M_data->_M_month07 = __u.__w;
2624+ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
2625+ _M_data->_M_month08 = __u.__w;
2626+ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
2627+ _M_data->_M_month09 = __u.__w;
2628+ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
2629+ _M_data->_M_month10 = __u.__w;
2630+ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
2631+ _M_data->_M_month11 = __u.__w;
2632+ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
2633+ _M_data->_M_month12 = __u.__w;
2634+
2635+ // Abbreviated month names, starting with "C"'s Jan.
2636+ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
2637+ _M_data->_M_amonth01 = __u.__w;
2638+ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
2639+ _M_data->_M_amonth02 = __u.__w;
2640+ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
2641+ _M_data->_M_amonth03 = __u.__w;
2642+ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
2643+ _M_data->_M_amonth04 = __u.__w;
2644+ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
2645+ _M_data->_M_amonth05 = __u.__w;
2646+ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
2647+ _M_data->_M_amonth06 = __u.__w;
2648+ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
2649+ _M_data->_M_amonth07 = __u.__w;
2650+ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
2651+ _M_data->_M_amonth08 = __u.__w;
2652+ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
2653+ _M_data->_M_amonth09 = __u.__w;
2654+ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
2655+ _M_data->_M_amonth10 = __u.__w;
2656+ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
2657+ _M_data->_M_amonth11 = __u.__w;
2658+ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
2659+ _M_data->_M_amonth12 = __u.__w;
2660+ }
2661+#endif // 0
2662+ }
2663+#endif
2664+}
2665diff --git a/libstdc++-v3/config/locale/uclibc/time_members.h b/libstdc++-v3/config/locale/uclibc/time_members.h
2666new file mode 100644
2667index 0000000..ba8e858
2668--- /dev/null
2669+++ b/libstdc++-v3/config/locale/uclibc/time_members.h
2670@@ -0,0 +1,68 @@
2671+// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
2672+
2673+// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
2674+//
2675+// This file is part of the GNU ISO C++ Library. This library is free
2676+// software; you can redistribute it and/or modify it under the
2677+// terms of the GNU General Public License as published by the
2678+// Free Software Foundation; either version 2, or (at your option)
2679+// any later version.
2680+
2681+// This library is distributed in the hope that it will be useful,
2682+// but WITHOUT ANY WARRANTY; without even the implied warranty of
2683+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2684+// GNU General Public License for more details.
2685+
2686+// You should have received a copy of the GNU General Public License along
2687+// with this library; see the file COPYING. If not, write to the Free
2688+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
2689+// USA.
2690+
2691+// As a special exception, you may use this file as part of a free software
2692+// library without restriction. Specifically, if other files instantiate
2693+// templates or use macros or inline functions from this file, or you compile
2694+// this file and link it with other files to produce an executable, this
2695+// file does not by itself cause the resulting executable to be covered by
2696+// the GNU General Public License. This exception does not however
2697+// invalidate any other reasons why the executable file might be covered by
2698+// the GNU General Public License.
2699+
2700+//
2701+// ISO C++ 14882: 22.2.5.1.2 - time_get functions
2702+// ISO C++ 14882: 22.2.5.3.2 - time_put functions
2703+//
2704+
2705+// Written by Benjamin Kosnik <bkoz@redhat.com>
2706+
2707+ template<typename _CharT>
2708+ __timepunct<_CharT>::__timepunct(size_t __refs)
2709+ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
2710+ _M_name_timepunct(_S_get_c_name())
2711+ { _M_initialize_timepunct(); }
2712+
2713+ template<typename _CharT>
2714+ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs)
2715+ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL),
2716+ _M_name_timepunct(_S_get_c_name())
2717+ { _M_initialize_timepunct(); }
2718+
2719+ template<typename _CharT>
2720+ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
2721+ size_t __refs)
2722+ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
2723+ _M_name_timepunct(__s)
2724+ {
2725+ char* __tmp = new char[std::strlen(__s) + 1];
2726+ std::strcpy(__tmp, __s);
2727+ _M_name_timepunct = __tmp;
2728+ _M_initialize_timepunct(__cloc);
2729+ }
2730+
2731+ template<typename _CharT>
2732+ __timepunct<_CharT>::~__timepunct()
2733+ {
2734+ if (_M_name_timepunct != _S_get_c_name())
2735+ delete [] _M_name_timepunct;
2736+ delete _M_data;
2737+ _S_destroy_c_locale(_M_c_locale_timepunct);
2738+ }
2739diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
2740index 8cd4c76..217012e 100755
2741--- a/libstdc++-v3/configure
2742+++ b/libstdc++-v3/configure
2743@@ -15918,6 +15918,9 @@ fi
2744 # Default to "generic".
2745 if test $enable_clocale_flag = auto; then
2746 case ${target_os} in
2747+ *-uclibc*)
2748+ enable_clocale_flag=uclibc
2749+ ;;
2750 linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2751 enable_clocale_flag=gnu
2752 ;;
2753@@ -16196,6 +16199,78 @@ $as_echo "newlib" >&6; }
2754 CTIME_CC=config/locale/generic/time_members.cc
2755 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2756 ;;
2757+ uclibc)
2758+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: uclibc" >&5
2759+$as_echo "uclibc" >&6; }
2760+
2761+ # Declare intention to use gettext, and add support for specific
2762+ # languages.
2763+ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2764+ ALL_LINGUAS="de fr"
2765+
2766+ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2767+ # Extract the first word of "msgfmt", so it can be a program name with args.
2768+set dummy msgfmt; ac_word=$2
2769+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
2770+$as_echo_n "checking for $ac_word... " >&6; }
2771+if test "${ac_cv_prog_check_msgfmt+set}" = set; then :
2772+ $as_echo_n "(cached) " >&6
2773+else
2774+ if test -n "$check_msgfmt"; then
2775+ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
2776+else
2777+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
2778+for as_dir in $PATH
2779+do
2780+ IFS=$as_save_IFS
2781+ test -z "$as_dir" && as_dir=.
2782+ for ac_exec_ext in '' $ac_executable_extensions; do
2783+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
2784+ ac_cv_prog_check_msgfmt="yes"
2785+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
2786+ break 2
2787+ fi
2788+done
2789+ done
2790+IFS=$as_save_IFS
2791+
2792+ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
2793+fi
2794+fi
2795+check_msgfmt=$ac_cv_prog_check_msgfmt
2796+if test -n "$check_msgfmt"; then
2797+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_msgfmt" >&5
2798+$as_echo "$check_msgfmt" >&6; }
2799+else
2800+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
2801+$as_echo "no" >&6; }
2802+fi
2803+
2804+
2805+ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2806+ USE_NLS=yes
2807+ fi
2808+ # Export the build objects.
2809+ for ling in $ALL_LINGUAS; do \
2810+ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2811+ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2812+ done
2813+
2814+
2815+
2816+ CLOCALE_H=config/locale/uclibc/c_locale.h
2817+ CLOCALE_CC=config/locale/uclibc/c_locale.cc
2818+ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
2819+ CCOLLATE_CC=config/locale/uclibc/collate_members.cc
2820+ CCTYPE_CC=config/locale/uclibc/ctype_members.cc
2821+ CMESSAGES_H=config/locale/uclibc/messages_members.h
2822+ CMESSAGES_CC=config/locale/uclibc/messages_members.cc
2823+ CMONEY_CC=config/locale/uclibc/monetary_members.cc
2824+ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
2825+ CTIME_H=config/locale/uclibc/time_members.h
2826+ CTIME_CC=config/locale/uclibc/time_members.cc
2827+ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
2828+ ;;
2829 esac
2830
2831 # This is where the testsuite looks for locale catalogs, using the
2832diff --git a/libstdc++-v3/include/c_compatibility/wchar.h b/libstdc++-v3/include/c_compatibility/wchar.h
2833index 06b5d47..7d3f835 100644
2834--- a/libstdc++-v3/include/c_compatibility/wchar.h
2835+++ b/libstdc++-v3/include/c_compatibility/wchar.h
2836@@ -101,7 +101,9 @@ using std::wmemcmp;
2837 using std::wmemcpy;
2838 using std::wmemmove;
2839 using std::wmemset;
2840+#if _GLIBCXX_HAVE_WCSFTIME
2841 using std::wcsftime;
2842+#endif
2843
2844 #if _GLIBCXX_USE_C99
2845 using std::wcstold;
2846diff --git a/libstdc++-v3/include/c_std/cwchar b/libstdc++-v3/include/c_std/cwchar
2847index aa1b2fa..45c4617 100644
2848--- a/libstdc++-v3/include/c_std/cwchar
2849+++ b/libstdc++-v3/include/c_std/cwchar
2850@@ -175,7 +175,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
2851 using ::wcscoll;
2852 using ::wcscpy;
2853 using ::wcscspn;
2854+#if _GLIBCXX_HAVE_WCSFTIME
2855 using ::wcsftime;
2856+#endif
2857 using ::wcslen;
2858 using ::wcsncat;
2859 using ::wcsncmp;
2860--
28612.6.3
2862