patches/gcc/3.4.6/110-uclibc-locale.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Jan 12 19:24:03 2010 +0100 (2010-01-12)
changeset 1761 88020b2c3246
parent 339 bd5e0a849352
permissions -rw-r--r--
scripts/functions: change handling of nochdir

- 'nochdir' must be the first option
- have systematic pushd/popd, even if nochdir
     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;