Whole document tree ios.ccGo to the documentation of this file.00001 // Iostreams base classes -*- C++ -*- 00002 00003 // Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 2, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // You should have received a copy of the GNU General Public License along 00017 // with this library; see the file COPYING. If not, write to the Free 00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00019 // USA. 00020 00021 // As a special exception, you may use this file as part of a free software 00022 // library without restriction. Specifically, if other files instantiate 00023 // templates or use macros or inline functions from this file, or you compile 00024 // this file and link it with other files to produce an executable, this 00025 // file does not by itself cause the resulting executable to be covered by 00026 // the GNU General Public License. This exception does not however 00027 // invalidate any other reasons why the executable file might be covered by 00028 // the GNU General Public License. 00029 00030 // 00031 // ISO C++ 14882: 27.4 Iostreams base classes 00032 // 00033 00034 #include <bits/std_ios.h> 00035 #include <bits/std_ostream.h> 00036 #include <bits/std_istream.h> 00037 #include <bits/std_fstream.h> 00038 00039 namespace std 00040 { 00041 // Extern declarations for global objects in src/globals.cc. 00042 extern istream cin; 00043 extern ostream cout; 00044 extern ostream cerr; 00045 extern ostream clog; 00046 extern filebuf buf_cout; 00047 extern filebuf buf_cin; 00048 extern filebuf buf_cerr; 00049 00050 #ifdef _GLIBCPP_USE_WCHAR_T 00051 extern wistream wcin; 00052 extern wostream wcout; 00053 extern wostream wcerr; 00054 extern wostream wclog; 00055 extern wfilebuf buf_wcout; 00056 extern wfilebuf buf_wcin; 00057 extern wfilebuf buf_wcerr; 00058 #endif 00059 00060 // Definitions for static const data members of __ios_flags. 00061 const __ios_flags::__int_type __ios_flags::_S_boolalpha; 00062 const __ios_flags::__int_type __ios_flags::_S_dec; 00063 const __ios_flags::__int_type __ios_flags::_S_fixed; 00064 const __ios_flags::__int_type __ios_flags::_S_hex; 00065 const __ios_flags::__int_type __ios_flags::_S_internal; 00066 const __ios_flags::__int_type __ios_flags::_S_left; 00067 const __ios_flags::__int_type __ios_flags::_S_oct; 00068 const __ios_flags::__int_type __ios_flags::_S_right; 00069 const __ios_flags::__int_type __ios_flags::_S_scientific; 00070 const __ios_flags::__int_type __ios_flags::_S_showbase; 00071 const __ios_flags::__int_type __ios_flags::_S_showpoint; 00072 const __ios_flags::__int_type __ios_flags::_S_showpos; 00073 const __ios_flags::__int_type __ios_flags::_S_skipws; 00074 const __ios_flags::__int_type __ios_flags::_S_unitbuf; 00075 const __ios_flags::__int_type __ios_flags::_S_uppercase; 00076 const __ios_flags::__int_type __ios_flags::_S_adjustfield; 00077 const __ios_flags::__int_type __ios_flags::_S_basefield; 00078 const __ios_flags::__int_type __ios_flags::_S_floatfield; 00079 00080 const __ios_flags::__int_type __ios_flags::_S_badbit; 00081 const __ios_flags::__int_type __ios_flags::_S_eofbit; 00082 const __ios_flags::__int_type __ios_flags::_S_failbit; 00083 00084 const __ios_flags::__int_type __ios_flags::_S_app; 00085 const __ios_flags::__int_type __ios_flags::_S_ate; 00086 const __ios_flags::__int_type __ios_flags::_S_bin; 00087 const __ios_flags::__int_type __ios_flags::_S_in; 00088 const __ios_flags::__int_type __ios_flags::_S_out; 00089 const __ios_flags::__int_type __ios_flags::_S_trunc; 00090 00091 // Definitions for static const members of ios_base. 00092 const ios_base::fmtflags ios_base::boolalpha; 00093 const ios_base::fmtflags ios_base::dec; 00094 const ios_base::fmtflags ios_base::fixed; 00095 const ios_base::fmtflags ios_base::hex; 00096 const ios_base::fmtflags ios_base::internal; 00097 const ios_base::fmtflags ios_base::left; 00098 const ios_base::fmtflags ios_base::oct; 00099 const ios_base::fmtflags ios_base::right; 00100 const ios_base::fmtflags ios_base::scientific; 00101 const ios_base::fmtflags ios_base::showbase; 00102 const ios_base::fmtflags ios_base::showpoint; 00103 const ios_base::fmtflags ios_base::showpos; 00104 const ios_base::fmtflags ios_base::skipws; 00105 const ios_base::fmtflags ios_base::unitbuf; 00106 const ios_base::fmtflags ios_base::uppercase; 00107 const ios_base::fmtflags ios_base::adjustfield; 00108 const ios_base::fmtflags ios_base::basefield; 00109 const ios_base::fmtflags ios_base::floatfield; 00110 00111 const ios_base::iostate ios_base::badbit; 00112 const ios_base::iostate ios_base::eofbit; 00113 const ios_base::iostate ios_base::failbit; 00114 const ios_base::iostate ios_base::goodbit; 00115 00116 const ios_base::openmode ios_base::app; 00117 const ios_base::openmode ios_base::ate; 00118 const ios_base::openmode ios_base::binary; 00119 const ios_base::openmode ios_base::in; 00120 const ios_base::openmode ios_base::out; 00121 const ios_base::openmode ios_base::trunc; 00122 00123 const ios_base::seekdir ios_base::beg; 00124 const ios_base::seekdir ios_base::cur; 00125 const ios_base::seekdir ios_base::end; 00126 00127 const int ios_base::_S_local_words; 00128 int ios_base::Init::_S_ios_base_init = 0; 00129 bool ios_base::Init::_S_synced_with_stdio = true; 00130 00131 ios_base::failure::failure(const string& __str) throw() 00132 { 00133 strncpy(_M_name, __str.c_str(), _M_bufsize); 00134 _M_name[_M_bufsize - 1] = '\0'; 00135 } 00136 00137 ios_base::failure::~failure() throw() 00138 { } 00139 00140 const char* 00141 ios_base::failure::what() const throw() 00142 { return _M_name; } 00143 00144 void 00145 ios_base::Init::_S_ios_create(bool __sync) 00146 { 00147 int __bufsize = __sync ? 0 : static_cast<int>(BUFSIZ); 00148 00149 // NB: The file globals.cc creates the four standard files 00150 // with NULL buffers. At this point, we swap out the dummy NULL 00151 // [io]stream objects and buffers with the real deal. 00152 new (&buf_cout) filebuf(stdout, ios_base::out, __bufsize); 00153 new (&buf_cin) filebuf(stdin, ios_base::in, 1); 00154 new (&buf_cerr) filebuf(stderr, ios_base::out, __bufsize); 00155 new (&cout) ostream(&buf_cout); 00156 new (&cin) istream(&buf_cin); 00157 new (&cerr) ostream(&buf_cerr); 00158 new (&clog) ostream(&buf_cerr); 00159 cin.tie(&cout); 00160 cerr.flags(ios_base::unitbuf); 00161 00162 #ifdef _GLIBCPP_USE_WCHAR_T 00163 new (&buf_wcout) wfilebuf(stdout, ios_base::out, __bufsize); 00164 new (&buf_wcin) wfilebuf(stdin, ios_base::in, 1); 00165 new (&buf_wcerr) wfilebuf(stderr, ios_base::out, __bufsize); 00166 new (&wcout) wostream(&buf_wcout); 00167 new (&wcin) wistream(&buf_wcin); 00168 new (&wcerr) wostream(&buf_wcerr); 00169 new (&wclog) wostream(&buf_wcerr); 00170 wcin.tie(&wcout); 00171 wcerr.flags(ios_base::unitbuf); 00172 #endif 00173 } 00174 00175 void 00176 ios_base::Init::_S_ios_destroy() 00177 { 00178 // Explicitly call dtors to free any memory that is dynamically 00179 // allocated by filebuf ctor or member functions, but don't 00180 // deallocate all memory by calling operator delete. 00181 cout.flush(); 00182 cerr.flush(); 00183 clog.flush(); 00184 buf_cout.~filebuf(); 00185 buf_cin.~filebuf(); 00186 buf_cerr.~filebuf(); 00187 #ifdef _GLIBCPP_USE_WCHAR_T 00188 wcout.flush(); 00189 wcerr.flush(); 00190 wclog.flush(); 00191 buf_wcout.~wfilebuf(); 00192 buf_wcin.~wfilebuf(); 00193 buf_wcerr.~wfilebuf(); 00194 #endif 00195 } 00196 00197 ios_base::Init::Init() 00198 { 00199 if (++_S_ios_base_init == 1) 00200 { 00201 // Standard streams default to synced with "C" operations. 00202 ios_base::Init::_S_synced_with_stdio = true; 00203 _S_ios_create(ios_base::Init::_S_synced_with_stdio); 00204 } 00205 } 00206 00207 ios_base::Init::~Init() 00208 { 00209 if (--_S_ios_base_init == 0) 00210 _S_ios_destroy(); 00211 } 00212 00213 // 27.4.2.5 ios_base storage functions 00214 int 00215 ios_base::xalloc() throw() 00216 { 00217 // XXX MT 00218 // XXX should be a symbol. (Reserve 0..3 for builtins.) 00219 static int top = 4; 00220 return top++; 00221 } 00222 00223 // 27.4.2.5 iword/pword storage 00224 ios_base::_Words& 00225 ios_base::_M_grow_words(int ix) 00226 { 00227 // Precondition: _M_word_limit <= ix 00228 _Words zero = { 0, 0 }; 00229 int newlimit = _S_local_words; 00230 _Words* words = _M_word_array; 00231 int i = 0; 00232 if (_S_local_words <= ix) 00233 { 00234 newlimit = ix+1; 00235 try 00236 { words = new _Words[ix+1]; } 00237 catch (...) 00238 { 00239 _M_dummy = zero; // XXX MT? Not on "normal" machines. 00240 // XXX now in basic_ios 00241 // _M_clear(_M_rdstate() | badbit); // may throw 00242 return _M_dummy; 00243 } 00244 for (; i < _M_word_limit; i++) 00245 words[i] = _M_words[i]; 00246 if (_M_words != _M_word_array) 00247 delete [] _M_words; 00248 } 00249 00250 do { words[i] = zero; } while (++i < newlimit); 00251 _M_words = words; 00252 _M_word_limit = newlimit; 00253 return words[ix]; 00254 } 00255 00256 // Called only by basic_ios<>::init. 00257 void 00258 ios_base::_M_init() 00259 { 00260 // NB: May be called more than once 00261 _M_precision = 6; 00262 _M_width = 0; 00263 _M_flags = skipws | dec; 00264 _M_callbacks = 0; 00265 _M_words = 0; 00266 _M_word_limit = 0; 00267 _M_ios_locale = locale(); 00268 // No init needed for _M_word_array or _M_dummy. 00269 } 00270 00271 // 27.4.2.3 ios_base locale functions 00272 locale 00273 ios_base::imbue(const locale& __loc) 00274 { 00275 locale __old = _M_ios_locale; 00276 _M_ios_locale = __loc; 00277 // Make sure there's a callback for the format caches so they will be 00278 // marked dirty. 00279 _Format_cache<char>::_S_get(*this); 00280 #ifdef _GLIBCPP_USE_WCHAR_T 00281 _Format_cache<wchar_t>::_S_get(*this); 00282 #endif 00283 _M_call_callbacks(imbue_event); 00284 return __old; 00285 } 00286 00287 ios_base::ios_base() 00288 { 00289 // Do nothing; init() does it. Static init to 0 makes everything sane. 00290 } 00291 00292 // 27.4.2.7 ios_base constructors/destructors 00293 ios_base::~ios_base() 00294 { 00295 _M_call_callbacks(erase_event); 00296 _M_dispose_callbacks(); 00297 if (_M_words != _M_word_array) 00298 delete [] _M_words; 00299 // XXX done? 00300 } 00301 00302 void 00303 ios_base::register_callback(event_callback __fn, int __index) 00304 { _M_callbacks = new _Callback_list(__fn, __index, _M_callbacks); } 00305 00306 void 00307 ios_base::_M_call_callbacks(event __e) throw() 00308 { 00309 for (_Callback_list* __p = _M_callbacks; __p; __p = __p->_M_next) 00310 { 00311 try { 00312 (*__p->_M_fn) (__e, *this, __p->_M_index); 00313 } 00314 catch (...) { 00315 } 00316 } 00317 } 00318 00319 void 00320 ios_base::_M_dispose_callbacks(void) 00321 { 00322 _Callback_list* __p = _M_callbacks; 00323 while (__p && __p->_M_remove_reference() == 0) 00324 { 00325 _Callback_list* __next = __p->_M_next; 00326 delete __p; 00327 __p = __next; 00328 } 00329 _M_callbacks = 0; 00330 } 00331 00332 bool 00333 ios_base::sync_with_stdio(bool __sync) 00334 { 00335 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 00336 // 49. Underspecification of ios_base::sync_with_stdio 00337 bool __ret = ios_base::Init::_S_synced_with_stdio; 00338 #endif 00339 00340 // Turn off sync with C FILE* for cin, cout, cerr, clog iff 00341 // currently synchronized. 00342 if (!__sync && __ret) 00343 { 00344 ios_base::Init::_S_synced_with_stdio = false; 00345 ios_base::Init::_S_ios_destroy(); 00346 ios_base::Init::_S_ios_create(ios_base::Init::_S_synced_with_stdio); 00347 } 00348 return __ret; 00349 } 00350 } // namespace std 00351 Generated on Mon Apr 8 03:11:26 2002 for libstdc++-v3 Source by ![]() |