/***************************************************************************
 *
 * _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
