patches/gcc/4.2.0/120-uclibc-locale.patch
author Arnaud Lacombe <lacombar@gmail.com>
Tue Aug 03 06:17:51 2010 +0200 (2010-08-03)
changeset 2064 f5ebe8c429dc
parent 111 2e16b9fc302d
permissions -rw-r--r--
libc/uClibc: add uClibc 0.9.30.3

This version has been released a couple of month ago, but it never reached
crosstool-ng tree. This may be linked to the fact that the current 0.9.30.2,
once patched, has nothing much different from 0.9.30.3, released.

I'm not including any patch with this upgrade, on purpose.

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