00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <ios>
00036 #include <ostream>
00037 #include <istream>
00038 #include <fstream>
00039 #include <bits/atomicity.h>
00040 #include <ext/stdio_filebuf.h>
00041 #ifdef _GLIBCPP_HAVE_UNISTD_H
00042 #include <unistd.h>
00043 #endif
00044
00045 namespace __gnu_cxx
00046 {
00047
00048 extern stdio_filebuf<char> buf_cout;
00049 extern stdio_filebuf<char> buf_cin;
00050 extern stdio_filebuf<char> buf_cerr;
00051
00052 #ifdef _GLIBCPP_USE_WCHAR_T
00053 extern stdio_filebuf<wchar_t> buf_wcout;
00054 extern stdio_filebuf<wchar_t> buf_wcin;
00055 extern stdio_filebuf<wchar_t> buf_wcerr;
00056 #endif
00057 }
00058
00059 namespace std
00060 {
00061 using namespace __gnu_cxx;
00062
00063 extern istream cin;
00064 extern ostream cout;
00065 extern ostream cerr;
00066 extern ostream clog;
00067
00068 #ifdef _GLIBCPP_USE_WCHAR_T
00069 extern wistream wcin;
00070 extern wostream wcout;
00071 extern wostream wcerr;
00072 extern wostream wclog;
00073 #endif
00074
00075
00076 const __ios_flags::__int_type __ios_flags::_S_boolalpha;
00077 const __ios_flags::__int_type __ios_flags::_S_dec;
00078 const __ios_flags::__int_type __ios_flags::_S_fixed;
00079 const __ios_flags::__int_type __ios_flags::_S_hex;
00080 const __ios_flags::__int_type __ios_flags::_S_internal;
00081 const __ios_flags::__int_type __ios_flags::_S_left;
00082 const __ios_flags::__int_type __ios_flags::_S_oct;
00083 const __ios_flags::__int_type __ios_flags::_S_right;
00084 const __ios_flags::__int_type __ios_flags::_S_scientific;
00085 const __ios_flags::__int_type __ios_flags::_S_showbase;
00086 const __ios_flags::__int_type __ios_flags::_S_showpoint;
00087 const __ios_flags::__int_type __ios_flags::_S_showpos;
00088 const __ios_flags::__int_type __ios_flags::_S_skipws;
00089 const __ios_flags::__int_type __ios_flags::_S_unitbuf;
00090 const __ios_flags::__int_type __ios_flags::_S_uppercase;
00091 const __ios_flags::__int_type __ios_flags::_S_adjustfield;
00092 const __ios_flags::__int_type __ios_flags::_S_basefield;
00093 const __ios_flags::__int_type __ios_flags::_S_floatfield;
00094
00095 const __ios_flags::__int_type __ios_flags::_S_badbit;
00096 const __ios_flags::__int_type __ios_flags::_S_eofbit;
00097 const __ios_flags::__int_type __ios_flags::_S_failbit;
00098
00099 const __ios_flags::__int_type __ios_flags::_S_app;
00100 const __ios_flags::__int_type __ios_flags::_S_ate;
00101 const __ios_flags::__int_type __ios_flags::_S_bin;
00102 const __ios_flags::__int_type __ios_flags::_S_in;
00103 const __ios_flags::__int_type __ios_flags::_S_out;
00104 const __ios_flags::__int_type __ios_flags::_S_trunc;
00105
00106
00107 const ios_base::fmtflags ios_base::boolalpha;
00108 const ios_base::fmtflags ios_base::dec;
00109 const ios_base::fmtflags ios_base::fixed;
00110 const ios_base::fmtflags ios_base::hex;
00111 const ios_base::fmtflags ios_base::internal;
00112 const ios_base::fmtflags ios_base::left;
00113 const ios_base::fmtflags ios_base::oct;
00114 const ios_base::fmtflags ios_base::right;
00115 const ios_base::fmtflags ios_base::scientific;
00116 const ios_base::fmtflags ios_base::showbase;
00117 const ios_base::fmtflags ios_base::showpoint;
00118 const ios_base::fmtflags ios_base::showpos;
00119 const ios_base::fmtflags ios_base::skipws;
00120 const ios_base::fmtflags ios_base::unitbuf;
00121 const ios_base::fmtflags ios_base::uppercase;
00122 const ios_base::fmtflags ios_base::adjustfield;
00123 const ios_base::fmtflags ios_base::basefield;
00124 const ios_base::fmtflags ios_base::floatfield;
00125
00126 const ios_base::iostate ios_base::badbit;
00127 const ios_base::iostate ios_base::eofbit;
00128 const ios_base::iostate ios_base::failbit;
00129 const ios_base::iostate ios_base::goodbit;
00130
00131 const ios_base::openmode ios_base::app;
00132 const ios_base::openmode ios_base::ate;
00133 const ios_base::openmode ios_base::binary;
00134 const ios_base::openmode ios_base::in;
00135 const ios_base::openmode ios_base::out;
00136 const ios_base::openmode ios_base::trunc;
00137
00138 const ios_base::seekdir ios_base::beg;
00139 const ios_base::seekdir ios_base::cur;
00140 const ios_base::seekdir ios_base::end;
00141
00142 const int ios_base::_S_local_word_size;
00143 int ios_base::Init::_S_ios_base_init = 0;
00144 bool ios_base::Init::_S_synced_with_stdio = true;
00145
00146 ios_base::failure::failure(const string& __str) throw()
00147 {
00148 strncpy(_M_name, __str.c_str(), _M_bufsize);
00149 _M_name[_M_bufsize - 1] = '\0';
00150 }
00151
00152 ios_base::failure::~failure() throw()
00153 { }
00154
00155 const char*
00156 ios_base::failure::what() const throw()
00157 { return _M_name; }
00158
00159 void
00160 ios_base::Init::_S_ios_create(bool __sync)
00161 {
00162 int __out_size = __sync ? 0 : static_cast<int>(BUFSIZ);
00163 #ifdef _GLIBCPP_HAVE_ISATTY
00164 int __in_size = (__sync || isatty (0)) ? 1 : static_cast<int>(BUFSIZ);
00165 #else
00166 int __in_size = 1;
00167 #endif
00168
00169
00170
00171
00172 new (&buf_cout) stdio_filebuf<char>(stdout, ios_base::out, __out_size);
00173 new (&buf_cin) stdio_filebuf<char>(stdin, ios_base::in, __in_size);
00174 new (&buf_cerr) stdio_filebuf<char>(stderr, ios_base::out, __out_size);
00175 new (&cout) ostream(&buf_cout);
00176 new (&cin) istream(&buf_cin);
00177 new (&cerr) ostream(&buf_cerr);
00178 new (&clog) ostream(&buf_cerr);
00179 cin.tie(&cout);
00180 cerr.flags(ios_base::unitbuf);
00181
00182 #ifdef _GLIBCPP_USE_WCHAR_T
00183 new (&buf_wcout) stdio_filebuf<wchar_t>(stdout, ios_base::out, __out_size);
00184 new (&buf_wcin) stdio_filebuf<wchar_t>(stdin, ios_base::in, __in_size);
00185 new (&buf_wcerr) stdio_filebuf<wchar_t>(stderr, ios_base::out, __out_size);
00186 new (&wcout) wostream(&buf_wcout);
00187 new (&wcin) wistream(&buf_wcin);
00188 new (&wcerr) wostream(&buf_wcerr);
00189 new (&wclog) wostream(&buf_wcerr);
00190 wcin.tie(&wcout);
00191 wcerr.flags(ios_base::unitbuf);
00192 #endif
00193 }
00194
00195 void
00196 ios_base::Init::_S_ios_destroy()
00197 {
00198
00199
00200
00201 buf_cout.~stdio_filebuf();
00202 buf_cin.~stdio_filebuf();
00203 buf_cerr.~stdio_filebuf();
00204
00205 #ifdef _GLIBCPP_USE_WCHAR_T
00206 buf_wcout.~stdio_filebuf();
00207 buf_wcin.~stdio_filebuf();
00208 buf_wcerr.~stdio_filebuf();
00209 #endif
00210 }
00211
00212 ios_base::Init::Init()
00213 {
00214 if (_S_ios_base_init == 0)
00215 {
00216
00217 ios_base::Init::_S_synced_with_stdio = true;
00218 _S_ios_create(ios_base::Init::_S_synced_with_stdio);
00219 }
00220 ++_S_ios_base_init;
00221 }
00222
00223 ios_base::Init::~Init()
00224 {
00225 if (--_S_ios_base_init == 0)
00226 _S_ios_destroy();
00227 }
00228
00229
00230 int
00231 ios_base::xalloc() throw()
00232 {
00233
00234
00235 static _Atomic_word _S_top = 0;
00236 return __exchange_and_add(&_S_top, 1) + 4;
00237 }
00238
00239
00240 ios_base::_Words&
00241 ios_base::_M_grow_words(int ix)
00242 {
00243
00244 int newsize = _S_local_word_size;
00245 _Words* words = _M_local_word;
00246 if (ix > _S_local_word_size - 1)
00247 {
00248 if (ix < numeric_limits<int>::max())
00249 {
00250 newsize = ix + 1;
00251 try
00252 { words = new _Words[newsize]; }
00253 catch (...)
00254 {
00255 delete [] _M_word;
00256 _M_word = 0;
00257 _M_streambuf_state |= badbit;
00258 if (_M_streambuf_state & _M_exception)
00259 __throw_ios_failure("ios_base::_M_grow_words failure");
00260 return _M_word_zero;
00261 }
00262 for (int i = 0; i < _M_word_size; i++)
00263 words[i] = _M_word[i];
00264 if (_M_word && _M_word != _M_local_word)
00265 {
00266 delete [] _M_word;
00267 _M_word = 0;
00268 }
00269 }
00270 else
00271 {
00272 _M_streambuf_state |= badbit;
00273 return _M_word_zero;
00274 }
00275 }
00276 _M_word = words;
00277 _M_word_size = newsize;
00278 return _M_word[ix];
00279 }
00280
00281
00282 void
00283 ios_base::_M_init()
00284 {
00285
00286 _M_precision = 6;
00287 _M_width = 0;
00288 _M_flags = skipws | dec;
00289 _M_callbacks = 0;
00290 _M_word_size = 0;
00291 _M_ios_locale = locale();
00292 }
00293
00294
00295 locale
00296 ios_base::imbue(const locale& __loc)
00297 {
00298 locale __old = _M_ios_locale;
00299 _M_ios_locale = __loc;
00300 _M_call_callbacks(imbue_event);
00301 return __old;
00302 }
00303
00304 ios_base::ios_base() : _M_callbacks(0), _M_word(0)
00305 {
00306
00307
00308
00309 }
00310
00311
00312 ios_base::~ios_base()
00313 {
00314 _M_call_callbacks(erase_event);
00315 _M_dispose_callbacks();
00316 if (_M_word && _M_word != _M_local_word)
00317 {
00318 delete [] _M_word;
00319 _M_word = 0;
00320 }
00321 }
00322
00323 void
00324 ios_base::register_callback(event_callback __fn, int __index)
00325 { _M_callbacks = new _Callback_list(__fn, __index, _M_callbacks); }
00326
00327 void
00328 ios_base::_M_call_callbacks(event __e) throw()
00329 {
00330 _Callback_list* __p = _M_callbacks;
00331 while (__p)
00332 {
00333 try
00334 { (*__p->_M_fn) (__e, *this, __p->_M_index); }
00335 catch (...)
00336 { }
00337 __p = __p->_M_next;
00338 }
00339 }
00340
00341 void
00342 ios_base::_M_dispose_callbacks(void)
00343 {
00344 _Callback_list* __p = _M_callbacks;
00345 while (__p && __p->_M_remove_reference() == 0)
00346 {
00347 _Callback_list* __next = __p->_M_next;
00348 delete __p;
00349 __p = __next;
00350 }
00351 _M_callbacks = 0;
00352 }
00353
00354 bool
00355 ios_base::sync_with_stdio(bool __sync)
00356 {
00357 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00358
00359 bool __ret = ios_base::Init::_S_synced_with_stdio;
00360 #endif
00361
00362
00363
00364 if (!__sync && __ret)
00365 {
00366 ios_base::Init::_S_synced_with_stdio = false;
00367 ios_base::Init::_S_ios_destroy();
00368 ios_base::Init::_S_ios_create(ios_base::Init::_S_synced_with_stdio);
00369 }
00370 return __ret;
00371 }
00372 }