patches/gcc/3.4.6/110-uclibc-locale.patch
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
parent 339 bd5e0a849352
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

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