--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/stdcxx/patches/078-tests.localization.patch Thu Jul 14 11:26:11 2011 -0700
@@ -0,0 +1,584 @@
+--- stdcxx-4.2.1/tests/src/locale.cpp 2008-04-24 17:23:00.000000000 -0700
++++ stdcxx-4.2.1/tests/src/locale.cpp 2011-02-23 15:23:26.419730197 -0800
+@@ -411,8 +411,13 @@
+ // execute a shell command and redirect its output into the file
+ const int exit_status =
+ grep_exp && *grep_exp
++#if defined(__SUNPRO_CC)
++ ? rw_system ("/usr/bin/locale -a | grep \"%s\" > %s", grep_exp, fname)
++ : rw_system ("/usr/bin/locale -a > %s", fname);
++#else
+ ? rw_system ("locale -a | grep \"%s\" > %s", grep_exp, fname)
+ : rw_system ("locale -a > %s", fname);
++#endif
+
+ if (exit_status) {
+ return deflocname; // error
+
+--- stdcxx-4.2.1/tests/localization/22.locale.money.put.mt.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.money.put.mt.cpp 2011-04-06 12:34:13.954979492 -0400
+@@ -65,17 +65,18 @@
+
+ // should all threads share the same set of locale objects instead
+ // of creating their own?
+-int opt_shared_locale;
++static int opt_shared_locale = 0;
++
++// print verbose info messages
++static int opt_verbose = 0;
+
+ /**************************************************************************/
+
+ // array of locale names to use for testing
+-static const char*
+-locales [MAX_THREADS];
++static const char* locales [MAX_THREADS];
+
+ // number of locale names in the array
+-static std::size_t
+-nlocales;
++static std::size_t nlocales;
+
+ /**************************************************************************/
+
+@@ -107,7 +108,7 @@
+ };
+
+ // name of the locale the data corresponds to
+- const char* locale_name_;
++ std::string locale_name_;
+
+ // optionally set to the named locale for threads to share
+ std::locale locale_;
+@@ -191,11 +192,16 @@
+ // facet from it and use it to format a random money value
+ const std::locale loc =
+ opt_shared_locale ? data.locale_
+- : std::locale (data.locale_name_);
++ : std::locale (data.locale_name_.c_str());
+
+ if (test_char) {
+ // exercise the narrow char specialization of the facet
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::money_put<char> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::money_put<char> &np =
+ std::use_facet<std::money_put<char> >(loc);
+
+@@ -219,7 +225,11 @@
+ }
+
+ RW_ASSERT (!nio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::strncmp (ncs, data.ncs_, sizeof (ncs)));
++#else
+ RW_ASSERT (!rw_strncmp (ncs, data.ncs_));
++#endif
+
+ }
+
+@@ -230,6 +240,11 @@
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::money_put<wchar_t> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::money_put<wchar_t> &wp =
+ std::use_facet<std::money_put<wchar_t> >(loc);
+
+@@ -253,7 +268,11 @@
+ }
+
+ RW_ASSERT (!wio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::wcsncmp (wcs, data.wcs_, sizeof (wcs)));
++#else
+ RW_ASSERT (!rw_strncmp (wcs, data.wcs_));
++#endif
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+@@ -280,6 +299,12 @@
+ wio.rdbuf (&wsb);
+ #endif // _RWSTD_NO_WCHAR_T
+
++ for (size_t i = 0; i < MAX_THREADS; ++i) {
++ locales[i] = 0UL;
++ my_money_data[i].locale_name_ = "";
++ my_money_data[i].locale_ = std::locale();
++ }
++
+ // find all installed locales for which setlocale (LC_ALL) succeeds
+ const char* const locale_list =
+ rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);
+@@ -298,7 +323,7 @@
+ data.locale_name_ = name;
+
+ try {
+- const std::locale loc (data.locale_name_);
++ const std::locale loc (data.locale_name_.c_str());
+
+ // initialize with random but valid values
+
+@@ -343,7 +368,7 @@
+ rw_assert (!nio.fail (), __FILE__, __LINE__,
+ "money_put<char>::put(...) "
+ "failed for locale(%#s)",
+- data.locale_name_);
++ data.locale_name_.c_str());
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
+@@ -372,7 +397,7 @@
+ rw_assert (!nio.fail (), __FILE__, __LINE__,
+ "money_put<wchar_t>::put(...) "
+ "failed for locale(%#s)",
+- data.locale_name_);
++ data.locale_name_.c_str());
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+--- stdcxx-4.2.1/tests/localization/22.locale.num.put.mt.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.num.put.mt.cpp 2011-04-06 12:01:45.334923153 -0400
+@@ -38,7 +38,7 @@
+ #include <valcmp.h>
+
+ #define MAX_THREADS 32
+-#define MAX_LOOPS 100000
++#define MAX_LOOPS 10000
+
+ // default number of threads (will be adjusted to the number
+ // of processors/cores later)
+@@ -62,17 +62,18 @@
+
+ // should all threads share the same set of locale objects instead
+ // of creating their own?
+-int opt_shared_locale;
++static int opt_shared_locale = 0;
++
++// print verbose information messages
++static int opt_verbose = 0;
+
+ /**************************************************************************/
+
+ // array of locale names to use for testing
+-static const char*
+-locales [MAX_THREADS];
++static const char* locales [MAX_THREADS];
+
+ // number of locale names in the array
+-static std::size_t
+-nlocales;
++static std::size_t nlocales;
+
+
+ struct MyNumData {
+@@ -104,7 +105,7 @@
+ };
+
+ // name of the locale the data corresponds to
+- const char* locale_name_;
++ std::string locale_name_;
+
+ // optionally set to the named locale for threads to share
+ std::locale locale_;
+@@ -245,11 +246,16 @@
+ // so that the locale is used not only by the num_put facet
+ const std::locale loc =
+ opt_shared_locale ? data.locale_
+- : std::locale (data.locale_name_);
++ : std::locale (data.locale_name_.c_str());
+
+ if (test_char) {
+ // exercise the narrow char specialization of the facet
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::num_put<char> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::num_put<char> &np =
+ std::use_facet<std::num_put<char> >(loc);
+
+@@ -260,7 +266,11 @@
+ nio, ' ', '\0');
+
+ RW_ASSERT (!nio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::strncmp (ncs, data.ncs_, sizeof (ncs)));
++#else
+ RW_ASSERT (!rw_strncmp (ncs, data.ncs_));
++#endif
+ }
+
+ // both specializations may be tested at the same time
+@@ -270,6 +280,11 @@
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::num_put<wchar_t> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::num_put<wchar_t> &wp =
+ std::use_facet<std::num_put<wchar_t> >(loc);
+
+@@ -280,7 +295,11 @@
+ wio, L' ', L'\0');
+
+ RW_ASSERT (!wio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::wcsncmp (wcs, data.wcs_, sizeof (wcs)));
++#else
+ RW_ASSERT (!rw_strncmp (wcs, data.wcs_));
++#endif // _RWSTD_OS_SUNOS || _RWSTD_OS_LINUX
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+@@ -308,6 +327,12 @@
+ wio.rdbuf (&wsb);
+ #endif // _RWSTD_NO_WCHAR_T
+
++ for (size_t i = 0; i < MAX_THREADS; ++i) {
++ locales[i] = 0UL;
++ my_num_data[i].locale_name_ = "";
++ my_num_data[i].locale_ = std::locale();
++ }
++
+ // find all installed locales for which setlocale(LC_ALL) succeeds
+ const char* const locale_list =
+ rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);
+@@ -319,14 +344,14 @@
+ name += std::strlen (name) + 1) {
+
+ const std::size_t inx = nlocales;
+- locales [inx] = name;
++ locales [inx] = strdup (name);
+
+ // fill in the value and results for this locale
+ MyNumData& data = my_num_data [nlocales];
+- data.locale_name_ = name;
++ data.locale_name_ = std::string (name);
+
+ try {
+- const std::locale loc (data.locale_name_);
++ const std::locale loc (data.locale_name_.c_str());
+
+ data.value_ = nlocales & 1 ? -1 * nlocales : nlocales;
+ data.type_ = MyNumData::PutId (nlocales % MyNumData::put_max);
+@@ -343,7 +368,7 @@
+
+ rw_fatal (!nio.fail (), __FILE__, __LINE__,
+ "num_put<char>::put(...) failed for locale(%#s)",
+- data.locale_name_);
++ data.locale_name_.c_str());
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
+@@ -358,7 +383,7 @@
+
+ rw_fatal (!wio.fail (), __FILE__, __LINE__,
+ "num_put<wchar_t>::put(...) failed for locale(%#s)",
+- data.locale_name_);
++ data.locale_name_.c_str());
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+@@ -466,3 +491,4 @@
+ &rw_opt_setlocales,
+ &opt_shared_locale);
+ }
++
+--- stdcxx-4.2.1/tests/localization/22.locale.time.put.mt.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.time.put.mt.cpp 2011-04-06 12:41:28.710792084 -0400
+@@ -34,6 +34,7 @@
+
+ #include <cstring> // for strlen ()
+ #include <ctime> // for tm
++#include <cstdio> // for sprintf
+
+ #include <rw_locale.h>
+ #include <rw_thread.h>
+@@ -65,17 +66,18 @@
+
+ // should all threads share the same set of locale objects instead
+ // of creating their own?
+-int opt_shared_locale;
++static int opt_shared_locale = 0;
++
++// print verbose info messages
++static int opt_verbose = 0;
+
+ /**************************************************************************/
+
+ // array of locale names to use for testing
+-static const char*
+-locales [MAX_THREADS];
++static const char* locales [MAX_THREADS];
+
+ // number of locale names in the array
+-static std::size_t
+-nlocales;
++static std::size_t nlocales;
+
+ /**************************************************************************/
+
+@@ -85,7 +87,7 @@
+ enum { BufferSize = 64 };
+
+ // name of the locale the data corresponds to
+- const char* locale_name_;
++ std::string locale_name_;
+
+ // optionally set to the named locale for threads to share
+ std::locale locale_;
+@@ -148,13 +150,19 @@
+ MyStreambuf<char, std::char_traits<char> > nsb;
+ nio.rdbuf (&nsb);
+
++ (void) ::memset(ncs, '\0', std::size_t (MyTimeData::BufferSize));
++
+ #ifndef _RWSTD_NO_WCHAR_T
+ wchar_t wcs [MyTimeData::BufferSize];
+ MyIos<wchar_t, std::char_traits<wchar_t> > wio;
+ MyStreambuf<wchar_t, std::char_traits<wchar_t> > wsb;
+ wio.rdbuf (&wsb);
++
++ (void) ::memset(wcs, '\0',
++ std::size_t (MyTimeData::BufferSize) * sizeof(wchar_t));
+ #endif // _RWSTD_NO_WCHAR_T
+
++
+ for (int i = 0; i != opt_nloops; ++i) {
+
+ // save the name of the locale
+@@ -165,11 +173,16 @@
+ // using a random conversion specifier
+ const std::locale loc =
+ opt_shared_locale ? data.locale_
+- : std::locale (data.locale_name_);
++ : std::locale (data.locale_name_.c_str());
+
+ if (test_char) {
+ // exercise the narrow char specialization of the facet
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::time_put<char> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::time_put<char> &tp =
+ std::use_facet<std::time_put<char> >(loc);
+
+@@ -181,7 +194,11 @@
+ nio, ' ', &data.time_, data.format_) = '\0';
+
+ RW_ASSERT (!nio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::strncmp(ncs, data.ncs_, sizeof(ncs)));
++#else
+ RW_ASSERT (!rw_strncmp(ncs, data.ncs_));
++#endif
+
+ }
+
+@@ -192,6 +209,11 @@
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
++ if (opt_verbose)
++ rw_info (0, 0, __LINE__,
++ "exercising std::time_put<wchar_t> in locale '%s'",
++ data.locale_name_.c_str());
++
+ const std::time_put<wchar_t> &wp =
+ std::use_facet<std::time_put<wchar_t> >(loc);
+
+@@ -202,7 +224,11 @@
+ wio, L' ', &data.time_, data.format_) = L'\0';
+
+ RW_ASSERT (!wio.fail ());
++#if defined(_RWSTD_OS_SUNOS) || defined(_RWSTD_OS_LINUX)
++ RW_ASSERT (0 == std::wcsncmp(wcs, data.wcs_, sizeof(wcs)));
++#else
+ RW_ASSERT (!rw_strncmp(wcs, data.wcs_));
++#endif
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+@@ -229,6 +255,12 @@
+ wio.rdbuf (&wsb);
+ #endif // _RWSTD_NO_WCHAR_T
+
++ for (size_t i = 0; i < MAX_THREADS; ++i) {
++ locales[i] = 0UL;
++ my_time_data[i].locale_name_ = "";
++ my_time_data[i].locale_ = std::locale();
++ }
++
+ // find all installed locales for which setlocale (LC_ALL) succeeds
+ const char* const locale_list =
+ rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);
+@@ -264,7 +296,7 @@
+ data.format_ = cvtspecs [nlocales % (sizeof cvtspecs - 1)];
+
+ try {
+- const std::locale loc (data.locale_name_);
++ const std::locale loc (data.locale_name_.c_str());
+
+ const std::time_put<char> &np =
+ std::use_facet<std::time_put<char> >(loc);
+@@ -278,7 +310,7 @@
+ rw_fatal (!nio.fail (), __FILE__, __LINE__,
+ "time_put<char>::put(..., %c) "
+ "failed for locale(%#s)",
+- data.format_, data.locale_name_);
++ data.format_, data.locale_name_.c_str());
+
+ #ifndef _RWSTD_NO_WCHAR_T
+
+@@ -294,7 +326,7 @@
+ rw_fatal (!wio.fail (), __FILE__, __LINE__,
+ "time_put<wchar_t>::put(..., %c) "
+ "failed for locale(%#s)",
+- data.format_, data.locale_name_);
++ data.format_, data.locale_name_.c_str());
+
+ #endif // _RWSTD_NO_WCHAR_T
+
+--- stdcxx-4.2.1/tests/localization/22.locale.money.get.cpp 2008-04-24 17:23:10.000000000 -0700
++++ stdcxx-4.2.1/tests/localization/22.locale.money.get.cpp 2011-03-22 15:37:13.547889349 -0700
+@@ -340,7 +340,7 @@
+ io.imbue (std::locale (io.getloc (), pf));
+ }
+
+- io.flags (std::ios_base::fmtflags (flags));
++ io.setf (std::ios_base::fmtflags (flags));
+
+ // expand (widen) input sequence
+ const charT* const next = rw_expand ((charT*)0, str);
+@@ -772,7 +772,8 @@
+ // all spaces extracted since currency symbol (last) is mandatory
+ // verify that the facet doesn't extract too many optional spaces
+ // leaving none for the final required currency symbol
+- TEST (T, 103.0, "103 ", 4, showbase, eofbit, 0, "-1@$", " ");
++ // 22.2.6.1.2, p3: if showbase is set, currency symbol is mandatory
++ TEST (T, 103.0, "103 ", 4, showbase, eofbit|failbit, 0, "-1@$", " ");
+
+ // 22.2.6.1.2, p3: [Example: If showbase is off, then for
+ // a negative sign value of "()" and a currency symbol of "L",
+@@ -818,7 +819,7 @@
+ // specifier that's last in the pattern doesn't confuse the facet into
+ // extracting all the optional whitespace, leaving none to complete
+ // the negative_sign
+- TEST (T, -109.1, "-109 ", 6, 0, eofbit, 0, "-1@$", "");
++ TEST (T, -109.1, "-109 ", 6, 0, eofbit|failbit, 0, "-1@$", "");
+
+ // verify that optional space after value and before currency
+ // symbol is treated correctly
+
+--- stdcxx-4.2.1/tests/localization/22.locale.codecvt.length.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.codecvt.length.cpp 2011-06-23 13:59:09.859216905 -0400
+@@ -202,10 +202,11 @@
+ "(state_type&, const extern_type*, const extern_type*, "
+ "size_t)");
+
+- const CodecvtByname cvt ("");
++ const std::locale loc (std::locale::classic(), new CodecvtByname(""));
+
+- test_codecvt (&cvt);
++ const CodecvtByname& cvt = std::use_facet<CodecvtByname>(loc);
+
++ test_codecvt (&cvt);
+ }
+
+ /****************************************************************************/
+@@ -266,10 +267,16 @@
+
+ // lowercase utf ==> relaxed checking (i.e., some, but not all,
+ // invalid UTF-8 sequence are accepted)
+- const WCodecvtByname cvt_relaxd ("utf-8@UCS");
++ std::locale loc_relaxd (std::locale(), new WCodecvtByname ("utf-8@UCS"));
+
+ // capital UTF ==> strict checking
+- const WCodecvtByname cvt_strict ("UTF-8@UCS");
++ std::locale loc_strict (std::locale(), new WCodecvtByname ("UTF-8@UCS"));
++
++ const WCodecvtByname& cvt_relaxd =
++ std::use_facet<WCodecvtByname> (loc_relaxd);
++
++ const WCodecvtByname& cvt_strict =
++ std::use_facet<WCodecvtByname> (loc_strict);
+
+ #undef STRICT
+ #define STRICT(from, nc, maxi, res) \
+
+--- stdcxx-4.2.1/tests/localization/22.locale.codecvt.out.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.codecvt.out.cpp 2011-06-23 14:04:06.286408279 -0400
+@@ -482,7 +482,9 @@
+ "const intern_type*, "
+ "extern_type*, extern_type*, exterm_type*&)");
+
+- const CodecvtByname cvt ("");
++ const std::locale loc (std::locale::classic(), new CodecvtByname(""));
++
++ const CodecvtByname& cvt = std::use_facet<CodecvtByname>(loc);
+
+ test_codecvt (&cvt);
+ }
+@@ -555,10 +557,16 @@
+
+ // lowercase utf ==> relaxed checking (i.e., some, but not all,
+ // invalid UTF-8 sequence are accepted)
+- const WCodecvtByname cvt_relaxd ("utf-8@UCS");
++ std::locale loc_relaxd (std::locale(), new WCodecvtByname ("utf-8@UCS"));
+
+ // capital UTF ==> strict checking
+- const WCodecvtByname cvt_strict ("UTF-8@UCS");
++ std::locale loc_strict (std::locale(), new WCodecvtByname ("UTF-8@UCS"));
++
++ const WCodecvtByname& cvt_relaxd =
++ std::use_facet<WCodecvtByname> (loc_relaxd);
++
++ const WCodecvtByname& cvt_strict =
++ std::use_facet<WCodecvtByname> (loc_strict);
+
+ #undef STRICT
+ #define STRICT(from, from_end_off, from_next_off, \
+
+
+--- stdcxx-4.2.1/tests/localization/22.locale.num.put.cpp 2008-04-24 20:23:10.000000000 -0400
++++ stdcxx-4.2.1/tests/localization/22.locale.num.put.cpp 2011-06-23 14:19:35.515277321 -0400
+@@ -505,12 +505,10 @@
+
+ Ios<charT> ios;
+
+- const std::num_put<charT> np;
+-
+ Streambuf<charT> sb;
+
+ #define DIRECT_USE_TEST(T) \
+- np.put (std::ostreambuf_iterator<charT>(&sb), ios, charT (), (T)0)
++ std::use_facet<std::num_put<charT> >(sb.getloc()).put (std::ostreambuf_iterator<charT>(&sb), ios, charT (), (T)0)
+
+ #ifndef _RWSTD_NO_BOOL
+
+--- stdcxx-4.2.1/util/charmap.cpp 2008-04-24 20:28:51.000000000 -0400
++++ stdcxx-4.2.1/util/charmap.cpp 2011-06-27 14:00:58.064216427 -0400
+@@ -221,7 +221,7 @@
+
+ if (ch_end < ch + num_bytes - 1) {
+ // the input doesn't have enough characters
+- issue_diag (E_MBCHAR, true, 0,
++ issue_diag (W_CHAR, true, 0,
+ "incomplete multibyte character in character "
+ "map file: expecting %u bytes, found %u\n",
+ num_bytes, ch_end - ch);
+