You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2007/06/28 03:50:18 UTC

svn commit: r551428 - in /incubator/stdcxx/trunk/tests: include/ localization/ src/

Author: sebor
Date: Wed Jun 27 18:50:17 2007
New Revision: 551428

URL: http://svn.apache.org/viewvc?view=rev&rev=551428
Log:
2007-06-27  Martin Sebor  <se...@roguewave.com>

	* rw_locale.h (rw_opt_locales): New constant pointing to a
	NUL-separated list of locale names specified by the --locales
	command line option (set by the rw_opt_setlocales handler).
	(rw_opt_setlocales): Callback function invoked in response to
	the --locales=<locale-list> command line option to set the
	rw_opt_locales global variable to a NUL-separated list of
	locale names to exercise.
	* locale.cpp (<cstdio>): Avoided #including C++ header (the C
	header is sufficient and preferable).
	(rw_create_locale): Removed std:: qualification from C library
	names.
	(_rw_locale_names): Static global helper.
	(rw_opt_locales): Defined and initialized to refer to the above.
	(rw_opt_setlocale): Defined.
	* 22.locale.moneypunct.mt.cpp (run_test): Used rw_opt_locales.
	(rw_opt_setlocales): Removed definition.
	* 22.locale.time.put.mt.cpp (rw_opt_nthreads): Initialzed to 1,
	and overwrote in main() with the result of rw_get_cpus() when
	thread safety is being exercised.
	(run_test): Used rw_opt_locales.
	(main): Used rw_opt_setlocales to handle the --locales option.
	* 22.locale.num.put.mt.cpp: Same.
	* 22.locale.numpunct.mt.cpp: Same.
	* 22.locale.money.put.mt.cpp: Same.

Modified:
    incubator/stdcxx/trunk/tests/include/rw_locale.h
    incubator/stdcxx/trunk/tests/localization/22.locale.money.put.mt.cpp
    incubator/stdcxx/trunk/tests/localization/22.locale.moneypunct.mt.cpp
    incubator/stdcxx/trunk/tests/localization/22.locale.num.put.mt.cpp
    incubator/stdcxx/trunk/tests/localization/22.locale.numpunct.mt.cpp
    incubator/stdcxx/trunk/tests/localization/22.locale.time.put.mt.cpp
    incubator/stdcxx/trunk/tests/src/locale.cpp

Modified: incubator/stdcxx/trunk/tests/include/rw_locale.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/include/rw_locale.h?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/include/rw_locale.h (original)
+++ incubator/stdcxx/trunk/tests/include/rw_locale.h Wed Jun 27 18:50:17 2007
@@ -1,27 +1,28 @@
 /************************************************************************
  *
- * localedef.h - declarations of locale testsuite helpers
+ * rw_locale.h - declarations of locale testsuite helpers
  *
  * $Id$
  *
  ************************************************************************
  *
- * Copyright 2005-2006 The Apache Software Foundation or its licensors,
- * as applicable.
+ * Licensed to the Apache Software  Foundation (ASF) under one or more
+ * contributor  license agreements.  See  the NOTICE  file distributed
+ * with  this  work  for  additional information  regarding  copyright
+ * ownership.   The ASF  licenses this  file to  you under  the Apache
+ * License, Version  2.0 (the  "License"); you may  not use  this file
+ * except in  compliance with the License.   You may obtain  a copy of
+ * the License at
  *
- * Copyright 2001-2006 Rogue Wave Software.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * distributed under the  License is distributed on an  "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
+ * implied.   See  the License  for  the  specific language  governing
+ * permissions and limitations under the License.
+ *
+ * Copyright 2001-2006 Rogue Wave Software.
  * 
  **************************************************************************/
 
@@ -91,5 +92,17 @@
 _TEST_EXPORT const char*
 rw_create_locale (const char *charmap, const char *locale);
 
+
+// NUL-separated list of locale names specified by the --locales
+// command line option (set by the rw_opt_setlocales handler)
+_TEST_EXPORT extern const char* const&
+rw_opt_locales;
+
+
+// callback function invoked in response to the --locales=<locale-list>
+// command line option to set the rw_opt_locales global variable to the
+// NUL-separated list of locale names to exercise
+_TEST_EXPORT int
+rw_opt_setlocales (int, char*[]);
 
 #endif   // RW_LOCALE_H_INCLUDED

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.money.put.mt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.money.put.mt.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.money.put.mt.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.money.put.mt.cpp Wed Jun 27 18:50:17 2007
@@ -40,13 +40,9 @@
 // maximum number of threads allowed by the command line interface
 #define MAX_THREADS   32
 
-
-#ifdef _RWSTD_REENTRANT
-int rw_opt_nthreads = 4;
-#else   // if !defined (_RWSTD_REENTRANT)
-// in non-threaded builds use just one thread
+// default number of threads (will be adjusted to the number
+// of processors/cores later)
 int rw_opt_nthreads = 1;
-#endif   // _RWSTD_REENTRANT
 
 // the number of times each thread should iterate (unless specified
 // otherwise on the command line)
@@ -142,7 +138,7 @@
 
             const std::ostreambuf_iterator<char> iter (&sb);
 
-            switch (PutId (i % put_max)) {
+            switch (i % put_max) {
             case put_ldbl:
                 mp.put (iter, intl, io, ' ', ldval);
                 break;
@@ -169,7 +165,7 @@
 
             const std::ostreambuf_iterator<wchar_t> iter (&wb);
 
-            switch (PutId (i % put_max)) {
+            switch (i % put_max) {
             case put_ldbl:
                 mp.put (iter, intl, io, ' ', ldval);
                 break;
@@ -198,11 +194,13 @@
 static int
 run_test (int, char**)
 {
-    char* const locale_list = rw_locales ();
+    // 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);
 
     const std::size_t maxinx = sizeof locales / sizeof *locales;
 
-    for (char *name = locale_list; *name; name += std::strlen (name) + 1) {
+    for (const char *name = locale_list; *name; name += std::strlen (name) +1) {
         locales [nlocales++] = name;
 
         if (nlocales == maxinx)
@@ -271,12 +269,21 @@
 
 int main (int argc, char *argv[])
 {
+#ifdef _RWSTD_REENTRANT
+
+    // set nthreads to the number of processors by default
+    rw_opt_nthreads = rw_get_cpus ();
+
+#endif   // _RWSTD_REENTRANT
+
     return rw_test (argc, argv, __FILE__,
                     "lib.locale.money.put",
                     "thread safety", run_test,
-                    "|-nloops#0 "       // must be non-negative
-                    "|-nthreads#0-*",   // must be in [0, MAX_THREADS]
+                    "|-nloops#0 "        // must be non-negative
+                    "|-nthreads#0-* "    // must be in [0, MAX_THREADS]
+                    "|-locales=",        // must be provided
                     &rw_opt_nloops,
                     int (MAX_THREADS),
-                    &rw_opt_nthreads);
+                    &rw_opt_nthreads,
+                    &rw_opt_setlocales);
 }

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.moneypunct.mt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.moneypunct.mt.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.moneypunct.mt.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.moneypunct.mt.cpp Wed Jun 27 18:50:17 2007
@@ -252,15 +252,11 @@
 
 /**************************************************************************/
 
-static char*
-rw_opt_locales;
-
-
 static int
 run_test (int, char**)
 {
     // find all installed locales for which setlocale(LC_ALL) succeeds
-    char* const locale_list =
+    const char* const locale_list =
         rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);
 
     // array of locale names to use for testing
@@ -269,7 +265,7 @@
     const std::size_t maxinx = sizeof locales / sizeof *locales;
 
     // iterate over locales, initializing a global punct_data array
-    for (char *name = locale_list; *name; name += std::strlen (name) + 1) {
+    for (const char *name = locale_list; *name; name += std::strlen (name) +1) {
 
         std::locale loc;
 
@@ -464,37 +460,6 @@
 
 /**************************************************************************/
 
-static int
-rw_opt_setlocales (int argc, char* argv[])
-{
-    RW_ASSERT (0 < argc && argv [0]);
-
-    rw_opt_locales = std::strchr (argv [0], '=');
-
-    if (rw_opt_locales) {
-
-        const std::size_t len = std::strlen (++rw_opt_locales);
-        char* const locale_names = new char [len + 2];
-
-        locale_names [len + 1] = '\0';
-
-        std::memcpy (locale_names, rw_opt_locales, len);
-
-        rw_opt_locales = locale_names;
-
-        for (char *next = rw_opt_locales; ; ) {
-            next = std::strpbrk (next, ", ");
-            if (next)
-                *next++ = '\0';
-            else
-                break;
-        }
-    }
-
-    return 0;
-}
-
-
 int main (int argc, char *argv[])
 {
 #ifdef _RWSTD_REENTRANT
@@ -508,7 +473,7 @@
                     "lib.locale.moneypunct",
                     "thread safety", run_test,
                     "|-nloops#0 "       // must be non-negative
-                    "|-nthreads#0-*"    // must be in [0, MAX_THREADS]
+                    "|-nthreads#0-* "   // must be in [0, MAX_THREADS]
                     "|-locales=",       // must be provided
                     &rw_opt_nloops,
                     int (MAX_THREADS),

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.num.put.mt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.num.put.mt.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.num.put.mt.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.num.put.mt.cpp Wed Jun 27 18:50:17 2007
@@ -33,20 +33,16 @@
 #include <cstring>    // for strlen()
 
 #include <rw_locale.h>
-#include <rw_thread.h>
+#include <rw_thread.h>   // for rw_get_processors (), rw_thread_pool()
 #include <driver.h>
 
 
 // maximum number of threads allowed by the command line interface
 #define MAX_THREADS   32
 
-
-#ifdef _RWSTD_REENTRANT
-int rw_opt_nthreads = 4;
-#else   // if !defined (_RWSTD_REENTRANT)
-// in non-threaded builds use just one thread
+// default number of threads (will be adjusted to the number
+// of processors/cores later)
 int rw_opt_nthreads = 1;
-#endif   // _RWSTD_REENTRANT
 
 // the number of times each thread should iterate (unless specified
 // otherwise on the command line)
@@ -164,7 +160,7 @@
 
             const std::ostreambuf_iterator<char> iter (&sb);
 
-            switch (PutId (i % put_max)) {
+            switch (i % put_max) {
             case put_bool:
                 if (i & 2)
                     io.setf (std::ios::boolalpha);
@@ -220,7 +216,7 @@
 
             const std::ostreambuf_iterator<wchar_t> iter (&wb);
 
-            switch (PutId (i % put_max)) {
+            switch (i % put_max) {
             case put_bool:
                 np.put (iter, io, L' ', bool (ival));
                 break;
@@ -273,11 +269,14 @@
 static int
 run_test (int, char**)
 {
-    char* const locale_list = rw_locales ();
+    // 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);
 
     const std::size_t maxinx = sizeof locales / sizeof *locales;
 
-    for (char *name = locale_list; *name; name += std::strlen (name) + 1) {
+    for (const char *name = locale_list; *name; name += std::strlen (name) +1) {
+
         locales [nlocales++] = name;
 
         if (nlocales == maxinx)
@@ -345,12 +344,21 @@
 
 int main (int argc, char *argv[])
 {
+#ifdef _RWSTD_REENTRANT
+
+    // set nthreads to the number of processors by default
+    rw_opt_nthreads = rw_get_cpus ();
+
+#endif   // _RWSTD_REENTRANT
+
     return rw_test (argc, argv, __FILE__,
                     "lib.locale.num.put",
                     "thread safety", run_test,
-                    "|-nloops#0 "       // must be non-negative
-                    "|-nthreads#0-*",   // must be in [0, MAX_THREADS]
+                    "|-nloops#0 "        // must be non-negative
+                    "|-nthreads#0-* "    // must be in [0, MAX_THREADS]
+                    "|-locales=",        // must be provided
                     &rw_opt_nloops,
                     int (MAX_THREADS),
-                    &rw_opt_nthreads);
+                    &rw_opt_nthreads,
+                    &rw_opt_setlocales);
 }

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.numpunct.mt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.numpunct.mt.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.numpunct.mt.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.numpunct.mt.cpp Wed Jun 27 18:50:17 2007
@@ -41,13 +41,9 @@
 // maximum number of threads allowed by the command line interface
 #define MAX_THREADS   32
 
-
-#ifdef _RWSTD_REENTRANT
-int rw_opt_nthreads = 4;
-#else   // if !defined (_RWSTD_REENTRANT)
-// in non-threaded builds use just one thread
+// default number of threads (will be adjusted to the number
+// of processors/cores later)
 int rw_opt_nthreads = 1;
-#endif   // _RWSTD_REENTRANT
 
 // the number of times each thread should iterate (unless specified
 // otherwise on the command line)
@@ -106,9 +102,6 @@
         // construct a named locale
         const std::locale loc (locale_name);
 
-        // exercise postive and negative values
-        const int ival = i & 1 ? -i : i;
-
         if (test_char) {
             // exercise the narrow char specialization of the facet
 
@@ -165,13 +158,14 @@
 static int
 run_test (int, char**)
 {
-    // get a NUL-separated list of names of installed locales
-    char* const locale_list = rw_locales ();
+    // 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);
 
     const std::size_t maxinx = sizeof locales / sizeof *locales;
 
     // iterate over locales, initializing a global punct_data array
-    for (char *name = locale_list; *name; name += std::strlen (name) + 1) {
+    for (const char *name = locale_list; *name; name += std::strlen (name) +1) {
 
         const std::size_t inx = nlocales;
 
@@ -286,12 +280,21 @@
 
 int main (int argc, char *argv[])
 {
+#ifdef _RWSTD_REENTRANT
+
+    // set nthreads to the number of processors by default
+    rw_opt_nthreads = rw_get_cpus ();
+
+#endif   // _RWSTD_REENTRANT
+
     return rw_test (argc, argv, __FILE__,
                     "lib.locale.numpunct",
                     "thread safety", run_test,
-                    "|-nloops#0 "       // must be non-negative
-                    "|-nthreads#0-*",   // must be in [0, MAX_THREADS]
+                    "|-nloops#0 "        // must be non-negative
+                    "|-nthreads#0-* "    // must be in [0, MAX_THREADS]
+                    "|-locales=",        // must be provided
                     &rw_opt_nloops,
                     int (MAX_THREADS),
-                    &rw_opt_nthreads);
+                    &rw_opt_nthreads,
+                    &rw_opt_setlocales);
 }

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.time.put.mt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.time.put.mt.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.time.put.mt.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.time.put.mt.cpp Wed Jun 27 18:50:17 2007
@@ -43,13 +43,9 @@
 #define MAX_THREADS      32
 #define MAX_LOOPS    100000
 
-
-#ifdef _RWSTD_REENTRANT
-int rw_opt_nthreads = 4;
-#else   // if !defined (_RWSTD_REENTRANT)
-// in non-threaded builds use just one thread
+// default number of threads (will be adjusted to the number
+// of processors/cores later)
 int rw_opt_nthreads = 1;
-#endif   // _RWSTD_REENTRANT
 
 // the number of times each thread should iterate
 int rw_opt_nloops = MAX_LOOPS;
@@ -73,13 +69,8 @@
 
 
 static void*
-thread_func (void *arg)
+thread_func (void*)
 {
-    const rw_thread_t* const pthread = (rw_thread_t*)arg;
-
-    // get the 0-based thread number
-    const std::size_t threadno = std::size_t (pthread->threadno);
-
     std::tm tmb = std::tm ();
 
     const char cvtspecs[] = "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%";
@@ -169,11 +160,13 @@
 static int
 run_test (int, char**)
 {
-    char* const locale_list = rw_locales ();
+    // 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);
 
     const std::size_t maxinx = sizeof locales / sizeof *locales;
 
-    for (char *name = locale_list; *name; name += std::strlen (name) + 1) {
+    for (const char *name = locale_list; *name; name += std::strlen (name) +1) {
         locales [nlocales++] = name;
 
         if (nlocales == maxinx)
@@ -241,12 +234,21 @@
 
 int main (int argc, char *argv[])
 {
+#ifdef _RWSTD_REENTRANT
+
+    // set nthreads to the number of processors by default
+    rw_opt_nthreads = rw_get_cpus ();
+
+#endif   // _RWSTD_REENTRANT
+
     return rw_test (argc, argv, __FILE__,
                     "lib.locale.time.put",
                     "thread safety", run_test,
                     "|-nloops#0 "       // must be non-negative
-                    "|-nthreads#0-*",   // must be in [0, MAX_THREADS]
+                    "|-nthreads#0-* "   // must be in [0, MAX_THREADS]
+                    "|-locales=",       // must be provided
                     &rw_opt_nloops,
                     int (MAX_THREADS),
-                    &rw_opt_nthreads);
+                    &rw_opt_nthreads,
+                    &rw_opt_setlocales);
 }

Modified: incubator/stdcxx/trunk/tests/src/locale.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/src/locale.cpp?view=diff&rev=551428&r1=551427&r2=551428
==============================================================================
--- incubator/stdcxx/trunk/tests/src/locale.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/locale.cpp Wed Jun 27 18:50:17 2007
@@ -36,7 +36,6 @@
 #include <file.h>         // for SHELL_RM_RF, rw_tmpnam
 #include <rw_printf.h>    // for rw_fprintf()
 #include <rw_process.h>   // for rw_system()
-#include <cstdio>
 
 
 #if defined (_RWSTD_OS_LINUX) && !defined (_XOPEN_SOURCE)
@@ -679,35 +678,35 @@
     // create a temporary locale definition file that exercises as
     // many different parts of the collate standard as possible
     char srcfname [256];
-    std::sprintf (srcfname, "%s%slocale.src", locale_root, SLASH);
+    sprintf (srcfname, "%s%slocale.src", locale_root, SLASH);
 
-    std::FILE *fout = std::fopen (srcfname, "w");
+    FILE *fout = fopen (srcfname, "w");
 
     if (!fout) {
-        std::fprintf (stderr, "%s:%d: fopen(\"%s\", \"w\") failed\n",
-                      __FILE__, __LINE__, srcfname);
+        fprintf (stderr, "%s:%d: fopen(\"%s\", \"w\") failed\n",
+                 __FILE__, __LINE__, srcfname);
         return 0;
     }
 
-       std::fprintf (fout, "%s", locale);
+       fprintf (fout, "%s", locale);
 
-    std::fclose (fout);
+    fclose (fout);
 
     // create a temporary character map file
     char cmfname [256];
-    std::sprintf (cmfname, "%s%scharmap.src", locale_root, SLASH);
+    sprintf (cmfname, "%s%scharmap.src", locale_root, SLASH);
 
-    fout = std::fopen (cmfname, "w");
+    fout = fopen (cmfname, "w");
 
     if (!fout) {
-        std::fprintf (stderr, "%s:%d: fopen(\"%s\", \"w\") failed\n",
-                      __FILE__, __LINE__, cmfname);
+        fprintf (stderr, "%s:%d: fopen(\"%s\", \"w\") failed\n",
+                 __FILE__, __LINE__, cmfname);
         return 0;
     }
 
-       std::fprintf (fout, "%s", charmap);
+       fprintf (fout, "%s", charmap);
 
-    std::fclose (fout);
+    fclose (fout);
 
        locname = "test-locale";
 
@@ -716,4 +715,56 @@
         locname = 0;
 
     return locname;
+}
+
+
+/**************************************************************************/
+
+static const char*
+_rw_locale_names;
+
+_TEST_EXPORT const char* const&
+rw_opt_locales = _rw_locale_names;
+
+
+_TEST_EXPORT int
+rw_opt_setlocales (int argc, char* argv[])
+{
+    RW_ASSERT (0 < argc && argv [0]);
+
+    // the option requires an equals sign followed by an optional argument
+    char *args = strchr (argv [0], '=');
+
+    RW_ASSERT (0 != args);
+
+    // small static buffer should be sufficient in most cases
+    static char buffer [256];
+
+    const size_t len = strlen (++args);
+
+    // dynamically allocate a bigger buffer when the small buffer
+    // isn't big enough (let the dynamically allocated buffer leak)
+    char* const locale_names =
+        sizeof buffer < len + 2 ? (char*)malloc (len + 2) : buffer;
+
+    if (0 == locale_names)
+        return 1;
+
+    locale_names [len]     = '\0';
+    locale_names [len + 1] = '\0';
+
+    memcpy (locale_names, args, len);
+
+    for (char *next = locale_names; ; ) {
+        next = strpbrk (next, ", ");
+        if (next)
+            *next++ = '\0';
+        else
+            break;
+    }
+
+    _rw_locale_names = locale_names;
+
+    // return 0 on success
+    return 0;
 }