// -*- C++ -*-
/***************************************************************************
 *
 * fstream -- declarations of the C++ Standard Library file stream classes
 *
 * $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-2008 Rogue Wave Software, Inc.
 * 
 **************************************************************************/

#ifndef _RWSTD_FSTREAM_INCLUDED
#define _RWSTD_FSTREAM_INCLUDED

#if __GNUG__ >= 3
#  pragma GCC system_header
#endif   // gcc >= 3

#include <streambuf>

#include <loc/_codecvt.h>

#include <rw/_file.h>
#include <rw/_iosbase.h>
#include <rw/_iosfwd.h>
#include <rw/_defs.h>

#ifndef _RWSTD_NO_REDUNDANT_DEFINITIONS
#  include <istream>
#  include <ostream>
#endif   // _RWSTD_NO_REDUNDANT_DEFINITIONS


#ifndef _RWSTD_PBACK_SIZE
#  define _RWSTD_PBACK_SIZE   ((_RWSTD_STREAMSIZE)4)
#endif   // _RWSTD_PBACK_SIZE


_RWSTD_NAMESPACE (std) { 

#ifndef _RWSTD_IOSFWD_INCLUDED

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_filebuf;

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ifstream;

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ofstream;

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_fstream;

typedef basic_filebuf<char>  filebuf;
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
typedef basic_fstream<char>  fstream;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_filebuf<wchar_t>  wfilebuf;
typedef basic_ifstream<wchar_t> wifstream;
typedef basic_ofstream<wchar_t> wofstream;
typedef basic_fstream<wchar_t>  wfstream;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_IOSFWD_INCLUDED


_EXPORT
template<class _CharT, class _Traits>
class basic_filebuf: public basic_streambuf<_CharT, _Traits>
{
    typedef basic_streambuf<_CharT, _Traits> _Streambuf;

public:
    typedef _CharT                          char_type;
    typedef _Traits                         traits_type;
    typedef typename traits_type::int_type int_type;
    typedef typename traits_type::pos_type pos_type;
    typedef typename traits_type::off_type off_type;

    // 27.8.1.2, p1
    basic_filebuf ()
        : _Streambuf(), _C_file (0),
          _C_cur_pos (pos_type (off_type (-1))),
          _C_beg_pos (pos_type (off_type (-1))),
          _C_pbacksize (0) {
        // call the virtual setbuf defined in this class (but
        // not an override defined in a class derived from it)
        basic_filebuf::setbuf (0, _RWSTD_DEFAULT_BUFSIZE);
    }

#if     defined (_RWSTD_NO_EXT_FILEBUF)            \
    && !defined (_RWSTD_NO_STATIC_IOSTREAM_INIT)   \
    && (!defined (__GNUG__) || 2 < __GNUG__ || 96 < __GNUC_MINOR__)

private:

    // g++ 2.95 error: `std::ios_base::Init' does not declare a template type
    friend struct ios_base::Init;

#endif   // _RWSTD_NO_EXT_FILEBUF && !_RWSTD_NO_STATIC_IOSTREAM_INIT

    // ctor extensions - associate this with an open file and
    // optionally set buffer size and caller-allocated buffer
    // NOTE: passed in buffer will NOT be deallocated
    explicit
    basic_filebuf (int __fd, char_type* __buf   = 0,
                   _RWSTD_STREAMSIZE __bufsz = _RWSTD_DEFAULT_BUFSIZE)
        : _Streambuf (ios_base::openmode (_RW::__rw_fdmode (__fd))),
          _C_file (0), _C_cur_pos (), _C_beg_pos (), _C_pbacksize (0) {
        _C_open (__fd, 0, __buf, __bufsz);
    }

public:

#ifndef _RWSTD_NO_EXT_FILEBUF

    // extension enabled only if the macro stdin is also #defined
    // i.e., if the header <cstdio> or <stdio.h> has been #included

#  ifdef stdin

    explicit
    basic_filebuf (FILE *__fptr, char_type* __buf = 0,
                   _RWSTD_STREAMSIZE __bufsz = _RWSTD_DEFAULT_BUFSIZE)
        : _Streambuf (),
          _C_file (0), _C_cur_pos (), _C_beg_pos (), _C_pbacksize (0) {
        open (__fptr, __buf, __bufsz);
    }

#  endif   // stdin
#endif   // _RWSTD_NO_EXT_FILEBUF

    // 27.8.1.2, p3
    virtual ~basic_filebuf ();

    // 27.8.1.3, p2 (last optional argument is an extension)
    basic_filebuf* open (const char*, ios_base::openmode, long = 0666);
    
#ifndef _RWSTD_NO_EXT_FILEBUF

    // extensions - associate *this with an open file descriptor
    // and optionally set buffer size and caller-allocated buffer
    // NOTE: passed in buffer will NOT be deallocated

    basic_filebuf* open (int __fd, char_type *__buf = 0,
          _RWSTD_STREAMSIZE __bufsz = _RWSTD_DEFAULT_BUFSIZE) {
        return _C_open (__fd, 0, __buf, __bufsz);
    }

#  ifdef stdin

    // extension enabled only if the macro stdin is also #defined
    // i.e., if the header <cstdio> or <stdio.h> has been #included

    basic_filebuf* open (FILE *__file, char_type *__buf = 0,
          _RWSTD_STREAMSIZE __bufsz = _RWSTD_DEFAULT_BUFSIZE) {
        return _C_open (-1, __file, __buf, __bufsz);
    }

#  endif   // stdin
    
    // extension - return the associated file descriptor
    int fd () const {
        return _RW::__rw_fileno (_C_file, this->_C_state);
    }

    // extension - associate *this with an open file descriptor
    basic_filebuf* attach (int __fd) {
        return _C_open (__fd, 0, this->_C_buffer, this->_C_bufsize);
    }

    // extension - flush and detach from file descriptor without closing it
    int detach () {
        const int __fd = fd ();
        return close (false) ? __fd : -1;
    }

#endif   // _RWSTD_NO_EXT_FILEBUF

    // 27.8.1.3, p6, argument is an extension
    basic_filebuf* close (bool = true);

    // 27.8.1.3, p1
    bool is_open () const {
        return 0 != _C_file;
    }

protected:

    // 27.8.1.4, p1
    virtual _RWSTD_STREAMSIZE showmanyc ();

    // 27.8.1.4, p3
    virtual int_type underflow ();

    // 27.8.1.4, p4 - same as base implementation
    // virtual int_type uflow ();

    // 27.8.1.4, p8
    virtual int_type overflow (int_type = traits_type::eof ());

    // 27.8.1.4, p5
    virtual int_type pbackfail (int_type = traits_type::eof ());

    // 27.8.1.4, p10 
    //   setbuf (0, 0) sets unbuffered mode (safe to use at any time)
    //   setbuf (0, N) sets buffered mode with internal buffer of size N
    //   setbuf (b, N) sets buffered mode with user-allocated buffer `b'
    //                 of size `N' (user responsible for deallocation)
    virtual basic_streambuf<char_type, traits_type>*
    setbuf (char_type*, _RWSTD_STREAMSIZE);
 
    // 27.8.1.4, p11
    virtual pos_type
    seekoff (off_type, ios_base::seekdir,
             ios_base::openmode = _RW::__rw_in_out);

    // 27.8.1.4, p14
    virtual pos_type
    seekpos (pos_type, ios_base::openmode = _RW::__rw_in_out);

    // 27.8.1.4, p16 - in input mode, repopulates buffer from file
    virtual int sync ();

    // overridden for efficiency
    virtual _RWSTD_STREAMSIZE
    xsputn (const char_type*, _RWSTD_STREAMSIZE);

private:

    basic_filebuf*
    _C_open (int, void*, char_type*, _RWSTD_STREAMSIZE);

    // count newlines in char sequence to handle CR/LF translation on win32
    // calculates seek offsets in external representation
    off_type _C_crlf_extern_count (const char*, const char*) const;
    
    // calculates seek offsets in internal representation
    off_type _C_crlf_intern_count (const char_type*, const char_type*) const;

    // write unshift sequence to file (multibyte, state-dependent encondings)
    bool _C_unshift ();

    void      *_C_file;               // underlying FILE ptr or file descriptor
    pos_type   _C_cur_pos;            // offset/state in file corresponding to
                                      //  end of buffer, and actual pos in file 
    pos_type   _C_beg_pos;            // offset/state in file corresponding
                                      //  to the beginning of buffer 
    _RWSTD_SIZE_T _C_pbacksize;       // size of putback area
};


template<class _CharT, class _Traits>
inline basic_filebuf<_CharT, _Traits>::~basic_filebuf ()
{
    _TRY {
        close ();
    }
    _CATCH (...) {
        // LWG issue 622: swallow all exceptions
    }

    if (this->_C_own_buf ())
        delete [] this->_C_buffer;
}


template<class _CharT, class _Traits>
inline typename basic_filebuf<_CharT, _Traits>::off_type
basic_filebuf<_CharT, _Traits>::
_C_crlf_extern_count (const char* __start, const char* __finish) const
{
    _RWSTD_ASSERT (__start <= __finish);

    off_type __n = 0;

#if defined (_RWSTD_NEWLINE_CR_LF) || defined (_RWSTD_NEWLINE_LF_CR)

    // compute the number of newline characters in the external representation
    if (!(this->_C_state & ios_base::binary)) {
        typedef char_traits<char> _CTraits;

        while ((__start = _CTraits::find (__start, __finish - __start, '\n'))) {
            ++__start;
            ++__n;
        }
    }

#else   // if !defined (_RWSTD_NEWLINE_CR_LF) || ...

    _RWSTD_UNUSED (__start);
    _RWSTD_UNUSED (__finish);

#endif   // _RWSTD_NEWLINE_CR_LF

    return __n;
}


template<class _CharT, class _Traits>
inline typename basic_filebuf<_CharT, _Traits>::off_type
basic_filebuf<_CharT, _Traits>::
_C_crlf_intern_count (const char_type* __start,
                      const char_type* __finish) const
{
    _RWSTD_ASSERT (__start <= __finish);

    off_type __n = 0;

#if defined (_RWSTD_NEWLINE_CR_LF) || defined (_RWSTD_NEWLINE_LF_CR)

    // compute the number of newline characters in the internal representation
    if (!(this->_C_state & ios_base::binary)) {
        const char_type __nl =
            _USE_FACET (ctype<char_type>, this->getloc ()).widen ('\n');

        while ((__start = _Traits::find (__start, __finish - __start, __nl))) {
            ++__start;
            ++__n;
        }
    }

#else   // if !defined (_RWSTD_NEWLINE_CR_LF) || ...

    _RWSTD_UNUSED (__start);
    _RWSTD_UNUSED (__finish);

#endif   // _RWSTD_NEWLINE_CR_LF

    return __n;
}


template<class _CharT, class _Traits>
class basic_ifstream: public basic_istream<_CharT, _Traits>
{
public:

    typedef _CharT                          char_type;
    typedef _Traits                         traits_type;
    typedef typename traits_type::int_type int_type;
    typedef typename traits_type::pos_type pos_type;
    typedef typename traits_type::off_type off_type;

    // NOTE: the ctors below pass the address of an unitialized
    //       member variable, _C_filebuf, to a base class ctor
    // the variable will be initialized only *after* the base
    // class ctor returns

    basic_ifstream ()
        : basic_istream<char_type, traits_type> (rdbuf ()) { }

    explicit
    basic_ifstream (const char        *__name,
                    ios_base::openmode __mode = ios_base::in,
                    long               __prot = 0666)
        : basic_istream<char_type, traits_type> (rdbuf ()) {
        open (__name, __mode, __prot);
    }

#ifndef  _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer
    explicit
    basic_ifstream (int __fd, char_type *__buf = 0,
                    _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_istream<char_type, traits_type> (rdbuf ()) {
        open (__fd, __buf, __n);
    }

#  ifdef stdin

    explicit
    basic_ifstream (FILE *__fptr, char_type *__buf = 0,
                    _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_istream<char_type, traits_type> (rdbuf ()) {
        open (__fptr, __buf, __n);
    }

#  endif   // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF
    
    // NOTE: the pointer returned from rdbuf() may be different from
    //       the one passed to basic_ios<>::rdbuf (basic_filebuf<>*)

    basic_filebuf<char_type, traits_type>* rdbuf() const {
        // necessary to help SunPro 5.0/T9
        typedef basic_ifstream <char_type, traits_type> __self_type;
        return &_RWSTD_CONST_CAST (__self_type*, this)->_C_filebuf;
    }

    bool is_open () const {
        return rdbuf ()->is_open ();
    }

    void open (const char         *__name,
               ios_base::openmode  __mode = ios_base::in,
               long                __prot = 0666) {
        this->clear (rdbuf ()->open (__name, __mode |= ios_base::in, __prot)
                     ? ios_base::goodbit : ios_base::failbit);
    }

#ifndef  _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer
    void open (int __fd, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fd, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  ifdef stdin

    void open (FILE *__fptr, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fptr, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  endif   // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF

    void close () {
        if (!rdbuf ()->close ())
            this->setstate (ios_base::failbit);
    }

private:
    basic_filebuf<char_type, traits_type> _C_filebuf;
};


template<class _CharT, class _Traits>
class basic_ofstream: public basic_ostream<_CharT, _Traits>
{
public:

    typedef _CharT                          char_type;
    typedef _Traits                         traits_type;
    typedef typename traits_type::int_type int_type;
    typedef typename traits_type::pos_type pos_type;
    typedef typename traits_type::off_type off_type;

    // NOTE: the ctors below pass the address of an unitialized
    //       member variable, _C_filebuf, to a base class ctor
    // the variable will be initialized only *after* the base
    // class ctor returns

    basic_ofstream ()
        : basic_ostream<char_type, traits_type> (rdbuf ()) { }

    explicit basic_ofstream (const char         *__name,
                              ios_base::openmode  __mode = ios_base::out,
                              long                __prot = 0666)
        : basic_ostream<char_type, traits_type> (rdbuf ()) {
        open (__name, __mode, __prot);
    }

#ifndef _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer
    explicit
    basic_ofstream (int __fd, char_type *__buf = 0,
                    _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_ostream<char_type, traits_type> (rdbuf ()) {
        open (__fd, __buf, __n);
    }
    
#  ifdef stdin

    explicit
    basic_ofstream (FILE *__fptr, char_type *__buf = 0,
                    _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_ostream<char_type, traits_type> (rdbuf ()) {
        open (__fptr, __buf, __n);
    }

#  endif   // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF
    
    // NOTE: the pointer returned from rdbuf() may be different from
    //       the one passed to basic_ios<>::rdbuf (basic_filebuf<>*)

    basic_filebuf<char_type, traits_type>* rdbuf () const {
        // necessary to help SunPro 5.0/T9
        typedef basic_ofstream <char_type, traits_type> _SelfT;
        return &_RWSTD_CONST_CAST (_SelfT*, this)->_C_filebuf;
    }

    bool is_open () const {
        return rdbuf ()->is_open ();
    }
     
    void open (const char         *__name,
               ios_base::openmode  __mode = ios_base::out,
               long                __prot = 0666) {
        this->clear (rdbuf ()->open (__name, __mode |= ios_base::out, __prot)
                     ? ios_base::goodbit : ios_base::failbit);
    }

#ifndef _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer
    void open (int  __fd, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fd, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  ifdef stdin

    void open (FILE *__fp, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fp, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  endif   // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF
    
    void close() {
        if (!rdbuf ()->close ())
            this->setstate (ios_base::failbit);
    }

private:
    basic_filebuf<char_type, traits_type> _C_filebuf;
};


template<class _CharT, class _Traits>
class basic_fstream: public basic_iostream<_CharT, _Traits>
{
public:

    typedef _CharT                          char_type;
    typedef _Traits                         traits_type;
    typedef typename traits_type::int_type int_type;
    typedef typename traits_type::pos_type pos_type;
    typedef typename traits_type::off_type off_type;

    // NOTE: the ctors below pass the address of an unitialized
    //       member variable, _C_filebuf, to a base class ctor
    // the variable will be initialized only *after* the base
    // class ctor returns

    basic_fstream ()
        : basic_iostream<char_type, traits_type>(rdbuf ()) { }

    explicit
    basic_fstream (const char         *__name,
                   ios_base::openmode  __mode = _RW::__rw_in_out,
                   long                __prot = 0666)
        : basic_iostream<char_type, traits_type>(rdbuf ()) {
        open (__name, __mode, __prot);
    }

#ifndef _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer
    explicit
    basic_fstream (int __fd, char_type *__buf = 0,
                   _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_iostream<char_type, traits_type>(rdbuf ()) {
        open (__fd, __buf, __n);
    }

#  ifdef stdin

    explicit
    basic_fstream (FILE *__fptr, char_type *__buf = 0,
                   _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE)
        : basic_iostream<char_type, traits_type>(rdbuf ()) {
        open (__fptr, __buf, __n);
    }

#  endif   // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF

    // NOTE: the pointer returned from rdbuf() may be different from
    //       the one passed to basic_ios<>::rdbuf (basic_filebuf<>*)

    basic_filebuf<char_type, traits_type>* rdbuf() const {
        // necessary to help SunPro 5.0/T9
        typedef basic_fstream <char_type, traits_type> _SelfT;
        return &_RWSTD_CONST_CAST (_SelfT*, this)->_C_filebuf;
    }

    bool is_open () const {
        return rdbuf ()->is_open ();
    }

    void open (const char         *__name,
               ios_base::openmode  __mode = _RW::__rw_in_out,
               long                __prot = 0666) {
        this->clear (rdbuf ()->open (__name, __mode, __prot)
                     ? ios_base::goodbit : ios_base::failbit);
    }

#ifndef _RWSTD_NO_EXT_FILEBUF

    // extensions - associate this with an open file and set buffer"
    void open (int __fd, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fd, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  ifdef stdin

    void open (FILE *__fptr, char_type *__buf=0,
               _RWSTD_STREAMSIZE __n = _RWSTD_DEFAULT_BUFSIZE) {
        this->clear (rdbuf ()->open (__fptr, __buf, __n) ?
                     ios_base::goodbit : ios_base::failbit);
    }

#  endif    // stdin

#endif   // _RWSTD_NO_EXT_FILEBUF

    void close () {
        if (!rdbuf ()->close ())
            this->setstate (ios_base::failbit);
    }

private:
    basic_filebuf<char_type, traits_type> _C_filebuf;
};


}   // namespace std


#if _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_FILEBUF)
#  include <fstream.cc>
#endif   // _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_FILEBUF)


#ifdef _RWSTD_MSVC
#  pragma warning (push)
#  pragma warning (disable: 4231)
#endif   // _RWSTD_MSVC


_RWSTD_NAMESPACE (std) { 

#if _RWSTD_INSTANTIATE (_BASIC_FILEBUF, _CHAR)

_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT
                      basic_filebuf<char, char_traits<char> >);

#endif   // _RWSTD_INSTANTIATE (_BASIC_FILEBUF, _CHAR)


#if _RWSTD_INSTANTIATE (_BASIC_FILEBUF, _WCHAR_T)

_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT
                      basic_filebuf<wchar_t, char_traits<wchar_t> >);

#endif   // _RWSTD_INSTANTIATE (_BASIC_FILEBUF, _WCHAR_T)

}   // namespace std


#ifdef _RWSTD_MSVC
#  pragma warning (pop)
#endif   // _RWSTD_MSVC


#if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_FILEBUF)
#  include <fstream.cc>
#endif   // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_FILEBUF)


#endif   // _RWSTD_FSTREAM_INCLUDED
