1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h"
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <memory>
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <istream>
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <fstream>
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_MSVC) || defined (__MWERKS__) || defined (__ICL) || defined (__ISCPP__)
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_USE_NOT_INIT_SEGMENT
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <iostream>
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stdio_streambuf.h"
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "aligned_buffer.h"
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "_stdio_file.h"
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h"
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// boris : note this is repeated in <iostream>
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_USE_NAMESPACES
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// in case of SGI iostreams, we have to rename our streams not to clash with those
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// provided in native lib
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define cin _STLP_cin
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define cout _STLP_cout
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define cerr _STLP_cerr
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define clog _STLP_clog
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// This file handles iostream initialization.  It is inherently
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// nonportable, since the C++ language definition provides no mechanism
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// for controlling order of initialization of nonlocal objects.
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Initialization has three parts, which must be performed in the following
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// order:
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  (1) Initialize the locale system
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  (2) Call the constructors for the eight global stream objects.
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  (3) Create streambufs for the global stream objects, and initialize
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//      the stream objects by calling the init() member function.
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_NOT_INIT_SEGMENT)
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Definitions of the eight global I/O objects that are declared in
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// <iostream>. For some compilers we use pragmas to put the global I/O
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// objects into an initialization segment that will not
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// be executed. We then explicitly invoke the constructors
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// with placement new in ios_base::_S_initialize()
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__MWERKS__)
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    pragma suppress_init_code on
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    pragma init_seg("STLPORT_NO_INIT")
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC istream cin(0);
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC ostream cout(0);
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC ostream cerr(0);
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC ostream clog(0);
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifndef _STLP_NO_WCHAR_T
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC wistream wcin(0);
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC wostream wcout(0);
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC wostream wcerr(0);
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC wostream wclog(0);
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__MWERKS__)
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    pragma suppress_init_code off
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Definitions of the eight global I/O objects that are declared in
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// <iostream>.  Disgusting hack: we deliberately define them with the
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// wrong types so that the constructors don't get run automatically.
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// We need special tricks to make sure that these objects are struct-
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// aligned rather than byte-aligned.
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// This is not portable.  Declaring a variable with different types in
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// two translations units is "undefined", according to the C++ standard.
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Most compilers, however, silently accept this instead of diagnosing
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// it as an error.
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifndef __DMC__
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<istream> cin;
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<ostream> cout;
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<ostream> cerr;
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<ostream> clog;
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<istream> cin;
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<ostream> cout;
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<ostream> cerr;
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<ostream> clog;
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    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")
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    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")
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    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")
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    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")
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifndef _STLP_NO_WCHAR_T
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    ifndef __DMC__
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<wistream> wcin;
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<wostream> wcout;
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<wostream> wcerr;
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC _Stl_aligned_buffer<wostream> wclog;
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    else
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<wistream> wcin;
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<wostream> wcout;
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<wostream> wcerr;
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_aligned_buffer<wostream> wclog;
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      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")
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      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")
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      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")
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      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")
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* STL_MSVC || __MWERKS__ */
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Member functions from class ios_base and ios_base::Init
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlong ios_base::Init::_S_count = 0;
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// by default, those are synced
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool ios_base::_S_is_synced = true;
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottios_base::Init::Init() {
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (_S_count++ == 0) {
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_init();
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ios_base::_S_initialize();
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Filebuf_base::_S_initialize();
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottios_base::Init::~Init() {
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (--_S_count == 0) {
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ios_base::_S_uninitialize();
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Locale_final();
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic int _Stl_extract_open_param(FILE* f)
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _FILE_fd(f); }
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_REDIRECT_STDSTREAMS
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* _Stl_extract_open_param(const char* name)
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return name; }
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp>
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic filebuf*
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_create_filebuf(_Tp x, ios_base::openmode mode ) {
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<filebuf> result(new basic_filebuf<char, char_traits<char> >());
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  result->open(_Stl_extract_open_param(x), mode);
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (result->is_open())
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return result.release();
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return 0;
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic wfilebuf*
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_Stl_create_wfilebuf(FILE* f, ios_base::openmode mode) {
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<wfilebuf> result(new basic_filebuf<wchar_t, char_traits<wchar_t> >());
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  result->_M_open(_FILE_fd(f), mode);
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (result->is_open())
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return result.release();
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return 0;
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid  _STLP_CALL ios_base::_S_initialize() {
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_HAS_NO_NAMESPACES) && !defined (_STLP_DONT_USE_PRIV_NAMESPACE)
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  using _STLP_PRIV stdio_istreambuf;
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  using _STLP_PRIV stdio_ostreambuf;
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cin_buf;
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cout_buf;
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cerr_buf;
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> clog_buf;
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (_S_is_synced)
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cin_buf.reset(new stdio_istreambuf(stdin));
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cin_buf.reset(_Stl_create_filebuf(stdin, ios_base::in));
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (_S_is_synced) {
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_REDIRECT_STDSTREAMS
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(_Stl_create_filebuf("/stdout.txt", ios::out));
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(_Stl_create_filebuf("/stderr.txt", ios::out));
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(_Stl_create_filebuf("/stdlog.txt", ios::out));
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(new stdio_ostreambuf(stdout));
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(new stdio_ostreambuf(stderr));
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(new stdio_ostreambuf(stderr));
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(_Stl_create_filebuf(stdout, ios_base::out));
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  istream* ptr_cin  = new(&cin)  istream(cin_buf.get()); cin_buf.release();
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ostream* ptr_cout = new(&cout) ostream(cout_buf.get()); cout_buf.release();
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ostream* ptr_cerr = new(&cerr) ostream(cerr_buf.get()); cerr_buf.release();
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /*ostream* ptr_clog = */ new(&clog) ostream(clog_buf.get()); clog_buf.release();
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_cin->tie(ptr_cout);
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_cerr->setf(ios_base::unitbuf);
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<wfilebuf> win(_Stl_create_wfilebuf(stdin, ios_base::in));
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<wfilebuf> wout(_Stl_create_wfilebuf(stdout, ios_base::out));
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<wfilebuf> werr(_Stl_create_wfilebuf(stderr, ios_base::out));
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<wfilebuf> wlog(_Stl_create_wfilebuf(stderr, ios_base::out));
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Run constructors for the four wide stream objects.
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wistream* ptr_wcin  = new(&wcin)  wistream(win.get()); win.release();
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wostream* ptr_wcout = new(&wcout) wostream(wout.get()); wout.release();
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wostream* ptr_wcerr = new(&wcerr) wostream(werr.get()); werr.release();
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /*wostream* ptr_wclog = */ new(&wclog) wostream(wlog.get()); wlog.release();
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wcin->tie(ptr_wcout);
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wcerr->setf(ios_base::unitbuf);
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL ios_base::_S_uninitialize() {
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Note that destroying output streambufs flushes the buffers.
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  istream* ptr_cin  = &cin;
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ostream* ptr_cout = &cout;
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ostream* ptr_cerr = &cerr;
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ostream* ptr_clog = &clog;
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We don't want any exceptions being thrown here
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_cin->exceptions(0);
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_cout->exceptions(0);
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_cerr->exceptions(0);
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_clog->exceptions(0);
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_cin->rdbuf(0);
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_cout->rdbuf(0);
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_cerr->rdbuf(0);
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_clog->rdbuf(0);
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_cin);
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_cout);
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_cerr);
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_clog);
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_NO_WCHAR_T
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wistream* ptr_wcin  = &wcin;
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wostream* ptr_wcout = &wcout;
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wostream* ptr_wcerr = &wcerr;
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wostream* ptr_wclog = &wclog;
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We don't want any exceptions being thrown here
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wcin->exceptions(0);
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wcout->exceptions(0);
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wcerr->exceptions(0);
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ptr_wclog->exceptions(0);
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_wcin->rdbuf(0);
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_wcout->rdbuf(0);
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_wcerr->rdbuf(0);
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  delete ptr_wclog->rdbuf(0);
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_wcin);
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_wcout);
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_wcerr);
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(ptr_wclog);
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool _STLP_CALL ios_base::sync_with_stdio(bool sync) {
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_HAS_NO_NAMESPACES) && !defined (_STLP_DONT_USE_PRIV_NAMESPACE)
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  using _STLP_PRIV stdio_istreambuf;
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  using _STLP_PRIV stdio_ostreambuf;
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (sync == _S_is_synced) return sync;
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // if by any chance we got there before std streams initialization,
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // just set the sync flag and exit
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (Init::_S_count == 0) {
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _S_is_synced = sync;
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return sync;
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cin_buf;
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cout_buf;
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> cerr_buf;
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  auto_ptr<streambuf> clog_buf;
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (sync)
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cin_buf.reset(new stdio_istreambuf(stdin));
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cin_buf.reset(_Stl_create_filebuf(stdin, ios_base::in));
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (sync) {
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_REDIRECT_STDSTREAMS
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(_Stl_create_filebuf("/stdout.txt", ios::out));
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(_Stl_create_filebuf("/stderr.txt", ios::out));
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(_Stl_create_filebuf("/stdlog.txt", ios::out));
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(new stdio_ostreambuf(stdout));
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(new stdio_ostreambuf(stderr));
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(new stdio_ostreambuf(stderr));
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cout_buf.reset(_Stl_create_filebuf(stdout, ios_base::out));
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    cerr_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    clog_buf.reset(_Stl_create_filebuf(stderr, ios_base::out));
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (cin_buf.get() != 0 && cout_buf.get() != 0 && cerr_buf.get() != 0 && clog_buf.get() != 0) {
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // When streambuf passed to rdbuf is not null, rdbuf is exception safe:
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    delete (&cin)->rdbuf(cin_buf.release());
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    delete (&cout)->rdbuf(cout_buf.release());
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    delete (&cerr)->rdbuf(cerr_buf.release());
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    delete (&clog)->rdbuf(clog_buf.release());
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _S_is_synced = sync;
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _S_is_synced;
348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Local Variables:
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// mode:C++
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// End:
355