__std_stream revision 903439f7359b1bfaecb59134bbe6bc869501e537
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// -*- C++ -*- 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 3bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 4f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef _LIBCPP___STD_STREAM 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define _LIBCPP___STD_STREAM 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <__config> 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <ostream> 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <istream> 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <__locale> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cstdio> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <__undef_min_max> 21adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant 22e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2314fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#pragma GCC system_header 247f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnant#endif 257f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnant 267f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 2792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant 287f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnantstatic const int __limit = 8; 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 3008e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant// __stdinbuf 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 3208e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnanttemplate <class _CharT> 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __stdinbuf 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public basic_streambuf<_CharT, char_traits<_CharT> > 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 3683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantpublic: 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef _CharT char_type; 3833be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant typedef char_traits<char_type> traits_type; 3933be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant typedef typename traits_type::int_type int_type; 4033be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant typedef typename traits_type::pos_type pos_type; 4133be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant typedef typename traits_type::off_type off_type; 4233be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant typedef typename traits_type::state_type state_type; 4333be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant 4433be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant __stdinbuf(FILE* __fp, state_type* __st); 4533be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant 4633be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantprotected: 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type underflow(); 4883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant virtual int_type uflow(); 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type pbackfail(int_type __c = traits_type::eof()); 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual void imbue(const locale& __loc); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 5283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantprivate: 5383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant FILE* __file_; 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const codecvt<char_type, char, state_type>* __cv_; 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type* __st_; 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int __encoding_; 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool __always_noconv_; 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdinbuf(const __stdinbuf&); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdinbuf& operator=(const __stdinbuf&); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int_type __getchar(bool __consume); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 67c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__stdinbuf<_CharT>::__stdinbuf(FILE* __fp, state_type* __st) 68c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant : __file_(__fp), 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_(__st) 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant imbue(this->getloc()); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 732d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnant 742d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnanttemplate <class _CharT> 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::imbue(const locale& __loc) 77c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant{ 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 79c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant __encoding_ = __cv_->encoding(); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_ = __cv_->always_noconv(); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__encoding_ > __limit) 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __throw_runtime_error("unsupported locale for standard input"); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::underflow() 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __getchar(false); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::uflow() 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __getchar(true); 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::__getchar(bool __consume) 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 104c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant int __nread = _VSTD::max(1, __encoding_); 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int __i = 0; __i < __nread; ++__i) 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int __c = getc(__file_); 10883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant if (__c == EOF) 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[__i] = static_cast<char>(__c); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 112b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant char_type __1buf; 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__always_noconv_) 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __1buf = static_cast<char_type>(__extbuf[0]); 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char* __enxt; 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* __inxt; 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 1211694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant { 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type __sv_st = *__st_; 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->in(*__st_, __extbuf, __extbuf + __nread, __enxt, 12483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant &__1buf, &__1buf + 1, __inxt); 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__r) 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case _VSTD::codecvt_base::ok: 128324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant break; 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::partial: 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *__st_ = __sv_st; 131f3d62ea57ff9ac61c5fd9860713d2d0f781f9e12Howard Hinnant if (__nread == sizeof(__extbuf)) 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int __c = getc(__file_); 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[__nread] = static_cast<char>(__c); 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ++__nread; 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::error: 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case _VSTD::codecvt_base::noconv: 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __1buf = static_cast<char_type>(__extbuf[0]); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (__r == _VSTD::codecvt_base::partial); 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!__consume) 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int __i = __nread; __i > 0;) 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (ungetc(traits_type::to_int_type(__extbuf[--__i]), __file_) == EOF) 154d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant return traits_type::eof(); 1550949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant } 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 157324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant return traits_type::to_int_type(__1buf); 1580949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant} 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::pbackfail(int_type __c) 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 164c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant if (traits_type::eq_int_type(__c, traits_type::eof())) 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __enxt; 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type __ci = traits_type::to_char_type(__c); 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type* __inxt; 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt, 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf, __extbuf + sizeof(__extbuf), __enxt)) 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case _VSTD::codecvt_base::ok: 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case _VSTD::codecvt_base::noconv: 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[0] = static_cast<char>(__c); 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __enxt = __extbuf + 1; 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::partial: 1800f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnant case codecvt_base::error: 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant while (__enxt > __extbuf) 184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (ungetc(*--__enxt, __file_) == EOF) 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::not_eof(__c); 187b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant} 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __stdoutbuf 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 191b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnanttemplate <class _CharT> 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __stdoutbuf 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public basic_streambuf<_CharT, char_traits<_CharT> > 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef _CharT char_type; 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef char_traits<char_type> traits_type; 198b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant typedef typename traits_type::int_type int_type; 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::pos_type pos_type; 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::off_type off_type; 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::state_type state_type; 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdoutbuf(FILE* __fp, state_type* __st); 204b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected: 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type overflow (int_type __c = traits_type::eof()); 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int sync(); 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual void imbue(const locale& __loc); 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate: 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant FILE* __file_; 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const codecvt<char_type, char, state_type>* __cv_; 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type* __st_; 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool __always_noconv_; 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdoutbuf(const __stdoutbuf&); 217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdoutbuf& operator=(const __stdoutbuf&); 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp, state_type* __st) 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __file_(__fp), 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_(__st), 225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_(__cv_->always_noconv()) 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdoutbuf<_CharT>::int_type 231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::overflow(int_type __c) 232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type __1buf; 235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!traits_type::eq_int_type(__c, traits_type::eof())) 236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp(&__1buf, &__1buf+1); 238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *this->pptr() = traits_type::to_char_type(__c); 239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->pbump(1); 240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__always_noconv_) 241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(this->pbase(), sizeof(char_type), 1, __file_) != 1) 243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 24511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant else 246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 24711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant char* __extbe = __extbuf; 24811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant codecvt_base::result __r; 24911624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant do 25011624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant { 251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type* __e; 252ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant __r = __cv_->out(*__st_, this->pbase(), this->pptr(), __e, 25311624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant __extbuf, 25411624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant __extbuf + sizeof(__extbuf), 255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbe); 25611624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant if (__e == this->pbase()) 257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::noconv) 25983eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant { 26083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant if (fwrite(this->pbase(), 1, 1, __file_) != 1) 261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else if (__r == codecvt_base::ok || __r == codecvt_base::partial) 2640f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnant { 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) 26783eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant return traits_type::eof(); 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::partial) 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp((char_type*)__e, this->pptr()); 271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->pbump(static_cast<int>(this->epptr() - this->pbase())); 272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (__r == codecvt_base::partial); 277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp(0, 0); 279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::not_eof(__c); 281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::sync() 28683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant{ 287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __extbe; 292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->unshift(*__st_, __extbuf, 293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf + sizeof(__extbuf), 294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbe); 295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); 296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) 297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (__r == codecvt_base::partial); 299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::error) 300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fflush(__file_)) 302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return 0; 304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::imbue(const locale& __loc) 309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 3100949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant sync(); 311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_ = __cv_->always_noconv(); 313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 31783eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant#endif // _LIBCPP___STD_STREAM 318b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant