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