Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 1 | //===------------------------ iostream.cpp --------------------------------===// |
| 2 | // |
Chandler Carruth | 57b08b0 | 2019-01-19 10:56:40 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "__std_stream" |
Eric Fiselier | f8d2d87 | 2019-05-22 03:45:49 | [diff] [blame] | 10 | #include "__locale" |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 11 | #include "string" |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 12 | #include "new" |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 13 | |
Shoaib Meenai | 9b8ef6e | 2017-08-07 19:59:58 | [diff] [blame] | 14 | #define _str(s) #s |
| 15 | #define str(s) _str(s) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 16 | #define _LIBCPP_ABI_NAMESPACE_STR str(_LIBCPP_ABI_NAMESPACE) |
Shoaib Meenai | 9b8ef6e | 2017-08-07 19:59:58 | [diff] [blame] | 17 | |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 18 | _LIBCPP_BEGIN_NAMESPACE_STD |
| 19 | |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 20 | #ifndef _LIBCPP_HAS_NO_STDIN |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 21 | _ALIGNAS_TYPE (istream) _LIBCPP_FUNC_VIS char cin[sizeof(istream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 22 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 23 | __asm__("?cin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 24 | #endif |
| 25 | ; |
| 26 | _ALIGNAS_TYPE (__stdinbuf<char> ) static char __cin[sizeof(__stdinbuf <char>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 27 | static mbstate_t mb_cin; |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 28 | _ALIGNAS_TYPE (wistream) _LIBCPP_FUNC_VIS char wcin[sizeof(wistream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 29 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 30 | __asm__("?wcin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 31 | #endif |
| 32 | ; |
| 33 | _ALIGNAS_TYPE (__stdinbuf<wchar_t> ) static char __wcin[sizeof(__stdinbuf <wchar_t>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 34 | static mbstate_t mb_wcin; |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 35 | #endif |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 36 | |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 37 | #ifndef _LIBCPP_HAS_NO_STDOUT |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 38 | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cout[sizeof(ostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 39 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 40 | __asm__("?cout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 41 | #endif |
| 42 | ; |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 43 | _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cout[sizeof(__stdoutbuf<char>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 44 | static mbstate_t mb_cout; |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 45 | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcout[sizeof(wostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 46 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 47 | __asm__("?wcout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 48 | #endif |
| 49 | ; |
Howard Hinnant | bf33f5b | 2012-05-31 19:31:14 | [diff] [blame] | 50 | _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcout[sizeof(__stdoutbuf<wchar_t>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 51 | static mbstate_t mb_wcout; |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 52 | #endif |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 53 | |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 54 | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cerr[sizeof(ostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 55 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 56 | __asm__("?cerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 57 | #endif |
| 58 | ; |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 59 | _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cerr[sizeof(__stdoutbuf<char>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 60 | static mbstate_t mb_cerr; |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 61 | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcerr[sizeof(wostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 62 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 63 | __asm__("?wcerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 64 | #endif |
| 65 | ; |
Howard Hinnant | bf33f5b | 2012-05-31 19:31:14 | [diff] [blame] | 66 | _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcerr[sizeof(__stdoutbuf<wchar_t>)]; |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 67 | static mbstate_t mb_wcerr; |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 68 | |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 69 | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char clog[sizeof(ostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 70 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 71 | __asm__("?clog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 72 | #endif |
| 73 | ; |
| 74 | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wclog[sizeof(wostream)] |
Shoaib Meenai | 3698889 | 2017-04-19 20:11:04 | [diff] [blame] | 75 | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
Eric Fiselier | fe13c13 | 2018-10-30 21:44:53 | [diff] [blame] | 76 | __asm__("?wclog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
Eric Fiselier | a7234f1 | 2017-01-07 06:09:12 | [diff] [blame] | 77 | #endif |
| 78 | ; |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 79 | |
Zbigniew Sarbinowski | 2c7e24c | 2020-11-20 19:46:21 | [diff] [blame] | 80 | _LIBCPP_HIDDEN ios_base::Init __start_std_streams _LIBCPP_INIT_PRIORITY_MAX; |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 81 | |
Eric Fiselier | f8d2d87 | 2019-05-22 03:45:49 | [diff] [blame] | 82 | // On Windows the TLS storage for locales needs to be initialized before we create |
| 83 | // the standard streams, otherwise it may not be alive during program termination |
| 84 | // when we flush the streams. |
| 85 | static void force_locale_initialization() { |
| 86 | #if defined(_LIBCPP_MSVCRT_LIKE) |
| 87 | static bool once = []() { |
| 88 | auto loc = newlocale(LC_ALL_MASK, "C", 0); |
| 89 | { |
| 90 | __libcpp_locale_guard g(loc); // forces initialization of locale TLS |
| 91 | ((void)g); |
| 92 | } |
| 93 | freelocale(loc); |
| 94 | return true; |
| 95 | }(); |
| 96 | ((void)once); |
| 97 | #endif |
| 98 | } |
| 99 | |
Marshall Clow | 7b81a13 | 2019-09-13 15:28:06 | [diff] [blame] | 100 | class DoIOSInit { |
| 101 | public: |
| 102 | DoIOSInit(); |
| 103 | ~DoIOSInit(); |
| 104 | }; |
| 105 | |
| 106 | DoIOSInit::DoIOSInit() |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 107 | { |
Eric Fiselier | f8d2d87 | 2019-05-22 03:45:49 | [diff] [blame] | 108 | force_locale_initialization(); |
| 109 | |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 110 | #ifndef _LIBCPP_HAS_NO_STDIN |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 111 | istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf <char>(stdin, &mb_cin)); |
| 112 | wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf <wchar_t>(stdin, &mb_wcin)); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 113 | #endif |
| 114 | #ifndef _LIBCPP_HAS_NO_STDOUT |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 115 | ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf<char>(stdout, &mb_cout)); |
| 116 | wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, &mb_wcout)); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 117 | #endif |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 118 | ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf<char>(stderr, &mb_cerr)); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 119 | ::new(clog) ostream(cerr_ptr->rdbuf()); |
Ed Schouten | 4d51429 | 2015-03-26 14:33:46 | [diff] [blame] | 120 | wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf<wchar_t>(stderr, &mb_wcerr)); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 121 | ::new(wclog) wostream(wcerr_ptr->rdbuf()); |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 122 | |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 123 | #if !defined(_LIBCPP_HAS_NO_STDIN) && !defined(_LIBCPP_HAS_NO_STDOUT) |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 124 | cin_ptr->tie(cout_ptr); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 125 | wcin_ptr->tie(wcout_ptr); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 126 | #endif |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 127 | _VSTD::unitbuf(*cerr_ptr); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 128 | _VSTD::unitbuf(*wcerr_ptr); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 129 | #ifndef _LIBCPP_HAS_NO_STDOUT |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 130 | cerr_ptr->tie(cout_ptr); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 131 | wcerr_ptr->tie(wcout_ptr); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 132 | #endif |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 133 | } |
| 134 | |
Marshall Clow | 7b81a13 | 2019-09-13 15:28:06 | [diff] [blame] | 135 | DoIOSInit::~DoIOSInit() |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 136 | { |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 137 | #ifndef _LIBCPP_HAS_NO_STDOUT |
Joerg Sonnenberger | 2ed7030 | 2013-04-27 19:12:36 | [diff] [blame] | 138 | ostream* cout_ptr = reinterpret_cast<ostream*>(cout); |
Joerg Sonnenberger | 2ed7030 | 2013-04-27 19:12:36 | [diff] [blame] | 139 | wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout); |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 140 | cout_ptr->flush(); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 141 | wcout_ptr->flush(); |
Ed Schouten | f4ac884 | 2015-03-26 14:35:46 | [diff] [blame] | 142 | #endif |
Ed Schouten | d2647ea | 2015-03-17 18:40:58 | [diff] [blame] | 143 | |
| 144 | ostream* clog_ptr = reinterpret_cast<ostream*>(clog); |
| 145 | wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog); |
| 146 | clog_ptr->flush(); |
Howard Hinnant | b4c7522 | 2012-03-16 15:13:51 | [diff] [blame] | 147 | wclog_ptr->flush(); |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 148 | } |
| 149 | |
Marshall Clow | 7b81a13 | 2019-09-13 15:28:06 | [diff] [blame] | 150 | ios_base::Init::Init() |
| 151 | { |
| 152 | static DoIOSInit init_the_streams; // gets initialized once |
| 153 | } |
| 154 | |
| 155 | ios_base::Init::~Init() |
| 156 | { |
| 157 | } |
| 158 | |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 159 | _LIBCPP_END_NAMESPACE_STD |