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

Update Linaro GCC with the latest available revisions.

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

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