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 #include <ext/stdio_sync_filebuf.h>
00042
00043 namespace __gnu_internal
00044 {
00045 using namespace __gnu_cxx;
00046
00047
00048 extern stdio_sync_filebuf<char> buf_cout_sync;
00049 extern stdio_sync_filebuf<char> buf_cin_sync;
00050 extern stdio_sync_filebuf<char> buf_cerr_sync;
00051
00052 extern stdio_filebuf<char> buf_cout;
00053 extern stdio_filebuf<char> buf_cin;
00054 extern stdio_filebuf<char> buf_cerr;
00055
00056 #ifdef _GLIBCXX_USE_WCHAR_T
00057 extern stdio_sync_filebuf<wchar_t> buf_wcout_sync;
00058 extern stdio_sync_filebuf<wchar_t> buf_wcin_sync;
00059 extern stdio_sync_filebuf<wchar_t> buf_wcerr_sync;
00060
00061 extern stdio_filebuf<wchar_t> buf_wcout;
00062 extern stdio_filebuf<wchar_t> buf_wcin;
00063 extern stdio_filebuf<wchar_t> buf_wcerr;
00064 #endif
00065 }
00066
00067 namespace std
00068 {
00069 using namespace __gnu_internal;
00070
00071 extern istream cin;
00072 extern ostream cout;
00073 extern ostream cerr;
00074 extern ostream clog;
00075
00076 #ifdef _GLIBCXX_USE_WCHAR_T
00077 extern wistream wcin;
00078 extern wostream wcout;
00079 extern wostream wcerr;
00080 extern wostream wclog;
00081 #endif
00082
00083 ios_base::Init::Init()
00084 {
00085 if (__gnu_cxx::__exchange_and_add(&_S_refcount, 1) == 0)
00086 {
00087
00088 _S_synced_with_stdio = true;
00089
00090 new (&buf_cout_sync) stdio_sync_filebuf<char>(stdout);
00091 new (&buf_cin_sync) stdio_sync_filebuf<char>(stdin);
00092 new (&buf_cerr_sync) stdio_sync_filebuf<char>(stderr);
00093
00094
00095
00096 new (&cout) ostream(&buf_cout_sync);
00097 new (&cin) istream(&buf_cin_sync);
00098 new (&cerr) ostream(&buf_cerr_sync);
00099 new (&clog) ostream(&buf_cerr_sync);
00100 cin.tie(&cout);
00101 cerr.flags(ios_base::unitbuf);
00102
00103 #ifdef _GLIBCXX_USE_WCHAR_T
00104 new (&buf_wcout_sync) stdio_sync_filebuf<wchar_t>(stdout);
00105 new (&buf_wcin_sync) stdio_sync_filebuf<wchar_t>(stdin);
00106 new (&buf_wcerr_sync) stdio_sync_filebuf<wchar_t>(stderr);
00107
00108 new (&wcout) wostream(&buf_wcout_sync);
00109 new (&wcin) wistream(&buf_wcin_sync);
00110 new (&wcerr) wostream(&buf_wcerr_sync);
00111 new (&wclog) wostream(&buf_wcerr_sync);
00112 wcin.tie(&wcout);
00113 wcerr.flags(ios_base::unitbuf);
00114 #endif
00115
00116
00117
00118
00119
00120 __gnu_cxx::__atomic_add(&_S_refcount, 1);
00121 }
00122 }
00123
00124 ios_base::Init::~Init()
00125 {
00126 if (__gnu_cxx::__exchange_and_add(&_S_refcount, -1) == 2)
00127 {
00128
00129 try
00130 {
00131
00132 cout.flush();
00133 cerr.flush();
00134 clog.flush();
00135
00136 #ifdef _GLIBCXX_USE_WCHAR_T
00137 wcout.flush();
00138 wcerr.flush();
00139 wclog.flush();
00140 #endif
00141 }
00142 catch (...)
00143 { }
00144 }
00145 }
00146
00147 bool
00148 ios_base::sync_with_stdio(bool __sync)
00149 {
00150
00151
00152 bool __ret = ios_base::Init::_S_synced_with_stdio;
00153
00154
00155
00156 if (!__sync && __ret)
00157 {
00158
00159 ios_base::Init __init;
00160
00161 ios_base::Init::_S_synced_with_stdio = __sync;
00162
00163
00164
00165
00166 buf_cout_sync.~stdio_sync_filebuf<char>();
00167 buf_cin_sync.~stdio_sync_filebuf<char>();
00168 buf_cerr_sync.~stdio_sync_filebuf<char>();
00169
00170 #ifdef _GLIBCXX_USE_WCHAR_T
00171 buf_wcout_sync.~stdio_sync_filebuf<wchar_t>();
00172 buf_wcin_sync.~stdio_sync_filebuf<wchar_t>();
00173 buf_wcerr_sync.~stdio_sync_filebuf<wchar_t>();
00174 #endif
00175
00176
00177
00178
00179 new (&buf_cout) stdio_filebuf<char>(stdout, ios_base::out);
00180 new (&buf_cin) stdio_filebuf<char>(stdin, ios_base::in);
00181 new (&buf_cerr) stdio_filebuf<char>(stderr, ios_base::out);
00182 cout.rdbuf(&buf_cout);
00183 cin.rdbuf(&buf_cin);
00184 cerr.rdbuf(&buf_cerr);
00185 clog.rdbuf(&buf_cerr);
00186
00187 #ifdef _GLIBCXX_USE_WCHAR_T
00188 new (&buf_wcout) stdio_filebuf<wchar_t>(stdout, ios_base::out);
00189 new (&buf_wcin) stdio_filebuf<wchar_t>(stdin, ios_base::in);
00190 new (&buf_wcerr) stdio_filebuf<wchar_t>(stderr, ios_base::out);
00191 wcout.rdbuf(&buf_wcout);
00192 wcin.rdbuf(&buf_wcin);
00193 wcerr.rdbuf(&buf_wcerr);
00194 wclog.rdbuf(&buf_wcerr);
00195 #endif
00196 }
00197 return __ret;
00198 }
00199 }