/**************************************************************************
 *
 * iostream.cpp - source for the Standard Library iostream objects
 *
 * $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.
 * 
 **************************************************************************/

#define _RWSTD_LIB_SRC

#if    3 == __GNUG__ && 3 > __GNUC_MINOR__ \
    || 3 == __GNUC_MINOR__ && 1 >__GNUC_PATCHLEVEL__

  // working around a gcc bug (PR #29570)
#  include <rw/_config.h>
#  ifndef _RWSTD_NO_EXTERN_TEMPLATE
#    define _RWSTD_NO_EXTERN_TEMPLATE
#  endif
#endif   // gcc >= 3.0 && gcc < 3.3.1

#include <rw/_defs.h>

#ifdef _WIN32
#  include <io.h>
#  ifndef STDIN_FILENO
#    define STDIN_FILENO  0
#    define STDOUT_FILENO 1
#    define STDERR_FILENO 2
#  endif   // STDIN_FILENO
#else
   // unistd.h must preceed other headers to avoid a namespace issue
   // ("time_t" vrs "std::time_t") on SunPro 5.3/SunOS 5.8
#  include <unistd.h>
#endif 

#include <iosfwd>
#include <istream>
#include <ostream>
#include <fstream>
#include <memory>
#include <new>

#include <rw/_error.h>

#include "iosdata.h"
#include "podarray.h"   // for __rw_aligned_buffer

#include <stdio.h>    // fprintf(), stderr
#include <stdlib.h>   // abort()


#ifdef _MSC_VER
   // force early intitalization of Standard Iostream Objects
   // gives warning C4073: initializers put in library initialization
   // area; disable it
#  pragma warning (disable: 4073)
#  pragma init_seg (lib)
#endif   // _MSC_VER


// #defined  below
#undef _INIT

// stream objects are initialized with static basic_filebuf objects
// based on static data buffers to avoid dynamic memory allocation
// at library initialization time

#ifndef _RWSTD_NO_STATIC_IOSTREAM_INIT

// iostream objects and buffers are (re)constructed in ios_base::Init()
// via calls to placement new after being zero-initialized (not constructed)
// at definition time (by the means of the __rw_aligned_buffer trick)

#  ifndef _RWSTD_NO_IOSTREAM_OBJECT_REFS

// cin, cout, and the other Standard iostream objects are references to
// these objects which of caurse violates 27.3 but avoids the potential
// for destruction prior to any other objects with static storage duration
// and is undetectable

#define _RWSTD_DEFINE_STREAM_OBJECT(buftype, stream, name, ign1, ign2)        \
  _RWSTD_NAMESPACE (__rw) {                                                   \
    /* static character buffer to prevent dynamic allocation */               \
    static _STD::stream::char_type __rw_##name##_databuf [512];               \
    /* static indestructible `basic_filebuf<>' object */                      \
    static __rw_aligned_buffer<_STD::buftype> __rw_##name##_buffer;           \
    /* static indestructible `basic_[i|o]stream<>' object */                  \
    static __rw_aligned_buffer<_STD::stream> __rw_indestructible_##name;      \
  }   /* namespace __rw */                                                    \
  _RWSTD_NAMESPACE (std) {                                                    \
    /* reference (not object) to a basic_[i|o]stream<> object */              \
    _RWSTD_EXPORT stream &name                                                \
        = _RWSTD_REINTERPRET_CAST (stream&, _RW::__rw_indestructible_##name); \
  }   /* namespace std */                                                     \
  typedef void __rw_unused_typedef

#define _OBJECT(ignore, name)   name

#  else   // if defined (_RWSTD_NO_IOSTREAM_OBJECT_REFS)

// cin, cout, and the other Standard iostream objects are defined to be
// specializations of the POD type __rw::__rw_aligned_buffer<[i|o]stream>
// but declared in <iostream> to be extern [i|o]stream
// since the type information isn't encoded (mangled) in data names this
// lie is transparent to the compiler/linker as neither ever sees both
// declarations

#define _RWSTD_DEFINE_STREAM_OBJECT(buftype, stream, name, ign1, ign2)      \
  _RWSTD_NAMESPACE (__rw) {                                                 \
    /* static character buffer to prevent dynamic allocation */             \
    static _STD::stream::char_type __rw_##name##_databuf [512];             \
    /* static indestructible `basic_filebuf<>' object */                    \
    static __rw_aligned_buffer<_STD::buftype> __rw_##name##_buffer;         \
  }   /* namespace __rw */                                                  \
  _RWSTD_NAMESPACE (std) {                                                  \
    /* extern  indestructible `basic_[i|o]stream<>' object */               \
    _RWSTD_EXPORT _RW::__rw_aligned_buffer<stream> name;                    \
  }   /* namespace std */                                                   \
  _RWSTD_NAMESPACE (__rw) {                                                 \
    /* reference to the actual object for convenience */                    \
    static __rw_aligned_buffer<_STD::stream>&                               \
        __rw_indestructible_##name = _STD::name;                            \
  }   /* namespace __rw */                                                  \
  typedef void __rw_unused_typedef

#define _OBJECT(type, name)   _RWSTD_REINTERPRET_CAST (type&, name)

#  endif   // _RWSTD_NO_IOSTREAM_OBJECT_REFS

// expression returning the address of the initialized object
#define _INIT(buftype, stream, name, buf, f)                                  \
  /* construct basic_[i|o]stream object backed by a filebuf object */         \
  /* backed by a static characater array                           */         \
  new (&_RW::__rw_indestructible_##name) stream                               \
          (new (&_RW::__rw_##name##_buffer) buftype                           \
              (f, _RW::__rw_##name##_databuf,                                 \
     sizeof _RW::__rw_##name##_databuf / sizeof *_RW::__rw_##name##_databuf)) \


#else   // if defined (_RWSTD_NO_STATIC_IOSTREAM_INIT)

// iostream objects and buffers are constructed at definition time

#define _RWSTD_DEFINE_STREAM_OBJECT(buftype, stream, name, buf, f)           \
  _RWSTD_NAMESPACE (__rw) {                                                  \
    /* static character buffer to prevent dynamic allocation */              \
    static _STD::stream::char_type __rw_##name##_databuf [512];              \
    /* static `basic_filebuf<>' object, destroyed at program termination */  \
    static _STD::buftype __rw_##name##_buffer (f,                            \
        __rw_##name##_databuf,                                               \
        sizeof __rw_##name##_databuf / sizeof *__rw_##name##_databuf);       \
  }   /* namespace __rw */                                                   \
  _RWSTD_NAMESPACE (std) {                                                   \
    /* extern `basic_[i|o]stream<>' object, destroyed at termination */      \
    _RWSTD_EXPORT stream name (&_RW::__rw_##buf##_buffer);                   \
  }   /* namespace std */                                                    \
  typedef void __rw_unused_typedef

#define _INIT(ign1, stream, ign3, ign4, ign5)   ((stream*)0)

#endif   // _RWSTD_NO_STATIC_IOSTREAM_INIT


// define iostream objects and their corresponding "buffers"
_RWSTD_DEFINE_STREAM_OBJECT (filebuf, istream, cin,  cin,  STDIN_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (filebuf, ostream, cout, cout, STDOUT_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (filebuf, ostream, cerr, cerr, STDERR_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (filebuf, ostream, clog, cerr, STDERR_FILENO);

#ifndef _RWSTD_NO_WCHAR_T

_RWSTD_DEFINE_STREAM_OBJECT (wfilebuf, wistream, wcin,  wcin,  STDIN_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (wfilebuf, wostream, wcout, wcout, STDOUT_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (wfilebuf, wostream, wcerr, wcerr, STDERR_FILENO);
_RWSTD_DEFINE_STREAM_OBJECT (wfilebuf, wostream, wclog, wcerr, STDERR_FILENO);

#endif   // _RWSTD_NO_WCHAR_T


// allow basic_ostream<> inline member functions to refer to the standard
// iostream objects without making those objects visible to user code (so
// that they can safely be dereferenced only after #including <iostream>
// which is the only header where they are declared and by the means of
// which they are initialized - through the static initialization object)

_RWSTD_NAMESPACE (__rw) { 

#ifdef _RWSTD_NO_STATIC_IOSTREAM_INIT

// a single (library-wide) iostream initializer object - must be defined
// after the definition of the iostream objects (above) so that when
// its dtor manipulates the objects they have not been destroyed
ios_base::Init __rw_stream_initializer;

#endif   // _RWSTD_NO_STATIC_IOSTREAM_INIT


// array of pointers to the 8 standard iostream objects
extern const void* __rw_std_streams [];


// iostream initialization counter
static int __rw_ios_initcnt /* = 0 */;

}   // namespace __rw


_RWSTD_NAMESPACE (std) {

ios_base::Init::Init ()
{
    // only the first thread initializes
    if (1 != _RWSTD_ATOMIC_PREINCREMENT (_RW::__rw_ios_initcnt, false))
        return;

    // since references need not be initialzied statically, cin, et al
    // may not be initialized at this time (i.e., &cin == 0 may hold,
    // and does with MSVC 6.0), obtain and use pointers to the objects
    istream *pcin =  _INIT (filebuf, istream, cin,  cin,  STDIN_FILENO);
    ostream *pcout = _INIT (filebuf, ostream, cout, cout, STDOUT_FILENO);
    ostream *pcerr = _INIT (filebuf, ostream, cerr, cerr, STDERR_FILENO);
    ostream *pclog = _INIT (filebuf, ostream, clog, cerr, STDERR_FILENO);

    // stream objects expected to be arranged in this order
    // must be initialized dynamically (as opposed to statically)
    _RW::__rw_std_streams[0] = _RWSTD_STATIC_CAST (ios_base*, pcin);
    _RW::__rw_std_streams[1] = _RWSTD_STATIC_CAST (ios_base*, pcout);
    _RW::__rw_std_streams[2] = _RWSTD_STATIC_CAST (ios_base*, pcerr);
    _RW::__rw_std_streams[3] = _RWSTD_STATIC_CAST (ios_base*, pclog);

    // 27.3.1, p2
    pcin->_C_usr = &_C_usr_data::_C_std_usr_data [0];
    pcin->_C_usr->_C_tie = pcout;

    // 27.3.1, p5
    pcerr->_C_fmtfl |= _RW::__rw_unitbuf;

    pcin->_C_fmtfl  |= _RW::__rw_sync_stdio;
    pcout->_C_fmtfl |= _RW::__rw_sync_stdio;
    pcerr->_C_fmtfl |= _RW::__rw_sync_stdio;
    pclog->_C_fmtfl |= _RW::__rw_sync_stdio;

#if     defined (_RWSTD_REENTRANT)             \
    && !defined (_RWSTD_NO_EXT_REENTRANT_IO)   \
    && !defined (_RWSTD_NO_REENTRANT_IO_DEFAULT)

    // override MT-safety setting done in basic_ios<>::init()
    pcin->_C_fmtfl  &= ~(nolock | nolockbuf);
    pcout->_C_fmtfl &= ~(nolock | nolockbuf);
    pcerr->_C_fmtfl &= ~(nolock | nolockbuf);
    pclog->_C_fmtfl &= ~(nolock | nolockbuf);

#endif   // _RWSTD_REENTRANT && !_RWSTD_NO_EXT_REENTRANT_IO && ...


#ifndef _RWSTD_NO_WCHAR_T

    wistream *pwcin =  _INIT (wfilebuf, wistream, wcin,  wcin,  STDIN_FILENO);
    wostream *pwcout = _INIT (wfilebuf, wostream, wcout, wcout, STDOUT_FILENO);
    wostream *pwcerr = _INIT (wfilebuf, wostream, wcerr, wcerr, STDERR_FILENO);
    wostream *pwclog = _INIT (wfilebuf, wostream, wclog, wcerr, STDERR_FILENO);

    // stream objects expected to be arranged in this order
    // must be initialized dynamically (as opposed to statically)
    _RW::__rw_std_streams[4] = _RWSTD_STATIC_CAST (ios_base*, pwcin);
    _RW::__rw_std_streams[5] = _RWSTD_STATIC_CAST (ios_base*, pwcout);
    _RW::__rw_std_streams[6] = _RWSTD_STATIC_CAST (ios_base*, pwcerr);
    _RW::__rw_std_streams[7] = _RWSTD_STATIC_CAST (ios_base*, pwclog);

    // 27.3.2, p2
    pwcin->_C_usr = &_C_usr_data::_C_std_usr_data [1];
    pwcin->_C_usr->_C_tie = pwcout;

    // 27.3.2, p5
    pwcerr->_C_fmtfl |= _RW::__rw_unitbuf;

    pwcin->_C_fmtfl  |= _RW::__rw_sync_stdio;
    pwcout->_C_fmtfl |= _RW::__rw_sync_stdio;
    pwcerr->_C_fmtfl |= _RW::__rw_sync_stdio;
    pwclog->_C_fmtfl |= _RW::__rw_sync_stdio;

#  if     defined (_RWSTD_REENTRANT)             \
      && !defined (_RWSTD_NO_EXT_REENTRANT_IO)   \
      && !defined (_RWSTD_NO_REENTRANT_IO_DEFAULT)

    // override MT-safety setting done in basic_ios<>::init()
    pwcin->_C_fmtfl  &= ~(nolock | nolockbuf);
    pwcout->_C_fmtfl &= ~(nolock | nolockbuf);
    pwcerr->_C_fmtfl &= ~(nolock | nolockbuf);
    pwclog->_C_fmtfl &= ~(nolock | nolockbuf);

#  endif   // _RWSTD_REENTRANT && !_RWSTD_NO_EXT_REENTRANT_IO && ...

#endif   // _RWSTD_NO_WCHAR_T
}


ios_base::Init::~Init ()
{
    if (_RWSTD_ATOMIC_PREDECREMENT (_RW::__rw_ios_initcnt, false))
        return;

    // put all standard iostream objects in unbuffered mode so that
    // output made from dtors of user objects with static storage
    // duration destroyed from this point on (i.e., after the destruction
    // of *this, the last initializer object) is not lost

    // references must not be destroyed
    _RWSTD_ASSERT (&cout && &cerr && &clog);

    const char fmt[] = "exception during std::%s cleanup\n";

    int caught = 0;

    _TRY {
        _OBJECT (ostream, cout).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "cout");
        ++caught;
    }
    _TRY {
        _OBJECT (ostream, cerr).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "cerr");
        ++caught;
    }
    _TRY {
        _OBJECT (ostream, clog).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "clog");
        ++caught;
    }

#ifndef _RWSTD_NO_WCHAR_T

    _RWSTD_ASSERT (&wcout && &wcerr && &wclog);

    _TRY {
        _OBJECT (wostream, wcout).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "wcout");
        ++caught;
    }
    _TRY {
        _OBJECT (wostream, wcerr).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "wcerr");
        ++caught;
    }
    _TRY {
        _OBJECT (wostream, wclog).rdbuf ()->pubsetbuf (0, 0);
    }
    _CATCH (...) {
        fprintf (stderr, fmt, "wclog");
        ++caught;
    }

#endif   // _RWSTD_NO_WCHAR_T

    if (caught)
        abort ();
}


}   // namespace std
