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/12/13 22:56:11 UTC

svn commit: r604045 - in /incubator/stdcxx/branches/4.2.x: etc/config/vacpp.config include/valarray tests/localization/22.locale.time.put.cpp

Author: sebor
Date: Thu Dec 13 13:56:09 2007
New Revision: 604045

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

	Merged revs 601922, 601927, and 601935 from trunk:

2007-12-06 Travis Vitek <vi...@roguewave.com>

	STDCXX-443
	* etc/config/vacpp.config: Remove -Q compile flag for AIX
	optimized builds to be consistent with IBM documentation.

2007-12-05 Travis Vitek <vi...@roguewave.com>

	STDCXX-676
	* tests/locale/22.locale.time.put.cpp [_MSC_VER] (rw_strftime):
	Avoid passing unsupported format specifiers to strftime().

2007-12-04 Travis Vitek <vi...@roguewave.com>

	STDCXX-603
	* include/valarray (apply): Avoid use of typedef in function
	type to avoid linker error with VisualAge C++.

Modified:
    incubator/stdcxx/branches/4.2.x/etc/config/vacpp.config
    incubator/stdcxx/branches/4.2.x/include/valarray
    incubator/stdcxx/branches/4.2.x/tests/localization/22.locale.time.put.cpp

Modified: incubator/stdcxx/branches/4.2.x/etc/config/vacpp.config
URL: http://svn.apache.org/viewvc/incubator/stdcxx/branches/4.2.x/etc/config/vacpp.config?rev=604045&r1=604044&r2=604045&view=diff
==============================================================================
--- incubator/stdcxx/branches/4.2.x/etc/config/vacpp.config (original)
+++ incubator/stdcxx/branches/4.2.x/etc/config/vacpp.config Thu Dec 13 13:56:09 2007
@@ -175,9 +175,7 @@
 DEBUG_CPPFLAGS  =
 
 # -O enables inlining of all functions declared inline
-# -Q (same as -qinline) enables inlining of all functions
-#    up to 20 statements big
-OPTMZ_CXXFLAGS  = -O -Q
+OPTMZ_CXXFLAGS  = -O
 OPTMZ_CPPFLAGS  =
 
 # shared/archive library options

Modified: incubator/stdcxx/branches/4.2.x/include/valarray
URL: http://svn.apache.org/viewvc/incubator/stdcxx/branches/4.2.x/include/valarray?rev=604045&r1=604044&r2=604045&view=diff
==============================================================================
--- incubator/stdcxx/branches/4.2.x/include/valarray (original)
+++ incubator/stdcxx/branches/4.2.x/include/valarray Thu Dec 13 13:56:09 2007
@@ -596,7 +596,7 @@
 
 template <class _TypeT>
 inline valarray<_TypeT>
-valarray<_TypeT>::apply (value_type __fun (value_type)) const
+valarray<_TypeT>::apply (_TypeT __fun (_TypeT)) const
 {
     return _RW::__rw_unary_function (*this, __fun);
 }
@@ -604,7 +604,7 @@
 
 template <class _TypeT>
 inline valarray<_TypeT>
-valarray<_TypeT>::apply (value_type __fun (const value_type&)) const
+valarray<_TypeT>::apply (_TypeT __fun (const _TypeT&)) const
 {
     return _RW::__rw_unary_function (*this, __fun);
 } 

Modified: incubator/stdcxx/branches/4.2.x/tests/localization/22.locale.time.put.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/branches/4.2.x/tests/localization/22.locale.time.put.cpp?rev=604045&r1=604044&r2=604045&view=diff
==============================================================================
--- incubator/stdcxx/branches/4.2.x/tests/localization/22.locale.time.put.cpp (original)
+++ incubator/stdcxx/branches/4.2.x/tests/localization/22.locale.time.put.cpp Thu Dec 13 13:56:09 2007
@@ -35,6 +35,7 @@
 #include <cstring>       // for memcpy(), strlen()
 #include <ctime>         // for tm
 #include <cwchar>        // for wcsftime(), wcslen()
+#include <cassert>       // for assert()
 
 #include <driver.h>      // for rw_test(), ...
 #include <environ.h>     // for rw_putenv()
@@ -124,7 +125,153 @@
 { 
     static const std::tm tmp = std::tm ();
 
-    const std::size_t n = std::strftime (buf, bufsize, pat, tmb ? tmb : &tmp);
+    if (!tmb)
+        tmb = &tmp;
+
+#ifdef _MSC_VER
+
+    // ms crt aborts if you use out of range values in debug
+    if (tmb->tm_hour < 0 || 24 <= tmb->tm_hour)
+        return 0;
+
+    if (tmb->tm_min < 0 || 60 <= tmb->tm_min)
+        return 0;
+
+    if (tmb->tm_sec < 0 || 60 <= tmb->tm_sec)
+        return 0;
+
+    // create a new pattern buffer that is windows strftime compatible...
+    char patbuf [512];
+    char *fpat = patbuf;
+
+    // assumes tm_year is relative to 1900
+    const int year    = (tmb->tm_year + 1900);
+    const int century = (tmb->tm_year + 1900) / 100;
+
+    while (*pat) {
+
+        if (*pat == '%') {
+
+            // ensure we are not within 16 chars of the end of the
+            // local pattern buffer to avoid overflow
+            assert ((fpat + 16) < (patbuf + 512));
+
+            pat += 1; // step past %
+            switch (*pat)
+            {
+            case '\0':
+                // fails miserably if the last char is %
+                *fpat++ = '%'; *fpat++ = '%';
+                break;
+            case 'C':
+                // %C is replaced by the century number (the year divided by
+                // 100 and truncated to an integer) as a decimal number.
+                *fpat++ = '0' + (century / 10) % 10;
+                *fpat++ = '0' + (century % 10);
+                pat += 1;
+                break;
+            case 'D':
+                // %D same as %m/%d/%y. 
+                *fpat++ = '%'; *fpat++ = 'm'; *fpat++ = '/';
+                *fpat++ = '%'; *fpat++ = 'd'; *fpat++ = '/';
+                *fpat++ = '%'; *fpat++ = 'y'; pat += 1;
+                break;
+            case 'e':
+                // %e is replaced by the day of the month as a decimal
+                // number [1,31]; a single digit is preceded by a space.
+                if (tmb->tm_mday < 10)
+                    *fpat++ = ' ';
+                else
+                    *fpat++ = '0' + (tmb->tm_mday / 10) % 10;
+                *fpat++ = '0' + (tmb->tm_mday % 10);
+                pat += 1;
+                break;
+            case 'F':
+                // %F Equivalent to %Y - %m - %d (the ISO 8601:2000 standard
+                // date format). [ tm_year, tm_mon, tm_mday]
+                *fpat++ = '%'; *fpat++ = 'Y';
+                *fpat++ = ' '; *fpat++ = '-'; *fpat++ = ' ';
+                *fpat++ = '%'; *fpat++ = 'm';
+                *fpat++ = ' '; *fpat++ = '-'; *fpat++ = ' ';
+                *fpat++ = '%'; *fpat++ = 'd'; pat += 1;
+                break;
+            case 'g':
+                // %g Replaced by the last 2 digits of the week-based year
+                // as a decimal number [00,99]. [ tm_year, tm_wday, tm_yday] 
+                return 0;
+            case 'G':
+                // %G Replaced by the week-based year as a decimal number
+                // (for example, 1977). [ tm_year, tm_wday, tm_yday] 
+                return 0;
+            case 'h':
+                // %h same as %b. 
+                *fpat++ = '%'; *fpat++ = 'b'; pat += 1;
+                break;
+            case 'n':
+                // %n is replaced by a newline character. 
+                *fpat++ = '\n'; pat += 1;
+                break;
+            case 'r':
+                // %r is replaced by the time in a.m. and p.m. notation; in
+                // the POSIX locale this is equivalent to %I:%M:%S %p.
+                *fpat++ = '%'; *fpat++ = 'I'; *fpat++ = ':';
+                *fpat++ = '%'; *fpat++ = 'M'; *fpat++ = ':';
+                *fpat++ = '%'; *fpat++ = 'S'; *fpat++ = ' ';
+                *fpat++ = '%'; *fpat++ = 'p'; pat += 1;
+                break;
+            case 'R':
+                // %R is replaced by the time in 24 hour notation (%H:%M).
+                *fpat++ = '%'; *fpat++ = 'H'; *fpat++ = ':';
+                *fpat++ = '%'; *fpat++ = 'M'; pat += 1;
+                break;
+            case 't':
+                // %t is replaced by a tab character. 
+                *fpat++ = '\t'; pat += 1;
+                break;
+            case 'T':
+                // %T is replaced by the time (%H:%M:%S). 
+                *fpat++ = '%'; *fpat++ = 'H'; *fpat++ = ':';
+                *fpat++ = '%'; *fpat++ = 'M'; *fpat++ = ':';
+                *fpat++ = '%'; *fpat++ = 'S'; pat += 1;
+                break;
+            case 'u':
+                // %u is replaced by the weekday as a decimal number [1,7],
+                // with 1 representing Monday.
+                *fpat++ = '0' + (tmb->tm_wday + 1);                
+                pat += 1;
+                break;
+            case 'V':
+                // %V is replaced by the week number of the year (Monday as
+                // the first day of the week) as a decimal number [01,53].
+                // If the week containing 1 January has four or more days
+                // in the new year, then it is considered week 1. Otherwise,
+                // it is the last week of the previous year, and the next
+                // week is week 1. 
+                return 0;
+            default:
+                // copy percent and format
+                *fpat++ = '%';
+                *fpat++ = *pat++;
+                break;
+            }
+
+            *fpat = 0; // null terminate
+        }
+        else {
+            *fpat++ = *pat++;
+        }
+    }
+
+    // copy the null
+    *fpat = *pat;
+
+    const std::size_t n = std::strftime (buf, bufsize, patbuf, tmb);
+
+#else   // if !defined (_MSC_VER)
+
+    const std::size_t n = std::strftime (buf, bufsize, pat, tmb);
+
+#endif   // _MSC_VER
 
     RW_ASSERT (n < bufsize);
 
@@ -137,21 +284,20 @@
 { 
     static const std::tm tmp = std::tm ();
 
-#ifndef _RWSTD_NO_WCSFTIME_WCHAR_T_FMAT
+#if !defined (_RWSTD_NO_WCSFTIME_WCHAR_T_FMAT) && !defined (_MSC_VER)
 
     std::size_t n = std::wcsftime (wbuf, bufsize, wpat, tmb ? tmb : &tmp);
 
-#else   // if defined (_RWSTD_NO_WCSFTIME)
+#else   // if defined (_RWSTD_NO_WCSFTIME) || defined (_MSC_VER)
 
     char pat [1024];
     char buf [1024];
 
     narrow (pat, wpat);
-    std::size_t n = std::strftime (buf, bufsize, pat, tmb ? tmb : &tmp);
-
+    std::size_t n = rw_strftime (buf, bufsize, pat, tmb ? tmb : &tmp);
     widen (wbuf, buf);
 
-#endif   // _RWSTD_NO_WCSFTIME
+#endif   // _RWSTD_NO_WCSFTIME, _MSC_VER
 
     RW_ASSERT (n < bufsize);