patches/gcc/4.2.0/120-uclibc-locale.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Aug 02 18:28:10 2011 +0200 (2011-08-02)
changeset 2590 b64cfb67944e
parent 111 2e16b9fc302d
permissions -rw-r--r--
scripts/functions: svn retrieval first tries the mirror for tarballs

The svn download helper looks for the local tarballs dir to see if it
can find a pre-downloaded tarball, and if it does not find it, does
the actual fetch to upstream via svn.

In the process, it does not even try to get a tarball from the local
mirror, which can be useful if the mirror has been pre-populated
manually (or with a previously downloaded tree).

Fake a tarball get with the standard tarball-download helper, but
without specifying any upstream URL, which makes the helper directly
try the LAN mirror.

Of course, if no mirror is specified, no URL wil be available, and
the standard svn retrieval will kick in.

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