| /*************************************************************************** |
| * |
| * _time_put.cc - definition of std::time_put members |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * 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 |
| * |
| * 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. |
| * |
| * Copyright 1994-2006 Rogue Wave Software. |
| * |
| **************************************************************************/ |
| |
| #include <streambuf> |
| #include <rw/_iosbase.h> |
| #include <loc/_ctype.h> |
| |
| |
| _RWSTD_NAMESPACE (__rw) { |
| |
| |
| // defined in time_put.cpp |
| _RWSTD_EXPORT char* |
| __rw_put_time (const __rw_facet*, char*, _RWSTD_SIZE_T, |
| _STD::ios_base&, char, const _RWSTD_C::tm*, |
| char, char, int, int); |
| |
| #ifndef _RWSTD_NO_WCHAR_T |
| |
| // defined in time_put.cpp |
| _RWSTD_EXPORT wchar_t* |
| __rw_put_time (const __rw_facet*, wchar_t*, _RWSTD_SIZE_T, |
| _STD::ios_base&, wchar_t, const _RWSTD_C::tm*, |
| char, char, int, int); |
| |
| #endif // _RWSTD_NO_WCHAR_T |
| |
| } // namespace __rw |
| |
| |
| _RWSTD_NAMESPACE (_V3_LOCALE) { |
| |
| |
| template <class _CharT, class _OutputIter> |
| _RW::__rw_facet_id time_put<_CharT, _OutputIter>::id; |
| |
| |
| template <class _CharT, class _OutputIter /* = ostreambuf_iterator<_CharT> */ > |
| /* virtual */ _TYPENAME time_put<_CharT, _OutputIter>::iter_type |
| time_put<_CharT, _OutputIter>:: |
| do_put (iter_type __it, ios_base &__flags, char_type __fill, |
| const tm *__tmb, char __fmt, char __modifier /* = 0 */) const |
| { |
| char_type __buf [256]; |
| |
| const char_type *__end = |
| _RW::__rw_put_time (this, __buf + 0, sizeof __buf / sizeof *__buf, |
| __flags, __fill, __tmb, __fmt, __modifier, -1, -1); |
| |
| // number of fill chars to pad with |
| streamsize __pad = __flags.width () - streamsize (__end - __buf); |
| |
| // adjustfield bits (left, internal, or the default right) |
| const int __adj = __flags.flags () & _RWSTD_IOS_ADJUSTFIELD; |
| |
| if (__pad > 0 && _RWSTD_IOS_LEFT != __adj) { |
| |
| // right justify unless left justification requested |
| for (; __pad--; ++__it) |
| *__it = __fill; |
| } |
| |
| for (const char_type *__p = __buf; __p != __end; ++__p, ++__it) { |
| *__it = *__p; |
| } |
| |
| // left justify if necessary |
| for (; __pad-- > 0; ++__it) |
| *__it = __fill; |
| |
| return __it; |
| } |
| |
| |
| template <class _CharT, class _OutputIter /* = ostreambuf_iterator<_CharT> */ > |
| _TYPENAME time_put<_CharT, _OutputIter>::iter_type |
| time_put<_CharT, _OutputIter>:: |
| put (iter_type __it, ios_base &__flags, char_type __fill, const tm *__tmb, |
| const char_type *__pat, const char_type *__end) const |
| { |
| _RWSTD_ASSERT (0 != __pat); |
| |
| if (!__end) // convenience extension |
| __end = __pat + char_traits<char_type>::length (__pat); |
| |
| const ctype<char_type> &__ctp = |
| _V3_USE_FACET (ctype<char_type>, __flags.getloc ()); |
| |
| for (; __pat != __end; ++__pat) { |
| |
| if ('%' == __ctp.narrow (*__pat, 0) && __pat + 1 < __end) { |
| |
| char __fmtmod = __ctp.narrow (*++__pat, 0); // format modifier |
| char __fmt; // format specifier |
| |
| if ('E' == __fmtmod) { |
| |
| __fmt = __ctp.narrow (__pat [1], 0); |
| |
| switch (__fmt) { |
| // check valid format modifiers |
| case 'c': case 'C': case 'x': case 'X': case 'y': case 'Y': |
| ++__pat; |
| break; |
| |
| case '\0': |
| break; |
| |
| default: |
| __fmt = 0; // `pat' doesn't point to a valid format |
| } |
| } |
| else if ('O' == __fmtmod) { |
| |
| __fmt = __ctp.narrow (__pat [1], 0); |
| |
| switch (__fmt) { |
| // check valid format modifiers |
| case 'd': case 'e': case 'H': case 'I': case 'm': case 'M': |
| case 'S': case 'u': case 'U': case 'V': case 'w': case 'W': |
| case 'y': |
| ++__pat; |
| break; |
| |
| case '\0': |
| break; |
| |
| default: |
| __fmt = 0; // `pat' doesn't point to a valid format |
| } |
| } |
| else { |
| __fmt = __fmtmod; |
| __fmtmod = 0; |
| } |
| |
| if (char (-1) != __fmt) { |
| __it = do_put (__it, __flags, __fill, __tmb, __fmt, __fmtmod); |
| continue; |
| } |
| } |
| |
| *__it = *__pat; |
| ++__it; |
| } |
| |
| return __it; |
| } |
| |
| |
| } // namespace _V3_LOCALE |