123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /*
- * Copyright (c) 1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Copyright (c) 1999
- * Boris Fomitchev
- *
- * This material is provided "as is", with absolutely no warranty expressed
- * or implied. Any use is at your own risk.
- *
- * Permission to use or copy this software for any purpose is hereby granted
- * without fee, provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
- */
- #include "stlport_prefix.h"
- #include <memory>
- #include <istream>
- #include <fstream>
- #if defined (_STLP_MSVC) || defined (__MWERKS__) || defined (__ICL) || defined (__ISCPP__)
- # define _STLP_USE_NOT_INIT_SEGMENT
- # include <iostream>
- #endif
- #include "stdio_streambuf.h"
- #include "aligned_buffer.h"
- #include "_stdio_file.h"
- #include "c_locale.h"
- // boris : note this is repeated in <iostream>
- #ifndef _STLP_USE_NAMESPACES
- // in case of SGI iostreams, we have to rename our streams not to clash with those
- // provided in native lib
- # define cin _STLP_cin
- # define cout _STLP_cout
- # define cerr _STLP_cerr
- # define clog _STLP_clog
- #endif
- _STLP_BEGIN_NAMESPACE
- // This file handles iostream initialization. It is inherently
- // nonportable, since the C++ language definition provides no mechanism
- // for controlling order of initialization of nonlocal objects.
- // Initialization has three parts, which must be performed in the following
- // order:
- // (1) Initialize the locale system
- // (2) Call the constructors for the eight global stream objects.
- // (3) Create streambufs for the global stream objects, and initialize
- // the stream objects by calling the init() member function.
- #if defined (_STLP_USE_NOT_INIT_SEGMENT)
- // Definitions of the eight global I/O objects that are declared in
- // <iostream>. For some compilers we use pragmas to put the global I/O
- // objects into an initialization segment that will not
- // be executed. We then explicitly invoke the constructors
- // with placement new in ios_base::_S_initialize()
- # if defined (__MWERKS__)
- # pragma suppress_init_code on
- # else
- # pragma init_seg("STLPORT_NO_INIT")
- # endif
- _STLP_DECLSPEC istream cin(0);
- _STLP_DECLSPEC ostream cout(0);
- _STLP_DECLSPEC ostream cerr(0);
- _STLP_DECLSPEC ostream clog(0);
- # ifndef _STLP_NO_WCHAR_T
- _STLP_DECLSPEC wistream wcin(0);
- _STLP_DECLSPEC wostream wcout(0);
- _STLP_DECLSPEC wostream wcerr(0);
- _STLP_DECLSPEC wostream wclog(0);
- # endif
- # if defined (__MWERKS__)
- # pragma suppress_init_code off
- # endif
- #else
- // Definitions of the eight global I/O objects that are declared in
- // <iostream>. Disgusting hack: we deliberately define them with the
- // wrong types so that the constructors don't get run automatically.
- // We need special tricks to make sure that these objects are struct-
- // aligned rather than byte-aligned.
- // This is not portable. Declaring a variable with different types in
- // two translations units is "undefined", according to the C++ standard.
- // Most compilers, however, silently accept this instead of diagnosing
- // it as an error.
- # ifndef __DMC__
- _STLP_DECLSPEC _Stl_aligned_buffer<istream> cin;
- _STLP_DECLSPEC _Stl_aligned_buffer<ostream> cout;
- _STLP_DECLSPEC _Stl_aligned_buffer<ostream> cerr;
- _STLP_DECLSPEC _Stl_aligned_buffer<ostream> clog;
- # else
- _Stl_aligned_buffer<istream> cin;
- _Stl_aligned_buffer<ostream> cout;
- _Stl_aligned_buffer<ostream> cerr;
- _Stl_aligned_buffer<ostream> clog;
- # pragma alias("?cin@std@@3V?$basic_istream@std@DV?$char_traits@std@D@1@@1@A", "?cin@std@@3T?$_Stl_aligned_buffer@std@V?$basic_istream@std@DV?$char_traits@std@D@1@@1@@1@A")
- # pragma alias("?cout@std@@3V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@A", "?cout@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@@1@A")
- # pragma alias("?cerr@std@@3V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@A", "?cerr@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@@1@A")
- # pragma alias("?clog@std@@3V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@A", "?clog@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@DV?$char_traits@std@D@1@@1@@1@A")
- # endif
- # ifndef _STLP_NO_WCHAR_T
- # ifndef __DMC__
- _STLP_DECLSPEC _Stl_aligned_buffer<wistream> wcin;
- _STLP_DECLSPEC _Stl_aligned_buffer<wostream> wcout;
- _STLP_DECLSPEC _Stl_aligned_buffer<wostream> wcerr;
- _STLP_DECLSPEC _Stl_aligned_buffer<wostream> wclog;
- # else
- _Stl_aligned_buffer<wistream> wcin;
- _Stl_aligned_buffer<wostream> wcout;
- _Stl_aligned_buffer<wostream> wcerr;
- _Stl_aligned_buffer<wostream> wclog;
- # pragma alias("?wcin@std@@3V?$basic_istream@std@_YV?$char_traits@std@_Y@1@@1@A", "?wcin@std@@3T?$_Stl_aligned_buffer@std@V?$basic_istream@std@_YV?$char_traits@std@_Y@1@@1@@1@A")
- # pragma alias("?wcout@std@@3V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@A", "?wcout@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@@1@A")
- # pragma alias("?wcerr@std@@3V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@A", "?wcerr@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@@1@A")
- # pragma alias("?wclog@std@@3V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@A", "?wclog@std@@3T?$_Stl_aligned_buffer@std@V?$basic_ostream@std@_YV?$char_traits@std@_Y@1@@1@@1@A")
- # endif
- # endif
- #endif /* STL_MSVC || __MWERKS__ */
- // Member functions from class ios_base and ios_base::Init
- long ios_base::Init::_S_count = 0;
- // by default, those are synced
- bool ios_base::_S_is_synced = true;
- ios_base::Init::Init() {
- if (_S_count++ == 0) {
- _Locale_init();
- ios_base::_S_initialize();
- _Filebuf_base::_S_initialize();
- }
- }
- ios_base::Init::~Init() {
- if (--_S_count == 0) {
- ios_base::_S_uninitialize();
- _Locale_final();
- }
- }
- static int _Stl_extract_open_param(FILE* f)
- { return _FILE_fd(f); }
- #ifdef _STLP_REDIRECT_STDSTREAMS
- static const char* _Stl_extract_open_param(const char* name)
- { return name; }
- #endif
- template <class _Tp>
- static filebuf*
- _Stl_create_filebuf(_Tp x, ios_base::openmode mode ) {
- auto_ptr<filebuf> result(new basic_filebuf<char, char_traits<char> >());
- result->open(_Stl_extract_open_param(x), mode);
- if (result->is_open())
- return result.release();
- return 0;
- }
- #if !defined (_STLP_NO_WCHAR_T)
- static wfilebuf*
- _Stl_create_wfilebuf(FILE* f, ios_base::openmode mode) {
- auto_ptr<wfilebuf> result(new basic_filebuf<wchar_t, char_traits<wchar_t> >());
- result->_M_open(_FILE_fd(f), mode);
- if (result->is_open())
- return result.release();
- return 0;
- }
- #endif
- void _STLP_CALL ios_base::_S_initialize() {
- #if !defined (_STLP_HAS_NO_NAMESPACES) && !defined (_STLP_DONT_USE_PRIV_NAMESPACE)
- using _STLP_PRIV stdio_istreambuf;
- using _STLP_PRIV stdio_ostreambuf;
- #endif
- auto_ptr<streambuf> cin_buf;
- auto_ptr<streambuf> cout_buf;
- auto_ptr<streambuf> cerr_buf;
- auto_ptr<streambuf> clog_buf;
- if (_S_is_synced)
- cin_buf.reset(new stdio_istreambuf(stdin));
- else
- cin_buf.reset(_Stl_create_filebuf(stdin, ios_base::in));
- if (_S_is_synced) {
- #ifdef _STLP_REDIRECT_STDSTREAMS
- cout_buf.reset(_Stl_create_filebuf("/stdout.txt", ios::out));
- cerr_buf.reset(_Stl_create_filebuf("/stderr.txt", ios::out));
- clog_buf.reset(_Stl_create_filebuf("/stdlog.txt", ios::out));
- #else
- cout_buf.reset(new stdio_ostreambuf(stdout));
- cerr_buf.reset(new stdio_ostreambuf(stderr));
- clog_buf.reset(new stdio_ostreambuf(stderr));
- #endif
- }
- else {
- cout_buf.reset(_Stl_create_filebuf(stdout, ios_base::out));
- cerr_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
- clog_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
- }
- istream* ptr_cin = new(&cin) istream(cin_buf.get()); cin_buf.release();
- ostream* ptr_cout = new(&cout) ostream(cout_buf.get()); cout_buf.release();
- ostream* ptr_cerr = new(&cerr) ostream(cerr_buf.get()); cerr_buf.release();
- /*ostream* ptr_clog = */ new(&clog) ostream(clog_buf.get()); clog_buf.release();
- ptr_cin->tie(ptr_cout);
- ptr_cerr->setf(ios_base::unitbuf);
- #ifndef _STLP_NO_WCHAR_T
- auto_ptr<wfilebuf> win(_Stl_create_wfilebuf(stdin, ios_base::in));
- auto_ptr<wfilebuf> wout(_Stl_create_wfilebuf(stdout, ios_base::out));
- auto_ptr<wfilebuf> werr(_Stl_create_wfilebuf(stderr, ios_base::out));
- auto_ptr<wfilebuf> wlog(_Stl_create_wfilebuf(stderr, ios_base::out));
- // Run constructors for the four wide stream objects.
- wistream* ptr_wcin = new(&wcin) wistream(win.get()); win.release();
- wostream* ptr_wcout = new(&wcout) wostream(wout.get()); wout.release();
- wostream* ptr_wcerr = new(&wcerr) wostream(werr.get()); werr.release();
- /*wostream* ptr_wclog = */ new(&wclog) wostream(wlog.get()); wlog.release();
- ptr_wcin->tie(ptr_wcout);
- ptr_wcerr->setf(ios_base::unitbuf);
- #endif
- }
- void _STLP_CALL ios_base::_S_uninitialize() {
- // Note that destroying output streambufs flushes the buffers.
- istream* ptr_cin = &cin;
- ostream* ptr_cout = &cout;
- ostream* ptr_cerr = &cerr;
- ostream* ptr_clog = &clog;
- // We don't want any exceptions being thrown here
- ptr_cin->exceptions(0);
- ptr_cout->exceptions(0);
- ptr_cerr->exceptions(0);
- ptr_clog->exceptions(0);
- delete ptr_cin->rdbuf(0);
- delete ptr_cout->rdbuf(0);
- delete ptr_cerr->rdbuf(0);
- delete ptr_clog->rdbuf(0);
- _Destroy(ptr_cin);
- _Destroy(ptr_cout);
- _Destroy(ptr_cerr);
- _Destroy(ptr_clog);
- #ifndef _STLP_NO_WCHAR_T
- wistream* ptr_wcin = &wcin;
- wostream* ptr_wcout = &wcout;
- wostream* ptr_wcerr = &wcerr;
- wostream* ptr_wclog = &wclog;
- // We don't want any exceptions being thrown here
- ptr_wcin->exceptions(0);
- ptr_wcout->exceptions(0);
- ptr_wcerr->exceptions(0);
- ptr_wclog->exceptions(0);
- delete ptr_wcin->rdbuf(0);
- delete ptr_wcout->rdbuf(0);
- delete ptr_wcerr->rdbuf(0);
- delete ptr_wclog->rdbuf(0);
- _Destroy(ptr_wcin);
- _Destroy(ptr_wcout);
- _Destroy(ptr_wcerr);
- _Destroy(ptr_wclog);
- #endif
- }
- bool _STLP_CALL ios_base::sync_with_stdio(bool sync) {
- # if !defined (_STLP_HAS_NO_NAMESPACES) && !defined (_STLP_DONT_USE_PRIV_NAMESPACE)
- using _STLP_PRIV stdio_istreambuf;
- using _STLP_PRIV stdio_ostreambuf;
- # endif
- if (sync == _S_is_synced) return sync;
- // if by any chance we got there before std streams initialization,
- // just set the sync flag and exit
- if (Init::_S_count == 0) {
- _S_is_synced = sync;
- return sync;
- }
- auto_ptr<streambuf> cin_buf;
- auto_ptr<streambuf> cout_buf;
- auto_ptr<streambuf> cerr_buf;
- auto_ptr<streambuf> clog_buf;
- if (sync)
- cin_buf.reset(new stdio_istreambuf(stdin));
- else
- cin_buf.reset(_Stl_create_filebuf(stdin, ios_base::in));
- if (sync) {
- #ifdef _STLP_REDIRECT_STDSTREAMS
- cout_buf.reset(_Stl_create_filebuf("/stdout.txt", ios::out));
- cerr_buf.reset(_Stl_create_filebuf("/stderr.txt", ios::out));
- clog_buf.reset(_Stl_create_filebuf("/stdlog.txt", ios::out));
- #else
- cout_buf.reset(new stdio_ostreambuf(stdout));
- cerr_buf.reset(new stdio_ostreambuf(stderr));
- clog_buf.reset(new stdio_ostreambuf(stderr));
- #endif
- }
- else {
- cout_buf.reset(_Stl_create_filebuf(stdout, ios_base::out));
- cerr_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
- clog_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
- }
- if (cin_buf.get() != 0 && cout_buf.get() != 0 && cerr_buf.get() != 0 && clog_buf.get() != 0) {
- // When streambuf passed to rdbuf is not null, rdbuf is exception safe:
- delete (&cin)->rdbuf(cin_buf.release());
- delete (&cout)->rdbuf(cout_buf.release());
- delete (&cerr)->rdbuf(cerr_buf.release());
- delete (&clog)->rdbuf(clog_buf.release());
- _S_is_synced = sync;
- }
- return _S_is_synced;
- }
- _STLP_END_NAMESPACE
- // Local Variables:
- // mode:C++
- // End:
|