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 }