summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-06-15 18:25:54 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-06-22 09:16:00 +0100
commitf09b074de8cb25914f996fd34a19d8d695cb0f70 (patch)
tree74dd3859b6fcc6b9dcb87a1f3786e19f6677fb9d /meta/recipes-devtools/gcc
parentc1b4bea9a1fe8eb2a22a82fd22af423489e0a8fa (diff)
downloadpoky-f09b074de8cb25914f996fd34a19d8d695cb0f70.tar.gz
meta: Drop further remnants of uclibc support
uclibc support was removed a while ago and musl works much better. Start to remove the various overrides and patches related to uclibc which are no longer needed. uclibc support in a layer would still be possible. I have strong reasons to believe nobody is still using uclibc since patches are missing and I doubt the metadata even parses anymore. (From OE-Core rev: ec03023d2165b49a52b83bac1ea2f0bfded7b852) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/gcc')
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4.inc8
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0002-uclibc-conf.patch53
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0003-gcc-uclibc-locale-ctype_touplow_t.patch87
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0004-uclibc-locale.patch2862
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0005-uclibc-locale-no__x.patch257
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0006-uclibc-locale-wchar_fix.patch68
-rw-r--r--meta/recipes-devtools/gcc/gcc-5.4/0007-uclibc-locale-update.patch542
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3.inc8
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0002-uclibc-conf.patch53
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0003-gcc-uclibc-locale-ctype_touplow_t.patch87
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0004-uclibc-locale.patch2862
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0005-uclibc-locale-no__x.patch257
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0006-uclibc-locale-wchar_fix.patch68
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.3/0007-uclibc-locale-update.patch542
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1.inc8
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0002-uclibc-conf.patch30
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0003-gcc-uclibc-locale-ctype_touplow_t.patch87
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0004-uclibc-locale.patch2862
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0005-uclibc-locale-no__x.patch257
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0006-uclibc-locale-wchar_fix.patch68
-rw-r--r--meta/recipes-devtools/gcc/gcc-7.1/0007-uclibc-locale-update.patch542
-rw-r--r--meta/recipes-devtools/gcc/gcc-configure-common.inc2
22 files changed, 0 insertions, 11610 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-5.4.inc b/meta/recipes-devtools/gcc/gcc-5.4.inc
index b7696756af..3f3edfbe33 100644
--- a/meta/recipes-devtools/gcc/gcc-5.4.inc
+++ b/meta/recipes-devtools/gcc/gcc-5.4.inc
@@ -31,12 +31,6 @@ SRC_URI = "\
31 ${BASEURI} \ 31 ${BASEURI} \
32 ${BACKPORTS} \ 32 ${BACKPORTS} \
33 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \ 33 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
34 file://0002-uclibc-conf.patch \
35 file://0003-gcc-uclibc-locale-ctype_touplow_t.patch \
36 file://0004-uclibc-locale.patch \
37 file://0005-uclibc-locale-no__x.patch \
38 file://0006-uclibc-locale-wchar_fix.patch \
39 file://0007-uclibc-locale-update.patch \
40 file://0008-missing-execinfo_h.patch \ 34 file://0008-missing-execinfo_h.patch \
41 file://0009-c99-snprintf.patch \ 35 file://0009-c99-snprintf.patch \
42 file://0010-gcc-poison-system-directories.patch \ 36 file://0010-gcc-poison-system-directories.patch \
@@ -138,8 +132,6 @@ EXTRA_OECONF_INITIAL = "\
138 gcc_cv_libc_provides_ssp=yes \ 132 gcc_cv_libc_provides_ssp=yes \
139" 133"
140 134
141EXTRA_OECONF_append_libc-uclibc = " --disable-decimal-float "
142
143EXTRA_OECONF_PATHS = "\ 135EXTRA_OECONF_PATHS = "\
144 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \ 136 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \
145 --with-sysroot=/not/exist \ 137 --with-sysroot=/not/exist \
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0002-uclibc-conf.patch b/meta/recipes-devtools/gcc/gcc-5.4/0002-uclibc-conf.patch
deleted file mode 100644
index 8d6aeb5e43..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0002-uclibc-conf.patch
+++ /dev/null
@@ -1,53 +0,0 @@
1From b67c3a844bccec1766a7ec120e2d18cdcbc5f114 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:38:25 +0400
4Subject: [PATCH 02/46] uclibc-conf
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 contrib/regression/objs-gcc.sh | 4 ++++
11 libjava/classpath/ltconfig | 4 ++--
12 2 files changed, 6 insertions(+), 2 deletions(-)
13
14diff --git a/contrib/regression/objs-gcc.sh b/contrib/regression/objs-gcc.sh
15index 60b0497..6dc7ead 100755
16--- a/contrib/regression/objs-gcc.sh
17+++ b/contrib/regression/objs-gcc.sh
18@@ -106,6 +106,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-gnu ]
19 then
20 make all-gdb all-dejagnu all-ld || exit 1
21 make install-gdb install-dejagnu install-ld || exit 1
22+elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
23+ then
24+ make all-gdb all-dejagnu all-ld || exit 1
25+ make install-gdb install-dejagnu install-ld || exit 1
26 elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
27 make bootstrap || exit 1
28 make install || exit 1
29diff --git a/libjava/classpath/ltconfig b/libjava/classpath/ltconfig
30index 743d951..ae4ea60 100755
31--- a/libjava/classpath/ltconfig
32+++ b/libjava/classpath/ltconfig
33@@ -603,7 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
34
35 # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
36 case $host_os in
37-linux-gnu*) ;;
38+linux-gnu*|linux-uclibc*) ;;
39 linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
40 esac
41
42@@ -1247,7 +1247,7 @@ linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
43 ;;
44
45 # This must be Linux ELF.
46-linux-gnu*)
47+linux*)
48 version_type=linux
49 need_lib_prefix=no
50 need_version=no
51--
522.6.3
53
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0003-gcc-uclibc-locale-ctype_touplow_t.patch b/meta/recipes-devtools/gcc/gcc-5.4/0003-gcc-uclibc-locale-ctype_touplow_t.patch
deleted file mode 100644
index bd0326343e..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0003-gcc-uclibc-locale-ctype_touplow_t.patch
+++ /dev/null
@@ -1,87 +0,0 @@
1From 9bcb3a1848ff0f8990301ca09a25b15c2cf90c6f Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:40:12 +0400
4Subject: [PATCH 03/46] gcc-uclibc-locale-ctype_touplow_t
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/generic/c_locale.cc | 5 +++++
11 libstdc++-v3/config/locale/generic/c_locale.h | 9 +++++++++
12 libstdc++-v3/config/os/gnu-linux/ctype_base.h | 9 +++++++++
13 3 files changed, 23 insertions(+)
14
15diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
16index 6da5f22..2f85c2f 100644
17--- a/libstdc++-v3/config/locale/generic/c_locale.cc
18+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
19@@ -263,5 +263,10 @@ _GLIBCXX_END_NAMESPACE_VERSION
20 #ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
21 #define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
22 extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
23+#ifdef __UCLIBC__
24+// This is because __c_locale is of type __ctype_touplow_t* which is short on uclibc. for glibc its int*
25+_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPs, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPs);
26+#else
27 _GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi);
28+#endif
29 #endif // _GLIBCXX_LONG_DOUBLE_COMPAT
30diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h
31index ee3ef86..7fd5485 100644
32--- a/libstdc++-v3/config/locale/generic/c_locale.h
33+++ b/libstdc++-v3/config/locale/generic/c_locale.h
34@@ -40,13 +40,22 @@
35
36 #include <clocale>
37
38+#ifdef __UCLIBC__
39+#include <features.h>
40+#include <ctype.h>
41+#endif
42+
43 #define _GLIBCXX_NUM_CATEGORIES 0
44
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49+#ifdef __UCLIBC__
50+ typedef __ctype_touplow_t* __c_locale;
51+#else
52 typedef int* __c_locale;
53+#endif
54
55 // Convert numeric value of type double and long double to string and
56 // return length of string. If vsnprintf is available use it, otherwise
57diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_base.h b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
58index fd52b73..2627cf3 100644
59--- a/libstdc++-v3/config/os/gnu-linux/ctype_base.h
60+++ b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
61@@ -33,6 +33,11 @@
62
63 // Information as gleaned from /usr/include/ctype.h
64
65+#ifdef __UCLIBC__
66+#include <features.h>
67+#include <ctype.h>
68+#endif
69+
70 namespace std _GLIBCXX_VISIBILITY(default)
71 {
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
73@@ -41,7 +46,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
74 struct ctype_base
75 {
76 // Non-standard typedefs.
77+#ifdef __UCLIBC__
78+ typedef const __ctype_touplow_t* __to_type;
79+#else
80 typedef const int* __to_type;
81+#endif
82
83 // NB: Offsets into ctype<char>::_M_table force a particular size
84 // on the mask type. Because of this, we don't use an enum.
85--
862.6.3
87
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0004-uclibc-locale.patch b/meta/recipes-devtools/gcc/gcc-5.4/0004-uclibc-locale.patch
deleted file mode 100644
index 656265a285..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0004-uclibc-locale.patch
+++ /dev/null
@@ -1,2862 +0,0 @@
1From 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
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0005-uclibc-locale-no__x.patch b/meta/recipes-devtools/gcc/gcc-5.4/0005-uclibc-locale-no__x.patch
deleted file mode 100644
index 19a86a4e1d..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0005-uclibc-locale-no__x.patch
+++ /dev/null
@@ -1,257 +0,0 @@
1From 72a1a4af3c18627f59aa5ba1f753a89011b4e4f0 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:42:36 +0400
4Subject: [PATCH 05/46] uclibc-locale-no__x
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 45 ++++++++++++++++++++++
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 14 -------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 1 +
13 .../config/locale/uclibc/collate_members.cc | 7 ----
14 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 7 ----
15 .../config/locale/uclibc/messages_members.cc | 7 +---
16 .../config/locale/uclibc/messages_members.h | 18 ++++-----
17 .../config/locale/uclibc/monetary_members.cc | 4 --
18 .../config/locale/uclibc/numeric_members.cc | 3 --
19 libstdc++-v3/config/locale/uclibc/time_members.cc | 3 --
20 10 files changed, 55 insertions(+), 54 deletions(-)
21
22diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
23index 2ae3e4a..e74fddf 100644
24--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
26@@ -60,4 +60,49 @@ extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
27 extern "C" __typeof(wctype_l) __wctype_l;
28 #endif
29
30+# define __nl_langinfo_l nl_langinfo_l
31+# define __strcoll_l strcoll_l
32+# define __strftime_l strftime_l
33+# define __strtod_l strtod_l
34+# define __strtof_l strtof_l
35+# define __strtold_l strtold_l
36+# define __strxfrm_l strxfrm_l
37+# define __newlocale newlocale
38+# define __freelocale freelocale
39+# define __duplocale duplocale
40+# define __uselocale uselocale
41+
42+# ifdef _GLIBCXX_USE_WCHAR_T
43+# define __iswctype_l iswctype_l
44+# define __towlower_l towlower_l
45+# define __towupper_l towupper_l
46+# define __wcscoll_l wcscoll_l
47+# define __wcsftime_l wcsftime_l
48+# define __wcsxfrm_l wcsxfrm_l
49+# define __wctype_l wctype_l
50+# endif
51+
52+#else
53+# define __nl_langinfo_l(N, L) nl_langinfo((N))
54+# define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
55+# define __strtod_l(S, E, L) strtod((S), (E))
56+# define __strtof_l(S, E, L) strtof((S), (E))
57+# define __strtold_l(S, E, L) strtold((S), (E))
58+# define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
59+# warning should dummy __newlocale check for C|POSIX ?
60+# define __newlocale(a, b, c) NULL
61+# define __freelocale(a) ((void)0)
62+# define __duplocale(a) __c_locale()
63+//# define __uselocale ?
64+//
65+# ifdef _GLIBCXX_USE_WCHAR_T
66+# define __iswctype_l(C, M, L) iswctype((C), (M))
67+# define __towlower_l(C, L) towlower((C))
68+# define __towupper_l(C, L) towupper((C))
69+# define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
70+//# define __wcsftime_l(S, M, F, T, L) wcsftime((S), (M), (F), (T))
71+# define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
72+# define __wctype_l(S, L) wctype((S))
73+# endif
74+
75 #endif // GLIBC 2.3 and later
76diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
77index 5081dc1..21430d0 100644
78--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
79+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
80@@ -39,20 +39,6 @@
81 #include <langinfo.h>
82 #include <bits/c++locale_internal.h>
83
84-#ifndef __UCLIBC_HAS_XLOCALE__
85-#define __strtol_l(S, E, B, L) strtol((S), (E), (B))
86-#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B))
87-#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B))
88-#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B))
89-#define __strtof_l(S, E, L) strtof((S), (E))
90-#define __strtod_l(S, E, L) strtod((S), (E))
91-#define __strtold_l(S, E, L) strtold((S), (E))
92-#warning should dummy __newlocale check for C|POSIX ?
93-#define __newlocale(a, b, c) NULL
94-#define __freelocale(a) ((void)0)
95-#define __duplocale(a) __c_locale()
96-#endif
97-
98 namespace std
99 {
100 template<>
101diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
102index da07c1f..4bca5f1 100644
103--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
104+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
105@@ -68,6 +68,7 @@ namespace __gnu_cxx
106 {
107 extern "C" __typeof(uselocale) __uselocale;
108 }
109+#define __uselocale uselocale
110 #endif
111
112 namespace std
113diff --git a/libstdc++-v3/config/locale/uclibc/collate_members.cc b/libstdc++-v3/config/locale/uclibc/collate_members.cc
114index c2664a7..ec5c329 100644
115--- a/libstdc++-v3/config/locale/uclibc/collate_members.cc
116+++ b/libstdc++-v3/config/locale/uclibc/collate_members.cc
117@@ -36,13 +36,6 @@
118 #include <locale>
119 #include <bits/c++locale_internal.h>
120
121-#ifndef __UCLIBC_HAS_XLOCALE__
122-#define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
123-#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
124-#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
125-#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
126-#endif
127-
128 namespace std
129 {
130 // These are basically extensions to char_traits, and perhaps should
131diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
132index 7294e3a..7b12861 100644
133--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
134+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
135@@ -38,13 +38,6 @@
136 #undef _LIBC
137 #include <bits/c++locale_internal.h>
138
139-#ifndef __UCLIBC_HAS_XLOCALE__
140-#define __wctype_l(S, L) wctype((S))
141-#define __towupper_l(C, L) towupper((C))
142-#define __towlower_l(C, L) towlower((C))
143-#define __iswctype_l(C, M, L) iswctype((C), (M))
144-#endif
145-
146 namespace std
147 {
148 // NB: The other ctype<char> specializations are in src/locale.cc and
149diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.cc b/libstdc++-v3/config/locale/uclibc/messages_members.cc
150index 13594d9..d7693b4 100644
151--- a/libstdc++-v3/config/locale/uclibc/messages_members.cc
152+++ b/libstdc++-v3/config/locale/uclibc/messages_members.cc
153@@ -39,13 +39,10 @@
154 #ifdef __UCLIBC_MJN3_ONLY__
155 #warning fix gettext stuff
156 #endif
157-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
158-extern "C" char *__dcgettext(const char *domainname,
159- const char *msgid, int category);
160 #undef gettext
161-#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
162+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
163+#define gettext(msgid) dcgettext(NULL, msgid, LC_MESSAGES)
164 #else
165-#undef gettext
166 #define gettext(msgid) (msgid)
167 #endif
168
169diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
170index 1424078..d89da33 100644
171--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
172+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
173@@ -36,15 +36,11 @@
174 #ifdef __UCLIBC_MJN3_ONLY__
175 #warning fix prototypes for *textdomain funcs
176 #endif
177-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
178-extern "C" char *__textdomain(const char *domainname);
179-extern "C" char *__bindtextdomain(const char *domainname,
180- const char *dirname);
181-#else
182-#undef __textdomain
183-#undef __bindtextdomain
184-#define __textdomain(D) ((void)0)
185-#define __bindtextdomain(D,P) ((void)0)
186+#ifndef __UCLIBC_HAS_GETTEXT_AWARENESS__
187+#undef textdomain
188+#undef bindtextdomain
189+#define textdomain(D) ((void)0)
190+#define bindtextdomain(D,P) ((void)0)
191 #endif
192
193 // Non-virtual member functions.
194@@ -70,7 +66,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
195 messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc,
196 const char* __dir) const
197 {
198- __bindtextdomain(__s.c_str(), __dir);
199+ bindtextdomain(__s.c_str(), __dir);
200 return this->do_open(__s, __loc);
201 }
202
203@@ -90,7 +86,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
204 {
205 // No error checking is done, assume the catalog exists and can
206 // be used.
207- __textdomain(__s.c_str());
208+ textdomain(__s.c_str());
209 return 0;
210 }
211
212diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
213index aa52731..2e6f80a 100644
214--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
215+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
216@@ -43,10 +43,6 @@
217 #warning tailor for stub locale support
218 #endif
219
220-#ifndef __UCLIBC_HAS_XLOCALE__
221-#define __nl_langinfo_l(N, L) nl_langinfo((N))
222-#endif
223-
224 namespace std
225 {
226 // Construct and return valid pattern consisting of some combination of:
227diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
228index 883ec1a..2c70642 100644
229--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
230+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
231@@ -41,9 +41,6 @@
232 #ifdef __UCLIBC_MJN3_ONLY__
233 #warning tailor for stub locale support
234 #endif
235-#ifndef __UCLIBC_HAS_XLOCALE__
236-#define __nl_langinfo_l(N, L) nl_langinfo((N))
237-#endif
238
239 namespace std
240 {
241diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
242index e0707d7..d848ed5 100644
243--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
245@@ -40,9 +40,6 @@
246 #ifdef __UCLIBC_MJN3_ONLY__
247 #warning tailor for stub locale support
248 #endif
249-#ifndef __UCLIBC_HAS_XLOCALE__
250-#define __nl_langinfo_l(N, L) nl_langinfo((N))
251-#endif
252
253 namespace std
254 {
255--
2562.6.3
257
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0006-uclibc-locale-wchar_fix.patch b/meta/recipes-devtools/gcc/gcc-5.4/0006-uclibc-locale-wchar_fix.patch
deleted file mode 100644
index d7dbe68bd2..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0006-uclibc-locale-wchar_fix.patch
+++ /dev/null
@@ -1,68 +0,0 @@
1From b1298344f0c221c382a95af689f7f3ecd864f531 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:45:57 +0400
4Subject: [PATCH 06/46] uclibc-locale-wchar_fix
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/uclibc/monetary_members.cc | 4 ++--
11 libstdc++-v3/config/locale/uclibc/numeric_members.cc | 13 +++++++++++++
12 2 files changed, 15 insertions(+), 2 deletions(-)
13
14diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
15index 2e6f80a..31ebb9f 100644
16--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
17+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
18@@ -401,7 +401,7 @@ namespace std
19 # ifdef __UCLIBC_HAS_XLOCALE__
20 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
21 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
22-# else
23+# elif defined __UCLIBC_HAS_LOCALE__
24 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
25 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
26 # endif
27@@ -556,7 +556,7 @@ namespace std
28 # ifdef __UCLIBC_HAS_XLOCALE__
29 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
30 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
31-# else
32+# elif defined __UCLIBC_HAS_LOCALE__
33 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
34 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
35 # endif
36diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
37index 2c70642..d5c8961 100644
38--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
39+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
40@@ -127,12 +127,25 @@ namespace std
41 {
42 // Named locale.
43 // NB: In the GNU model wchar_t is always 32 bit wide.
44+#ifdef __UCLIBC_MJN3_ONLY__
45+#warning fix this... should be numeric
46+#endif
47+#ifdef __UCLIBC__
48+# ifdef __UCLIBC_HAS_XLOCALE__
49+ _M_data->_M_decimal_point = __cloc->decimal_point_wc;
50+ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
51+# elif defined __UCLIBC_HAS_LOCALE__
52+ _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
53+ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
54+# endif
55+#else
56 union { char *__s; wchar_t __w; } __u;
57 __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
58 _M_data->_M_decimal_point = __u.__w;
59
60 __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
61 _M_data->_M_thousands_sep = __u.__w;
62+#endif
63
64 if (_M_data->_M_thousands_sep == L'\0')
65 _M_data->_M_grouping = "";
66--
672.6.3
68
diff --git a/meta/recipes-devtools/gcc/gcc-5.4/0007-uclibc-locale-update.patch b/meta/recipes-devtools/gcc/gcc-5.4/0007-uclibc-locale-update.patch
deleted file mode 100644
index cde749931d..0000000000
--- a/meta/recipes-devtools/gcc/gcc-5.4/0007-uclibc-locale-update.patch
+++ /dev/null
@@ -1,542 +0,0 @@
1From e9d7cb62741c22d667fe56e98d50753d89aefdc3 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:46:58 +0400
4Subject: [PATCH 07/46] uclibc-locale-update
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 3 +
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 74 ++++++++++------------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 42 ++++++------
13 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 51 +++++++++++----
14 .../config/locale/uclibc/messages_members.h | 12 ++--
15 .../config/locale/uclibc/monetary_members.cc | 34 ++++++----
16 .../config/locale/uclibc/numeric_members.cc | 5 ++
17 libstdc++-v3/config/locale/uclibc/time_members.cc | 18 ++++--
18 libstdc++-v3/config/locale/uclibc/time_members.h | 17 +++--
19 9 files changed, 158 insertions(+), 98 deletions(-)
20
21diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
22index e74fddf..971a6b4 100644
23--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
24+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25@@ -31,6 +31,9 @@
26
27 #include <bits/c++config.h>
28 #include <clocale>
29+#include <cstdlib>
30+#include <cstring>
31+#include <cstddef>
32
33 #ifdef __UCLIBC_MJN3_ONLY__
34 #warning clean this up
35diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
36index 21430d0..1b9d8e1 100644
37--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
38+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
39@@ -39,23 +39,20 @@
40 #include <langinfo.h>
41 #include <bits/c++locale_internal.h>
42
43-namespace std
44-{
45+_GLIBCXX_BEGIN_NAMESPACE(std)
46+
47 template<>
48 void
49 __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
50 const __c_locale& __cloc)
51 {
52- if (!(__err & ios_base::failbit))
53- {
54- char* __sanity;
55- errno = 0;
56- float __f = __strtof_l(__s, &__sanity, __cloc);
57- if (__sanity != __s && errno != ERANGE)
58- __v = __f;
59- else
60- __err |= ios_base::failbit;
61- }
62+ char* __sanity;
63+ errno = 0;
64+ float __f = __strtof_l(__s, &__sanity, __cloc);
65+ if (__sanity != __s && errno != ERANGE)
66+ __v = __f;
67+ else
68+ __err |= ios_base::failbit;
69 }
70
71 template<>
72@@ -63,16 +60,13 @@ namespace std
73 __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
74 const __c_locale& __cloc)
75 {
76- if (!(__err & ios_base::failbit))
77- {
78- char* __sanity;
79- errno = 0;
80- double __d = __strtod_l(__s, &__sanity, __cloc);
81- if (__sanity != __s && errno != ERANGE)
82- __v = __d;
83- else
84- __err |= ios_base::failbit;
85- }
86+ char* __sanity;
87+ errno = 0;
88+ double __d = __strtod_l(__s, &__sanity, __cloc);
89+ if (__sanity != __s && errno != ERANGE)
90+ __v = __d;
91+ else
92+ __err |= ios_base::failbit;
93 }
94
95 template<>
96@@ -80,16 +74,13 @@ namespace std
97 __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
98 const __c_locale& __cloc)
99 {
100- if (!(__err & ios_base::failbit))
101- {
102- char* __sanity;
103- errno = 0;
104- long double __ld = __strtold_l(__s, &__sanity, __cloc);
105- if (__sanity != __s && errno != ERANGE)
106- __v = __ld;
107- else
108- __err |= ios_base::failbit;
109- }
110+ char* __sanity;
111+ errno = 0;
112+ long double __ld = __strtold_l(__s, &__sanity, __cloc);
113+ if (__sanity != __s && errno != ERANGE)
114+ __v = __ld;
115+ else
116+ __err |= ios_base::failbit;
117 }
118
119 void
120@@ -110,17 +101,18 @@ namespace std
121 void
122 locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
123 {
124- if (_S_get_c_locale() != __cloc)
125+ if (__cloc && _S_get_c_locale() != __cloc)
126 __freelocale(__cloc);
127 }
128
129 __c_locale
130 locale::facet::_S_clone_c_locale(__c_locale& __cloc)
131 { return __duplocale(__cloc); }
132-} // namespace std
133
134-namespace __gnu_cxx
135-{
136+_GLIBCXX_END_NAMESPACE
137+
138+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
139+
140 const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
141 {
142 "LC_CTYPE",
143@@ -138,9 +130,11 @@ namespace __gnu_cxx
144 "LC_IDENTIFICATION"
145 #endif
146 };
147-}
148
149-namespace std
150-{
151+_GLIBCXX_END_NAMESPACE
152+
153+_GLIBCXX_BEGIN_NAMESPACE(std)
154+
155 const char* const* const locale::_S_categories = __gnu_cxx::category_names;
156-} // namespace std
157+
158+_GLIBCXX_END_NAMESPACE
159diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
160index 4bca5f1..64a6d46 100644
161--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
162+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
163@@ -39,21 +39,23 @@
164 #pragma GCC system_header
165
166 #include <cstring> // get std::strlen
167-#include <cstdio> // get std::snprintf or std::sprintf
168+#include <cstdio> // get std::vsnprintf or std::vsprintf
169 #include <clocale>
170 #include <langinfo.h> // For codecvt
171 #ifdef __UCLIBC_MJN3_ONLY__
172 #warning fix this
173 #endif
174-#ifdef __UCLIBC_HAS_LOCALE__
175+#ifdef _GLIBCXX_USE_ICONV
176 #include <iconv.h> // For codecvt using iconv, iconv_t
177 #endif
178-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
179-#include <libintl.h> // For messages
180+#ifdef HAVE_LIBINTL_H
181+#include <libintl.h> // For messages
182 #endif
183+#include <cstdarg>
184
185 #ifdef __UCLIBC_MJN3_ONLY__
186 #warning what is _GLIBCXX_C_LOCALE_GNU for
187+// psm: used in os/gnu-linux/ctype_noninline.h
188 #endif
189 #define _GLIBCXX_C_LOCALE_GNU 1
190
191@@ -78,23 +80,25 @@ namespace std
192 #else
193 typedef int* __c_locale;
194 #endif
195-
196- // Convert numeric value of type _Tv to string and return length of
197- // string. If snprintf is available use it, otherwise fall back to
198- // the unsafe sprintf which, in general, can be dangerous and should
199+ // Convert numeric value of type double to string and return length of
200+ // string. If vsnprintf is available use it, otherwise fall back to
201+ // the unsafe vsprintf which, in general, can be dangerous and should
202 // be avoided.
203- template<typename _Tv>
204- int
205- __convert_from_v(char* __out,
206- const int __size __attribute__ ((__unused__)),
207- const char* __fmt,
208-#ifdef __UCLIBC_HAS_XCLOCALE__
209- _Tv __v, const __c_locale& __cloc, int __prec)
210+ inline int
211+ __convert_from_v(const __c_locale&
212+#ifndef __UCLIBC_HAS_XCLOCALE__
213+ __cloc __attribute__ ((__unused__))
214+#endif
215+ ,
216+ char* __out,
217+ const int __size,
218+ const char* __fmt, ...)
219 {
220+ va_list __args;
221+#ifdef __UCLIBC_HAS_XCLOCALE__
222+
223 __c_locale __old = __gnu_cxx::__uselocale(__cloc);
224 #else
225- _Tv __v, const __c_locale&, int __prec)
226- {
227 # ifdef __UCLIBC_HAS_LOCALE__
228 char* __old = std::setlocale(LC_ALL, NULL);
229 char* __sav = new char[std::strlen(__old) + 1];
230@@ -103,7 +107,9 @@ namespace std
231 # endif
232 #endif
233
234- const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
235+ va_start(__args, __fmt);
236+ const int __ret = std::vsnprintf(__out, __size, __fmt, __args);
237+ va_end(__args);
238
239 #ifdef __UCLIBC_HAS_XCLOCALE__
240 __gnu_cxx::__uselocale(__old);
241diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
242index 7b12861..13e011d 100644
243--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
245@@ -33,16 +33,20 @@
246
247 // Written by Benjamin Kosnik <bkoz@redhat.com>
248
249+#include <features.h>
250+#ifdef __UCLIBC_HAS_LOCALE__
251 #define _LIBC
252 #include <locale>
253 #undef _LIBC
254+#else
255+#include <locale>
256+#endif
257 #include <bits/c++locale_internal.h>
258
259-namespace std
260-{
261+_GLIBCXX_BEGIN_NAMESPACE(std)
262+
263 // NB: The other ctype<char> specializations are in src/locale.cc and
264 // various /config/os/* files.
265- template<>
266 ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
267 : ctype<char>(0, false, __refs)
268 {
269@@ -57,6 +61,8 @@ namespace std
270 #endif
271 }
272 }
273+ ctype_byname<char>::~ctype_byname()
274+ { }
275
276 #ifdef _GLIBCXX_USE_WCHAR_T
277 ctype<wchar_t>::__wmask_type
278@@ -138,17 +144,33 @@ namespace std
279 ctype<wchar_t>::
280 do_is(mask __m, wchar_t __c) const
281 {
282- // Highest bitmask in ctype_base == 10, but extra in "C"
283- // library for blank.
284+ // The case of __m == ctype_base::space is particularly important,
285+ // due to its use in many istream functions. Therefore we deal with
286+ // it first, exploiting the knowledge that on GNU systems _M_bit[5]
287+ // is the mask corresponding to ctype_base::space. NB: an encoding
288+ // change would not affect correctness!
289+
290 bool __ret = false;
291- const size_t __bitmasksize = 11;
292- for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
293- if (__m & _M_bit[__bitcur]
294- && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
295- {
296- __ret = true;
297- break;
298- }
299+ if (__m == _M_bit[5])
300+ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
301+ else
302+ {
303+ // Highest bitmask in ctype_base == 10, but extra in "C"
304+ // library for blank.
305+ const size_t __bitmasksize = 11;
306+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
307+ if (__m & _M_bit[__bitcur])
308+ {
309+ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
310+ {
311+ __ret = true;
312+ break;
313+ }
314+ else if (__m == _M_bit[__bitcur])
315+ break;
316+ }
317+ }
318+
319 return __ret;
320 }
321
322@@ -290,4 +312,5 @@ namespace std
323 #endif
324 }
325 #endif // _GLIBCXX_USE_WCHAR_T
326-}
327+
328+_GLIBCXX_END_NAMESPACE
329diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
330index d89da33..067657a 100644
331--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
332+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
333@@ -53,12 +53,16 @@
334 template<typename _CharT>
335 messages<_CharT>::messages(__c_locale __cloc, const char* __s,
336 size_t __refs)
337- : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
338- _M_name_messages(__s)
339+ : facet(__refs), _M_c_locale_messages(NULL),
340+ _M_name_messages(NULL)
341 {
342- char* __tmp = new char[std::strlen(__s) + 1];
343- std::strcpy(__tmp, __s);
344+ const size_t __len = std::strlen(__s) + 1;
345+ char* __tmp = new char[__len];
346+ std::memcpy(__tmp, __s, __len);
347 _M_name_messages = __tmp;
348+
349+ // Last to avoid leaking memory if new throws.
350+ _M_c_locale_messages = _S_clone_c_locale(__cloc);
351 }
352
353 template<typename _CharT>
354diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
355index 31ebb9f..7679b9c 100644
356--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
357+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
358@@ -33,9 +33,14 @@
359
360 // Written by Benjamin Kosnik <bkoz@redhat.com>
361
362+#include <features.h>
363+#ifdef __UCLIBC_HAS_LOCALE__
364 #define _LIBC
365 #include <locale>
366 #undef _LIBC
367+#else
368+#include <locale>
369+#endif
370 #include <bits/c++locale_internal.h>
371
372 #ifdef __UCLIBC_MJN3_ONLY__
373@@ -206,7 +211,7 @@ namespace std
374 }
375 break;
376 default:
377- ;
378+ __ret = pattern();
379 }
380 return __ret;
381 }
382@@ -390,7 +395,9 @@ namespace std
383 __c_locale __old = __uselocale(__cloc);
384 #else
385 // Switch to named locale so that mbsrtowcs will work.
386- char* __old = strdup(setlocale(LC_ALL, NULL));
387+ char* __old = setlocale(LC_ALL, NULL);
388+ const size_t __llen = strlen(__old) + 1;
389+ char* __sav = new char[__llen];
390 setlocale(LC_ALL, __name);
391 #endif
392
393@@ -477,8 +484,8 @@ namespace std
394 #ifdef __UCLIBC_HAS_XLOCALE__
395 __uselocale(__old);
396 #else
397- setlocale(LC_ALL, __old);
398- free(__old);
399+ setlocale(LC_ALL, __sav);
400+ delete [] __sav;
401 #endif
402 __throw_exception_again;
403 }
404@@ -498,8 +505,8 @@ namespace std
405 #ifdef __UCLIBC_HAS_XLOCALE__
406 __uselocale(__old);
407 #else
408- setlocale(LC_ALL, __old);
409- free(__old);
410+ setlocale(LC_ALL, __sav);
411+ delete [] __sav;
412 #endif
413 }
414 }
415@@ -545,8 +552,11 @@ namespace std
416 __c_locale __old = __uselocale(__cloc);
417 #else
418 // Switch to named locale so that mbsrtowcs will work.
419- char* __old = strdup(setlocale(LC_ALL, NULL));
420- setlocale(LC_ALL, __name);
421+ char* __old = setlocale(LC_ALL, NULL);
422+ const size_t __llen = strlen(__old) + 1;
423+ char* __sav = new char[__llen];
424+ memcpy(__sav, __old, __llen);
425+ setlocale(LC_ALL, __name);
426 #endif
427
428 #ifdef __UCLIBC_MJN3_ONLY__
429@@ -633,8 +643,8 @@ namespace std
430 #ifdef __UCLIBC_HAS_XLOCALE__
431 __uselocale(__old);
432 #else
433- setlocale(LC_ALL, __old);
434- free(__old);
435+ setlocale(LC_ALL, __sav);
436+ delete [] __sav;
437 #endif
438 __throw_exception_again;
439 }
440@@ -653,8 +663,8 @@ namespace std
441 #ifdef __UCLIBC_HAS_XLOCALE__
442 __uselocale(__old);
443 #else
444- setlocale(LC_ALL, __old);
445- free(__old);
446+ setlocale(LC_ALL, __sav);
447+ delete [] __sav;
448 #endif
449 }
450 }
451diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
452index d5c8961..8ae8969 100644
453--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
454+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
455@@ -33,9 +33,14 @@
456
457 // Written by Benjamin Kosnik <bkoz@redhat.com>
458
459+#include <features.h>
460+#ifdef __UCLIBC_HAS_LOCALE__
461 #define _LIBC
462 #include <locale>
463 #undef _LIBC
464+#else
465+#include <locale>
466+#endif
467 #include <bits/c++locale_internal.h>
468
469 #ifdef __UCLIBC_MJN3_ONLY__
470diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
471index d848ed5..f24d53e 100644
472--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
473+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
474@@ -53,11 +53,14 @@ namespace std
475 const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
476 _M_c_locale_timepunct);
477 #else
478- char* __old = strdup(setlocale(LC_ALL, NULL));
479+ char* __old = setlocale(LC_ALL, NULL);
480+ const size_t __llen = strlen(__old) + 1;
481+ char* __sav = new char[__llen];
482+ memcpy(__sav, __old, __llen);
483 setlocale(LC_ALL, _M_name_timepunct);
484 const size_t __len = strftime(__s, __maxlen, __format, __tm);
485- setlocale(LC_ALL, __old);
486- free(__old);
487+ setlocale(LC_ALL, __sav);
488+ delete [] __sav;
489 #endif
490 // Make sure __s is null terminated.
491 if (__len == 0)
492@@ -207,11 +210,14 @@ namespace std
493 const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
494 _M_c_locale_timepunct);
495 #else
496- char* __old = strdup(setlocale(LC_ALL, NULL));
497+ char* __old = setlocale(LC_ALL, NULL);
498+ const size_t __llen = strlen(__old) + 1;
499+ char* __sav = new char[__llen];
500+ memcpy(__sav, __old, __llen);
501 setlocale(LC_ALL, _M_name_timepunct);
502 const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
503- setlocale(LC_ALL, __old);
504- free(__old);
505+ setlocale(LC_ALL, __sav);
506+ delete [] __sav;
507 #endif
508 // Make sure __s is null terminated.
509 if (__len == 0)
510diff --git a/libstdc++-v3/config/locale/uclibc/time_members.h b/libstdc++-v3/config/locale/uclibc/time_members.h
511index ba8e858..1665dde 100644
512--- a/libstdc++-v3/config/locale/uclibc/time_members.h
513+++ b/libstdc++-v3/config/locale/uclibc/time_members.h
514@@ -50,12 +50,21 @@
515 __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
516 size_t __refs)
517 : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
518- _M_name_timepunct(__s)
519+ _M_name_timepunct(NULL)
520 {
521- char* __tmp = new char[std::strlen(__s) + 1];
522- std::strcpy(__tmp, __s);
523+ const size_t __len = std::strlen(__s) + 1;
524+ char* __tmp = new char[__len];
525+ std::memcpy(__tmp, __s, __len);
526 _M_name_timepunct = __tmp;
527- _M_initialize_timepunct(__cloc);
528+
529+ try
530+ { _M_initialize_timepunct(__cloc); }
531+ catch(...)
532+ {
533+ delete [] _M_name_timepunct;
534+ __throw_exception_again;
535+ }
536+
537 }
538
539 template<typename _CharT>
540--
5412.6.3
542
diff --git a/meta/recipes-devtools/gcc/gcc-6.3.inc b/meta/recipes-devtools/gcc/gcc-6.3.inc
index 71d0affb89..86b3e9ff19 100644
--- a/meta/recipes-devtools/gcc/gcc-6.3.inc
+++ b/meta/recipes-devtools/gcc/gcc-6.3.inc
@@ -32,12 +32,6 @@ BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2"
32SRC_URI = "\ 32SRC_URI = "\
33 ${BASEURI} \ 33 ${BASEURI} \
34 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \ 34 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
35 file://0002-uclibc-conf.patch \
36 file://0003-gcc-uclibc-locale-ctype_touplow_t.patch \
37 file://0004-uclibc-locale.patch \
38 file://0005-uclibc-locale-no__x.patch \
39 file://0006-uclibc-locale-wchar_fix.patch \
40 file://0007-uclibc-locale-update.patch \
41 file://0008-missing-execinfo_h.patch \ 35 file://0008-missing-execinfo_h.patch \
42 file://0009-c99-snprintf.patch \ 36 file://0009-c99-snprintf.patch \
43 file://0010-gcc-poison-system-directories.patch \ 37 file://0010-gcc-poison-system-directories.patch \
@@ -128,8 +122,6 @@ EXTRA_OECONF_INITIAL = "\
128 gcc_cv_libc_provides_ssp=yes \ 122 gcc_cv_libc_provides_ssp=yes \
129" 123"
130 124
131EXTRA_OECONF_append_libc-uclibc = " --disable-decimal-float "
132
133EXTRA_OECONF_PATHS = "\ 125EXTRA_OECONF_PATHS = "\
134 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \ 126 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \
135 --with-sysroot=/not/exist \ 127 --with-sysroot=/not/exist \
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0002-uclibc-conf.patch b/meta/recipes-devtools/gcc/gcc-6.3/0002-uclibc-conf.patch
deleted file mode 100644
index 4d284ef862..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0002-uclibc-conf.patch
+++ /dev/null
@@ -1,53 +0,0 @@
1From 4efc5a258c812875743647d756f75c93c4d514a5 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:38:25 +0400
4Subject: [PATCH 02/46] uclibc-conf
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 contrib/regression/objs-gcc.sh | 4 ++++
11 libjava/classpath/ltconfig | 4 ++--
12 2 files changed, 6 insertions(+), 2 deletions(-)
13
14diff --git a/contrib/regression/objs-gcc.sh b/contrib/regression/objs-gcc.sh
15index 60b0497..6dc7ead 100755
16--- a/contrib/regression/objs-gcc.sh
17+++ b/contrib/regression/objs-gcc.sh
18@@ -106,6 +106,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-gnu ]
19 then
20 make all-gdb all-dejagnu all-ld || exit 1
21 make install-gdb install-dejagnu install-ld || exit 1
22+elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
23+ then
24+ make all-gdb all-dejagnu all-ld || exit 1
25+ make install-gdb install-dejagnu install-ld || exit 1
26 elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
27 make bootstrap || exit 1
28 make install || exit 1
29diff --git a/libjava/classpath/ltconfig b/libjava/classpath/ltconfig
30index d318957..df55950 100755
31--- a/libjava/classpath/ltconfig
32+++ b/libjava/classpath/ltconfig
33@@ -603,7 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
34
35 # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
36 case $host_os in
37-linux-gnu*) ;;
38+linux-gnu*|linux-uclibc*) ;;
39 linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
40 esac
41
42@@ -1247,7 +1247,7 @@ linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
43 ;;
44
45 # This must be Linux ELF.
46-linux-gnu*)
47+linux*)
48 version_type=linux
49 need_lib_prefix=no
50 need_version=no
51--
522.8.2
53
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0003-gcc-uclibc-locale-ctype_touplow_t.patch b/meta/recipes-devtools/gcc/gcc-6.3/0003-gcc-uclibc-locale-ctype_touplow_t.patch
deleted file mode 100644
index df07febee2..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0003-gcc-uclibc-locale-ctype_touplow_t.patch
+++ /dev/null
@@ -1,87 +0,0 @@
1From ad5fd283fc7ef04f66c7fb003805364ea3bd34e9 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:40:12 +0400
4Subject: [PATCH 03/46] gcc-uclibc-locale-ctype_touplow_t
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/generic/c_locale.cc | 5 +++++
11 libstdc++-v3/config/locale/generic/c_locale.h | 9 +++++++++
12 libstdc++-v3/config/os/gnu-linux/ctype_base.h | 9 +++++++++
13 3 files changed, 23 insertions(+)
14
15diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
16index ef6ce8f..4740636 100644
17--- a/libstdc++-v3/config/locale/generic/c_locale.cc
18+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
19@@ -273,5 +273,10 @@ _GLIBCXX_END_NAMESPACE_VERSION
20 #ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
21 #define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
22 extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
23+#ifdef __UCLIBC__
24+// This is because __c_locale is of type __ctype_touplow_t* which is short on uclibc. for glibc its int*
25+_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPs, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPs);
26+#else
27 _GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi);
28+#endif
29 #endif // _GLIBCXX_LONG_DOUBLE_COMPAT
30diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h
31index 794471e..d65f955 100644
32--- a/libstdc++-v3/config/locale/generic/c_locale.h
33+++ b/libstdc++-v3/config/locale/generic/c_locale.h
34@@ -40,13 +40,22 @@
35
36 #include <clocale>
37
38+#ifdef __UCLIBC__
39+#include <features.h>
40+#include <ctype.h>
41+#endif
42+
43 #define _GLIBCXX_NUM_CATEGORIES 0
44
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49+#ifdef __UCLIBC__
50+ typedef __ctype_touplow_t* __c_locale;
51+#else
52 typedef int* __c_locale;
53+#endif
54
55 // Convert numeric value of type double and long double to string and
56 // return length of string. If vsnprintf is available use it, otherwise
57diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_base.h b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
58index 591c793..55eb0e9 100644
59--- a/libstdc++-v3/config/os/gnu-linux/ctype_base.h
60+++ b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
61@@ -33,6 +33,11 @@
62
63 // Information as gleaned from /usr/include/ctype.h
64
65+#ifdef __UCLIBC__
66+#include <features.h>
67+#include <ctype.h>
68+#endif
69+
70 namespace std _GLIBCXX_VISIBILITY(default)
71 {
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
73@@ -41,7 +46,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
74 struct ctype_base
75 {
76 // Non-standard typedefs.
77+#ifdef __UCLIBC__
78+ typedef const __ctype_touplow_t* __to_type;
79+#else
80 typedef const int* __to_type;
81+#endif
82
83 // NB: Offsets into ctype<char>::_M_table force a particular size
84 // on the mask type. Because of this, we don't use an enum.
85--
862.8.2
87
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0004-uclibc-locale.patch b/meta/recipes-devtools/gcc/gcc-6.3/0004-uclibc-locale.patch
deleted file mode 100644
index ae2627c2ef..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0004-uclibc-locale.patch
+++ /dev/null
@@ -1,2862 +0,0 @@
1From 68bd083357e78678a9baac760beb2a31f00954a5 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 b0f88cb..a0ee36b 100644
42--- a/libstdc++-v3/acinclude.m4
43+++ b/libstdc++-v3/acinclude.m4
44@@ -2358,6 +2358,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@@ -2542,6 +2545,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 41797a9..8a5481c 100755
2741--- a/libstdc++-v3/configure
2742+++ b/libstdc++-v3/configure
2743@@ -15830,6 +15830,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@@ -16108,6 +16111,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 55a0b52..7d8bb15 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_WCHAR
2845 using std::wcstold;
2846diff --git a/libstdc++-v3/include/c_std/cwchar b/libstdc++-v3/include/c_std/cwchar
2847index dc4cef02..256d126 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.8.2
2862
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0005-uclibc-locale-no__x.patch b/meta/recipes-devtools/gcc/gcc-6.3/0005-uclibc-locale-no__x.patch
deleted file mode 100644
index 3275016e77..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0005-uclibc-locale-no__x.patch
+++ /dev/null
@@ -1,257 +0,0 @@
1From c01c14e8e9be382ecd4121ee70f5003b4cb0f904 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:42:36 +0400
4Subject: [PATCH 05/46] uclibc-locale-no__x
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 45 ++++++++++++++++++++++
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 14 -------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 1 +
13 .../config/locale/uclibc/collate_members.cc | 7 ----
14 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 7 ----
15 .../config/locale/uclibc/messages_members.cc | 7 +---
16 .../config/locale/uclibc/messages_members.h | 18 ++++-----
17 .../config/locale/uclibc/monetary_members.cc | 4 --
18 .../config/locale/uclibc/numeric_members.cc | 3 --
19 libstdc++-v3/config/locale/uclibc/time_members.cc | 3 --
20 10 files changed, 55 insertions(+), 54 deletions(-)
21
22diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
23index 2ae3e4a..e74fddf 100644
24--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
26@@ -60,4 +60,49 @@ extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
27 extern "C" __typeof(wctype_l) __wctype_l;
28 #endif
29
30+# define __nl_langinfo_l nl_langinfo_l
31+# define __strcoll_l strcoll_l
32+# define __strftime_l strftime_l
33+# define __strtod_l strtod_l
34+# define __strtof_l strtof_l
35+# define __strtold_l strtold_l
36+# define __strxfrm_l strxfrm_l
37+# define __newlocale newlocale
38+# define __freelocale freelocale
39+# define __duplocale duplocale
40+# define __uselocale uselocale
41+
42+# ifdef _GLIBCXX_USE_WCHAR_T
43+# define __iswctype_l iswctype_l
44+# define __towlower_l towlower_l
45+# define __towupper_l towupper_l
46+# define __wcscoll_l wcscoll_l
47+# define __wcsftime_l wcsftime_l
48+# define __wcsxfrm_l wcsxfrm_l
49+# define __wctype_l wctype_l
50+# endif
51+
52+#else
53+# define __nl_langinfo_l(N, L) nl_langinfo((N))
54+# define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
55+# define __strtod_l(S, E, L) strtod((S), (E))
56+# define __strtof_l(S, E, L) strtof((S), (E))
57+# define __strtold_l(S, E, L) strtold((S), (E))
58+# define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
59+# warning should dummy __newlocale check for C|POSIX ?
60+# define __newlocale(a, b, c) NULL
61+# define __freelocale(a) ((void)0)
62+# define __duplocale(a) __c_locale()
63+//# define __uselocale ?
64+//
65+# ifdef _GLIBCXX_USE_WCHAR_T
66+# define __iswctype_l(C, M, L) iswctype((C), (M))
67+# define __towlower_l(C, L) towlower((C))
68+# define __towupper_l(C, L) towupper((C))
69+# define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
70+//# define __wcsftime_l(S, M, F, T, L) wcsftime((S), (M), (F), (T))
71+# define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
72+# define __wctype_l(S, L) wctype((S))
73+# endif
74+
75 #endif // GLIBC 2.3 and later
76diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
77index 5081dc1..21430d0 100644
78--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
79+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
80@@ -39,20 +39,6 @@
81 #include <langinfo.h>
82 #include <bits/c++locale_internal.h>
83
84-#ifndef __UCLIBC_HAS_XLOCALE__
85-#define __strtol_l(S, E, B, L) strtol((S), (E), (B))
86-#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B))
87-#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B))
88-#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B))
89-#define __strtof_l(S, E, L) strtof((S), (E))
90-#define __strtod_l(S, E, L) strtod((S), (E))
91-#define __strtold_l(S, E, L) strtold((S), (E))
92-#warning should dummy __newlocale check for C|POSIX ?
93-#define __newlocale(a, b, c) NULL
94-#define __freelocale(a) ((void)0)
95-#define __duplocale(a) __c_locale()
96-#endif
97-
98 namespace std
99 {
100 template<>
101diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
102index da07c1f..4bca5f1 100644
103--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
104+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
105@@ -68,6 +68,7 @@ namespace __gnu_cxx
106 {
107 extern "C" __typeof(uselocale) __uselocale;
108 }
109+#define __uselocale uselocale
110 #endif
111
112 namespace std
113diff --git a/libstdc++-v3/config/locale/uclibc/collate_members.cc b/libstdc++-v3/config/locale/uclibc/collate_members.cc
114index c2664a7..ec5c329 100644
115--- a/libstdc++-v3/config/locale/uclibc/collate_members.cc
116+++ b/libstdc++-v3/config/locale/uclibc/collate_members.cc
117@@ -36,13 +36,6 @@
118 #include <locale>
119 #include <bits/c++locale_internal.h>
120
121-#ifndef __UCLIBC_HAS_XLOCALE__
122-#define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
123-#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
124-#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
125-#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
126-#endif
127-
128 namespace std
129 {
130 // These are basically extensions to char_traits, and perhaps should
131diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
132index 7294e3a..7b12861 100644
133--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
134+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
135@@ -38,13 +38,6 @@
136 #undef _LIBC
137 #include <bits/c++locale_internal.h>
138
139-#ifndef __UCLIBC_HAS_XLOCALE__
140-#define __wctype_l(S, L) wctype((S))
141-#define __towupper_l(C, L) towupper((C))
142-#define __towlower_l(C, L) towlower((C))
143-#define __iswctype_l(C, M, L) iswctype((C), (M))
144-#endif
145-
146 namespace std
147 {
148 // NB: The other ctype<char> specializations are in src/locale.cc and
149diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.cc b/libstdc++-v3/config/locale/uclibc/messages_members.cc
150index 13594d9..d7693b4 100644
151--- a/libstdc++-v3/config/locale/uclibc/messages_members.cc
152+++ b/libstdc++-v3/config/locale/uclibc/messages_members.cc
153@@ -39,13 +39,10 @@
154 #ifdef __UCLIBC_MJN3_ONLY__
155 #warning fix gettext stuff
156 #endif
157-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
158-extern "C" char *__dcgettext(const char *domainname,
159- const char *msgid, int category);
160 #undef gettext
161-#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
162+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
163+#define gettext(msgid) dcgettext(NULL, msgid, LC_MESSAGES)
164 #else
165-#undef gettext
166 #define gettext(msgid) (msgid)
167 #endif
168
169diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
170index 1424078..d89da33 100644
171--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
172+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
173@@ -36,15 +36,11 @@
174 #ifdef __UCLIBC_MJN3_ONLY__
175 #warning fix prototypes for *textdomain funcs
176 #endif
177-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
178-extern "C" char *__textdomain(const char *domainname);
179-extern "C" char *__bindtextdomain(const char *domainname,
180- const char *dirname);
181-#else
182-#undef __textdomain
183-#undef __bindtextdomain
184-#define __textdomain(D) ((void)0)
185-#define __bindtextdomain(D,P) ((void)0)
186+#ifndef __UCLIBC_HAS_GETTEXT_AWARENESS__
187+#undef textdomain
188+#undef bindtextdomain
189+#define textdomain(D) ((void)0)
190+#define bindtextdomain(D,P) ((void)0)
191 #endif
192
193 // Non-virtual member functions.
194@@ -70,7 +66,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
195 messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc,
196 const char* __dir) const
197 {
198- __bindtextdomain(__s.c_str(), __dir);
199+ bindtextdomain(__s.c_str(), __dir);
200 return this->do_open(__s, __loc);
201 }
202
203@@ -90,7 +86,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
204 {
205 // No error checking is done, assume the catalog exists and can
206 // be used.
207- __textdomain(__s.c_str());
208+ textdomain(__s.c_str());
209 return 0;
210 }
211
212diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
213index aa52731..2e6f80a 100644
214--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
215+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
216@@ -43,10 +43,6 @@
217 #warning tailor for stub locale support
218 #endif
219
220-#ifndef __UCLIBC_HAS_XLOCALE__
221-#define __nl_langinfo_l(N, L) nl_langinfo((N))
222-#endif
223-
224 namespace std
225 {
226 // Construct and return valid pattern consisting of some combination of:
227diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
228index 883ec1a..2c70642 100644
229--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
230+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
231@@ -41,9 +41,6 @@
232 #ifdef __UCLIBC_MJN3_ONLY__
233 #warning tailor for stub locale support
234 #endif
235-#ifndef __UCLIBC_HAS_XLOCALE__
236-#define __nl_langinfo_l(N, L) nl_langinfo((N))
237-#endif
238
239 namespace std
240 {
241diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
242index e0707d7..d848ed5 100644
243--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
245@@ -40,9 +40,6 @@
246 #ifdef __UCLIBC_MJN3_ONLY__
247 #warning tailor for stub locale support
248 #endif
249-#ifndef __UCLIBC_HAS_XLOCALE__
250-#define __nl_langinfo_l(N, L) nl_langinfo((N))
251-#endif
252
253 namespace std
254 {
255--
2562.8.2
257
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0006-uclibc-locale-wchar_fix.patch b/meta/recipes-devtools/gcc/gcc-6.3/0006-uclibc-locale-wchar_fix.patch
deleted file mode 100644
index e45a482d53..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0006-uclibc-locale-wchar_fix.patch
+++ /dev/null
@@ -1,68 +0,0 @@
1From e7a4760fb40008cae33e6fc7dc4cfef6c2fd5f93 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:45:57 +0400
4Subject: [PATCH 06/46] uclibc-locale-wchar_fix
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/uclibc/monetary_members.cc | 4 ++--
11 libstdc++-v3/config/locale/uclibc/numeric_members.cc | 13 +++++++++++++
12 2 files changed, 15 insertions(+), 2 deletions(-)
13
14diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
15index 2e6f80a..31ebb9f 100644
16--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
17+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
18@@ -401,7 +401,7 @@ namespace std
19 # ifdef __UCLIBC_HAS_XLOCALE__
20 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
21 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
22-# else
23+# elif defined __UCLIBC_HAS_LOCALE__
24 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
25 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
26 # endif
27@@ -556,7 +556,7 @@ namespace std
28 # ifdef __UCLIBC_HAS_XLOCALE__
29 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
30 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
31-# else
32+# elif defined __UCLIBC_HAS_LOCALE__
33 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
34 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
35 # endif
36diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
37index 2c70642..d5c8961 100644
38--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
39+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
40@@ -127,12 +127,25 @@ namespace std
41 {
42 // Named locale.
43 // NB: In the GNU model wchar_t is always 32 bit wide.
44+#ifdef __UCLIBC_MJN3_ONLY__
45+#warning fix this... should be numeric
46+#endif
47+#ifdef __UCLIBC__
48+# ifdef __UCLIBC_HAS_XLOCALE__
49+ _M_data->_M_decimal_point = __cloc->decimal_point_wc;
50+ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
51+# elif defined __UCLIBC_HAS_LOCALE__
52+ _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
53+ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
54+# endif
55+#else
56 union { char *__s; wchar_t __w; } __u;
57 __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
58 _M_data->_M_decimal_point = __u.__w;
59
60 __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
61 _M_data->_M_thousands_sep = __u.__w;
62+#endif
63
64 if (_M_data->_M_thousands_sep == L'\0')
65 _M_data->_M_grouping = "";
66--
672.8.2
68
diff --git a/meta/recipes-devtools/gcc/gcc-6.3/0007-uclibc-locale-update.patch b/meta/recipes-devtools/gcc/gcc-6.3/0007-uclibc-locale-update.patch
deleted file mode 100644
index b73e5914e2..0000000000
--- a/meta/recipes-devtools/gcc/gcc-6.3/0007-uclibc-locale-update.patch
+++ /dev/null
@@ -1,542 +0,0 @@
1From 8d53a38a3038104e6830ecea5e4beadce54457c1 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:46:58 +0400
4Subject: [PATCH 07/46] uclibc-locale-update
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 3 +
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 74 ++++++++++------------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 42 ++++++------
13 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 51 +++++++++++----
14 .../config/locale/uclibc/messages_members.h | 12 ++--
15 .../config/locale/uclibc/monetary_members.cc | 34 ++++++----
16 .../config/locale/uclibc/numeric_members.cc | 5 ++
17 libstdc++-v3/config/locale/uclibc/time_members.cc | 18 ++++--
18 libstdc++-v3/config/locale/uclibc/time_members.h | 17 +++--
19 9 files changed, 158 insertions(+), 98 deletions(-)
20
21diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
22index e74fddf..971a6b4 100644
23--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
24+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25@@ -31,6 +31,9 @@
26
27 #include <bits/c++config.h>
28 #include <clocale>
29+#include <cstdlib>
30+#include <cstring>
31+#include <cstddef>
32
33 #ifdef __UCLIBC_MJN3_ONLY__
34 #warning clean this up
35diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
36index 21430d0..1b9d8e1 100644
37--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
38+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
39@@ -39,23 +39,20 @@
40 #include <langinfo.h>
41 #include <bits/c++locale_internal.h>
42
43-namespace std
44-{
45+_GLIBCXX_BEGIN_NAMESPACE(std)
46+
47 template<>
48 void
49 __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
50 const __c_locale& __cloc)
51 {
52- if (!(__err & ios_base::failbit))
53- {
54- char* __sanity;
55- errno = 0;
56- float __f = __strtof_l(__s, &__sanity, __cloc);
57- if (__sanity != __s && errno != ERANGE)
58- __v = __f;
59- else
60- __err |= ios_base::failbit;
61- }
62+ char* __sanity;
63+ errno = 0;
64+ float __f = __strtof_l(__s, &__sanity, __cloc);
65+ if (__sanity != __s && errno != ERANGE)
66+ __v = __f;
67+ else
68+ __err |= ios_base::failbit;
69 }
70
71 template<>
72@@ -63,16 +60,13 @@ namespace std
73 __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
74 const __c_locale& __cloc)
75 {
76- if (!(__err & ios_base::failbit))
77- {
78- char* __sanity;
79- errno = 0;
80- double __d = __strtod_l(__s, &__sanity, __cloc);
81- if (__sanity != __s && errno != ERANGE)
82- __v = __d;
83- else
84- __err |= ios_base::failbit;
85- }
86+ char* __sanity;
87+ errno = 0;
88+ double __d = __strtod_l(__s, &__sanity, __cloc);
89+ if (__sanity != __s && errno != ERANGE)
90+ __v = __d;
91+ else
92+ __err |= ios_base::failbit;
93 }
94
95 template<>
96@@ -80,16 +74,13 @@ namespace std
97 __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
98 const __c_locale& __cloc)
99 {
100- if (!(__err & ios_base::failbit))
101- {
102- char* __sanity;
103- errno = 0;
104- long double __ld = __strtold_l(__s, &__sanity, __cloc);
105- if (__sanity != __s && errno != ERANGE)
106- __v = __ld;
107- else
108- __err |= ios_base::failbit;
109- }
110+ char* __sanity;
111+ errno = 0;
112+ long double __ld = __strtold_l(__s, &__sanity, __cloc);
113+ if (__sanity != __s && errno != ERANGE)
114+ __v = __ld;
115+ else
116+ __err |= ios_base::failbit;
117 }
118
119 void
120@@ -110,17 +101,18 @@ namespace std
121 void
122 locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
123 {
124- if (_S_get_c_locale() != __cloc)
125+ if (__cloc && _S_get_c_locale() != __cloc)
126 __freelocale(__cloc);
127 }
128
129 __c_locale
130 locale::facet::_S_clone_c_locale(__c_locale& __cloc)
131 { return __duplocale(__cloc); }
132-} // namespace std
133
134-namespace __gnu_cxx
135-{
136+_GLIBCXX_END_NAMESPACE
137+
138+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
139+
140 const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
141 {
142 "LC_CTYPE",
143@@ -138,9 +130,11 @@ namespace __gnu_cxx
144 "LC_IDENTIFICATION"
145 #endif
146 };
147-}
148
149-namespace std
150-{
151+_GLIBCXX_END_NAMESPACE
152+
153+_GLIBCXX_BEGIN_NAMESPACE(std)
154+
155 const char* const* const locale::_S_categories = __gnu_cxx::category_names;
156-} // namespace std
157+
158+_GLIBCXX_END_NAMESPACE
159diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
160index 4bca5f1..64a6d46 100644
161--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
162+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
163@@ -39,21 +39,23 @@
164 #pragma GCC system_header
165
166 #include <cstring> // get std::strlen
167-#include <cstdio> // get std::snprintf or std::sprintf
168+#include <cstdio> // get std::vsnprintf or std::vsprintf
169 #include <clocale>
170 #include <langinfo.h> // For codecvt
171 #ifdef __UCLIBC_MJN3_ONLY__
172 #warning fix this
173 #endif
174-#ifdef __UCLIBC_HAS_LOCALE__
175+#ifdef _GLIBCXX_USE_ICONV
176 #include <iconv.h> // For codecvt using iconv, iconv_t
177 #endif
178-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
179-#include <libintl.h> // For messages
180+#ifdef HAVE_LIBINTL_H
181+#include <libintl.h> // For messages
182 #endif
183+#include <cstdarg>
184
185 #ifdef __UCLIBC_MJN3_ONLY__
186 #warning what is _GLIBCXX_C_LOCALE_GNU for
187+// psm: used in os/gnu-linux/ctype_noninline.h
188 #endif
189 #define _GLIBCXX_C_LOCALE_GNU 1
190
191@@ -78,23 +80,25 @@ namespace std
192 #else
193 typedef int* __c_locale;
194 #endif
195-
196- // Convert numeric value of type _Tv to string and return length of
197- // string. If snprintf is available use it, otherwise fall back to
198- // the unsafe sprintf which, in general, can be dangerous and should
199+ // Convert numeric value of type double to string and return length of
200+ // string. If vsnprintf is available use it, otherwise fall back to
201+ // the unsafe vsprintf which, in general, can be dangerous and should
202 // be avoided.
203- template<typename _Tv>
204- int
205- __convert_from_v(char* __out,
206- const int __size __attribute__ ((__unused__)),
207- const char* __fmt,
208-#ifdef __UCLIBC_HAS_XCLOCALE__
209- _Tv __v, const __c_locale& __cloc, int __prec)
210+ inline int
211+ __convert_from_v(const __c_locale&
212+#ifndef __UCLIBC_HAS_XCLOCALE__
213+ __cloc __attribute__ ((__unused__))
214+#endif
215+ ,
216+ char* __out,
217+ const int __size,
218+ const char* __fmt, ...)
219 {
220+ va_list __args;
221+#ifdef __UCLIBC_HAS_XCLOCALE__
222+
223 __c_locale __old = __gnu_cxx::__uselocale(__cloc);
224 #else
225- _Tv __v, const __c_locale&, int __prec)
226- {
227 # ifdef __UCLIBC_HAS_LOCALE__
228 char* __old = std::setlocale(LC_ALL, NULL);
229 char* __sav = new char[std::strlen(__old) + 1];
230@@ -103,7 +107,9 @@ namespace std
231 # endif
232 #endif
233
234- const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
235+ va_start(__args, __fmt);
236+ const int __ret = std::vsnprintf(__out, __size, __fmt, __args);
237+ va_end(__args);
238
239 #ifdef __UCLIBC_HAS_XCLOCALE__
240 __gnu_cxx::__uselocale(__old);
241diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
242index 7b12861..13e011d 100644
243--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
245@@ -33,16 +33,20 @@
246
247 // Written by Benjamin Kosnik <bkoz@redhat.com>
248
249+#include <features.h>
250+#ifdef __UCLIBC_HAS_LOCALE__
251 #define _LIBC
252 #include <locale>
253 #undef _LIBC
254+#else
255+#include <locale>
256+#endif
257 #include <bits/c++locale_internal.h>
258
259-namespace std
260-{
261+_GLIBCXX_BEGIN_NAMESPACE(std)
262+
263 // NB: The other ctype<char> specializations are in src/locale.cc and
264 // various /config/os/* files.
265- template<>
266 ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
267 : ctype<char>(0, false, __refs)
268 {
269@@ -57,6 +61,8 @@ namespace std
270 #endif
271 }
272 }
273+ ctype_byname<char>::~ctype_byname()
274+ { }
275
276 #ifdef _GLIBCXX_USE_WCHAR_T
277 ctype<wchar_t>::__wmask_type
278@@ -138,17 +144,33 @@ namespace std
279 ctype<wchar_t>::
280 do_is(mask __m, wchar_t __c) const
281 {
282- // Highest bitmask in ctype_base == 10, but extra in "C"
283- // library for blank.
284+ // The case of __m == ctype_base::space is particularly important,
285+ // due to its use in many istream functions. Therefore we deal with
286+ // it first, exploiting the knowledge that on GNU systems _M_bit[5]
287+ // is the mask corresponding to ctype_base::space. NB: an encoding
288+ // change would not affect correctness!
289+
290 bool __ret = false;
291- const size_t __bitmasksize = 11;
292- for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
293- if (__m & _M_bit[__bitcur]
294- && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
295- {
296- __ret = true;
297- break;
298- }
299+ if (__m == _M_bit[5])
300+ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
301+ else
302+ {
303+ // Highest bitmask in ctype_base == 10, but extra in "C"
304+ // library for blank.
305+ const size_t __bitmasksize = 11;
306+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
307+ if (__m & _M_bit[__bitcur])
308+ {
309+ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
310+ {
311+ __ret = true;
312+ break;
313+ }
314+ else if (__m == _M_bit[__bitcur])
315+ break;
316+ }
317+ }
318+
319 return __ret;
320 }
321
322@@ -290,4 +312,5 @@ namespace std
323 #endif
324 }
325 #endif // _GLIBCXX_USE_WCHAR_T
326-}
327+
328+_GLIBCXX_END_NAMESPACE
329diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
330index d89da33..067657a 100644
331--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
332+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
333@@ -53,12 +53,16 @@
334 template<typename _CharT>
335 messages<_CharT>::messages(__c_locale __cloc, const char* __s,
336 size_t __refs)
337- : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
338- _M_name_messages(__s)
339+ : facet(__refs), _M_c_locale_messages(NULL),
340+ _M_name_messages(NULL)
341 {
342- char* __tmp = new char[std::strlen(__s) + 1];
343- std::strcpy(__tmp, __s);
344+ const size_t __len = std::strlen(__s) + 1;
345+ char* __tmp = new char[__len];
346+ std::memcpy(__tmp, __s, __len);
347 _M_name_messages = __tmp;
348+
349+ // Last to avoid leaking memory if new throws.
350+ _M_c_locale_messages = _S_clone_c_locale(__cloc);
351 }
352
353 template<typename _CharT>
354diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
355index 31ebb9f..7679b9c 100644
356--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
357+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
358@@ -33,9 +33,14 @@
359
360 // Written by Benjamin Kosnik <bkoz@redhat.com>
361
362+#include <features.h>
363+#ifdef __UCLIBC_HAS_LOCALE__
364 #define _LIBC
365 #include <locale>
366 #undef _LIBC
367+#else
368+#include <locale>
369+#endif
370 #include <bits/c++locale_internal.h>
371
372 #ifdef __UCLIBC_MJN3_ONLY__
373@@ -206,7 +211,7 @@ namespace std
374 }
375 break;
376 default:
377- ;
378+ __ret = pattern();
379 }
380 return __ret;
381 }
382@@ -390,7 +395,9 @@ namespace std
383 __c_locale __old = __uselocale(__cloc);
384 #else
385 // Switch to named locale so that mbsrtowcs will work.
386- char* __old = strdup(setlocale(LC_ALL, NULL));
387+ char* __old = setlocale(LC_ALL, NULL);
388+ const size_t __llen = strlen(__old) + 1;
389+ char* __sav = new char[__llen];
390 setlocale(LC_ALL, __name);
391 #endif
392
393@@ -477,8 +484,8 @@ namespace std
394 #ifdef __UCLIBC_HAS_XLOCALE__
395 __uselocale(__old);
396 #else
397- setlocale(LC_ALL, __old);
398- free(__old);
399+ setlocale(LC_ALL, __sav);
400+ delete [] __sav;
401 #endif
402 __throw_exception_again;
403 }
404@@ -498,8 +505,8 @@ namespace std
405 #ifdef __UCLIBC_HAS_XLOCALE__
406 __uselocale(__old);
407 #else
408- setlocale(LC_ALL, __old);
409- free(__old);
410+ setlocale(LC_ALL, __sav);
411+ delete [] __sav;
412 #endif
413 }
414 }
415@@ -545,8 +552,11 @@ namespace std
416 __c_locale __old = __uselocale(__cloc);
417 #else
418 // Switch to named locale so that mbsrtowcs will work.
419- char* __old = strdup(setlocale(LC_ALL, NULL));
420- setlocale(LC_ALL, __name);
421+ char* __old = setlocale(LC_ALL, NULL);
422+ const size_t __llen = strlen(__old) + 1;
423+ char* __sav = new char[__llen];
424+ memcpy(__sav, __old, __llen);
425+ setlocale(LC_ALL, __name);
426 #endif
427
428 #ifdef __UCLIBC_MJN3_ONLY__
429@@ -633,8 +643,8 @@ namespace std
430 #ifdef __UCLIBC_HAS_XLOCALE__
431 __uselocale(__old);
432 #else
433- setlocale(LC_ALL, __old);
434- free(__old);
435+ setlocale(LC_ALL, __sav);
436+ delete [] __sav;
437 #endif
438 __throw_exception_again;
439 }
440@@ -653,8 +663,8 @@ namespace std
441 #ifdef __UCLIBC_HAS_XLOCALE__
442 __uselocale(__old);
443 #else
444- setlocale(LC_ALL, __old);
445- free(__old);
446+ setlocale(LC_ALL, __sav);
447+ delete [] __sav;
448 #endif
449 }
450 }
451diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
452index d5c8961..8ae8969 100644
453--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
454+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
455@@ -33,9 +33,14 @@
456
457 // Written by Benjamin Kosnik <bkoz@redhat.com>
458
459+#include <features.h>
460+#ifdef __UCLIBC_HAS_LOCALE__
461 #define _LIBC
462 #include <locale>
463 #undef _LIBC
464+#else
465+#include <locale>
466+#endif
467 #include <bits/c++locale_internal.h>
468
469 #ifdef __UCLIBC_MJN3_ONLY__
470diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
471index d848ed5..f24d53e 100644
472--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
473+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
474@@ -53,11 +53,14 @@ namespace std
475 const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
476 _M_c_locale_timepunct);
477 #else
478- char* __old = strdup(setlocale(LC_ALL, NULL));
479+ char* __old = setlocale(LC_ALL, NULL);
480+ const size_t __llen = strlen(__old) + 1;
481+ char* __sav = new char[__llen];
482+ memcpy(__sav, __old, __llen);
483 setlocale(LC_ALL, _M_name_timepunct);
484 const size_t __len = strftime(__s, __maxlen, __format, __tm);
485- setlocale(LC_ALL, __old);
486- free(__old);
487+ setlocale(LC_ALL, __sav);
488+ delete [] __sav;
489 #endif
490 // Make sure __s is null terminated.
491 if (__len == 0)
492@@ -207,11 +210,14 @@ namespace std
493 const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
494 _M_c_locale_timepunct);
495 #else
496- char* __old = strdup(setlocale(LC_ALL, NULL));
497+ char* __old = setlocale(LC_ALL, NULL);
498+ const size_t __llen = strlen(__old) + 1;
499+ char* __sav = new char[__llen];
500+ memcpy(__sav, __old, __llen);
501 setlocale(LC_ALL, _M_name_timepunct);
502 const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
503- setlocale(LC_ALL, __old);
504- free(__old);
505+ setlocale(LC_ALL, __sav);
506+ delete [] __sav;
507 #endif
508 // Make sure __s is null terminated.
509 if (__len == 0)
510diff --git a/libstdc++-v3/config/locale/uclibc/time_members.h b/libstdc++-v3/config/locale/uclibc/time_members.h
511index ba8e858..1665dde 100644
512--- a/libstdc++-v3/config/locale/uclibc/time_members.h
513+++ b/libstdc++-v3/config/locale/uclibc/time_members.h
514@@ -50,12 +50,21 @@
515 __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
516 size_t __refs)
517 : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
518- _M_name_timepunct(__s)
519+ _M_name_timepunct(NULL)
520 {
521- char* __tmp = new char[std::strlen(__s) + 1];
522- std::strcpy(__tmp, __s);
523+ const size_t __len = std::strlen(__s) + 1;
524+ char* __tmp = new char[__len];
525+ std::memcpy(__tmp, __s, __len);
526 _M_name_timepunct = __tmp;
527- _M_initialize_timepunct(__cloc);
528+
529+ try
530+ { _M_initialize_timepunct(__cloc); }
531+ catch(...)
532+ {
533+ delete [] _M_name_timepunct;
534+ __throw_exception_again;
535+ }
536+
537 }
538
539 template<typename _CharT>
540--
5412.8.2
542
diff --git a/meta/recipes-devtools/gcc/gcc-7.1.inc b/meta/recipes-devtools/gcc/gcc-7.1.inc
index 3df04199a6..4098d6a2c1 100644
--- a/meta/recipes-devtools/gcc/gcc-7.1.inc
+++ b/meta/recipes-devtools/gcc/gcc-7.1.inc
@@ -32,12 +32,6 @@ BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2"
32SRC_URI = "\ 32SRC_URI = "\
33 ${BASEURI} \ 33 ${BASEURI} \
34 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \ 34 file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
35 file://0002-uclibc-conf.patch \
36 file://0003-gcc-uclibc-locale-ctype_touplow_t.patch \
37 file://0004-uclibc-locale.patch \
38 file://0005-uclibc-locale-no__x.patch \
39 file://0006-uclibc-locale-wchar_fix.patch \
40 file://0007-uclibc-locale-update.patch \
41 file://0008-c99-snprintf.patch \ 35 file://0008-c99-snprintf.patch \
42 file://0009-gcc-poison-system-directories.patch \ 36 file://0009-gcc-poison-system-directories.patch \
43 file://0010-gcc-poison-dir-extend.patch \ 37 file://0010-gcc-poison-dir-extend.patch \
@@ -124,8 +118,6 @@ EXTRA_OECONF_INITIAL = "\
124 gcc_cv_libc_provides_ssp=yes \ 118 gcc_cv_libc_provides_ssp=yes \
125" 119"
126 120
127EXTRA_OECONF_append_libc-uclibc = " --disable-decimal-float "
128
129EXTRA_OECONF_PATHS = "\ 121EXTRA_OECONF_PATHS = "\
130 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \ 122 --with-gxx-include-dir=/not/exist{target_includedir}/c++/${BINV} \
131 --with-sysroot=/not/exist \ 123 --with-sysroot=/not/exist \
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0002-uclibc-conf.patch b/meta/recipes-devtools/gcc/gcc-7.1/0002-uclibc-conf.patch
deleted file mode 100644
index dfcf25feb3..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0002-uclibc-conf.patch
+++ /dev/null
@@ -1,30 +0,0 @@
1From b4edd6af6e5c007d04ba0a0b6f614ac5773c9b36 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:38:25 +0400
4Subject: [PATCH 02/47] uclibc-conf
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 contrib/regression/objs-gcc.sh | 4 ++++
11 1 file changed, 4 insertions(+)
12
13diff --git a/contrib/regression/objs-gcc.sh b/contrib/regression/objs-gcc.sh
14index 60b0497fea2..6dc7eadff36 100755
15--- a/contrib/regression/objs-gcc.sh
16+++ b/contrib/regression/objs-gcc.sh
17@@ -106,6 +106,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-gnu ]
18 then
19 make all-gdb all-dejagnu all-ld || exit 1
20 make install-gdb install-dejagnu install-ld || exit 1
21+elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
22+ then
23+ make all-gdb all-dejagnu all-ld || exit 1
24+ make install-gdb install-dejagnu install-ld || exit 1
25 elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
26 make bootstrap || exit 1
27 make install || exit 1
28--
292.12.2
30
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0003-gcc-uclibc-locale-ctype_touplow_t.patch b/meta/recipes-devtools/gcc/gcc-7.1/0003-gcc-uclibc-locale-ctype_touplow_t.patch
deleted file mode 100644
index bd9eddc4d6..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0003-gcc-uclibc-locale-ctype_touplow_t.patch
+++ /dev/null
@@ -1,87 +0,0 @@
1From e53fb4bcf1e584413ca7207511757287a0156147 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:40:12 +0400
4Subject: [PATCH 03/47] gcc-uclibc-locale-ctype_touplow_t
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/generic/c_locale.cc | 5 +++++
11 libstdc++-v3/config/locale/generic/c_locale.h | 9 +++++++++
12 libstdc++-v3/config/os/gnu-linux/ctype_base.h | 9 +++++++++
13 3 files changed, 23 insertions(+)
14
15diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
16index bd311e300f8..3190973d164 100644
17--- a/libstdc++-v3/config/locale/generic/c_locale.cc
18+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
19@@ -273,5 +273,10 @@ _GLIBCXX_END_NAMESPACE_VERSION
20 #ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
21 #define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
22 extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
23+#ifdef __UCLIBC__
24+// This is because __c_locale is of type __ctype_touplow_t* which is short on uclibc. for glibc its int*
25+_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPs, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPs);
26+#else
27 _GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi);
28+#endif
29 #endif // _GLIBCXX_LONG_DOUBLE_COMPAT
30diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h
31index ce9fbb80d76..54211bee314 100644
32--- a/libstdc++-v3/config/locale/generic/c_locale.h
33+++ b/libstdc++-v3/config/locale/generic/c_locale.h
34@@ -40,13 +40,22 @@
35
36 #include <clocale>
37
38+#ifdef __UCLIBC__
39+#include <features.h>
40+#include <ctype.h>
41+#endif
42+
43 #define _GLIBCXX_NUM_CATEGORIES 0
44
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49+#ifdef __UCLIBC__
50+ typedef __ctype_touplow_t* __c_locale;
51+#else
52 typedef int* __c_locale;
53+#endif
54
55 // Convert numeric value of type double and long double to string and
56 // return length of string. If vsnprintf is available use it, otherwise
57diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_base.h b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
58index 6ee1debdc2a..94bf3cf00aa 100644
59--- a/libstdc++-v3/config/os/gnu-linux/ctype_base.h
60+++ b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
61@@ -33,6 +33,11 @@
62
63 // Information as gleaned from /usr/include/ctype.h
64
65+#ifdef __UCLIBC__
66+#include <features.h>
67+#include <ctype.h>
68+#endif
69+
70 namespace std _GLIBCXX_VISIBILITY(default)
71 {
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
73@@ -41,7 +46,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
74 struct ctype_base
75 {
76 // Non-standard typedefs.
77+#ifdef __UCLIBC__
78+ typedef const __ctype_touplow_t* __to_type;
79+#else
80 typedef const int* __to_type;
81+#endif
82
83 // NB: Offsets into ctype<char>::_M_table force a particular size
84 // on the mask type. Because of this, we don't use an enum.
85--
862.12.2
87
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0004-uclibc-locale.patch b/meta/recipes-devtools/gcc/gcc-7.1/0004-uclibc-locale.patch
deleted file mode 100644
index 8d3135b992..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0004-uclibc-locale.patch
+++ /dev/null
@@ -1,2862 +0,0 @@
1From 87010423a7d26baed4556f5e540f4d00664ae86d 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/47] 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 8cb525b2938..e6056f25ddc 100644
42--- a/libstdc++-v3/acinclude.m4
43+++ b/libstdc++-v3/acinclude.m4
44@@ -2410,6 +2410,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@@ -2594,6 +2597,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 00000000000..2ae3e4aaad9
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 00000000000..5081dc1cc64
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 00000000000..da07c1f7dcf
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 00000000000..64aa96253de
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 00000000000..c2664a77f30
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 00000000000..7294e3a84e1
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 00000000000..13594d9fe9a
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 00000000000..1424078173a
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 00000000000..aa52731695f
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 00000000000..883ec1a1d4d
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 00000000000..e0707d76a66
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 00000000000..ba8e8587c0f
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 2406cb9d946..fb7e126c0b0 100755
2741--- a/libstdc++-v3/configure
2742+++ b/libstdc++-v3/configure
2743@@ -15837,6 +15837,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@@ -16115,6 +16118,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 bddb791c10e..511d7e46d25 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_WCHAR
2845 using std::wcstold;
2846diff --git a/libstdc++-v3/include/c_std/cwchar b/libstdc++-v3/include/c_std/cwchar
2847index e6ba261e47c..2c3676893ac 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.12.2
2862
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0005-uclibc-locale-no__x.patch b/meta/recipes-devtools/gcc/gcc-7.1/0005-uclibc-locale-no__x.patch
deleted file mode 100644
index 7dc8df67db..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0005-uclibc-locale-no__x.patch
+++ /dev/null
@@ -1,257 +0,0 @@
1From 78592335e36f76bebb3b60b50bced1cde5586a9b Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:42:36 +0400
4Subject: [PATCH 05/47] uclibc-locale-no__x
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 45 ++++++++++++++++++++++
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 14 -------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 1 +
13 .../config/locale/uclibc/collate_members.cc | 7 ----
14 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 7 ----
15 .../config/locale/uclibc/messages_members.cc | 7 +---
16 .../config/locale/uclibc/messages_members.h | 18 ++++-----
17 .../config/locale/uclibc/monetary_members.cc | 4 --
18 .../config/locale/uclibc/numeric_members.cc | 3 --
19 libstdc++-v3/config/locale/uclibc/time_members.cc | 3 --
20 10 files changed, 55 insertions(+), 54 deletions(-)
21
22diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
23index 2ae3e4aaad9..e74fddfa409 100644
24--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
26@@ -60,4 +60,49 @@ extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
27 extern "C" __typeof(wctype_l) __wctype_l;
28 #endif
29
30+# define __nl_langinfo_l nl_langinfo_l
31+# define __strcoll_l strcoll_l
32+# define __strftime_l strftime_l
33+# define __strtod_l strtod_l
34+# define __strtof_l strtof_l
35+# define __strtold_l strtold_l
36+# define __strxfrm_l strxfrm_l
37+# define __newlocale newlocale
38+# define __freelocale freelocale
39+# define __duplocale duplocale
40+# define __uselocale uselocale
41+
42+# ifdef _GLIBCXX_USE_WCHAR_T
43+# define __iswctype_l iswctype_l
44+# define __towlower_l towlower_l
45+# define __towupper_l towupper_l
46+# define __wcscoll_l wcscoll_l
47+# define __wcsftime_l wcsftime_l
48+# define __wcsxfrm_l wcsxfrm_l
49+# define __wctype_l wctype_l
50+# endif
51+
52+#else
53+# define __nl_langinfo_l(N, L) nl_langinfo((N))
54+# define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
55+# define __strtod_l(S, E, L) strtod((S), (E))
56+# define __strtof_l(S, E, L) strtof((S), (E))
57+# define __strtold_l(S, E, L) strtold((S), (E))
58+# define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
59+# warning should dummy __newlocale check for C|POSIX ?
60+# define __newlocale(a, b, c) NULL
61+# define __freelocale(a) ((void)0)
62+# define __duplocale(a) __c_locale()
63+//# define __uselocale ?
64+//
65+# ifdef _GLIBCXX_USE_WCHAR_T
66+# define __iswctype_l(C, M, L) iswctype((C), (M))
67+# define __towlower_l(C, L) towlower((C))
68+# define __towupper_l(C, L) towupper((C))
69+# define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
70+//# define __wcsftime_l(S, M, F, T, L) wcsftime((S), (M), (F), (T))
71+# define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
72+# define __wctype_l(S, L) wctype((S))
73+# endif
74+
75 #endif // GLIBC 2.3 and later
76diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
77index 5081dc1cc64..21430d05834 100644
78--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
79+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
80@@ -39,20 +39,6 @@
81 #include <langinfo.h>
82 #include <bits/c++locale_internal.h>
83
84-#ifndef __UCLIBC_HAS_XLOCALE__
85-#define __strtol_l(S, E, B, L) strtol((S), (E), (B))
86-#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B))
87-#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B))
88-#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B))
89-#define __strtof_l(S, E, L) strtof((S), (E))
90-#define __strtod_l(S, E, L) strtod((S), (E))
91-#define __strtold_l(S, E, L) strtold((S), (E))
92-#warning should dummy __newlocale check for C|POSIX ?
93-#define __newlocale(a, b, c) NULL
94-#define __freelocale(a) ((void)0)
95-#define __duplocale(a) __c_locale()
96-#endif
97-
98 namespace std
99 {
100 template<>
101diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
102index da07c1f7dcf..4bca5f1f8d6 100644
103--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
104+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
105@@ -68,6 +68,7 @@ namespace __gnu_cxx
106 {
107 extern "C" __typeof(uselocale) __uselocale;
108 }
109+#define __uselocale uselocale
110 #endif
111
112 namespace std
113diff --git a/libstdc++-v3/config/locale/uclibc/collate_members.cc b/libstdc++-v3/config/locale/uclibc/collate_members.cc
114index c2664a77f30..ec5c3291699 100644
115--- a/libstdc++-v3/config/locale/uclibc/collate_members.cc
116+++ b/libstdc++-v3/config/locale/uclibc/collate_members.cc
117@@ -36,13 +36,6 @@
118 #include <locale>
119 #include <bits/c++locale_internal.h>
120
121-#ifndef __UCLIBC_HAS_XLOCALE__
122-#define __strcoll_l(S1, S2, L) strcoll((S1), (S2))
123-#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N))
124-#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2))
125-#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N))
126-#endif
127-
128 namespace std
129 {
130 // These are basically extensions to char_traits, and perhaps should
131diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
132index 7294e3a84e1..7b12861303c 100644
133--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
134+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
135@@ -38,13 +38,6 @@
136 #undef _LIBC
137 #include <bits/c++locale_internal.h>
138
139-#ifndef __UCLIBC_HAS_XLOCALE__
140-#define __wctype_l(S, L) wctype((S))
141-#define __towupper_l(C, L) towupper((C))
142-#define __towlower_l(C, L) towlower((C))
143-#define __iswctype_l(C, M, L) iswctype((C), (M))
144-#endif
145-
146 namespace std
147 {
148 // NB: The other ctype<char> specializations are in src/locale.cc and
149diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.cc b/libstdc++-v3/config/locale/uclibc/messages_members.cc
150index 13594d9fe9a..d7693b4c413 100644
151--- a/libstdc++-v3/config/locale/uclibc/messages_members.cc
152+++ b/libstdc++-v3/config/locale/uclibc/messages_members.cc
153@@ -39,13 +39,10 @@
154 #ifdef __UCLIBC_MJN3_ONLY__
155 #warning fix gettext stuff
156 #endif
157-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
158-extern "C" char *__dcgettext(const char *domainname,
159- const char *msgid, int category);
160 #undef gettext
161-#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
162+#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
163+#define gettext(msgid) dcgettext(NULL, msgid, LC_MESSAGES)
164 #else
165-#undef gettext
166 #define gettext(msgid) (msgid)
167 #endif
168
169diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
170index 1424078173a..d89da339d59 100644
171--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
172+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
173@@ -36,15 +36,11 @@
174 #ifdef __UCLIBC_MJN3_ONLY__
175 #warning fix prototypes for *textdomain funcs
176 #endif
177-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
178-extern "C" char *__textdomain(const char *domainname);
179-extern "C" char *__bindtextdomain(const char *domainname,
180- const char *dirname);
181-#else
182-#undef __textdomain
183-#undef __bindtextdomain
184-#define __textdomain(D) ((void)0)
185-#define __bindtextdomain(D,P) ((void)0)
186+#ifndef __UCLIBC_HAS_GETTEXT_AWARENESS__
187+#undef textdomain
188+#undef bindtextdomain
189+#define textdomain(D) ((void)0)
190+#define bindtextdomain(D,P) ((void)0)
191 #endif
192
193 // Non-virtual member functions.
194@@ -70,7 +66,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
195 messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc,
196 const char* __dir) const
197 {
198- __bindtextdomain(__s.c_str(), __dir);
199+ bindtextdomain(__s.c_str(), __dir);
200 return this->do_open(__s, __loc);
201 }
202
203@@ -90,7 +86,7 @@ extern "C" char *__bindtextdomain(const char *domainname,
204 {
205 // No error checking is done, assume the catalog exists and can
206 // be used.
207- __textdomain(__s.c_str());
208+ textdomain(__s.c_str());
209 return 0;
210 }
211
212diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
213index aa52731695f..2e6f80a98d4 100644
214--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
215+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
216@@ -43,10 +43,6 @@
217 #warning tailor for stub locale support
218 #endif
219
220-#ifndef __UCLIBC_HAS_XLOCALE__
221-#define __nl_langinfo_l(N, L) nl_langinfo((N))
222-#endif
223-
224 namespace std
225 {
226 // Construct and return valid pattern consisting of some combination of:
227diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
228index 883ec1a1d4d..2c7064242b1 100644
229--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
230+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
231@@ -41,9 +41,6 @@
232 #ifdef __UCLIBC_MJN3_ONLY__
233 #warning tailor for stub locale support
234 #endif
235-#ifndef __UCLIBC_HAS_XLOCALE__
236-#define __nl_langinfo_l(N, L) nl_langinfo((N))
237-#endif
238
239 namespace std
240 {
241diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
242index e0707d76a66..d848ed5a442 100644
243--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
245@@ -40,9 +40,6 @@
246 #ifdef __UCLIBC_MJN3_ONLY__
247 #warning tailor for stub locale support
248 #endif
249-#ifndef __UCLIBC_HAS_XLOCALE__
250-#define __nl_langinfo_l(N, L) nl_langinfo((N))
251-#endif
252
253 namespace std
254 {
255--
2562.12.2
257
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0006-uclibc-locale-wchar_fix.patch b/meta/recipes-devtools/gcc/gcc-7.1/0006-uclibc-locale-wchar_fix.patch
deleted file mode 100644
index 470f954c8f..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0006-uclibc-locale-wchar_fix.patch
+++ /dev/null
@@ -1,68 +0,0 @@
1From 119f6b4b8a6fcaa536ad567deedf8cad3104d51d Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:45:57 +0400
4Subject: [PATCH 06/47] uclibc-locale-wchar_fix
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 libstdc++-v3/config/locale/uclibc/monetary_members.cc | 4 ++--
11 libstdc++-v3/config/locale/uclibc/numeric_members.cc | 13 +++++++++++++
12 2 files changed, 15 insertions(+), 2 deletions(-)
13
14diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
15index 2e6f80a98d4..31ebb9f47f3 100644
16--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
17+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
18@@ -401,7 +401,7 @@ namespace std
19 # ifdef __UCLIBC_HAS_XLOCALE__
20 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
21 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
22-# else
23+# elif defined __UCLIBC_HAS_LOCALE__
24 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
25 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
26 # endif
27@@ -556,7 +556,7 @@ namespace std
28 # ifdef __UCLIBC_HAS_XLOCALE__
29 _M_data->_M_decimal_point = __cloc->decimal_point_wc;
30 _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
31-# else
32+# elif defined __UCLIBC_HAS_LOCALE__
33 _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
34 _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
35 # endif
36diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
37index 2c7064242b1..d5c896152a5 100644
38--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
39+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
40@@ -127,12 +127,25 @@ namespace std
41 {
42 // Named locale.
43 // NB: In the GNU model wchar_t is always 32 bit wide.
44+#ifdef __UCLIBC_MJN3_ONLY__
45+#warning fix this... should be numeric
46+#endif
47+#ifdef __UCLIBC__
48+# ifdef __UCLIBC_HAS_XLOCALE__
49+ _M_data->_M_decimal_point = __cloc->decimal_point_wc;
50+ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
51+# elif defined __UCLIBC_HAS_LOCALE__
52+ _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
53+ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
54+# endif
55+#else
56 union { char *__s; wchar_t __w; } __u;
57 __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
58 _M_data->_M_decimal_point = __u.__w;
59
60 __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
61 _M_data->_M_thousands_sep = __u.__w;
62+#endif
63
64 if (_M_data->_M_thousands_sep == L'\0')
65 _M_data->_M_grouping = "";
66--
672.12.2
68
diff --git a/meta/recipes-devtools/gcc/gcc-7.1/0007-uclibc-locale-update.patch b/meta/recipes-devtools/gcc/gcc-7.1/0007-uclibc-locale-update.patch
deleted file mode 100644
index 0096fb832b..0000000000
--- a/meta/recipes-devtools/gcc/gcc-7.1/0007-uclibc-locale-update.patch
+++ /dev/null
@@ -1,542 +0,0 @@
1From 2c05fb5dc63c3366da55683dd9744246dc75af29 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 29 Mar 2013 08:46:58 +0400
4Subject: [PATCH 07/47] uclibc-locale-update
5
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8Upstream-Status: Pending
9---
10 .../config/locale/uclibc/c++locale_internal.h | 3 +
11 libstdc++-v3/config/locale/uclibc/c_locale.cc | 74 ++++++++++------------
12 libstdc++-v3/config/locale/uclibc/c_locale.h | 42 ++++++------
13 libstdc++-v3/config/locale/uclibc/ctype_members.cc | 51 +++++++++++----
14 .../config/locale/uclibc/messages_members.h | 12 ++--
15 .../config/locale/uclibc/monetary_members.cc | 34 ++++++----
16 .../config/locale/uclibc/numeric_members.cc | 5 ++
17 libstdc++-v3/config/locale/uclibc/time_members.cc | 18 ++++--
18 libstdc++-v3/config/locale/uclibc/time_members.h | 17 +++--
19 9 files changed, 158 insertions(+), 98 deletions(-)
20
21diff --git a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
22index e74fddfa409..971a6b4e5fb 100644
23--- a/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
24+++ b/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
25@@ -31,6 +31,9 @@
26
27 #include <bits/c++config.h>
28 #include <clocale>
29+#include <cstdlib>
30+#include <cstring>
31+#include <cstddef>
32
33 #ifdef __UCLIBC_MJN3_ONLY__
34 #warning clean this up
35diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.cc b/libstdc++-v3/config/locale/uclibc/c_locale.cc
36index 21430d05834..1b9d8e185b3 100644
37--- a/libstdc++-v3/config/locale/uclibc/c_locale.cc
38+++ b/libstdc++-v3/config/locale/uclibc/c_locale.cc
39@@ -39,23 +39,20 @@
40 #include <langinfo.h>
41 #include <bits/c++locale_internal.h>
42
43-namespace std
44-{
45+_GLIBCXX_BEGIN_NAMESPACE(std)
46+
47 template<>
48 void
49 __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
50 const __c_locale& __cloc)
51 {
52- if (!(__err & ios_base::failbit))
53- {
54- char* __sanity;
55- errno = 0;
56- float __f = __strtof_l(__s, &__sanity, __cloc);
57- if (__sanity != __s && errno != ERANGE)
58- __v = __f;
59- else
60- __err |= ios_base::failbit;
61- }
62+ char* __sanity;
63+ errno = 0;
64+ float __f = __strtof_l(__s, &__sanity, __cloc);
65+ if (__sanity != __s && errno != ERANGE)
66+ __v = __f;
67+ else
68+ __err |= ios_base::failbit;
69 }
70
71 template<>
72@@ -63,16 +60,13 @@ namespace std
73 __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
74 const __c_locale& __cloc)
75 {
76- if (!(__err & ios_base::failbit))
77- {
78- char* __sanity;
79- errno = 0;
80- double __d = __strtod_l(__s, &__sanity, __cloc);
81- if (__sanity != __s && errno != ERANGE)
82- __v = __d;
83- else
84- __err |= ios_base::failbit;
85- }
86+ char* __sanity;
87+ errno = 0;
88+ double __d = __strtod_l(__s, &__sanity, __cloc);
89+ if (__sanity != __s && errno != ERANGE)
90+ __v = __d;
91+ else
92+ __err |= ios_base::failbit;
93 }
94
95 template<>
96@@ -80,16 +74,13 @@ namespace std
97 __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
98 const __c_locale& __cloc)
99 {
100- if (!(__err & ios_base::failbit))
101- {
102- char* __sanity;
103- errno = 0;
104- long double __ld = __strtold_l(__s, &__sanity, __cloc);
105- if (__sanity != __s && errno != ERANGE)
106- __v = __ld;
107- else
108- __err |= ios_base::failbit;
109- }
110+ char* __sanity;
111+ errno = 0;
112+ long double __ld = __strtold_l(__s, &__sanity, __cloc);
113+ if (__sanity != __s && errno != ERANGE)
114+ __v = __ld;
115+ else
116+ __err |= ios_base::failbit;
117 }
118
119 void
120@@ -110,17 +101,18 @@ namespace std
121 void
122 locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
123 {
124- if (_S_get_c_locale() != __cloc)
125+ if (__cloc && _S_get_c_locale() != __cloc)
126 __freelocale(__cloc);
127 }
128
129 __c_locale
130 locale::facet::_S_clone_c_locale(__c_locale& __cloc)
131 { return __duplocale(__cloc); }
132-} // namespace std
133
134-namespace __gnu_cxx
135-{
136+_GLIBCXX_END_NAMESPACE
137+
138+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
139+
140 const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
141 {
142 "LC_CTYPE",
143@@ -138,9 +130,11 @@ namespace __gnu_cxx
144 "LC_IDENTIFICATION"
145 #endif
146 };
147-}
148
149-namespace std
150-{
151+_GLIBCXX_END_NAMESPACE
152+
153+_GLIBCXX_BEGIN_NAMESPACE(std)
154+
155 const char* const* const locale::_S_categories = __gnu_cxx::category_names;
156-} // namespace std
157+
158+_GLIBCXX_END_NAMESPACE
159diff --git a/libstdc++-v3/config/locale/uclibc/c_locale.h b/libstdc++-v3/config/locale/uclibc/c_locale.h
160index 4bca5f1f8d6..64a6d46a787 100644
161--- a/libstdc++-v3/config/locale/uclibc/c_locale.h
162+++ b/libstdc++-v3/config/locale/uclibc/c_locale.h
163@@ -39,21 +39,23 @@
164 #pragma GCC system_header
165
166 #include <cstring> // get std::strlen
167-#include <cstdio> // get std::snprintf or std::sprintf
168+#include <cstdio> // get std::vsnprintf or std::vsprintf
169 #include <clocale>
170 #include <langinfo.h> // For codecvt
171 #ifdef __UCLIBC_MJN3_ONLY__
172 #warning fix this
173 #endif
174-#ifdef __UCLIBC_HAS_LOCALE__
175+#ifdef _GLIBCXX_USE_ICONV
176 #include <iconv.h> // For codecvt using iconv, iconv_t
177 #endif
178-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
179-#include <libintl.h> // For messages
180+#ifdef HAVE_LIBINTL_H
181+#include <libintl.h> // For messages
182 #endif
183+#include <cstdarg>
184
185 #ifdef __UCLIBC_MJN3_ONLY__
186 #warning what is _GLIBCXX_C_LOCALE_GNU for
187+// psm: used in os/gnu-linux/ctype_noninline.h
188 #endif
189 #define _GLIBCXX_C_LOCALE_GNU 1
190
191@@ -78,23 +80,25 @@ namespace std
192 #else
193 typedef int* __c_locale;
194 #endif
195-
196- // Convert numeric value of type _Tv to string and return length of
197- // string. If snprintf is available use it, otherwise fall back to
198- // the unsafe sprintf which, in general, can be dangerous and should
199+ // Convert numeric value of type double to string and return length of
200+ // string. If vsnprintf is available use it, otherwise fall back to
201+ // the unsafe vsprintf which, in general, can be dangerous and should
202 // be avoided.
203- template<typename _Tv>
204- int
205- __convert_from_v(char* __out,
206- const int __size __attribute__ ((__unused__)),
207- const char* __fmt,
208-#ifdef __UCLIBC_HAS_XCLOCALE__
209- _Tv __v, const __c_locale& __cloc, int __prec)
210+ inline int
211+ __convert_from_v(const __c_locale&
212+#ifndef __UCLIBC_HAS_XCLOCALE__
213+ __cloc __attribute__ ((__unused__))
214+#endif
215+ ,
216+ char* __out,
217+ const int __size,
218+ const char* __fmt, ...)
219 {
220+ va_list __args;
221+#ifdef __UCLIBC_HAS_XCLOCALE__
222+
223 __c_locale __old = __gnu_cxx::__uselocale(__cloc);
224 #else
225- _Tv __v, const __c_locale&, int __prec)
226- {
227 # ifdef __UCLIBC_HAS_LOCALE__
228 char* __old = std::setlocale(LC_ALL, NULL);
229 char* __sav = new char[std::strlen(__old) + 1];
230@@ -103,7 +107,9 @@ namespace std
231 # endif
232 #endif
233
234- const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
235+ va_start(__args, __fmt);
236+ const int __ret = std::vsnprintf(__out, __size, __fmt, __args);
237+ va_end(__args);
238
239 #ifdef __UCLIBC_HAS_XCLOCALE__
240 __gnu_cxx::__uselocale(__old);
241diff --git a/libstdc++-v3/config/locale/uclibc/ctype_members.cc b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
242index 7b12861303c..13e011de617 100644
243--- a/libstdc++-v3/config/locale/uclibc/ctype_members.cc
244+++ b/libstdc++-v3/config/locale/uclibc/ctype_members.cc
245@@ -33,16 +33,20 @@
246
247 // Written by Benjamin Kosnik <bkoz@redhat.com>
248
249+#include <features.h>
250+#ifdef __UCLIBC_HAS_LOCALE__
251 #define _LIBC
252 #include <locale>
253 #undef _LIBC
254+#else
255+#include <locale>
256+#endif
257 #include <bits/c++locale_internal.h>
258
259-namespace std
260-{
261+_GLIBCXX_BEGIN_NAMESPACE(std)
262+
263 // NB: The other ctype<char> specializations are in src/locale.cc and
264 // various /config/os/* files.
265- template<>
266 ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
267 : ctype<char>(0, false, __refs)
268 {
269@@ -57,6 +61,8 @@ namespace std
270 #endif
271 }
272 }
273+ ctype_byname<char>::~ctype_byname()
274+ { }
275
276 #ifdef _GLIBCXX_USE_WCHAR_T
277 ctype<wchar_t>::__wmask_type
278@@ -138,17 +144,33 @@ namespace std
279 ctype<wchar_t>::
280 do_is(mask __m, wchar_t __c) const
281 {
282- // Highest bitmask in ctype_base == 10, but extra in "C"
283- // library for blank.
284+ // The case of __m == ctype_base::space is particularly important,
285+ // due to its use in many istream functions. Therefore we deal with
286+ // it first, exploiting the knowledge that on GNU systems _M_bit[5]
287+ // is the mask corresponding to ctype_base::space. NB: an encoding
288+ // change would not affect correctness!
289+
290 bool __ret = false;
291- const size_t __bitmasksize = 11;
292- for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
293- if (__m & _M_bit[__bitcur]
294- && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
295- {
296- __ret = true;
297- break;
298- }
299+ if (__m == _M_bit[5])
300+ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
301+ else
302+ {
303+ // Highest bitmask in ctype_base == 10, but extra in "C"
304+ // library for blank.
305+ const size_t __bitmasksize = 11;
306+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
307+ if (__m & _M_bit[__bitcur])
308+ {
309+ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
310+ {
311+ __ret = true;
312+ break;
313+ }
314+ else if (__m == _M_bit[__bitcur])
315+ break;
316+ }
317+ }
318+
319 return __ret;
320 }
321
322@@ -290,4 +312,5 @@ namespace std
323 #endif
324 }
325 #endif // _GLIBCXX_USE_WCHAR_T
326-}
327+
328+_GLIBCXX_END_NAMESPACE
329diff --git a/libstdc++-v3/config/locale/uclibc/messages_members.h b/libstdc++-v3/config/locale/uclibc/messages_members.h
330index d89da339d59..067657aa71f 100644
331--- a/libstdc++-v3/config/locale/uclibc/messages_members.h
332+++ b/libstdc++-v3/config/locale/uclibc/messages_members.h
333@@ -53,12 +53,16 @@
334 template<typename _CharT>
335 messages<_CharT>::messages(__c_locale __cloc, const char* __s,
336 size_t __refs)
337- : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
338- _M_name_messages(__s)
339+ : facet(__refs), _M_c_locale_messages(NULL),
340+ _M_name_messages(NULL)
341 {
342- char* __tmp = new char[std::strlen(__s) + 1];
343- std::strcpy(__tmp, __s);
344+ const size_t __len = std::strlen(__s) + 1;
345+ char* __tmp = new char[__len];
346+ std::memcpy(__tmp, __s, __len);
347 _M_name_messages = __tmp;
348+
349+ // Last to avoid leaking memory if new throws.
350+ _M_c_locale_messages = _S_clone_c_locale(__cloc);
351 }
352
353 template<typename _CharT>
354diff --git a/libstdc++-v3/config/locale/uclibc/monetary_members.cc b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
355index 31ebb9f47f3..7679b9c9b36 100644
356--- a/libstdc++-v3/config/locale/uclibc/monetary_members.cc
357+++ b/libstdc++-v3/config/locale/uclibc/monetary_members.cc
358@@ -33,9 +33,14 @@
359
360 // Written by Benjamin Kosnik <bkoz@redhat.com>
361
362+#include <features.h>
363+#ifdef __UCLIBC_HAS_LOCALE__
364 #define _LIBC
365 #include <locale>
366 #undef _LIBC
367+#else
368+#include <locale>
369+#endif
370 #include <bits/c++locale_internal.h>
371
372 #ifdef __UCLIBC_MJN3_ONLY__
373@@ -206,7 +211,7 @@ namespace std
374 }
375 break;
376 default:
377- ;
378+ __ret = pattern();
379 }
380 return __ret;
381 }
382@@ -390,7 +395,9 @@ namespace std
383 __c_locale __old = __uselocale(__cloc);
384 #else
385 // Switch to named locale so that mbsrtowcs will work.
386- char* __old = strdup(setlocale(LC_ALL, NULL));
387+ char* __old = setlocale(LC_ALL, NULL);
388+ const size_t __llen = strlen(__old) + 1;
389+ char* __sav = new char[__llen];
390 setlocale(LC_ALL, __name);
391 #endif
392
393@@ -477,8 +484,8 @@ namespace std
394 #ifdef __UCLIBC_HAS_XLOCALE__
395 __uselocale(__old);
396 #else
397- setlocale(LC_ALL, __old);
398- free(__old);
399+ setlocale(LC_ALL, __sav);
400+ delete [] __sav;
401 #endif
402 __throw_exception_again;
403 }
404@@ -498,8 +505,8 @@ namespace std
405 #ifdef __UCLIBC_HAS_XLOCALE__
406 __uselocale(__old);
407 #else
408- setlocale(LC_ALL, __old);
409- free(__old);
410+ setlocale(LC_ALL, __sav);
411+ delete [] __sav;
412 #endif
413 }
414 }
415@@ -545,8 +552,11 @@ namespace std
416 __c_locale __old = __uselocale(__cloc);
417 #else
418 // Switch to named locale so that mbsrtowcs will work.
419- char* __old = strdup(setlocale(LC_ALL, NULL));
420- setlocale(LC_ALL, __name);
421+ char* __old = setlocale(LC_ALL, NULL);
422+ const size_t __llen = strlen(__old) + 1;
423+ char* __sav = new char[__llen];
424+ memcpy(__sav, __old, __llen);
425+ setlocale(LC_ALL, __name);
426 #endif
427
428 #ifdef __UCLIBC_MJN3_ONLY__
429@@ -633,8 +643,8 @@ namespace std
430 #ifdef __UCLIBC_HAS_XLOCALE__
431 __uselocale(__old);
432 #else
433- setlocale(LC_ALL, __old);
434- free(__old);
435+ setlocale(LC_ALL, __sav);
436+ delete [] __sav;
437 #endif
438 __throw_exception_again;
439 }
440@@ -653,8 +663,8 @@ namespace std
441 #ifdef __UCLIBC_HAS_XLOCALE__
442 __uselocale(__old);
443 #else
444- setlocale(LC_ALL, __old);
445- free(__old);
446+ setlocale(LC_ALL, __sav);
447+ delete [] __sav;
448 #endif
449 }
450 }
451diff --git a/libstdc++-v3/config/locale/uclibc/numeric_members.cc b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
452index d5c896152a5..8ae8969d55e 100644
453--- a/libstdc++-v3/config/locale/uclibc/numeric_members.cc
454+++ b/libstdc++-v3/config/locale/uclibc/numeric_members.cc
455@@ -33,9 +33,14 @@
456
457 // Written by Benjamin Kosnik <bkoz@redhat.com>
458
459+#include <features.h>
460+#ifdef __UCLIBC_HAS_LOCALE__
461 #define _LIBC
462 #include <locale>
463 #undef _LIBC
464+#else
465+#include <locale>
466+#endif
467 #include <bits/c++locale_internal.h>
468
469 #ifdef __UCLIBC_MJN3_ONLY__
470diff --git a/libstdc++-v3/config/locale/uclibc/time_members.cc b/libstdc++-v3/config/locale/uclibc/time_members.cc
471index d848ed5a442..f24d53ec9e8 100644
472--- a/libstdc++-v3/config/locale/uclibc/time_members.cc
473+++ b/libstdc++-v3/config/locale/uclibc/time_members.cc
474@@ -53,11 +53,14 @@ namespace std
475 const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
476 _M_c_locale_timepunct);
477 #else
478- char* __old = strdup(setlocale(LC_ALL, NULL));
479+ char* __old = setlocale(LC_ALL, NULL);
480+ const size_t __llen = strlen(__old) + 1;
481+ char* __sav = new char[__llen];
482+ memcpy(__sav, __old, __llen);
483 setlocale(LC_ALL, _M_name_timepunct);
484 const size_t __len = strftime(__s, __maxlen, __format, __tm);
485- setlocale(LC_ALL, __old);
486- free(__old);
487+ setlocale(LC_ALL, __sav);
488+ delete [] __sav;
489 #endif
490 // Make sure __s is null terminated.
491 if (__len == 0)
492@@ -207,11 +210,14 @@ namespace std
493 const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
494 _M_c_locale_timepunct);
495 #else
496- char* __old = strdup(setlocale(LC_ALL, NULL));
497+ char* __old = setlocale(LC_ALL, NULL);
498+ const size_t __llen = strlen(__old) + 1;
499+ char* __sav = new char[__llen];
500+ memcpy(__sav, __old, __llen);
501 setlocale(LC_ALL, _M_name_timepunct);
502 const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
503- setlocale(LC_ALL, __old);
504- free(__old);
505+ setlocale(LC_ALL, __sav);
506+ delete [] __sav;
507 #endif
508 // Make sure __s is null terminated.
509 if (__len == 0)
510diff --git a/libstdc++-v3/config/locale/uclibc/time_members.h b/libstdc++-v3/config/locale/uclibc/time_members.h
511index ba8e8587c0f..1665dde239a 100644
512--- a/libstdc++-v3/config/locale/uclibc/time_members.h
513+++ b/libstdc++-v3/config/locale/uclibc/time_members.h
514@@ -50,12 +50,21 @@
515 __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
516 size_t __refs)
517 : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
518- _M_name_timepunct(__s)
519+ _M_name_timepunct(NULL)
520 {
521- char* __tmp = new char[std::strlen(__s) + 1];
522- std::strcpy(__tmp, __s);
523+ const size_t __len = std::strlen(__s) + 1;
524+ char* __tmp = new char[__len];
525+ std::memcpy(__tmp, __s, __len);
526 _M_name_timepunct = __tmp;
527- _M_initialize_timepunct(__cloc);
528+
529+ try
530+ { _M_initialize_timepunct(__cloc); }
531+ catch(...)
532+ {
533+ delete [] _M_name_timepunct;
534+ __throw_exception_again;
535+ }
536+
537 }
538
539 template<typename _CharT>
540--
5412.12.2
542
diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
index 086525997e..63fa1d9686 100644
--- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
@@ -53,9 +53,7 @@ export gcc_cv_collect2_libs = 'none required'
53# in the config.log files (which might not get generated until do_compile 53# in the config.log files (which might not get generated until do_compile
54# hence being missed by the insane do_configure check). 54# hence being missed by the insane do_configure check).
55 55
56# Build uclibc compilers without cxa_atexit support
57EXTRA_OECONF_append_linux = " --enable-__cxa_atexit" 56EXTRA_OECONF_append_linux = " --enable-__cxa_atexit"
58EXTRA_OECONF_append_libc-uclibc = " --enable-__cxa_atexit"
59 57
60EXTRA_OECONF_append_mips64 = " --with-abi=64 --with-arch-64=mips64 --with-tune-64=mips64" 58EXTRA_OECONF_append_mips64 = " --with-abi=64 --with-arch-64=mips64 --with-tune-64=mips64"
61EXTRA_OECONF_append_mips64el = " --with-abi=64 --with-arch-64=mips64 --with-tune-64=mips64" 59EXTRA_OECONF_append_mips64el = " --with-abi=64 --with-arch-64=mips64 --with-tune-64=mips64"