patches/gcc/4.2.2/120-uclibc-locale.patch
changeset 747 d3e603e7c17c
parent 431 8bde4c6ea47a
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/4.2.2/120-uclibc-locale.patch	Mon Jul 28 21:32:33 2008 +0000
     1.3 @@ -0,0 +1,2806 @@
     1.4 +diff -durN gcc-4.2.1.orig/libstdc++-v3/acinclude.m4 gcc-4.2.1/libstdc++-v3/acinclude.m4
     1.5 +--- gcc-4.2.1.orig/libstdc++-v3/acinclude.m4	2007-06-29 01:02:05.000000000 +0200
     1.6 ++++ gcc-4.2.1/libstdc++-v3/acinclude.m4	2007-08-03 20:30:21.000000000 +0200
     1.7 +@@ -1334,7 +1334,7 @@
     1.8 + AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
     1.9 +   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
    1.10 +     [use MODEL for target locale package],
    1.11 +-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
    1.12 ++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
    1.13 + 
    1.14 +   # Deal with gettext issues.  Default to not using it (=no) until we detect
    1.15 +   # support for it later.  Let the user turn it off via --e/d, but let that
    1.16 +@@ -1355,6 +1355,9 @@
    1.17 +   # Default to "generic".
    1.18 +   if test $enable_clocale_flag = auto; then
    1.19 +     case ${target_os} in
    1.20 ++      *-uclibc*)
    1.21 ++        enable_clocale_flag=uclibc
    1.22 ++        ;;
    1.23 +       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
    1.24 +         enable_clocale_flag=gnu	
    1.25 +         ;;
    1.26 +@@ -1526,6 +1529,40 @@
    1.27 +       CTIME_CC=config/locale/generic/time_members.cc
    1.28 +       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
    1.29 +       ;;
    1.30 ++    uclibc)
    1.31 ++      AC_MSG_RESULT(uclibc)
    1.32 ++
    1.33 ++      # Declare intention to use gettext, and add support for specific
    1.34 ++      # languages.
    1.35 ++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
    1.36 ++      ALL_LINGUAS="de fr"
    1.37 ++
    1.38 ++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
    1.39 ++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
    1.40 ++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
    1.41 ++        USE_NLS=yes
    1.42 ++      fi
    1.43 ++      # Export the build objects.
    1.44 ++      for ling in $ALL_LINGUAS; do \
    1.45 ++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
    1.46 ++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
    1.47 ++      done
    1.48 ++      AC_SUBST(glibcxx_MOFILES)
    1.49 ++      AC_SUBST(glibcxx_POFILES)
    1.50 ++
    1.51 ++      CLOCALE_H=config/locale/uclibc/c_locale.h
    1.52 ++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
    1.53 ++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
    1.54 ++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
    1.55 ++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
    1.56 ++      CMESSAGES_H=config/locale/uclibc/messages_members.h
    1.57 ++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
    1.58 ++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
    1.59 ++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
    1.60 ++      CTIME_H=config/locale/uclibc/time_members.h
    1.61 ++      CTIME_CC=config/locale/uclibc/time_members.cc
    1.62 ++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
    1.63 ++      ;;
    1.64 +   esac
    1.65 + 
    1.66 +   # This is where the testsuite looks for locale catalogs, using the
    1.67 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.cc
    1.68 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc	1970-01-01 01:00:00.000000000 +0100
    1.69 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.cc	2007-08-03 20:30:21.000000000 +0200
    1.70 +@@ -0,0 +1,160 @@
    1.71 ++// Wrapper for underlying C-language localization -*- C++ -*-
    1.72 ++
    1.73 ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
    1.74 ++//
    1.75 ++// This file is part of the GNU ISO C++ Library.  This library is free
    1.76 ++// software; you can redistribute it and/or modify it under the
    1.77 ++// terms of the GNU General Public License as published by the
    1.78 ++// Free Software Foundation; either version 2, or (at your option)
    1.79 ++// any later version.
    1.80 ++
    1.81 ++// This library is distributed in the hope that it will be useful,
    1.82 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.83 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.84 ++// GNU General Public License for more details.
    1.85 ++
    1.86 ++// You should have received a copy of the GNU General Public License along
    1.87 ++// with this library; see the file COPYING.  If not, write to the Free
    1.88 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
    1.89 ++// USA.
    1.90 ++
    1.91 ++// As a special exception, you may use this file as part of a free software
    1.92 ++// library without restriction.  Specifically, if other files instantiate
    1.93 ++// templates or use macros or inline functions from this file, or you compile
    1.94 ++// this file and link it with other files to produce an executable, this
    1.95 ++// file does not by itself cause the resulting executable to be covered by
    1.96 ++// the GNU General Public License.  This exception does not however
    1.97 ++// invalidate any other reasons why the executable file might be covered by
    1.98 ++// the GNU General Public License.
    1.99 ++
   1.100 ++//
   1.101 ++// ISO C++ 14882: 22.8  Standard locale categories.
   1.102 ++//
   1.103 ++
   1.104 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
   1.105 ++
   1.106 ++#include <cerrno>  // For errno
   1.107 ++#include <locale>
   1.108 ++#include <stdexcept>
   1.109 ++#include <langinfo.h>
   1.110 ++#include <bits/c++locale_internal.h>
   1.111 ++
   1.112 ++#ifndef __UCLIBC_HAS_XLOCALE__
   1.113 ++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
   1.114 ++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
   1.115 ++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
   1.116 ++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
   1.117 ++#define __strtof_l(S, E, L)         strtof((S), (E))
   1.118 ++#define __strtod_l(S, E, L)         strtod((S), (E))
   1.119 ++#define __strtold_l(S, E, L)        strtold((S), (E))
   1.120 ++#warning should dummy __newlocale check for C|POSIX ?
   1.121 ++#define __newlocale(a, b, c)        NULL
   1.122 ++#define __freelocale(a)             ((void)0)
   1.123 ++#define __duplocale(a)              __c_locale()
   1.124 ++#endif
   1.125 ++
   1.126 ++namespace std 
   1.127 ++{
   1.128 ++  template<>
   1.129 ++    void
   1.130 ++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
   1.131 ++		   const __c_locale& __cloc)
   1.132 ++    {
   1.133 ++      if (!(__err & ios_base::failbit))
   1.134 ++	{
   1.135 ++	  char* __sanity;
   1.136 ++	  errno = 0;
   1.137 ++	  float __f = __strtof_l(__s, &__sanity, __cloc);
   1.138 ++          if (__sanity != __s && errno != ERANGE)
   1.139 ++	    __v = __f;
   1.140 ++	  else
   1.141 ++	    __err |= ios_base::failbit;
   1.142 ++	}
   1.143 ++    }
   1.144 ++
   1.145 ++  template<>
   1.146 ++    void
   1.147 ++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
   1.148 ++		   const __c_locale& __cloc)
   1.149 ++    {
   1.150 ++      if (!(__err & ios_base::failbit))
   1.151 ++	{
   1.152 ++	  char* __sanity;
   1.153 ++	  errno = 0;
   1.154 ++	  double __d = __strtod_l(__s, &__sanity, __cloc);
   1.155 ++          if (__sanity != __s && errno != ERANGE)
   1.156 ++	    __v = __d;
   1.157 ++	  else
   1.158 ++	    __err |= ios_base::failbit;
   1.159 ++	}
   1.160 ++    }
   1.161 ++
   1.162 ++  template<>
   1.163 ++    void
   1.164 ++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
   1.165 ++		   const __c_locale& __cloc)
   1.166 ++    {
   1.167 ++      if (!(__err & ios_base::failbit))
   1.168 ++	{
   1.169 ++	  char* __sanity;
   1.170 ++	  errno = 0;
   1.171 ++	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
   1.172 ++          if (__sanity != __s && errno != ERANGE)
   1.173 ++	    __v = __ld;
   1.174 ++	  else
   1.175 ++	    __err |= ios_base::failbit;
   1.176 ++	}
   1.177 ++    }
   1.178 ++
   1.179 ++  void
   1.180 ++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
   1.181 ++				    __c_locale __old)
   1.182 ++  {
   1.183 ++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
   1.184 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.185 ++    if (!__cloc)
   1.186 ++      {
   1.187 ++	// This named locale is not supported by the underlying OS.
   1.188 ++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
   1.189 ++			      "name not valid"));
   1.190 ++      }
   1.191 ++#endif
   1.192 ++  }
   1.193 ++  
   1.194 ++  void
   1.195 ++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
   1.196 ++  {
   1.197 ++    if (_S_get_c_locale() != __cloc)
   1.198 ++      __freelocale(__cloc); 
   1.199 ++  }
   1.200 ++
   1.201 ++  __c_locale
   1.202 ++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
   1.203 ++  { return __duplocale(__cloc); }
   1.204 ++} // namespace std
   1.205 ++
   1.206 ++namespace __gnu_cxx
   1.207 ++{
   1.208 ++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
   1.209 ++    {
   1.210 ++      "LC_CTYPE", 
   1.211 ++      "LC_NUMERIC",
   1.212 ++      "LC_TIME", 
   1.213 ++      "LC_COLLATE", 
   1.214 ++      "LC_MONETARY",
   1.215 ++      "LC_MESSAGES", 
   1.216 ++#if _GLIBCXX_NUM_CATEGORIES != 0
   1.217 ++      "LC_PAPER", 
   1.218 ++      "LC_NAME", 
   1.219 ++      "LC_ADDRESS",
   1.220 ++      "LC_TELEPHONE", 
   1.221 ++      "LC_MEASUREMENT", 
   1.222 ++      "LC_IDENTIFICATION" 
   1.223 ++#endif
   1.224 ++    };
   1.225 ++}
   1.226 ++
   1.227 ++namespace std
   1.228 ++{
   1.229 ++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
   1.230 ++}  // namespace std
   1.231 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.h
   1.232 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c_locale.h	1970-01-01 01:00:00.000000000 +0100
   1.233 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c_locale.h	2007-08-03 20:30:21.000000000 +0200
   1.234 +@@ -0,0 +1,117 @@
   1.235 ++// Wrapper for underlying C-language localization -*- C++ -*-
   1.236 ++
   1.237 ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
   1.238 ++//
   1.239 ++// This file is part of the GNU ISO C++ Library.  This library is free
   1.240 ++// software; you can redistribute it and/or modify it under the
   1.241 ++// terms of the GNU General Public License as published by the
   1.242 ++// Free Software Foundation; either version 2, or (at your option)
   1.243 ++// any later version.
   1.244 ++
   1.245 ++// This library is distributed in the hope that it will be useful,
   1.246 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.247 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.248 ++// GNU General Public License for more details.
   1.249 ++
   1.250 ++// You should have received a copy of the GNU General Public License along
   1.251 ++// with this library; see the file COPYING.  If not, write to the Free
   1.252 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.253 ++// USA.
   1.254 ++
   1.255 ++// As a special exception, you may use this file as part of a free software
   1.256 ++// library without restriction.  Specifically, if other files instantiate
   1.257 ++// templates or use macros or inline functions from this file, or you compile
   1.258 ++// this file and link it with other files to produce an executable, this
   1.259 ++// file does not by itself cause the resulting executable to be covered by
   1.260 ++// the GNU General Public License.  This exception does not however
   1.261 ++// invalidate any other reasons why the executable file might be covered by
   1.262 ++// the GNU General Public License.
   1.263 ++
   1.264 ++//
   1.265 ++// ISO C++ 14882: 22.8  Standard locale categories.
   1.266 ++//
   1.267 ++
   1.268 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
   1.269 ++
   1.270 ++#ifndef _C_LOCALE_H
   1.271 ++#define _C_LOCALE_H 1
   1.272 ++
   1.273 ++#pragma GCC system_header
   1.274 ++
   1.275 ++#include <cstring>              // get std::strlen
   1.276 ++#include <cstdio>               // get std::snprintf or std::sprintf
   1.277 ++#include <clocale>
   1.278 ++#include <langinfo.h>		// For codecvt
   1.279 ++#ifdef __UCLIBC_MJN3_ONLY__
   1.280 ++#warning fix this
   1.281 ++#endif
   1.282 ++#ifdef __UCLIBC_HAS_LOCALE__
   1.283 ++#include <iconv.h>		// For codecvt using iconv, iconv_t
   1.284 ++#endif
   1.285 ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
   1.286 ++#include <libintl.h> 		// For messages
   1.287 ++#endif
   1.288 ++
   1.289 ++#ifdef __UCLIBC_MJN3_ONLY__
   1.290 ++#warning what is _GLIBCXX_C_LOCALE_GNU for
   1.291 ++#endif
   1.292 ++#define _GLIBCXX_C_LOCALE_GNU 1
   1.293 ++
   1.294 ++#ifdef __UCLIBC_MJN3_ONLY__
   1.295 ++#warning fix categories
   1.296 ++#endif
   1.297 ++// #define _GLIBCXX_NUM_CATEGORIES 6
   1.298 ++#define _GLIBCXX_NUM_CATEGORIES 0
   1.299 ++ 
   1.300 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.301 ++namespace __gnu_cxx
   1.302 ++{
   1.303 ++  extern "C" __typeof(uselocale) __uselocale;
   1.304 ++}
   1.305 ++#endif
   1.306 ++
   1.307 ++namespace std
   1.308 ++{
   1.309 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.310 ++  typedef __locale_t		__c_locale;
   1.311 ++#else
   1.312 ++  typedef int*			__c_locale;
   1.313 ++#endif
   1.314 ++
   1.315 ++  // Convert numeric value of type _Tv to string and return length of
   1.316 ++  // string.  If snprintf is available use it, otherwise fall back to
   1.317 ++  // the unsafe sprintf which, in general, can be dangerous and should
   1.318 ++  // be avoided.
   1.319 ++  template<typename _Tv>
   1.320 ++    int
   1.321 ++    __convert_from_v(char* __out, 
   1.322 ++		     const int __size __attribute__ ((__unused__)),
   1.323 ++		     const char* __fmt,
   1.324 ++#ifdef __UCLIBC_HAS_XCLOCALE__
   1.325 ++		     _Tv __v, const __c_locale& __cloc, int __prec)
   1.326 ++    {
   1.327 ++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
   1.328 ++#else
   1.329 ++		     _Tv __v, const __c_locale&, int __prec)
   1.330 ++    {
   1.331 ++# ifdef __UCLIBC_HAS_LOCALE__
   1.332 ++      char* __old = std::setlocale(LC_ALL, NULL);
   1.333 ++      char* __sav = new char[std::strlen(__old) + 1];
   1.334 ++      std::strcpy(__sav, __old);
   1.335 ++      std::setlocale(LC_ALL, "C");
   1.336 ++# endif
   1.337 ++#endif
   1.338 ++
   1.339 ++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
   1.340 ++
   1.341 ++#ifdef __UCLIBC_HAS_XCLOCALE__
   1.342 ++      __gnu_cxx::__uselocale(__old);
   1.343 ++#elif defined __UCLIBC_HAS_LOCALE__
   1.344 ++      std::setlocale(LC_ALL, __sav);
   1.345 ++      delete [] __sav;
   1.346 ++#endif
   1.347 ++      return __ret;
   1.348 ++    }
   1.349 ++}
   1.350 ++
   1.351 ++#endif
   1.352 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
   1.353 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	1970-01-01 01:00:00.000000000 +0100
   1.354 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	2007-08-03 20:30:21.000000000 +0200
   1.355 +@@ -0,0 +1,63 @@
   1.356 ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
   1.357 ++
   1.358 ++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
   1.359 ++//
   1.360 ++// This file is part of the GNU ISO C++ Library.  This library is free
   1.361 ++// software; you can redistribute it and/or modify it under the
   1.362 ++// terms of the GNU General Public License as published by the
   1.363 ++// Free Software Foundation; either version 2, or (at your option)
   1.364 ++// any later version.
   1.365 ++
   1.366 ++// This library is distributed in the hope that it will be useful,
   1.367 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.368 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.369 ++// GNU General Public License for more details.
   1.370 ++
   1.371 ++// You should have received a copy of the GNU General Public License along
   1.372 ++// with this library; see the file COPYING.  If not, write to the Free
   1.373 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.374 ++// USA.
   1.375 ++
   1.376 ++// As a special exception, you may use this file as part of a free software
   1.377 ++// library without restriction.  Specifically, if other files instantiate
   1.378 ++// templates or use macros or inline functions from this file, or you compile
   1.379 ++// this file and link it with other files to produce an executable, this
   1.380 ++// file does not by itself cause the resulting executable to be covered by
   1.381 ++// the GNU General Public License.  This exception does not however
   1.382 ++// invalidate any other reasons why the executable file might be covered by
   1.383 ++// the GNU General Public License.
   1.384 ++
   1.385 ++// Written by Jakub Jelinek <jakub@redhat.com>
   1.386 ++
   1.387 ++#include <bits/c++config.h>
   1.388 ++#include <clocale>
   1.389 ++
   1.390 ++#ifdef __UCLIBC_MJN3_ONLY__
   1.391 ++#warning clean this up
   1.392 ++#endif
   1.393 ++
   1.394 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.395 ++                                                  
   1.396 ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
   1.397 ++extern "C" __typeof(strcoll_l) __strcoll_l;
   1.398 ++extern "C" __typeof(strftime_l) __strftime_l;
   1.399 ++extern "C" __typeof(strtod_l) __strtod_l;
   1.400 ++extern "C" __typeof(strtof_l) __strtof_l;
   1.401 ++extern "C" __typeof(strtold_l) __strtold_l;
   1.402 ++extern "C" __typeof(strxfrm_l) __strxfrm_l;
   1.403 ++extern "C" __typeof(newlocale) __newlocale;
   1.404 ++extern "C" __typeof(freelocale) __freelocale;
   1.405 ++extern "C" __typeof(duplocale) __duplocale;
   1.406 ++extern "C" __typeof(uselocale) __uselocale;
   1.407 ++
   1.408 ++#ifdef _GLIBCXX_USE_WCHAR_T
   1.409 ++extern "C" __typeof(iswctype_l) __iswctype_l;
   1.410 ++extern "C" __typeof(towlower_l) __towlower_l;
   1.411 ++extern "C" __typeof(towupper_l) __towupper_l;
   1.412 ++extern "C" __typeof(wcscoll_l) __wcscoll_l;
   1.413 ++extern "C" __typeof(wcsftime_l) __wcsftime_l;
   1.414 ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
   1.415 ++extern "C" __typeof(wctype_l) __wctype_l;
   1.416 ++#endif 
   1.417 ++
   1.418 ++#endif // GLIBC 2.3 and later
   1.419 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
   1.420 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	1970-01-01 01:00:00.000000000 +0100
   1.421 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	2007-08-03 20:30:21.000000000 +0200
   1.422 +@@ -0,0 +1,306 @@
   1.423 ++// std::codecvt implementation details, GNU version -*- C++ -*-
   1.424 ++
   1.425 ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
   1.426 ++//
   1.427 ++// This file is part of the GNU ISO C++ Library.  This library is free
   1.428 ++// software; you can redistribute it and/or modify it under the
   1.429 ++// terms of the GNU General Public License as published by the
   1.430 ++// Free Software Foundation; either version 2, or (at your option)
   1.431 ++// any later version.
   1.432 ++
   1.433 ++// This library is distributed in the hope that it will be useful,
   1.434 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.435 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.436 ++// GNU General Public License for more details.
   1.437 ++
   1.438 ++// You should have received a copy of the GNU General Public License along
   1.439 ++// with this library; see the file COPYING.  If not, write to the Free
   1.440 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.441 ++// USA.
   1.442 ++
   1.443 ++// As a special exception, you may use this file as part of a free software
   1.444 ++// library without restriction.  Specifically, if other files instantiate
   1.445 ++// templates or use macros or inline functions from this file, or you compile
   1.446 ++// this file and link it with other files to produce an executable, this
   1.447 ++// file does not by itself cause the resulting executable to be covered by
   1.448 ++// the GNU General Public License.  This exception does not however
   1.449 ++// invalidate any other reasons why the executable file might be covered by
   1.450 ++// the GNU General Public License.
   1.451 ++
   1.452 ++//
   1.453 ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
   1.454 ++//
   1.455 ++
   1.456 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
   1.457 ++
   1.458 ++#include <locale>
   1.459 ++#include <bits/c++locale_internal.h>
   1.460 ++
   1.461 ++namespace std
   1.462 ++{
   1.463 ++  // Specializations.
   1.464 ++#ifdef _GLIBCXX_USE_WCHAR_T
   1.465 ++  codecvt_base::result
   1.466 ++  codecvt<wchar_t, char, mbstate_t>::
   1.467 ++  do_out(state_type& __state, const intern_type* __from, 
   1.468 ++	 const intern_type* __from_end, const intern_type*& __from_next,
   1.469 ++	 extern_type* __to, extern_type* __to_end,
   1.470 ++	 extern_type*& __to_next) const
   1.471 ++  {
   1.472 ++    result __ret = ok;
   1.473 ++    state_type __tmp_state(__state);
   1.474 ++
   1.475 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.476 ++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
   1.477 ++#endif
   1.478 ++
   1.479 ++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
   1.480 ++    // in case we fall back to wcrtomb and then continue, in a loop.
   1.481 ++    // NB: wcsnrtombs is a GNU extension
   1.482 ++    for (__from_next = __from, __to_next = __to;
   1.483 ++	 __from_next < __from_end && __to_next < __to_end
   1.484 ++	 && __ret == ok;)
   1.485 ++      {
   1.486 ++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
   1.487 ++						      __from_end - __from_next);
   1.488 ++	if (!__from_chunk_end)
   1.489 ++	  __from_chunk_end = __from_end;
   1.490 ++
   1.491 ++	__from = __from_next;
   1.492 ++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
   1.493 ++					 __from_chunk_end - __from_next,
   1.494 ++					 __to_end - __to_next, &__state);
   1.495 ++	if (__conv == static_cast<size_t>(-1))
   1.496 ++	  {
   1.497 ++	    // In case of error, in order to stop at the exact place we
   1.498 ++	    // have to start again from the beginning with a series of
   1.499 ++	    // wcrtomb.
   1.500 ++	    for (; __from < __from_next; ++__from)
   1.501 ++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
   1.502 ++	    __state = __tmp_state;
   1.503 ++	    __ret = error;
   1.504 ++	  }
   1.505 ++	else if (__from_next && __from_next < __from_chunk_end)
   1.506 ++	  {
   1.507 ++	    __to_next += __conv;
   1.508 ++	    __ret = partial;
   1.509 ++	  }
   1.510 ++	else
   1.511 ++	  {
   1.512 ++	    __from_next = __from_chunk_end;
   1.513 ++	    __to_next += __conv;
   1.514 ++	  }
   1.515 ++
   1.516 ++	if (__from_next < __from_end && __ret == ok)
   1.517 ++	  {
   1.518 ++	    extern_type __buf[MB_LEN_MAX];
   1.519 ++	    __tmp_state = __state;
   1.520 ++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
   1.521 ++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
   1.522 ++	      __ret = partial;
   1.523 ++	    else
   1.524 ++	      {
   1.525 ++		memcpy(__to_next, __buf, __conv);
   1.526 ++		__state = __tmp_state;
   1.527 ++		__to_next += __conv;
   1.528 ++		++__from_next;
   1.529 ++	      }
   1.530 ++	  }
   1.531 ++      }
   1.532 ++
   1.533 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.534 ++    __uselocale(__old);
   1.535 ++#endif
   1.536 ++
   1.537 ++    return __ret; 
   1.538 ++  }
   1.539 ++  
   1.540 ++  codecvt_base::result
   1.541 ++  codecvt<wchar_t, char, mbstate_t>::
   1.542 ++  do_in(state_type& __state, const extern_type* __from, 
   1.543 ++	const extern_type* __from_end, const extern_type*& __from_next,
   1.544 ++	intern_type* __to, intern_type* __to_end,
   1.545 ++	intern_type*& __to_next) const
   1.546 ++  {
   1.547 ++    result __ret = ok;
   1.548 ++    state_type __tmp_state(__state);
   1.549 ++
   1.550 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.551 ++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
   1.552 ++#endif
   1.553 ++
   1.554 ++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
   1.555 ++    // in case we store a L'\0' and then continue, in a loop.
   1.556 ++    // NB: mbsnrtowcs is a GNU extension
   1.557 ++    for (__from_next = __from, __to_next = __to;
   1.558 ++	 __from_next < __from_end && __to_next < __to_end
   1.559 ++	 && __ret == ok;)
   1.560 ++      {
   1.561 ++	const extern_type* __from_chunk_end;
   1.562 ++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
   1.563 ++								  __from_end
   1.564 ++								  - __from_next));
   1.565 ++	if (!__from_chunk_end)
   1.566 ++	  __from_chunk_end = __from_end;
   1.567 ++
   1.568 ++	__from = __from_next;
   1.569 ++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
   1.570 ++				   __from_chunk_end - __from_next,
   1.571 ++				   __to_end - __to_next, &__state);
   1.572 ++	if (__conv == static_cast<size_t>(-1))
   1.573 ++	  {
   1.574 ++	    // In case of error, in order to stop at the exact place we
   1.575 ++	    // have to start again from the beginning with a series of
   1.576 ++	    // mbrtowc.
   1.577 ++	    for (;; ++__to_next, __from += __conv)
   1.578 ++	      {
   1.579 ++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
   1.580 ++				 &__tmp_state);
   1.581 ++		if (__conv == static_cast<size_t>(-1)
   1.582 ++		    || __conv == static_cast<size_t>(-2))
   1.583 ++		  break;
   1.584 ++	      }
   1.585 ++	    __from_next = __from;
   1.586 ++	    __state = __tmp_state;	    
   1.587 ++	    __ret = error;
   1.588 ++	  }
   1.589 ++	else if (__from_next && __from_next < __from_chunk_end)
   1.590 ++	  {
   1.591 ++	    // It is unclear what to return in this case (see DR 382). 
   1.592 ++	    __to_next += __conv;
   1.593 ++	    __ret = partial;
   1.594 ++	  }
   1.595 ++	else
   1.596 ++	  {
   1.597 ++	    __from_next = __from_chunk_end;
   1.598 ++	    __to_next += __conv;
   1.599 ++	  }
   1.600 ++
   1.601 ++	if (__from_next < __from_end && __ret == ok)
   1.602 ++	  {
   1.603 ++	    if (__to_next < __to_end)
   1.604 ++	      {
   1.605 ++		// XXX Probably wrong for stateful encodings
   1.606 ++		__tmp_state = __state;		
   1.607 ++		++__from_next;
   1.608 ++		*__to_next++ = L'\0';
   1.609 ++	      }
   1.610 ++	    else
   1.611 ++	      __ret = partial;
   1.612 ++	  }
   1.613 ++      }
   1.614 ++
   1.615 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.616 ++    __uselocale(__old);
   1.617 ++#endif
   1.618 ++
   1.619 ++    return __ret; 
   1.620 ++  }
   1.621 ++
   1.622 ++  int 
   1.623 ++  codecvt<wchar_t, char, mbstate_t>::
   1.624 ++  do_encoding() const throw()
   1.625 ++  {
   1.626 ++    // XXX This implementation assumes that the encoding is
   1.627 ++    // stateless and is either single-byte or variable-width.
   1.628 ++    int __ret = 0;
   1.629 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.630 ++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
   1.631 ++#endif
   1.632 ++    if (MB_CUR_MAX == 1)
   1.633 ++      __ret = 1;
   1.634 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.635 ++    __uselocale(__old);
   1.636 ++#endif
   1.637 ++    return __ret;
   1.638 ++  }  
   1.639 ++
   1.640 ++  int 
   1.641 ++  codecvt<wchar_t, char, mbstate_t>::
   1.642 ++  do_max_length() const throw()
   1.643 ++  {
   1.644 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.645 ++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
   1.646 ++#endif
   1.647 ++    // XXX Probably wrong for stateful encodings.
   1.648 ++    int __ret = MB_CUR_MAX;
   1.649 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.650 ++    __uselocale(__old);
   1.651 ++#endif
   1.652 ++    return __ret;
   1.653 ++  }
   1.654 ++  
   1.655 ++  int 
   1.656 ++  codecvt<wchar_t, char, mbstate_t>::
   1.657 ++  do_length(state_type& __state, const extern_type* __from,
   1.658 ++	    const extern_type* __end, size_t __max) const
   1.659 ++  {
   1.660 ++    int __ret = 0;
   1.661 ++    state_type __tmp_state(__state);
   1.662 ++
   1.663 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.664 ++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
   1.665 ++#endif
   1.666 ++
   1.667 ++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
   1.668 ++    // in case we advance past it and then continue, in a loop.
   1.669 ++    // NB: mbsnrtowcs is a GNU extension
   1.670 ++  
   1.671 ++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
   1.672 ++    // its fourth parameter (it wouldn't with NULL as first parameter).
   1.673 ++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
   1.674 ++							   * __max));
   1.675 ++    while (__from < __end && __max)
   1.676 ++      {
   1.677 ++	const extern_type* __from_chunk_end;
   1.678 ++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
   1.679 ++								  __end
   1.680 ++								  - __from));
   1.681 ++	if (!__from_chunk_end)
   1.682 ++	  __from_chunk_end = __end;
   1.683 ++
   1.684 ++	const extern_type* __tmp_from = __from;
   1.685 ++	size_t __conv = mbsnrtowcs(__to, &__from,
   1.686 ++				   __from_chunk_end - __from,
   1.687 ++				   __max, &__state);
   1.688 ++	if (__conv == static_cast<size_t>(-1))
   1.689 ++	  {
   1.690 ++	    // In case of error, in order to stop at the exact place we
   1.691 ++	    // have to start again from the beginning with a series of
   1.692 ++	    // mbrtowc.
   1.693 ++	    for (__from = __tmp_from;; __from += __conv)
   1.694 ++	      {
   1.695 ++		__conv = mbrtowc(NULL, __from, __end - __from,
   1.696 ++				 &__tmp_state);
   1.697 ++		if (__conv == static_cast<size_t>(-1)
   1.698 ++		    || __conv == static_cast<size_t>(-2))
   1.699 ++		  break;
   1.700 ++	      }
   1.701 ++	    __state = __tmp_state;
   1.702 ++	    __ret += __from - __tmp_from;
   1.703 ++	    break;
   1.704 ++	  }
   1.705 ++	if (!__from)
   1.706 ++	  __from = __from_chunk_end;
   1.707 ++	
   1.708 ++	__ret += __from - __tmp_from;
   1.709 ++	__max -= __conv;
   1.710 ++
   1.711 ++	if (__from < __end && __max)
   1.712 ++	  {
   1.713 ++	    // XXX Probably wrong for stateful encodings
   1.714 ++	    __tmp_state = __state;
   1.715 ++	    ++__from;
   1.716 ++	    ++__ret;
   1.717 ++	    --__max;
   1.718 ++	  }
   1.719 ++      }
   1.720 ++
   1.721 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.722 ++    __uselocale(__old);
   1.723 ++#endif
   1.724 ++
   1.725 ++    return __ret; 
   1.726 ++  }
   1.727 ++#endif
   1.728 ++}
   1.729 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/collate_members.cc
   1.730 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/collate_members.cc	1970-01-01 01:00:00.000000000 +0100
   1.731 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/collate_members.cc	2007-08-03 20:30:21.000000000 +0200
   1.732 +@@ -0,0 +1,80 @@
   1.733 ++// std::collate implementation details, GNU version -*- C++ -*-
   1.734 ++
   1.735 ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
   1.736 ++//
   1.737 ++// This file is part of the GNU ISO C++ Library.  This library is free
   1.738 ++// software; you can redistribute it and/or modify it under the
   1.739 ++// terms of the GNU General Public License as published by the
   1.740 ++// Free Software Foundation; either version 2, or (at your option)
   1.741 ++// any later version.
   1.742 ++
   1.743 ++// This library is distributed in the hope that it will be useful,
   1.744 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.745 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.746 ++// GNU General Public License for more details.
   1.747 ++
   1.748 ++// You should have received a copy of the GNU General Public License along
   1.749 ++// with this library; see the file COPYING.  If not, write to the Free
   1.750 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.751 ++// USA.
   1.752 ++
   1.753 ++// As a special exception, you may use this file as part of a free software
   1.754 ++// library without restriction.  Specifically, if other files instantiate
   1.755 ++// templates or use macros or inline functions from this file, or you compile
   1.756 ++// this file and link it with other files to produce an executable, this
   1.757 ++// file does not by itself cause the resulting executable to be covered by
   1.758 ++// the GNU General Public License.  This exception does not however
   1.759 ++// invalidate any other reasons why the executable file might be covered by
   1.760 ++// the GNU General Public License.
   1.761 ++
   1.762 ++//
   1.763 ++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
   1.764 ++//
   1.765 ++
   1.766 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
   1.767 ++
   1.768 ++#include <locale>
   1.769 ++#include <bits/c++locale_internal.h>
   1.770 ++
   1.771 ++#ifndef __UCLIBC_HAS_XLOCALE__
   1.772 ++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
   1.773 ++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
   1.774 ++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
   1.775 ++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
   1.776 ++#endif
   1.777 ++
   1.778 ++namespace std
   1.779 ++{
   1.780 ++  // These are basically extensions to char_traits, and perhaps should
   1.781 ++  // be put there instead of here.
   1.782 ++  template<>
   1.783 ++    int 
   1.784 ++    collate<char>::_M_compare(const char* __one, const char* __two) const
   1.785 ++    { 
   1.786 ++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
   1.787 ++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
   1.788 ++    }
   1.789 ++  
   1.790 ++  template<>
   1.791 ++    size_t
   1.792 ++    collate<char>::_M_transform(char* __to, const char* __from, 
   1.793 ++				size_t __n) const 
   1.794 ++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
   1.795 ++
   1.796 ++#ifdef _GLIBCXX_USE_WCHAR_T
   1.797 ++  template<>
   1.798 ++    int 
   1.799 ++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
   1.800 ++				 const wchar_t* __two) const
   1.801 ++    {
   1.802 ++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
   1.803 ++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
   1.804 ++    }
   1.805 ++  
   1.806 ++  template<>
   1.807 ++    size_t
   1.808 ++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
   1.809 ++				   size_t __n) const
   1.810 ++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
   1.811 ++#endif
   1.812 ++}
   1.813 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc
   1.814 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc	1970-01-01 01:00:00.000000000 +0100
   1.815 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2007-08-03 20:30:21.000000000 +0200
   1.816 +@@ -0,0 +1,300 @@
   1.817 ++// std::ctype implementation details, GNU version -*- C++ -*-
   1.818 ++
   1.819 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
   1.820 ++//
   1.821 ++// This file is part of the GNU ISO C++ Library.  This library is free
   1.822 ++// software; you can redistribute it and/or modify it under the
   1.823 ++// terms of the GNU General Public License as published by the
   1.824 ++// Free Software Foundation; either version 2, or (at your option)
   1.825 ++// any later version.
   1.826 ++
   1.827 ++// This library is distributed in the hope that it will be useful,
   1.828 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.829 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.830 ++// GNU General Public License for more details.
   1.831 ++
   1.832 ++// You should have received a copy of the GNU General Public License along
   1.833 ++// with this library; see the file COPYING.  If not, write to the Free
   1.834 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.835 ++// USA.
   1.836 ++
   1.837 ++// As a special exception, you may use this file as part of a free software
   1.838 ++// library without restriction.  Specifically, if other files instantiate
   1.839 ++// templates or use macros or inline functions from this file, or you compile
   1.840 ++// this file and link it with other files to produce an executable, this
   1.841 ++// file does not by itself cause the resulting executable to be covered by
   1.842 ++// the GNU General Public License.  This exception does not however
   1.843 ++// invalidate any other reasons why the executable file might be covered by
   1.844 ++// the GNU General Public License.
   1.845 ++
   1.846 ++//
   1.847 ++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
   1.848 ++//
   1.849 ++
   1.850 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
   1.851 ++
   1.852 ++#define _LIBC
   1.853 ++#include <locale>
   1.854 ++#undef _LIBC
   1.855 ++#include <bits/c++locale_internal.h>
   1.856 ++
   1.857 ++#ifndef __UCLIBC_HAS_XLOCALE__
   1.858 ++#define __wctype_l(S, L)           wctype((S))
   1.859 ++#define __towupper_l(C, L)         towupper((C))
   1.860 ++#define __towlower_l(C, L)         towlower((C))
   1.861 ++#define __iswctype_l(C, M, L)      iswctype((C), (M))
   1.862 ++#endif
   1.863 ++
   1.864 ++namespace std
   1.865 ++{
   1.866 ++  // NB: The other ctype<char> specializations are in src/locale.cc and
   1.867 ++  // various /config/os/* files.
   1.868 ++  template<>
   1.869 ++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
   1.870 ++    : ctype<char>(0, false, __refs) 
   1.871 ++    { 		
   1.872 ++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
   1.873 ++	{
   1.874 ++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
   1.875 ++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
   1.876 ++#ifdef __UCLIBC_HAS_XLOCALE__
   1.877 ++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
   1.878 ++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
   1.879 ++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
   1.880 ++#endif
   1.881 ++	}
   1.882 ++    }
   1.883 ++
   1.884 ++#ifdef _GLIBCXX_USE_WCHAR_T  
   1.885 ++  ctype<wchar_t>::__wmask_type
   1.886 ++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
   1.887 ++  {
   1.888 ++    __wmask_type __ret;
   1.889 ++    switch (__m)
   1.890 ++      {
   1.891 ++      case space:
   1.892 ++	__ret = __wctype_l("space", _M_c_locale_ctype);
   1.893 ++	break;
   1.894 ++      case print:
   1.895 ++	__ret = __wctype_l("print", _M_c_locale_ctype);
   1.896 ++	break;
   1.897 ++      case cntrl:
   1.898 ++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
   1.899 ++	break;
   1.900 ++      case upper:
   1.901 ++	__ret = __wctype_l("upper", _M_c_locale_ctype);
   1.902 ++	break;
   1.903 ++      case lower:
   1.904 ++	__ret = __wctype_l("lower", _M_c_locale_ctype);
   1.905 ++	break;
   1.906 ++      case alpha:
   1.907 ++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
   1.908 ++	break;
   1.909 ++      case digit:
   1.910 ++	__ret = __wctype_l("digit", _M_c_locale_ctype);
   1.911 ++	break;
   1.912 ++      case punct:
   1.913 ++	__ret = __wctype_l("punct", _M_c_locale_ctype);
   1.914 ++	break;
   1.915 ++      case xdigit:
   1.916 ++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
   1.917 ++	break;
   1.918 ++      case alnum:
   1.919 ++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
   1.920 ++	break;
   1.921 ++      case graph:
   1.922 ++	__ret = __wctype_l("graph", _M_c_locale_ctype);
   1.923 ++	break;
   1.924 ++      default:
   1.925 ++	__ret = __wmask_type();
   1.926 ++      }
   1.927 ++    return __ret;
   1.928 ++  }
   1.929 ++  
   1.930 ++  wchar_t
   1.931 ++  ctype<wchar_t>::do_toupper(wchar_t __c) const
   1.932 ++  { return __towupper_l(__c, _M_c_locale_ctype); }
   1.933 ++
   1.934 ++  const wchar_t*
   1.935 ++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
   1.936 ++  {
   1.937 ++    while (__lo < __hi)
   1.938 ++      {
   1.939 ++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
   1.940 ++        ++__lo;
   1.941 ++      }
   1.942 ++    return __hi;
   1.943 ++  }
   1.944 ++  
   1.945 ++  wchar_t
   1.946 ++  ctype<wchar_t>::do_tolower(wchar_t __c) const
   1.947 ++  { return __towlower_l(__c, _M_c_locale_ctype); }
   1.948 ++  
   1.949 ++  const wchar_t*
   1.950 ++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
   1.951 ++  {
   1.952 ++    while (__lo < __hi)
   1.953 ++      {
   1.954 ++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
   1.955 ++        ++__lo;
   1.956 ++      }
   1.957 ++    return __hi;
   1.958 ++  }
   1.959 ++
   1.960 ++  bool
   1.961 ++  ctype<wchar_t>::
   1.962 ++  do_is(mask __m, wchar_t __c) const
   1.963 ++  { 
   1.964 ++    // Highest bitmask in ctype_base == 10, but extra in "C"
   1.965 ++    // library for blank.
   1.966 ++    bool __ret = false;
   1.967 ++    const size_t __bitmasksize = 11; 
   1.968 ++    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
   1.969 ++      if (__m & _M_bit[__bitcur]
   1.970 ++	  && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
   1.971 ++	{
   1.972 ++	  __ret = true;
   1.973 ++	  break;
   1.974 ++	}
   1.975 ++    return __ret;    
   1.976 ++  }
   1.977 ++  
   1.978 ++  const wchar_t* 
   1.979 ++  ctype<wchar_t>::
   1.980 ++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
   1.981 ++  {
   1.982 ++    for (; __lo < __hi; ++__vec, ++__lo)
   1.983 ++      {
   1.984 ++	// Highest bitmask in ctype_base == 10, but extra in "C"
   1.985 ++	// library for blank.
   1.986 ++	const size_t __bitmasksize = 11; 
   1.987 ++	mask __m = 0;
   1.988 ++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
   1.989 ++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
   1.990 ++	    __m |= _M_bit[__bitcur];
   1.991 ++	*__vec = __m;
   1.992 ++      }
   1.993 ++    return __hi;
   1.994 ++  }
   1.995 ++  
   1.996 ++  const wchar_t* 
   1.997 ++  ctype<wchar_t>::
   1.998 ++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
   1.999 ++  {
  1.1000 ++    while (__lo < __hi && !this->do_is(__m, *__lo))
  1.1001 ++      ++__lo;
  1.1002 ++    return __lo;
  1.1003 ++  }
  1.1004 ++
  1.1005 ++  const wchar_t*
  1.1006 ++  ctype<wchar_t>::
  1.1007 ++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
  1.1008 ++  {
  1.1009 ++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
  1.1010 ++      ++__lo;
  1.1011 ++    return __lo;
  1.1012 ++  }
  1.1013 ++
  1.1014 ++  wchar_t
  1.1015 ++  ctype<wchar_t>::
  1.1016 ++  do_widen(char __c) const
  1.1017 ++  { return _M_widen[static_cast<unsigned char>(__c)]; }
  1.1018 ++
  1.1019 ++  const char* 
  1.1020 ++  ctype<wchar_t>::
  1.1021 ++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
  1.1022 ++  {
  1.1023 ++    while (__lo < __hi)
  1.1024 ++      {
  1.1025 ++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
  1.1026 ++	++__lo;
  1.1027 ++	++__dest;
  1.1028 ++      }
  1.1029 ++    return __hi;
  1.1030 ++  }
  1.1031 ++
  1.1032 ++  char
  1.1033 ++  ctype<wchar_t>::
  1.1034 ++  do_narrow(wchar_t __wc, char __dfault) const
  1.1035 ++  {
  1.1036 ++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
  1.1037 ++      return _M_narrow[__wc];
  1.1038 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1039 ++    __c_locale __old = __uselocale(_M_c_locale_ctype);
  1.1040 ++#endif
  1.1041 ++    const int __c = wctob(__wc);
  1.1042 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1043 ++    __uselocale(__old);
  1.1044 ++#endif
  1.1045 ++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
  1.1046 ++  }
  1.1047 ++
  1.1048 ++  const wchar_t*
  1.1049 ++  ctype<wchar_t>::
  1.1050 ++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
  1.1051 ++	    char* __dest) const
  1.1052 ++  {
  1.1053 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1054 ++    __c_locale __old = __uselocale(_M_c_locale_ctype);
  1.1055 ++#endif
  1.1056 ++    if (_M_narrow_ok)
  1.1057 ++      while (__lo < __hi)
  1.1058 ++	{
  1.1059 ++	  if (*__lo >= 0 && *__lo < 128)
  1.1060 ++	    *__dest = _M_narrow[*__lo];
  1.1061 ++	  else
  1.1062 ++	    {
  1.1063 ++	      const int __c = wctob(*__lo);
  1.1064 ++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
  1.1065 ++	    }
  1.1066 ++	  ++__lo;
  1.1067 ++	  ++__dest;
  1.1068 ++	}
  1.1069 ++    else
  1.1070 ++      while (__lo < __hi)
  1.1071 ++	{
  1.1072 ++	  const int __c = wctob(*__lo);
  1.1073 ++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
  1.1074 ++	  ++__lo;
  1.1075 ++	  ++__dest;
  1.1076 ++	}
  1.1077 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1078 ++    __uselocale(__old);
  1.1079 ++#endif
  1.1080 ++    return __hi;
  1.1081 ++  }
  1.1082 ++
  1.1083 ++  void
  1.1084 ++  ctype<wchar_t>::_M_initialize_ctype()
  1.1085 ++  {
  1.1086 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1087 ++    __c_locale __old = __uselocale(_M_c_locale_ctype);
  1.1088 ++#endif
  1.1089 ++    wint_t __i;
  1.1090 ++    for (__i = 0; __i < 128; ++__i)
  1.1091 ++      {
  1.1092 ++	const int __c = wctob(__i);
  1.1093 ++	if (__c == EOF)
  1.1094 ++	  break;
  1.1095 ++	else
  1.1096 ++	  _M_narrow[__i] = static_cast<char>(__c);
  1.1097 ++      }
  1.1098 ++    if (__i == 128)
  1.1099 ++      _M_narrow_ok = true;
  1.1100 ++    else
  1.1101 ++      _M_narrow_ok = false;
  1.1102 ++    for (size_t __j = 0;
  1.1103 ++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
  1.1104 ++      _M_widen[__j] = btowc(__j);
  1.1105 ++
  1.1106 ++    for (size_t __k = 0; __k <= 11; ++__k)
  1.1107 ++      { 
  1.1108 ++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
  1.1109 ++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
  1.1110 ++      }
  1.1111 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1112 ++    __uselocale(__old);
  1.1113 ++#endif
  1.1114 ++  }
  1.1115 ++#endif //  _GLIBCXX_USE_WCHAR_T
  1.1116 ++}
  1.1117 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.cc
  1.1118 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.cc	1970-01-01 01:00:00.000000000 +0100
  1.1119 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.cc	2007-08-03 20:30:21.000000000 +0200
  1.1120 +@@ -0,0 +1,100 @@
  1.1121 ++// std::messages implementation details, GNU version -*- C++ -*-
  1.1122 ++
  1.1123 ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
  1.1124 ++//
  1.1125 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.1126 ++// software; you can redistribute it and/or modify it under the
  1.1127 ++// terms of the GNU General Public License as published by the
  1.1128 ++// Free Software Foundation; either version 2, or (at your option)
  1.1129 ++// any later version.
  1.1130 ++
  1.1131 ++// This library is distributed in the hope that it will be useful,
  1.1132 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.1133 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.1134 ++// GNU General Public License for more details.
  1.1135 ++
  1.1136 ++// You should have received a copy of the GNU General Public License along
  1.1137 ++// with this library; see the file COPYING.  If not, write to the Free
  1.1138 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.1139 ++// USA.
  1.1140 ++
  1.1141 ++// As a special exception, you may use this file as part of a free software
  1.1142 ++// library without restriction.  Specifically, if other files instantiate
  1.1143 ++// templates or use macros or inline functions from this file, or you compile
  1.1144 ++// this file and link it with other files to produce an executable, this
  1.1145 ++// file does not by itself cause the resulting executable to be covered by
  1.1146 ++// the GNU General Public License.  This exception does not however
  1.1147 ++// invalidate any other reasons why the executable file might be covered by
  1.1148 ++// the GNU General Public License.
  1.1149 ++
  1.1150 ++//
  1.1151 ++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
  1.1152 ++//
  1.1153 ++
  1.1154 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.1155 ++
  1.1156 ++#include <locale>
  1.1157 ++#include <bits/c++locale_internal.h>
  1.1158 ++
  1.1159 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.1160 ++#warning fix gettext stuff
  1.1161 ++#endif
  1.1162 ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
  1.1163 ++extern "C" char *__dcgettext(const char *domainname,
  1.1164 ++			     const char *msgid, int category);
  1.1165 ++#undef gettext
  1.1166 ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
  1.1167 ++#else
  1.1168 ++#undef gettext
  1.1169 ++#define gettext(msgid) (msgid)
  1.1170 ++#endif
  1.1171 ++
  1.1172 ++namespace std
  1.1173 ++{
  1.1174 ++  // Specializations.
  1.1175 ++  template<>
  1.1176 ++    string
  1.1177 ++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
  1.1178 ++    {
  1.1179 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1180 ++      __c_locale __old = __uselocale(_M_c_locale_messages);
  1.1181 ++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
  1.1182 ++      __uselocale(__old);
  1.1183 ++      return string(__msg);
  1.1184 ++#elif defined __UCLIBC_HAS_LOCALE__
  1.1185 ++      char* __old = strdup(setlocale(LC_ALL, NULL));
  1.1186 ++      setlocale(LC_ALL, _M_name_messages);
  1.1187 ++      const char* __msg = gettext(__dfault.c_str());
  1.1188 ++      setlocale(LC_ALL, __old);
  1.1189 ++      free(__old);
  1.1190 ++      return string(__msg);
  1.1191 ++#else
  1.1192 ++      const char* __msg = gettext(__dfault.c_str());
  1.1193 ++      return string(__msg);
  1.1194 ++#endif
  1.1195 ++    }
  1.1196 ++
  1.1197 ++#ifdef _GLIBCXX_USE_WCHAR_T
  1.1198 ++  template<>
  1.1199 ++    wstring
  1.1200 ++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
  1.1201 ++    {
  1.1202 ++# ifdef __UCLIBC_HAS_XLOCALE__
  1.1203 ++      __c_locale __old = __uselocale(_M_c_locale_messages);
  1.1204 ++      char* __msg = gettext(_M_convert_to_char(__dfault));
  1.1205 ++      __uselocale(__old);
  1.1206 ++      return _M_convert_from_char(__msg);
  1.1207 ++# elif defined __UCLIBC_HAS_LOCALE__
  1.1208 ++      char* __old = strdup(setlocale(LC_ALL, NULL));
  1.1209 ++      setlocale(LC_ALL, _M_name_messages);
  1.1210 ++      char* __msg = gettext(_M_convert_to_char(__dfault));
  1.1211 ++      setlocale(LC_ALL, __old);
  1.1212 ++      free(__old);
  1.1213 ++      return _M_convert_from_char(__msg);
  1.1214 ++# else
  1.1215 ++      char* __msg = gettext(_M_convert_to_char(__dfault));
  1.1216 ++      return _M_convert_from_char(__msg);
  1.1217 ++# endif
  1.1218 ++    }
  1.1219 ++#endif
  1.1220 ++}
  1.1221 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.h
  1.1222 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/messages_members.h	1970-01-01 01:00:00.000000000 +0100
  1.1223 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/messages_members.h	2007-08-03 20:30:21.000000000 +0200
  1.1224 +@@ -0,0 +1,118 @@
  1.1225 ++// std::messages implementation details, GNU version -*- C++ -*-
  1.1226 ++
  1.1227 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
  1.1228 ++//
  1.1229 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.1230 ++// software; you can redistribute it and/or modify it under the
  1.1231 ++// terms of the GNU General Public License as published by the
  1.1232 ++// Free Software Foundation; either version 2, or (at your option)
  1.1233 ++// any later version.
  1.1234 ++
  1.1235 ++// This library is distributed in the hope that it will be useful,
  1.1236 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.1237 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.1238 ++// GNU General Public License for more details.
  1.1239 ++
  1.1240 ++// You should have received a copy of the GNU General Public License along
  1.1241 ++// with this library; see the file COPYING.  If not, write to the Free
  1.1242 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.1243 ++// USA.
  1.1244 ++
  1.1245 ++// As a special exception, you may use this file as part of a free software
  1.1246 ++// library without restriction.  Specifically, if other files instantiate
  1.1247 ++// templates or use macros or inline functions from this file, or you compile
  1.1248 ++// this file and link it with other files to produce an executable, this
  1.1249 ++// file does not by itself cause the resulting executable to be covered by
  1.1250 ++// the GNU General Public License.  This exception does not however
  1.1251 ++// invalidate any other reasons why the executable file might be covered by
  1.1252 ++// the GNU General Public License.
  1.1253 ++
  1.1254 ++//
  1.1255 ++// ISO C++ 14882: 22.2.7.1.2  messages functions
  1.1256 ++//
  1.1257 ++
  1.1258 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.1259 ++
  1.1260 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.1261 ++#warning fix prototypes for *textdomain funcs
  1.1262 ++#endif
  1.1263 ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
  1.1264 ++extern "C" char *__textdomain(const char *domainname);
  1.1265 ++extern "C" char *__bindtextdomain(const char *domainname,
  1.1266 ++				  const char *dirname);
  1.1267 ++#else
  1.1268 ++#undef __textdomain
  1.1269 ++#undef __bindtextdomain
  1.1270 ++#define __textdomain(D)           ((void)0)
  1.1271 ++#define __bindtextdomain(D,P)     ((void)0)
  1.1272 ++#endif
  1.1273 ++
  1.1274 ++  // Non-virtual member functions.
  1.1275 ++  template<typename _CharT>
  1.1276 ++     messages<_CharT>::messages(size_t __refs)
  1.1277 ++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
  1.1278 ++     _M_name_messages(_S_get_c_name())
  1.1279 ++     { }
  1.1280 ++
  1.1281 ++  template<typename _CharT>
  1.1282 ++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
  1.1283 ++				size_t __refs) 
  1.1284 ++     : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
  1.1285 ++     _M_name_messages(__s)
  1.1286 ++     {
  1.1287 ++       char* __tmp = new char[std::strlen(__s) + 1];
  1.1288 ++       std::strcpy(__tmp, __s);
  1.1289 ++       _M_name_messages = __tmp;
  1.1290 ++     }
  1.1291 ++
  1.1292 ++  template<typename _CharT>
  1.1293 ++    typename messages<_CharT>::catalog 
  1.1294 ++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
  1.1295 ++			   const char* __dir) const
  1.1296 ++    { 
  1.1297 ++      __bindtextdomain(__s.c_str(), __dir);
  1.1298 ++      return this->do_open(__s, __loc); 
  1.1299 ++    }
  1.1300 ++
  1.1301 ++  // Virtual member functions.
  1.1302 ++  template<typename _CharT>
  1.1303 ++    messages<_CharT>::~messages()
  1.1304 ++    { 
  1.1305 ++      if (_M_name_messages != _S_get_c_name())
  1.1306 ++	delete [] _M_name_messages;
  1.1307 ++      _S_destroy_c_locale(_M_c_locale_messages); 
  1.1308 ++    }
  1.1309 ++
  1.1310 ++  template<typename _CharT>
  1.1311 ++    typename messages<_CharT>::catalog 
  1.1312 ++    messages<_CharT>::do_open(const basic_string<char>& __s, 
  1.1313 ++			      const locale&) const
  1.1314 ++    { 
  1.1315 ++      // No error checking is done, assume the catalog exists and can
  1.1316 ++      // be used.
  1.1317 ++      __textdomain(__s.c_str());
  1.1318 ++      return 0;
  1.1319 ++    }
  1.1320 ++
  1.1321 ++  template<typename _CharT>
  1.1322 ++    void    
  1.1323 ++    messages<_CharT>::do_close(catalog) const 
  1.1324 ++    { }
  1.1325 ++
  1.1326 ++   // messages_byname
  1.1327 ++   template<typename _CharT>
  1.1328 ++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
  1.1329 ++     : messages<_CharT>(__refs) 
  1.1330 ++     { 
  1.1331 ++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
  1.1332 ++	 delete [] this->_M_name_messages;
  1.1333 ++       char* __tmp = new char[std::strlen(__s) + 1];
  1.1334 ++       std::strcpy(__tmp, __s);
  1.1335 ++       this->_M_name_messages = __tmp;
  1.1336 ++
  1.1337 ++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
  1.1338 ++	 {
  1.1339 ++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
  1.1340 ++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
  1.1341 ++	 }
  1.1342 ++     }
  1.1343 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc
  1.1344 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc	1970-01-01 01:00:00.000000000 +0100
  1.1345 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2007-08-03 20:30:21.000000000 +0200
  1.1346 +@@ -0,0 +1,692 @@
  1.1347 ++// std::moneypunct implementation details, GNU version -*- C++ -*-
  1.1348 ++
  1.1349 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
  1.1350 ++//
  1.1351 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.1352 ++// software; you can redistribute it and/or modify it under the
  1.1353 ++// terms of the GNU General Public License as published by the
  1.1354 ++// Free Software Foundation; either version 2, or (at your option)
  1.1355 ++// any later version.
  1.1356 ++
  1.1357 ++// This library is distributed in the hope that it will be useful,
  1.1358 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.1359 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.1360 ++// GNU General Public License for more details.
  1.1361 ++
  1.1362 ++// You should have received a copy of the GNU General Public License along
  1.1363 ++// with this library; see the file COPYING.  If not, write to the Free
  1.1364 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.1365 ++// USA.
  1.1366 ++
  1.1367 ++// As a special exception, you may use this file as part of a free software
  1.1368 ++// library without restriction.  Specifically, if other files instantiate
  1.1369 ++// templates or use macros or inline functions from this file, or you compile
  1.1370 ++// this file and link it with other files to produce an executable, this
  1.1371 ++// file does not by itself cause the resulting executable to be covered by
  1.1372 ++// the GNU General Public License.  This exception does not however
  1.1373 ++// invalidate any other reasons why the executable file might be covered by
  1.1374 ++// the GNU General Public License.
  1.1375 ++
  1.1376 ++//
  1.1377 ++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
  1.1378 ++//
  1.1379 ++
  1.1380 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.1381 ++
  1.1382 ++#define _LIBC
  1.1383 ++#include <locale>
  1.1384 ++#undef _LIBC
  1.1385 ++#include <bits/c++locale_internal.h>
  1.1386 ++
  1.1387 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.1388 ++#warning optimize this for uclibc
  1.1389 ++#warning tailor for stub locale support
  1.1390 ++#endif
  1.1391 ++
  1.1392 ++#ifndef __UCLIBC_HAS_XLOCALE__
  1.1393 ++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
  1.1394 ++#endif
  1.1395 ++
  1.1396 ++namespace std
  1.1397 ++{
  1.1398 ++  // Construct and return valid pattern consisting of some combination of:
  1.1399 ++  // space none symbol sign value
  1.1400 ++  money_base::pattern
  1.1401 ++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
  1.1402 ++  { 
  1.1403 ++    pattern __ret;
  1.1404 ++
  1.1405 ++    // This insanely complicated routine attempts to construct a valid
  1.1406 ++    // pattern for use with monyepunct. A couple of invariants:
  1.1407 ++
  1.1408 ++    // if (__precedes) symbol -> value
  1.1409 ++    // else value -> symbol
  1.1410 ++    
  1.1411 ++    // if (__space) space
  1.1412 ++    // else none
  1.1413 ++
  1.1414 ++    // none == never first
  1.1415 ++    // space never first or last
  1.1416 ++
  1.1417 ++    // Any elegant implementations of this are welcome.
  1.1418 ++    switch (__posn)
  1.1419 ++      {
  1.1420 ++      case 0:
  1.1421 ++      case 1:
  1.1422 ++	// 1 The sign precedes the value and symbol.
  1.1423 ++	__ret.field[0] = sign;
  1.1424 ++	if (__space)
  1.1425 ++	  {
  1.1426 ++	    // Pattern starts with sign.
  1.1427 ++	    if (__precedes)
  1.1428 ++	      {
  1.1429 ++		__ret.field[1] = symbol;
  1.1430 ++		__ret.field[3] = value;
  1.1431 ++	      }
  1.1432 ++	    else
  1.1433 ++	      {
  1.1434 ++		__ret.field[1] = value;
  1.1435 ++		__ret.field[3] = symbol;
  1.1436 ++	      }
  1.1437 ++	    __ret.field[2] = space;
  1.1438 ++	  }
  1.1439 ++	else
  1.1440 ++	  {
  1.1441 ++	    // Pattern starts with sign and ends with none.
  1.1442 ++	    if (__precedes)
  1.1443 ++	      {
  1.1444 ++		__ret.field[1] = symbol;
  1.1445 ++		__ret.field[2] = value;
  1.1446 ++	      }
  1.1447 ++	    else
  1.1448 ++	      {
  1.1449 ++		__ret.field[1] = value;
  1.1450 ++		__ret.field[2] = symbol;
  1.1451 ++	      }
  1.1452 ++	    __ret.field[3] = none;
  1.1453 ++	  }
  1.1454 ++	break;
  1.1455 ++      case 2:
  1.1456 ++	// 2 The sign follows the value and symbol.
  1.1457 ++	if (__space)
  1.1458 ++	  {
  1.1459 ++	    // Pattern either ends with sign.
  1.1460 ++	    if (__precedes)
  1.1461 ++	      {
  1.1462 ++		__ret.field[0] = symbol;
  1.1463 ++		__ret.field[2] = value;
  1.1464 ++	      }
  1.1465 ++	    else
  1.1466 ++	      {
  1.1467 ++		__ret.field[0] = value;
  1.1468 ++		__ret.field[2] = symbol;
  1.1469 ++	      }
  1.1470 ++	    __ret.field[1] = space;
  1.1471 ++	    __ret.field[3] = sign;
  1.1472 ++	  }
  1.1473 ++	else
  1.1474 ++	  {
  1.1475 ++	    // Pattern ends with sign then none.
  1.1476 ++	    if (__precedes)
  1.1477 ++	      {
  1.1478 ++		__ret.field[0] = symbol;
  1.1479 ++		__ret.field[1] = value;
  1.1480 ++	      }
  1.1481 ++	    else
  1.1482 ++	      {
  1.1483 ++		__ret.field[0] = value;
  1.1484 ++		__ret.field[1] = symbol;
  1.1485 ++	      }
  1.1486 ++	    __ret.field[2] = sign;
  1.1487 ++	    __ret.field[3] = none;
  1.1488 ++	  }
  1.1489 ++	break;
  1.1490 ++      case 3:
  1.1491 ++	// 3 The sign immediately precedes the symbol.
  1.1492 ++	if (__precedes)
  1.1493 ++	  {
  1.1494 ++	    __ret.field[0] = sign;
  1.1495 ++	    __ret.field[1] = symbol;	    
  1.1496 ++	    if (__space)
  1.1497 ++	      {
  1.1498 ++		__ret.field[2] = space;
  1.1499 ++		__ret.field[3] = value;
  1.1500 ++	      }
  1.1501 ++	    else
  1.1502 ++	      {
  1.1503 ++		__ret.field[2] = value;		
  1.1504 ++		__ret.field[3] = none;
  1.1505 ++	      }
  1.1506 ++	  }
  1.1507 ++	else
  1.1508 ++	  {
  1.1509 ++	    __ret.field[0] = value;
  1.1510 ++	    if (__space)
  1.1511 ++	      {
  1.1512 ++		__ret.field[1] = space;
  1.1513 ++		__ret.field[2] = sign;
  1.1514 ++		__ret.field[3] = symbol;
  1.1515 ++	      }
  1.1516 ++	    else
  1.1517 ++	      {
  1.1518 ++		__ret.field[1] = sign;
  1.1519 ++		__ret.field[2] = symbol;
  1.1520 ++		__ret.field[3] = none;
  1.1521 ++	      }
  1.1522 ++	  }
  1.1523 ++	break;
  1.1524 ++      case 4:
  1.1525 ++	// 4 The sign immediately follows the symbol.
  1.1526 ++	if (__precedes)
  1.1527 ++	  {
  1.1528 ++	    __ret.field[0] = symbol;
  1.1529 ++	    __ret.field[1] = sign;
  1.1530 ++	    if (__space)
  1.1531 ++	      {
  1.1532 ++		__ret.field[2] = space;
  1.1533 ++		__ret.field[3] = value;
  1.1534 ++	      }
  1.1535 ++	    else
  1.1536 ++	      {
  1.1537 ++		__ret.field[2] = value;
  1.1538 ++		__ret.field[3] = none;
  1.1539 ++	      }
  1.1540 ++	  }
  1.1541 ++	else
  1.1542 ++	  {
  1.1543 ++	    __ret.field[0] = value;
  1.1544 ++	    if (__space)
  1.1545 ++	      {
  1.1546 ++		__ret.field[1] = space;
  1.1547 ++		__ret.field[2] = symbol;
  1.1548 ++		__ret.field[3] = sign;
  1.1549 ++	      }
  1.1550 ++	    else
  1.1551 ++	      {
  1.1552 ++		__ret.field[1] = symbol;
  1.1553 ++		__ret.field[2] = sign;
  1.1554 ++		__ret.field[3] = none;
  1.1555 ++	      }
  1.1556 ++	  }
  1.1557 ++	break;
  1.1558 ++      default:
  1.1559 ++	;
  1.1560 ++      }
  1.1561 ++    return __ret;
  1.1562 ++  }
  1.1563 ++
  1.1564 ++  template<> 
  1.1565 ++    void
  1.1566 ++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
  1.1567 ++						     const char*)
  1.1568 ++    {
  1.1569 ++      if (!_M_data)
  1.1570 ++	_M_data = new __moneypunct_cache<char, true>;
  1.1571 ++
  1.1572 ++      if (!__cloc)
  1.1573 ++	{
  1.1574 ++	  // "C" locale
  1.1575 ++	  _M_data->_M_decimal_point = '.';
  1.1576 ++	  _M_data->_M_thousands_sep = ',';
  1.1577 ++	  _M_data->_M_grouping = "";
  1.1578 ++	  _M_data->_M_grouping_size = 0;
  1.1579 ++	  _M_data->_M_curr_symbol = "";
  1.1580 ++	  _M_data->_M_curr_symbol_size = 0;
  1.1581 ++	  _M_data->_M_positive_sign = "";
  1.1582 ++	  _M_data->_M_positive_sign_size = 0;
  1.1583 ++	  _M_data->_M_negative_sign = "";
  1.1584 ++	  _M_data->_M_negative_sign_size = 0;
  1.1585 ++	  _M_data->_M_frac_digits = 0;
  1.1586 ++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
  1.1587 ++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
  1.1588 ++
  1.1589 ++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
  1.1590 ++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
  1.1591 ++	}
  1.1592 ++      else
  1.1593 ++	{
  1.1594 ++	  // Named locale.
  1.1595 ++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
  1.1596 ++							__cloc));
  1.1597 ++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
  1.1598 ++							__cloc));
  1.1599 ++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
  1.1600 ++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.1601 ++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
  1.1602 ++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
  1.1603 ++
  1.1604 ++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
  1.1605 ++	  if (!__nposn)
  1.1606 ++	    _M_data->_M_negative_sign = "()";
  1.1607 ++	  else
  1.1608 ++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
  1.1609 ++							__cloc);
  1.1610 ++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
  1.1611 ++
  1.1612 ++	  // _Intl == true
  1.1613 ++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
  1.1614 ++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
  1.1615 ++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
  1.1616 ++						      __cloc));
  1.1617 ++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
  1.1618 ++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
  1.1619 ++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
  1.1620 ++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
  1.1621 ++							__pposn);
  1.1622 ++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
  1.1623 ++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
  1.1624 ++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
  1.1625 ++							__nposn);
  1.1626 ++	}
  1.1627 ++    }
  1.1628 ++
  1.1629 ++  template<> 
  1.1630 ++    void
  1.1631 ++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
  1.1632 ++						      const char*)
  1.1633 ++    {
  1.1634 ++      if (!_M_data)
  1.1635 ++	_M_data = new __moneypunct_cache<char, false>;
  1.1636 ++
  1.1637 ++      if (!__cloc)
  1.1638 ++	{
  1.1639 ++	  // "C" locale
  1.1640 ++	  _M_data->_M_decimal_point = '.';
  1.1641 ++	  _M_data->_M_thousands_sep = ',';
  1.1642 ++	  _M_data->_M_grouping = "";
  1.1643 ++	  _M_data->_M_grouping_size = 0;
  1.1644 ++	  _M_data->_M_curr_symbol = "";
  1.1645 ++	  _M_data->_M_curr_symbol_size = 0;
  1.1646 ++	  _M_data->_M_positive_sign = "";
  1.1647 ++	  _M_data->_M_positive_sign_size = 0;
  1.1648 ++	  _M_data->_M_negative_sign = "";
  1.1649 ++	  _M_data->_M_negative_sign_size = 0;
  1.1650 ++	  _M_data->_M_frac_digits = 0;
  1.1651 ++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
  1.1652 ++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
  1.1653 ++
  1.1654 ++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
  1.1655 ++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
  1.1656 ++	}
  1.1657 ++      else
  1.1658 ++	{
  1.1659 ++	  // Named locale.
  1.1660 ++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
  1.1661 ++							__cloc));
  1.1662 ++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
  1.1663 ++							__cloc));
  1.1664 ++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
  1.1665 ++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.1666 ++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
  1.1667 ++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
  1.1668 ++
  1.1669 ++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
  1.1670 ++	  if (!__nposn)
  1.1671 ++	    _M_data->_M_negative_sign = "()";
  1.1672 ++	  else
  1.1673 ++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
  1.1674 ++							__cloc);
  1.1675 ++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
  1.1676 ++
  1.1677 ++	  // _Intl == false
  1.1678 ++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
  1.1679 ++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
  1.1680 ++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
  1.1681 ++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
  1.1682 ++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
  1.1683 ++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
  1.1684 ++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
  1.1685 ++							__pposn);
  1.1686 ++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
  1.1687 ++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
  1.1688 ++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
  1.1689 ++							__nposn);
  1.1690 ++	}
  1.1691 ++    }
  1.1692 ++
  1.1693 ++  template<> 
  1.1694 ++    moneypunct<char, true>::~moneypunct()
  1.1695 ++    { delete _M_data; }
  1.1696 ++
  1.1697 ++  template<> 
  1.1698 ++    moneypunct<char, false>::~moneypunct()
  1.1699 ++    { delete _M_data; }
  1.1700 ++
  1.1701 ++#ifdef _GLIBCXX_USE_WCHAR_T
  1.1702 ++  template<> 
  1.1703 ++    void
  1.1704 ++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
  1.1705 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1706 ++							const char*)
  1.1707 ++#else
  1.1708 ++							const char* __name)
  1.1709 ++#endif
  1.1710 ++    {
  1.1711 ++      if (!_M_data)
  1.1712 ++	_M_data = new __moneypunct_cache<wchar_t, true>;
  1.1713 ++
  1.1714 ++      if (!__cloc)
  1.1715 ++	{
  1.1716 ++	  // "C" locale
  1.1717 ++	  _M_data->_M_decimal_point = L'.';
  1.1718 ++	  _M_data->_M_thousands_sep = L',';
  1.1719 ++	  _M_data->_M_grouping = "";
  1.1720 ++	  _M_data->_M_grouping_size = 0;
  1.1721 ++	  _M_data->_M_curr_symbol = L"";
  1.1722 ++	  _M_data->_M_curr_symbol_size = 0;
  1.1723 ++	  _M_data->_M_positive_sign = L"";
  1.1724 ++	  _M_data->_M_positive_sign_size = 0;
  1.1725 ++	  _M_data->_M_negative_sign = L"";
  1.1726 ++	  _M_data->_M_negative_sign_size = 0;
  1.1727 ++	  _M_data->_M_frac_digits = 0;
  1.1728 ++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
  1.1729 ++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
  1.1730 ++
  1.1731 ++	  // Use ctype::widen code without the facet...
  1.1732 ++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
  1.1733 ++	    _M_data->_M_atoms[__i] =
  1.1734 ++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
  1.1735 ++	}
  1.1736 ++      else
  1.1737 ++	{
  1.1738 ++	  // Named locale.
  1.1739 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1740 ++	  __c_locale __old = __uselocale(__cloc);
  1.1741 ++#else
  1.1742 ++	  // Switch to named locale so that mbsrtowcs will work.
  1.1743 ++	  char* __old = strdup(setlocale(LC_ALL, NULL));
  1.1744 ++	  setlocale(LC_ALL, __name);
  1.1745 ++#endif
  1.1746 ++
  1.1747 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.1748 ++#warning fix this... should be monetary
  1.1749 ++#endif
  1.1750 ++#ifdef __UCLIBC__
  1.1751 ++# ifdef __UCLIBC_HAS_XLOCALE__
  1.1752 ++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
  1.1753 ++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
  1.1754 ++# else
  1.1755 ++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
  1.1756 ++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
  1.1757 ++# endif
  1.1758 ++#else
  1.1759 ++	  union { char *__s; wchar_t __w; } __u;
  1.1760 ++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
  1.1761 ++	  _M_data->_M_decimal_point = __u.__w;
  1.1762 ++
  1.1763 ++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
  1.1764 ++	  _M_data->_M_thousands_sep = __u.__w;
  1.1765 ++#endif
  1.1766 ++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
  1.1767 ++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.1768 ++
  1.1769 ++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
  1.1770 ++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
  1.1771 ++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
  1.1772 ++
  1.1773 ++	  wchar_t* __wcs_ps = 0;
  1.1774 ++	  wchar_t* __wcs_ns = 0;
  1.1775 ++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
  1.1776 ++	  try
  1.1777 ++	    {
  1.1778 ++	      mbstate_t __state;
  1.1779 ++	      size_t __len = strlen(__cpossign);
  1.1780 ++	      if (__len)
  1.1781 ++		{
  1.1782 ++		  ++__len;
  1.1783 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1784 ++		  __wcs_ps = new wchar_t[__len];
  1.1785 ++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
  1.1786 ++		  _M_data->_M_positive_sign = __wcs_ps;
  1.1787 ++		}
  1.1788 ++	      else
  1.1789 ++		_M_data->_M_positive_sign = L"";
  1.1790 ++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
  1.1791 ++	      
  1.1792 ++	      __len = strlen(__cnegsign);
  1.1793 ++	      if (!__nposn)
  1.1794 ++		_M_data->_M_negative_sign = L"()";
  1.1795 ++	      else if (__len)
  1.1796 ++		{ 
  1.1797 ++		  ++__len;
  1.1798 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1799 ++		  __wcs_ns = new wchar_t[__len];
  1.1800 ++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
  1.1801 ++		  _M_data->_M_negative_sign = __wcs_ns;
  1.1802 ++		}
  1.1803 ++	      else
  1.1804 ++		_M_data->_M_negative_sign = L"";
  1.1805 ++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
  1.1806 ++	      
  1.1807 ++	      // _Intl == true.
  1.1808 ++	      __len = strlen(__ccurr);
  1.1809 ++	      if (__len)
  1.1810 ++		{
  1.1811 ++		  ++__len;
  1.1812 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1813 ++		  wchar_t* __wcs = new wchar_t[__len];
  1.1814 ++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
  1.1815 ++		  _M_data->_M_curr_symbol = __wcs;
  1.1816 ++		}
  1.1817 ++	      else
  1.1818 ++		_M_data->_M_curr_symbol = L"";
  1.1819 ++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
  1.1820 ++	    }
  1.1821 ++	  catch (...)
  1.1822 ++	    {
  1.1823 ++	      delete _M_data;
  1.1824 ++	      _M_data = 0;
  1.1825 ++	      delete __wcs_ps;
  1.1826 ++	      delete __wcs_ns;	      
  1.1827 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1828 ++	      __uselocale(__old);
  1.1829 ++#else
  1.1830 ++	      setlocale(LC_ALL, __old);
  1.1831 ++	      free(__old);
  1.1832 ++#endif
  1.1833 ++	      __throw_exception_again;
  1.1834 ++	    } 
  1.1835 ++	  
  1.1836 ++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
  1.1837 ++						      __cloc));
  1.1838 ++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
  1.1839 ++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
  1.1840 ++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
  1.1841 ++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
  1.1842 ++							__pposn);
  1.1843 ++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
  1.1844 ++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
  1.1845 ++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
  1.1846 ++							__nposn);
  1.1847 ++
  1.1848 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1849 ++	  __uselocale(__old);
  1.1850 ++#else
  1.1851 ++	  setlocale(LC_ALL, __old);
  1.1852 ++	  free(__old);
  1.1853 ++#endif
  1.1854 ++	}
  1.1855 ++    }
  1.1856 ++
  1.1857 ++  template<> 
  1.1858 ++  void
  1.1859 ++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
  1.1860 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1861 ++						       const char*)
  1.1862 ++#else
  1.1863 ++                                                       const char* __name)
  1.1864 ++#endif
  1.1865 ++  {
  1.1866 ++    if (!_M_data)
  1.1867 ++      _M_data = new __moneypunct_cache<wchar_t, false>;
  1.1868 ++
  1.1869 ++    if (!__cloc)
  1.1870 ++	{
  1.1871 ++	  // "C" locale
  1.1872 ++	  _M_data->_M_decimal_point = L'.';
  1.1873 ++	  _M_data->_M_thousands_sep = L',';
  1.1874 ++	  _M_data->_M_grouping = "";
  1.1875 ++          _M_data->_M_grouping_size = 0;
  1.1876 ++	  _M_data->_M_curr_symbol = L"";
  1.1877 ++	  _M_data->_M_curr_symbol_size = 0;
  1.1878 ++	  _M_data->_M_positive_sign = L"";
  1.1879 ++	  _M_data->_M_positive_sign_size = 0;
  1.1880 ++	  _M_data->_M_negative_sign = L"";
  1.1881 ++	  _M_data->_M_negative_sign_size = 0;
  1.1882 ++	  _M_data->_M_frac_digits = 0;
  1.1883 ++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
  1.1884 ++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
  1.1885 ++
  1.1886 ++	  // Use ctype::widen code without the facet...
  1.1887 ++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
  1.1888 ++	    _M_data->_M_atoms[__i] =
  1.1889 ++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
  1.1890 ++	}
  1.1891 ++      else
  1.1892 ++	{
  1.1893 ++	  // Named locale.
  1.1894 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1895 ++	  __c_locale __old = __uselocale(__cloc);
  1.1896 ++#else
  1.1897 ++	  // Switch to named locale so that mbsrtowcs will work.
  1.1898 ++	  char* __old = strdup(setlocale(LC_ALL, NULL));
  1.1899 ++	  setlocale(LC_ALL, __name);
  1.1900 ++#endif
  1.1901 ++
  1.1902 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.1903 ++#warning fix this... should be monetary
  1.1904 ++#endif
  1.1905 ++#ifdef __UCLIBC__
  1.1906 ++# ifdef __UCLIBC_HAS_XLOCALE__
  1.1907 ++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
  1.1908 ++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
  1.1909 ++# else
  1.1910 ++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
  1.1911 ++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
  1.1912 ++# endif
  1.1913 ++#else
  1.1914 ++          union { char *__s; wchar_t __w; } __u;
  1.1915 ++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
  1.1916 ++	  _M_data->_M_decimal_point = __u.__w;
  1.1917 ++
  1.1918 ++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
  1.1919 ++	  _M_data->_M_thousands_sep = __u.__w;
  1.1920 ++#endif
  1.1921 ++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
  1.1922 ++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.1923 ++
  1.1924 ++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
  1.1925 ++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
  1.1926 ++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
  1.1927 ++
  1.1928 ++	  wchar_t* __wcs_ps = 0;
  1.1929 ++	  wchar_t* __wcs_ns = 0;
  1.1930 ++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
  1.1931 ++	  try
  1.1932 ++            {
  1.1933 ++              mbstate_t __state;
  1.1934 ++              size_t __len;
  1.1935 ++              __len = strlen(__cpossign);
  1.1936 ++              if (__len)
  1.1937 ++                {
  1.1938 ++		  ++__len;
  1.1939 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1940 ++		  __wcs_ps = new wchar_t[__len];
  1.1941 ++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
  1.1942 ++		  _M_data->_M_positive_sign = __wcs_ps;
  1.1943 ++		}
  1.1944 ++	      else
  1.1945 ++		_M_data->_M_positive_sign = L"";
  1.1946 ++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
  1.1947 ++	      
  1.1948 ++	      __len = strlen(__cnegsign);
  1.1949 ++	      if (!__nposn)
  1.1950 ++		_M_data->_M_negative_sign = L"()";
  1.1951 ++	      else if (__len)
  1.1952 ++		{ 
  1.1953 ++		  ++__len;
  1.1954 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1955 ++		  __wcs_ns = new wchar_t[__len];
  1.1956 ++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
  1.1957 ++		  _M_data->_M_negative_sign = __wcs_ns;
  1.1958 ++		}
  1.1959 ++	      else
  1.1960 ++		_M_data->_M_negative_sign = L"";
  1.1961 ++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
  1.1962 ++
  1.1963 ++	      // _Intl == true.
  1.1964 ++	      __len = strlen(__ccurr);
  1.1965 ++	      if (__len)
  1.1966 ++		{
  1.1967 ++		  ++__len;
  1.1968 ++		  memset(&__state, 0, sizeof(mbstate_t));
  1.1969 ++		  wchar_t* __wcs = new wchar_t[__len];
  1.1970 ++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
  1.1971 ++		  _M_data->_M_curr_symbol = __wcs;
  1.1972 ++		}
  1.1973 ++	      else
  1.1974 ++		_M_data->_M_curr_symbol = L"";
  1.1975 ++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
  1.1976 ++	    }
  1.1977 ++          catch (...)
  1.1978 ++	    {
  1.1979 ++	      delete _M_data;
  1.1980 ++              _M_data = 0;
  1.1981 ++	      delete __wcs_ps;
  1.1982 ++	      delete __wcs_ns;	      
  1.1983 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.1984 ++	      __uselocale(__old);
  1.1985 ++#else
  1.1986 ++	      setlocale(LC_ALL, __old);
  1.1987 ++	      free(__old);
  1.1988 ++#endif
  1.1989 ++              __throw_exception_again;
  1.1990 ++	    }
  1.1991 ++
  1.1992 ++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
  1.1993 ++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
  1.1994 ++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
  1.1995 ++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
  1.1996 ++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
  1.1997 ++	                                                __pposn);
  1.1998 ++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
  1.1999 ++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
  1.2000 ++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
  1.2001 ++	                                                __nposn);
  1.2002 ++
  1.2003 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.2004 ++	  __uselocale(__old);
  1.2005 ++#else
  1.2006 ++	  setlocale(LC_ALL, __old);
  1.2007 ++	  free(__old);
  1.2008 ++#endif
  1.2009 ++	}
  1.2010 ++    }
  1.2011 ++
  1.2012 ++  template<> 
  1.2013 ++    moneypunct<wchar_t, true>::~moneypunct()
  1.2014 ++    {
  1.2015 ++      if (_M_data->_M_positive_sign_size)
  1.2016 ++	delete [] _M_data->_M_positive_sign;
  1.2017 ++      if (_M_data->_M_negative_sign_size
  1.2018 ++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
  1.2019 ++	delete [] _M_data->_M_negative_sign;
  1.2020 ++      if (_M_data->_M_curr_symbol_size)
  1.2021 ++	delete [] _M_data->_M_curr_symbol;
  1.2022 ++      delete _M_data;
  1.2023 ++    }
  1.2024 ++
  1.2025 ++  template<> 
  1.2026 ++    moneypunct<wchar_t, false>::~moneypunct()
  1.2027 ++    {
  1.2028 ++      if (_M_data->_M_positive_sign_size)
  1.2029 ++	delete [] _M_data->_M_positive_sign;
  1.2030 ++      if (_M_data->_M_negative_sign_size
  1.2031 ++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
  1.2032 ++	delete [] _M_data->_M_negative_sign;
  1.2033 ++      if (_M_data->_M_curr_symbol_size)
  1.2034 ++	delete [] _M_data->_M_curr_symbol;
  1.2035 ++      delete _M_data;
  1.2036 ++    }
  1.2037 ++#endif
  1.2038 ++}
  1.2039 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc
  1.2040 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc	1970-01-01 01:00:00.000000000 +0100
  1.2041 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2007-08-03 20:30:21.000000000 +0200
  1.2042 +@@ -0,0 +1,160 @@
  1.2043 ++// std::numpunct implementation details, GNU version -*- C++ -*-
  1.2044 ++
  1.2045 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
  1.2046 ++//
  1.2047 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.2048 ++// software; you can redistribute it and/or modify it under the
  1.2049 ++// terms of the GNU General Public License as published by the
  1.2050 ++// Free Software Foundation; either version 2, or (at your option)
  1.2051 ++// any later version.
  1.2052 ++
  1.2053 ++// This library is distributed in the hope that it will be useful,
  1.2054 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.2055 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.2056 ++// GNU General Public License for more details.
  1.2057 ++
  1.2058 ++// You should have received a copy of the GNU General Public License along
  1.2059 ++// with this library; see the file COPYING.  If not, write to the Free
  1.2060 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.2061 ++// USA.
  1.2062 ++
  1.2063 ++// As a special exception, you may use this file as part of a free software
  1.2064 ++// library without restriction.  Specifically, if other files instantiate
  1.2065 ++// templates or use macros or inline functions from this file, or you compile
  1.2066 ++// this file and link it with other files to produce an executable, this
  1.2067 ++// file does not by itself cause the resulting executable to be covered by
  1.2068 ++// the GNU General Public License.  This exception does not however
  1.2069 ++// invalidate any other reasons why the executable file might be covered by
  1.2070 ++// the GNU General Public License.
  1.2071 ++
  1.2072 ++//
  1.2073 ++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
  1.2074 ++//
  1.2075 ++
  1.2076 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.2077 ++
  1.2078 ++#define _LIBC
  1.2079 ++#include <locale>
  1.2080 ++#undef _LIBC
  1.2081 ++#include <bits/c++locale_internal.h>
  1.2082 ++
  1.2083 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.2084 ++#warning tailor for stub locale support
  1.2085 ++#endif
  1.2086 ++#ifndef __UCLIBC_HAS_XLOCALE__
  1.2087 ++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
  1.2088 ++#endif
  1.2089 ++
  1.2090 ++namespace std
  1.2091 ++{
  1.2092 ++  template<> 
  1.2093 ++    void
  1.2094 ++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
  1.2095 ++    {
  1.2096 ++      if (!_M_data)
  1.2097 ++	_M_data = new __numpunct_cache<char>;
  1.2098 ++
  1.2099 ++      if (!__cloc)
  1.2100 ++	{
  1.2101 ++	  // "C" locale
  1.2102 ++	  _M_data->_M_grouping = "";
  1.2103 ++	  _M_data->_M_grouping_size = 0;
  1.2104 ++	  _M_data->_M_use_grouping = false;
  1.2105 ++
  1.2106 ++	  _M_data->_M_decimal_point = '.';
  1.2107 ++	  _M_data->_M_thousands_sep = ',';
  1.2108 ++
  1.2109 ++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
  1.2110 ++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
  1.2111 ++
  1.2112 ++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
  1.2113 ++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
  1.2114 ++	}
  1.2115 ++      else
  1.2116 ++	{
  1.2117 ++	  // Named locale.
  1.2118 ++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
  1.2119 ++							__cloc));
  1.2120 ++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
  1.2121 ++							__cloc));
  1.2122 ++
  1.2123 ++	  // Check for NULL, which implies no grouping.
  1.2124 ++	  if (_M_data->_M_thousands_sep == '\0')
  1.2125 ++	    _M_data->_M_grouping = "";
  1.2126 ++	  else
  1.2127 ++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
  1.2128 ++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.2129 ++	}
  1.2130 ++
  1.2131 ++      // NB: There is no way to extact this info from posix locales.
  1.2132 ++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
  1.2133 ++      _M_data->_M_truename = "true";
  1.2134 ++      _M_data->_M_truename_size = 4;
  1.2135 ++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
  1.2136 ++      _M_data->_M_falsename = "false";
  1.2137 ++      _M_data->_M_falsename_size = 5;
  1.2138 ++    }
  1.2139 ++ 
  1.2140 ++  template<> 
  1.2141 ++    numpunct<char>::~numpunct()
  1.2142 ++    { delete _M_data; }
  1.2143 ++   
  1.2144 ++#ifdef _GLIBCXX_USE_WCHAR_T
  1.2145 ++  template<> 
  1.2146 ++    void
  1.2147 ++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
  1.2148 ++    {
  1.2149 ++      if (!_M_data)
  1.2150 ++	_M_data = new __numpunct_cache<wchar_t>;
  1.2151 ++
  1.2152 ++      if (!__cloc)
  1.2153 ++	{
  1.2154 ++	  // "C" locale
  1.2155 ++	  _M_data->_M_grouping = "";
  1.2156 ++	  _M_data->_M_grouping_size = 0;
  1.2157 ++	  _M_data->_M_use_grouping = false;
  1.2158 ++
  1.2159 ++	  _M_data->_M_decimal_point = L'.';
  1.2160 ++	  _M_data->_M_thousands_sep = L',';
  1.2161 ++
  1.2162 ++	  // Use ctype::widen code without the facet...
  1.2163 ++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
  1.2164 ++	    _M_data->_M_atoms_out[__i] =
  1.2165 ++	      static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
  1.2166 ++
  1.2167 ++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
  1.2168 ++	    _M_data->_M_atoms_in[__j] =
  1.2169 ++	      static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
  1.2170 ++	}
  1.2171 ++      else
  1.2172 ++	{
  1.2173 ++	  // Named locale.
  1.2174 ++	  // NB: In the GNU model wchar_t is always 32 bit wide.
  1.2175 ++	  union { char *__s; wchar_t __w; } __u;
  1.2176 ++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
  1.2177 ++	  _M_data->_M_decimal_point = __u.__w;
  1.2178 ++
  1.2179 ++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
  1.2180 ++	  _M_data->_M_thousands_sep = __u.__w;
  1.2181 ++
  1.2182 ++	  if (_M_data->_M_thousands_sep == L'\0')
  1.2183 ++	    _M_data->_M_grouping = "";
  1.2184 ++	  else
  1.2185 ++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
  1.2186 ++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
  1.2187 ++	}
  1.2188 ++
  1.2189 ++      // NB: There is no way to extact this info from posix locales.
  1.2190 ++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
  1.2191 ++      _M_data->_M_truename = L"true";
  1.2192 ++      _M_data->_M_truename_size = 4;
  1.2193 ++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
  1.2194 ++      _M_data->_M_falsename = L"false";
  1.2195 ++      _M_data->_M_falsename_size = 5;
  1.2196 ++    }
  1.2197 ++
  1.2198 ++  template<> 
  1.2199 ++    numpunct<wchar_t>::~numpunct()
  1.2200 ++    { delete _M_data; }
  1.2201 ++ #endif
  1.2202 ++}
  1.2203 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.cc
  1.2204 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.cc	1970-01-01 01:00:00.000000000 +0100
  1.2205 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.cc	2007-08-03 20:30:21.000000000 +0200
  1.2206 +@@ -0,0 +1,406 @@
  1.2207 ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
  1.2208 ++
  1.2209 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
  1.2210 ++//
  1.2211 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.2212 ++// software; you can redistribute it and/or modify it under the
  1.2213 ++// terms of the GNU General Public License as published by the
  1.2214 ++// Free Software Foundation; either version 2, or (at your option)
  1.2215 ++// any later version.
  1.2216 ++
  1.2217 ++// This library is distributed in the hope that it will be useful,
  1.2218 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.2219 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.2220 ++// GNU General Public License for more details.
  1.2221 ++
  1.2222 ++// You should have received a copy of the GNU General Public License along
  1.2223 ++// with this library; see the file COPYING.  If not, write to the Free
  1.2224 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.2225 ++// USA.
  1.2226 ++
  1.2227 ++// As a special exception, you may use this file as part of a free software
  1.2228 ++// library without restriction.  Specifically, if other files instantiate
  1.2229 ++// templates or use macros or inline functions from this file, or you compile
  1.2230 ++// this file and link it with other files to produce an executable, this
  1.2231 ++// file does not by itself cause the resulting executable to be covered by
  1.2232 ++// the GNU General Public License.  This exception does not however
  1.2233 ++// invalidate any other reasons why the executable file might be covered by
  1.2234 ++// the GNU General Public License.
  1.2235 ++
  1.2236 ++//
  1.2237 ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
  1.2238 ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
  1.2239 ++//
  1.2240 ++
  1.2241 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.2242 ++
  1.2243 ++#include <locale>
  1.2244 ++#include <bits/c++locale_internal.h>
  1.2245 ++
  1.2246 ++#ifdef __UCLIBC_MJN3_ONLY__
  1.2247 ++#warning tailor for stub locale support
  1.2248 ++#endif
  1.2249 ++#ifndef __UCLIBC_HAS_XLOCALE__
  1.2250 ++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
  1.2251 ++#endif
  1.2252 ++
  1.2253 ++namespace std
  1.2254 ++{
  1.2255 ++  template<>
  1.2256 ++    void
  1.2257 ++    __timepunct<char>::
  1.2258 ++    _M_put(char* __s, size_t __maxlen, const char* __format, 
  1.2259 ++	   const tm* __tm) const
  1.2260 ++    {
  1.2261 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.2262 ++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
  1.2263 ++					_M_c_locale_timepunct);
  1.2264 ++#else
  1.2265 ++      char* __old = strdup(setlocale(LC_ALL, NULL));
  1.2266 ++      setlocale(LC_ALL, _M_name_timepunct);
  1.2267 ++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
  1.2268 ++      setlocale(LC_ALL, __old);
  1.2269 ++      free(__old);
  1.2270 ++#endif
  1.2271 ++      // Make sure __s is null terminated.
  1.2272 ++      if (__len == 0)
  1.2273 ++	__s[0] = '\0';
  1.2274 ++    }
  1.2275 ++
  1.2276 ++  template<> 
  1.2277 ++    void
  1.2278 ++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
  1.2279 ++    {
  1.2280 ++      if (!_M_data)
  1.2281 ++	_M_data = new __timepunct_cache<char>;
  1.2282 ++
  1.2283 ++      if (!__cloc)
  1.2284 ++	{
  1.2285 ++	  // "C" locale
  1.2286 ++	  _M_c_locale_timepunct = _S_get_c_locale();
  1.2287 ++
  1.2288 ++	  _M_data->_M_date_format = "%m/%d/%y";
  1.2289 ++	  _M_data->_M_date_era_format = "%m/%d/%y";
  1.2290 ++	  _M_data->_M_time_format = "%H:%M:%S";
  1.2291 ++	  _M_data->_M_time_era_format = "%H:%M:%S";
  1.2292 ++	  _M_data->_M_date_time_format = "";
  1.2293 ++	  _M_data->_M_date_time_era_format = "";
  1.2294 ++	  _M_data->_M_am = "AM";
  1.2295 ++	  _M_data->_M_pm = "PM";
  1.2296 ++	  _M_data->_M_am_pm_format = "";
  1.2297 ++
  1.2298 ++	  // Day names, starting with "C"'s Sunday.
  1.2299 ++	  _M_data->_M_day1 = "Sunday";
  1.2300 ++	  _M_data->_M_day2 = "Monday";
  1.2301 ++	  _M_data->_M_day3 = "Tuesday";
  1.2302 ++	  _M_data->_M_day4 = "Wednesday";
  1.2303 ++	  _M_data->_M_day5 = "Thursday";
  1.2304 ++	  _M_data->_M_day6 = "Friday";
  1.2305 ++	  _M_data->_M_day7 = "Saturday";
  1.2306 ++
  1.2307 ++	  // Abbreviated day names, starting with "C"'s Sun.
  1.2308 ++	  _M_data->_M_aday1 = "Sun";
  1.2309 ++	  _M_data->_M_aday2 = "Mon";
  1.2310 ++	  _M_data->_M_aday3 = "Tue";
  1.2311 ++	  _M_data->_M_aday4 = "Wed";
  1.2312 ++	  _M_data->_M_aday5 = "Thu";
  1.2313 ++	  _M_data->_M_aday6 = "Fri";
  1.2314 ++	  _M_data->_M_aday7 = "Sat";
  1.2315 ++
  1.2316 ++	  // Month names, starting with "C"'s January.
  1.2317 ++	  _M_data->_M_month01 = "January";
  1.2318 ++	  _M_data->_M_month02 = "February";
  1.2319 ++	  _M_data->_M_month03 = "March";
  1.2320 ++	  _M_data->_M_month04 = "April";
  1.2321 ++	  _M_data->_M_month05 = "May";
  1.2322 ++	  _M_data->_M_month06 = "June";
  1.2323 ++	  _M_data->_M_month07 = "July";
  1.2324 ++	  _M_data->_M_month08 = "August";
  1.2325 ++	  _M_data->_M_month09 = "September";
  1.2326 ++	  _M_data->_M_month10 = "October";
  1.2327 ++	  _M_data->_M_month11 = "November";
  1.2328 ++	  _M_data->_M_month12 = "December";
  1.2329 ++
  1.2330 ++	  // Abbreviated month names, starting with "C"'s Jan.
  1.2331 ++	  _M_data->_M_amonth01 = "Jan";
  1.2332 ++	  _M_data->_M_amonth02 = "Feb";
  1.2333 ++	  _M_data->_M_amonth03 = "Mar";
  1.2334 ++	  _M_data->_M_amonth04 = "Apr";
  1.2335 ++	  _M_data->_M_amonth05 = "May";
  1.2336 ++	  _M_data->_M_amonth06 = "Jun";
  1.2337 ++	  _M_data->_M_amonth07 = "Jul";
  1.2338 ++	  _M_data->_M_amonth08 = "Aug";
  1.2339 ++	  _M_data->_M_amonth09 = "Sep";
  1.2340 ++	  _M_data->_M_amonth10 = "Oct";
  1.2341 ++	  _M_data->_M_amonth11 = "Nov";
  1.2342 ++	  _M_data->_M_amonth12 = "Dec";
  1.2343 ++	}
  1.2344 ++      else
  1.2345 ++	{
  1.2346 ++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
  1.2347 ++
  1.2348 ++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
  1.2349 ++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
  1.2350 ++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
  1.2351 ++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
  1.2352 ++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
  1.2353 ++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
  1.2354 ++							     __cloc);
  1.2355 ++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
  1.2356 ++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
  1.2357 ++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
  1.2358 ++
  1.2359 ++	  // Day names, starting with "C"'s Sunday.
  1.2360 ++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
  1.2361 ++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
  1.2362 ++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
  1.2363 ++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
  1.2364 ++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
  1.2365 ++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
  1.2366 ++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
  1.2367 ++
  1.2368 ++	  // Abbreviated day names, starting with "C"'s Sun.
  1.2369 ++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
  1.2370 ++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
  1.2371 ++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
  1.2372 ++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
  1.2373 ++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
  1.2374 ++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
  1.2375 ++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
  1.2376 ++
  1.2377 ++	  // Month names, starting with "C"'s January.
  1.2378 ++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
  1.2379 ++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
  1.2380 ++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
  1.2381 ++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
  1.2382 ++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
  1.2383 ++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
  1.2384 ++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
  1.2385 ++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
  1.2386 ++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
  1.2387 ++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
  1.2388 ++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
  1.2389 ++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
  1.2390 ++
  1.2391 ++	  // Abbreviated month names, starting with "C"'s Jan.
  1.2392 ++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
  1.2393 ++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
  1.2394 ++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
  1.2395 ++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
  1.2396 ++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
  1.2397 ++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
  1.2398 ++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
  1.2399 ++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
  1.2400 ++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
  1.2401 ++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
  1.2402 ++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
  1.2403 ++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
  1.2404 ++	}
  1.2405 ++    }
  1.2406 ++
  1.2407 ++#ifdef _GLIBCXX_USE_WCHAR_T
  1.2408 ++  template<>
  1.2409 ++    void
  1.2410 ++    __timepunct<wchar_t>::
  1.2411 ++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
  1.2412 ++	   const tm* __tm) const
  1.2413 ++    {
  1.2414 ++#ifdef __UCLIBC_HAS_XLOCALE__
  1.2415 ++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
  1.2416 ++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
  1.2417 ++					_M_c_locale_timepunct);
  1.2418 ++#else
  1.2419 ++      char* __old = strdup(setlocale(LC_ALL, NULL));
  1.2420 ++      setlocale(LC_ALL, _M_name_timepunct);
  1.2421 ++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
  1.2422 ++      setlocale(LC_ALL, __old);
  1.2423 ++      free(__old);
  1.2424 ++#endif
  1.2425 ++      // Make sure __s is null terminated.
  1.2426 ++      if (__len == 0)
  1.2427 ++	__s[0] = L'\0';
  1.2428 ++    }
  1.2429 ++
  1.2430 ++  template<> 
  1.2431 ++    void
  1.2432 ++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
  1.2433 ++    {
  1.2434 ++      if (!_M_data)
  1.2435 ++	_M_data = new __timepunct_cache<wchar_t>;
  1.2436 ++
  1.2437 ++#warning wide time stuff
  1.2438 ++//       if (!__cloc)
  1.2439 ++	{
  1.2440 ++	  // "C" locale
  1.2441 ++	  _M_c_locale_timepunct = _S_get_c_locale();
  1.2442 ++
  1.2443 ++	  _M_data->_M_date_format = L"%m/%d/%y";
  1.2444 ++	  _M_data->_M_date_era_format = L"%m/%d/%y";
  1.2445 ++	  _M_data->_M_time_format = L"%H:%M:%S";
  1.2446 ++	  _M_data->_M_time_era_format = L"%H:%M:%S";
  1.2447 ++	  _M_data->_M_date_time_format = L"";
  1.2448 ++	  _M_data->_M_date_time_era_format = L"";
  1.2449 ++	  _M_data->_M_am = L"AM";
  1.2450 ++	  _M_data->_M_pm = L"PM";
  1.2451 ++	  _M_data->_M_am_pm_format = L"";
  1.2452 ++
  1.2453 ++	  // Day names, starting with "C"'s Sunday.
  1.2454 ++	  _M_data->_M_day1 = L"Sunday";
  1.2455 ++	  _M_data->_M_day2 = L"Monday";
  1.2456 ++	  _M_data->_M_day3 = L"Tuesday";
  1.2457 ++	  _M_data->_M_day4 = L"Wednesday";
  1.2458 ++	  _M_data->_M_day5 = L"Thursday";
  1.2459 ++	  _M_data->_M_day6 = L"Friday";
  1.2460 ++	  _M_data->_M_day7 = L"Saturday";
  1.2461 ++
  1.2462 ++	  // Abbreviated day names, starting with "C"'s Sun.
  1.2463 ++	  _M_data->_M_aday1 = L"Sun";
  1.2464 ++	  _M_data->_M_aday2 = L"Mon";
  1.2465 ++	  _M_data->_M_aday3 = L"Tue";
  1.2466 ++	  _M_data->_M_aday4 = L"Wed";
  1.2467 ++	  _M_data->_M_aday5 = L"Thu";
  1.2468 ++	  _M_data->_M_aday6 = L"Fri";
  1.2469 ++	  _M_data->_M_aday7 = L"Sat";
  1.2470 ++
  1.2471 ++	  // Month names, starting with "C"'s January.
  1.2472 ++	  _M_data->_M_month01 = L"January";
  1.2473 ++	  _M_data->_M_month02 = L"February";
  1.2474 ++	  _M_data->_M_month03 = L"March";
  1.2475 ++	  _M_data->_M_month04 = L"April";
  1.2476 ++	  _M_data->_M_month05 = L"May";
  1.2477 ++	  _M_data->_M_month06 = L"June";
  1.2478 ++	  _M_data->_M_month07 = L"July";
  1.2479 ++	  _M_data->_M_month08 = L"August";
  1.2480 ++	  _M_data->_M_month09 = L"September";
  1.2481 ++	  _M_data->_M_month10 = L"October";
  1.2482 ++	  _M_data->_M_month11 = L"November";
  1.2483 ++	  _M_data->_M_month12 = L"December";
  1.2484 ++
  1.2485 ++	  // Abbreviated month names, starting with "C"'s Jan.
  1.2486 ++	  _M_data->_M_amonth01 = L"Jan";
  1.2487 ++	  _M_data->_M_amonth02 = L"Feb";
  1.2488 ++	  _M_data->_M_amonth03 = L"Mar";
  1.2489 ++	  _M_data->_M_amonth04 = L"Apr";
  1.2490 ++	  _M_data->_M_amonth05 = L"May";
  1.2491 ++	  _M_data->_M_amonth06 = L"Jun";
  1.2492 ++	  _M_data->_M_amonth07 = L"Jul";
  1.2493 ++	  _M_data->_M_amonth08 = L"Aug";
  1.2494 ++	  _M_data->_M_amonth09 = L"Sep";
  1.2495 ++	  _M_data->_M_amonth10 = L"Oct";
  1.2496 ++	  _M_data->_M_amonth11 = L"Nov";
  1.2497 ++	  _M_data->_M_amonth12 = L"Dec";
  1.2498 ++	}
  1.2499 ++#if 0
  1.2500 ++      else
  1.2501 ++	{
  1.2502 ++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
  1.2503 ++
  1.2504 ++	  union { char *__s; wchar_t *__w; } __u;
  1.2505 ++
  1.2506 ++	  __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
  1.2507 ++	  _M_data->_M_date_format = __u.__w;
  1.2508 ++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
  1.2509 ++	  _M_data->_M_date_era_format = __u.__w;
  1.2510 ++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
  1.2511 ++	  _M_data->_M_time_format = __u.__w;
  1.2512 ++	  __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
  1.2513 ++	  _M_data->_M_time_era_format = __u.__w;
  1.2514 ++	  __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
  1.2515 ++	  _M_data->_M_date_time_format = __u.__w;
  1.2516 ++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
  1.2517 ++	  _M_data->_M_date_time_era_format = __u.__w;
  1.2518 ++	  __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
  1.2519 ++	  _M_data->_M_am = __u.__w;
  1.2520 ++	  __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
  1.2521 ++	  _M_data->_M_pm = __u.__w;
  1.2522 ++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
  1.2523 ++	  _M_data->_M_am_pm_format = __u.__w;
  1.2524 ++
  1.2525 ++	  // Day names, starting with "C"'s Sunday.
  1.2526 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
  1.2527 ++	  _M_data->_M_day1 = __u.__w;
  1.2528 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
  1.2529 ++	  _M_data->_M_day2 = __u.__w;
  1.2530 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
  1.2531 ++	  _M_data->_M_day3 = __u.__w;
  1.2532 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
  1.2533 ++	  _M_data->_M_day4 = __u.__w;
  1.2534 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
  1.2535 ++	  _M_data->_M_day5 = __u.__w;
  1.2536 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
  1.2537 ++	  _M_data->_M_day6 = __u.__w;
  1.2538 ++	  __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
  1.2539 ++	  _M_data->_M_day7 = __u.__w;
  1.2540 ++
  1.2541 ++	  // Abbreviated day names, starting with "C"'s Sun.
  1.2542 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
  1.2543 ++	  _M_data->_M_aday1 = __u.__w;
  1.2544 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
  1.2545 ++	  _M_data->_M_aday2 = __u.__w;
  1.2546 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
  1.2547 ++	  _M_data->_M_aday3 = __u.__w;
  1.2548 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
  1.2549 ++	  _M_data->_M_aday4 = __u.__w;
  1.2550 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
  1.2551 ++	  _M_data->_M_aday5 = __u.__w;
  1.2552 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
  1.2553 ++	  _M_data->_M_aday6 = __u.__w;
  1.2554 ++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
  1.2555 ++	  _M_data->_M_aday7 = __u.__w;
  1.2556 ++
  1.2557 ++	  // Month names, starting with "C"'s January.
  1.2558 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
  1.2559 ++	  _M_data->_M_month01 = __u.__w;
  1.2560 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
  1.2561 ++	  _M_data->_M_month02 = __u.__w;
  1.2562 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
  1.2563 ++	  _M_data->_M_month03 = __u.__w;
  1.2564 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
  1.2565 ++	  _M_data->_M_month04 = __u.__w;
  1.2566 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
  1.2567 ++	  _M_data->_M_month05 = __u.__w;
  1.2568 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
  1.2569 ++	  _M_data->_M_month06 = __u.__w;
  1.2570 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
  1.2571 ++	  _M_data->_M_month07 = __u.__w;
  1.2572 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
  1.2573 ++	  _M_data->_M_month08 = __u.__w;
  1.2574 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
  1.2575 ++	  _M_data->_M_month09 = __u.__w;
  1.2576 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
  1.2577 ++	  _M_data->_M_month10 = __u.__w;
  1.2578 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
  1.2579 ++	  _M_data->_M_month11 = __u.__w;
  1.2580 ++	  __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
  1.2581 ++	  _M_data->_M_month12 = __u.__w;
  1.2582 ++
  1.2583 ++	  // Abbreviated month names, starting with "C"'s Jan.
  1.2584 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
  1.2585 ++	  _M_data->_M_amonth01 = __u.__w;
  1.2586 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
  1.2587 ++	  _M_data->_M_amonth02 = __u.__w;
  1.2588 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
  1.2589 ++	  _M_data->_M_amonth03 = __u.__w;
  1.2590 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
  1.2591 ++	  _M_data->_M_amonth04 = __u.__w;
  1.2592 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
  1.2593 ++	  _M_data->_M_amonth05 = __u.__w;
  1.2594 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
  1.2595 ++	  _M_data->_M_amonth06 = __u.__w;
  1.2596 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
  1.2597 ++	  _M_data->_M_amonth07 = __u.__w;
  1.2598 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
  1.2599 ++	  _M_data->_M_amonth08 = __u.__w;
  1.2600 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
  1.2601 ++	  _M_data->_M_amonth09 = __u.__w;
  1.2602 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
  1.2603 ++	  _M_data->_M_amonth10 = __u.__w;
  1.2604 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
  1.2605 ++	  _M_data->_M_amonth11 = __u.__w;
  1.2606 ++	  __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
  1.2607 ++	  _M_data->_M_amonth12 = __u.__w;
  1.2608 ++	}
  1.2609 ++#endif // 0
  1.2610 ++    }
  1.2611 ++#endif
  1.2612 ++}
  1.2613 +diff -durN gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.h
  1.2614 +--- gcc-4.2.1.orig/libstdc++-v3/config/locale/uclibc/time_members.h	1970-01-01 01:00:00.000000000 +0100
  1.2615 ++++ gcc-4.2.1/libstdc++-v3/config/locale/uclibc/time_members.h	2007-08-03 20:30:21.000000000 +0200
  1.2616 +@@ -0,0 +1,68 @@
  1.2617 ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
  1.2618 ++
  1.2619 ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
  1.2620 ++//
  1.2621 ++// This file is part of the GNU ISO C++ Library.  This library is free
  1.2622 ++// software; you can redistribute it and/or modify it under the
  1.2623 ++// terms of the GNU General Public License as published by the
  1.2624 ++// Free Software Foundation; either version 2, or (at your option)
  1.2625 ++// any later version.
  1.2626 ++
  1.2627 ++// This library is distributed in the hope that it will be useful,
  1.2628 ++// but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.2629 ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.2630 ++// GNU General Public License for more details.
  1.2631 ++
  1.2632 ++// You should have received a copy of the GNU General Public License along
  1.2633 ++// with this library; see the file COPYING.  If not, write to the Free
  1.2634 ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  1.2635 ++// USA.
  1.2636 ++
  1.2637 ++// As a special exception, you may use this file as part of a free software
  1.2638 ++// library without restriction.  Specifically, if other files instantiate
  1.2639 ++// templates or use macros or inline functions from this file, or you compile
  1.2640 ++// this file and link it with other files to produce an executable, this
  1.2641 ++// file does not by itself cause the resulting executable to be covered by
  1.2642 ++// the GNU General Public License.  This exception does not however
  1.2643 ++// invalidate any other reasons why the executable file might be covered by
  1.2644 ++// the GNU General Public License.
  1.2645 ++
  1.2646 ++//
  1.2647 ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
  1.2648 ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
  1.2649 ++//
  1.2650 ++
  1.2651 ++// Written by Benjamin Kosnik <bkoz@redhat.com>
  1.2652 ++
  1.2653 ++  template<typename _CharT>
  1.2654 ++    __timepunct<_CharT>::__timepunct(size_t __refs) 
  1.2655 ++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
  1.2656 ++    _M_name_timepunct(_S_get_c_name())
  1.2657 ++    { _M_initialize_timepunct(); }
  1.2658 ++
  1.2659 ++  template<typename _CharT>
  1.2660 ++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
  1.2661 ++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
  1.2662 ++    _M_name_timepunct(_S_get_c_name())
  1.2663 ++    { _M_initialize_timepunct(); }
  1.2664 ++
  1.2665 ++  template<typename _CharT>
  1.2666 ++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
  1.2667 ++				     size_t __refs) 
  1.2668 ++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
  1.2669 ++    _M_name_timepunct(__s)
  1.2670 ++    { 
  1.2671 ++      char* __tmp = new char[std::strlen(__s) + 1];
  1.2672 ++      std::strcpy(__tmp, __s);
  1.2673 ++      _M_name_timepunct = __tmp;
  1.2674 ++      _M_initialize_timepunct(__cloc); 
  1.2675 ++    }
  1.2676 ++
  1.2677 ++  template<typename _CharT>
  1.2678 ++    __timepunct<_CharT>::~__timepunct()
  1.2679 ++    { 
  1.2680 ++      if (_M_name_timepunct != _S_get_c_name())
  1.2681 ++	delete [] _M_name_timepunct;
  1.2682 ++      delete _M_data; 
  1.2683 ++      _S_destroy_c_locale(_M_c_locale_timepunct); 
  1.2684 ++    }
  1.2685 +diff -durN gcc-4.2.1.orig/libstdc++-v3/configure gcc-4.2.1/libstdc++-v3/configure
  1.2686 +--- gcc-4.2.1.orig/libstdc++-v3/configure	2007-08-03 20:29:22.000000000 +0200
  1.2687 ++++ gcc-4.2.1/libstdc++-v3/configure	2007-08-03 20:30:21.000000000 +0200
  1.2688 +@@ -5769,7 +5769,7 @@
  1.2689 +   enableval="$enable_clocale"
  1.2690 + 
  1.2691 +       case "$enableval" in
  1.2692 +-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
  1.2693 ++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
  1.2694 +        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
  1.2695 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
  1.2696 +    { (exit 1); exit 1; }; } ;;
  1.2697 +@@ -5802,6 +5802,9 @@
  1.2698 +   # Default to "generic".
  1.2699 +   if test $enable_clocale_flag = auto; then
  1.2700 +     case ${target_os} in
  1.2701 ++      linux-uclibc*)
  1.2702 ++        enable_clocale_flag=uclibc
  1.2703 ++	;;
  1.2704 +       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
  1.2705 +         enable_clocale_flag=gnu
  1.2706 +         ;;
  1.2707 +@@ -6190,6 +6193,76 @@
  1.2708 +       CTIME_CC=config/locale/generic/time_members.cc
  1.2709 +       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
  1.2710 +       ;;
  1.2711 ++    uclibc)
  1.2712 ++      echo "$as_me:$LINENO: result: uclibc" >&5
  1.2713 ++echo "${ECHO_T}uclibc" >&6
  1.2714 ++
  1.2715 ++      # Declare intention to use gettext, and add support for specific
  1.2716 ++      # languages.
  1.2717 ++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
  1.2718 ++      ALL_LINGUAS="de fr"
  1.2719 ++
  1.2720 ++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
  1.2721 ++      # Extract the first word of "msgfmt", so it can be a program name with args.
  1.2722 ++set dummy msgfmt; ac_word=$2
  1.2723 ++echo "$as_me:$LINENO: checking for $ac_word" >&5
  1.2724 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
  1.2725 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
  1.2726 ++  echo $ECHO_N "(cached) $ECHO_C" >&6
  1.2727 ++else
  1.2728 ++  if test -n "$check_msgfmt"; then
  1.2729 ++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
  1.2730 ++else
  1.2731 ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
  1.2732 ++for as_dir in $PATH
  1.2733 ++do
  1.2734 ++  IFS=$as_save_IFS
  1.2735 ++  test -z "$as_dir" && as_dir=.
  1.2736 ++  for ac_exec_ext in '' $ac_executable_extensions; do
  1.2737 ++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
  1.2738 ++    ac_cv_prog_check_msgfmt="yes"
  1.2739 ++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
  1.2740 ++    break 2
  1.2741 ++  fi
  1.2742 ++done
  1.2743 ++done
  1.2744 ++
  1.2745 ++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
  1.2746 ++fi
  1.2747 ++fi
  1.2748 ++check_msgfmt=$ac_cv_prog_check_msgfmt
  1.2749 ++if test -n "$check_msgfmt"; then
  1.2750 ++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
  1.2751 ++echo "${ECHO_T}$check_msgfmt" >&6
  1.2752 ++else
  1.2753 ++  echo "$as_me:$LINENO: result: no" >&5
  1.2754 ++echo "${ECHO_T}no" >&6
  1.2755 ++fi
  1.2756 ++
  1.2757 ++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
  1.2758 ++        USE_NLS=yes
  1.2759 ++      fi
  1.2760 ++      # Export the build objects.
  1.2761 ++      for ling in $ALL_LINGUAS; do \
  1.2762 ++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
  1.2763 ++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
  1.2764 ++      done
  1.2765 ++
  1.2766 ++
  1.2767 ++
  1.2768 ++      CLOCALE_H=config/locale/uclibc/c_locale.h
  1.2769 ++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
  1.2770 ++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
  1.2771 ++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
  1.2772 ++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
  1.2773 ++      CMESSAGES_H=config/locale/uclibc/messages_members.h
  1.2774 ++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
  1.2775 ++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
  1.2776 ++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
  1.2777 ++      CTIME_H=config/locale/uclibc/time_members.h
  1.2778 ++      CTIME_CC=config/locale/uclibc/time_members.cc
  1.2779 ++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
  1.2780 ++      ;;
  1.2781 +   esac
  1.2782 + 
  1.2783 +   # This is where the testsuite looks for locale catalogs, using the
  1.2784 +diff -durN gcc-4.2.1.orig/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.2.1/libstdc++-v3/include/c_compatibility/wchar.h
  1.2785 +--- gcc-4.2.1.orig/libstdc++-v3/include/c_compatibility/wchar.h	2005-08-17 04:28:44.000000000 +0200
  1.2786 ++++ gcc-4.2.1/libstdc++-v3/include/c_compatibility/wchar.h	2007-08-03 20:30:21.000000000 +0200
  1.2787 +@@ -101,7 +101,9 @@
  1.2788 + using std::wmemcpy;
  1.2789 + using std::wmemmove;
  1.2790 + using std::wmemset;
  1.2791 ++#if _GLIBCXX_HAVE_WCSFTIME
  1.2792 + using std::wcsftime;
  1.2793 ++#endif
  1.2794 + 
  1.2795 + #if _GLIBCXX_USE_C99
  1.2796 + using std::wcstold;
  1.2797 +diff -durN gcc-4.2.1.orig/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.2.1/libstdc++-v3/include/c_std/std_cwchar.h
  1.2798 +--- gcc-4.2.1.orig/libstdc++-v3/include/c_std/std_cwchar.h	2006-12-07 10:33:51.000000000 +0100
  1.2799 ++++ gcc-4.2.1/libstdc++-v3/include/c_std/std_cwchar.h	2007-08-03 20:30:21.000000000 +0200
  1.2800 +@@ -182,7 +182,9 @@
  1.2801 +   using ::wcscoll;
  1.2802 +   using ::wcscpy;
  1.2803 +   using ::wcscspn;
  1.2804 ++#if _GLIBCXX_HAVE_WCSFTIME
  1.2805 +   using ::wcsftime;
  1.2806 ++#endif
  1.2807 +   using ::wcslen;
  1.2808 +   using ::wcsncat;
  1.2809 +   using ::wcsncmp;