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 size_t __out_size = __sync ? 0 : static_cast<size_t>(BUFSIZ);
00163 #ifdef _GLIBCPP_HAVE_ISATTY
00164 size_t __in_size =
00165 (__sync || isatty (0)) ? 1 : static_cast<size_t>(BUFSIZ);
00166 #else
00167 size_t __in_size = 1;
00168 #endif
00169
00170
00171
00172
00173 new (&buf_cout) stdio_filebuf<char>(stdout, ios_base::out, __out_size);
00174 new (&buf_cin) stdio_filebuf<char>(stdin, ios_base::in, __in_size);
00175 new (&buf_cerr) stdio_filebuf<char>(stderr, ios_base::out, __out_size);
00176
00177 new (&cout) ostream(&buf_cout);
00178 new (&cin) istream(&buf_cin);
00179 new (&cerr) ostream(&buf_cerr);
00180 new (&clog) ostream(&buf_cerr);
00181 cout.init(&buf_cout);
00182 cin.init(&buf_cin);
00183 cerr.init(&buf_cerr);
00184 clog.init(&buf_cerr);
00185 cin.tie(&cout);
00186 cerr.flags(ios_base::unitbuf);
00187
00188 #ifdef _GLIBCPP_USE_WCHAR_T
00189 new (&buf_wcout) stdio_filebuf<wchar_t>(stdout, ios_base::out, __out_size);
00190 new (&buf_wcin) stdio_filebuf<wchar_t>(stdin, ios_base::in, __in_size);
00191 new (&buf_wcerr) stdio_filebuf<wchar_t>(stderr, ios_base::out, __out_size);
00192 new (&wcout) wostream(&buf_wcout);
00193 new (&wcin) wistream(&buf_wcin);
00194 new (&wcerr) wostream(&buf_wcerr);
00195 new (&wclog) wostream(&buf_wcerr);
00196 wcout.init(&buf_wcout);
00197 wcin.init(&buf_wcin);
00198 wcerr.init(&buf_wcerr);
00199 wclog.init(&buf_wcerr);
00200 wcin.tie(&wcout);
00201 wcerr.flags(ios_base::unitbuf);
00202 #endif
00203 }
00204
00205 void
00206 ios_base::Init::_S_ios_destroy()
00207 {
00208
00209
00210
00211 buf_cout.~stdio_filebuf();
00212 buf_cin.~stdio_filebuf();
00213 buf_cerr.~stdio_filebuf();
00214
00215 #ifdef _GLIBCPP_USE_WCHAR_T
00216 buf_wcout.~stdio_filebuf();
00217 buf_wcin.~stdio_filebuf();
00218 buf_wcerr.~stdio_filebuf();
00219 #endif
00220 }
00221
00222 ios_base::Init::Init()
00223 {
00224 if (_S_ios_base_init == 0)
00225 {
00226
00227 ios_base::Init::_S_synced_with_stdio = true;
00228 _S_ios_create(ios_base::Init::_S_synced_with_stdio);
00229 }
00230 ++_S_ios_base_init;
00231 }
00232
00233 ios_base::Init::~Init()
00234 {
00235 if (--_S_ios_base_init == 0)
00236 _S_ios_destroy();
00237 }
00238
00239
00240 int
00241 ios_base::xalloc() throw()
00242 {
00243
00244
00245 static _Atomic_word _S_top = 0;
00246 return __exchange_and_add(&_S_top, 1) + 4;
00247 }
00248
00249
00250 ios_base::_Words&
00251 ios_base::_M_grow_words(int ix)
00252 {
00253
00254 int newsize = _S_local_word_size;
00255 _Words* words = _M_local_word;
00256 if (ix > _S_local_word_size - 1)
00257 {
00258 if (ix < numeric_limits<int>::max())
00259 {
00260 newsize = ix + 1;
00261 try
00262 { words = new _Words[newsize]; }
00263 catch (...)
00264 {
00265 _M_streambuf_state |= badbit;
00266 if (_M_streambuf_state & _M_exception)
00267 __throw_ios_failure("ios_base::_M_grow_words failure");
00268 return _M_word_zero;
00269 }
00270 for (int i = 0; i < _M_word_size; i++)
00271 words[i] = _M_word[i];
00272 if (_M_word && _M_word != _M_local_word)
00273 {
00274 delete [] _M_word;
00275 _M_word = 0;
00276 }
00277 }
00278 else
00279 {
00280 _M_streambuf_state |= badbit;
00281 if (_M_streambuf_state & _M_exception)
00282 __throw_ios_failure("ios_base::_M_grow_words failure");
00283 return _M_word_zero;
00284 }
00285 }
00286 _M_word = words;
00287 _M_word_size = newsize;
00288 return _M_word[ix];
00289 }
00290
00291
00292 void
00293 ios_base::_M_init()
00294 {
00295
00296 _M_precision = 6;
00297 _M_width = 0;
00298 _M_flags = skipws | dec;
00299 _M_ios_locale = locale();
00300 }
00301
00302
00303 locale
00304 ios_base::imbue(const locale& __loc)
00305 {
00306 locale __old = _M_ios_locale;
00307 _M_ios_locale = __loc;
00308 _M_call_callbacks(imbue_event);
00309 return __old;
00310 }
00311
00312 ios_base::ios_base() : _M_callbacks(0), _M_word_size(_S_local_word_size),
00313 _M_word(_M_local_word)
00314 {
00315
00316
00317
00318 }
00319
00320
00321 ios_base::~ios_base()
00322 {
00323 _M_call_callbacks(erase_event);
00324 _M_dispose_callbacks();
00325 if (_M_word != _M_local_word)
00326 {
00327 delete [] _M_word;
00328 _M_word = 0;
00329 }
00330 }
00331
00332 void
00333 ios_base::register_callback(event_callback __fn, int __index)
00334 { _M_callbacks = new _Callback_list(__fn, __index, _M_callbacks); }
00335
00336 void
00337 ios_base::_M_call_callbacks(event __e) throw()
00338 {
00339 _Callback_list* __p = _M_callbacks;
00340 while (__p)
00341 {
00342 try
00343 { (*__p->_M_fn) (__e, *this, __p->_M_index); }
00344 catch (...)
00345 { }
00346 __p = __p->_M_next;
00347 }
00348 }
00349
00350 void
00351 ios_base::_M_dispose_callbacks(void)
00352 {
00353 _Callback_list* __p = _M_callbacks;
00354 while (__p && __p->_M_remove_reference() == 0)
00355 {
00356 _Callback_list* __next = __p->_M_next;
00357 delete __p;
00358 __p = __next;
00359 }
00360 _M_callbacks = 0;
00361 }
00362
00363 bool
00364 ios_base::sync_with_stdio(bool __sync)
00365 {
00366 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
00367
00368 bool __ret = ios_base::Init::_S_synced_with_stdio;
00369 #endif
00370
00371
00372
00373 if (!__sync && __ret)
00374 {
00375 ios_base::Init::_S_synced_with_stdio = false;
00376 ios_base::Init::_S_ios_destroy();
00377 ios_base::Init::_S_ios_create(ios_base::Init::_S_synced_with_stdio);
00378 }
00379 return __ret;
00380 }
00381 }