__std_stream revision c789025a5a2fed4ff260ac2c95d391e36304cb45
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 2066c6f9733b5fde00b3e07602cc8b5eef59c8f514Howard Hinnant#include <__undef_min_max> 2166c6f9733b5fde00b3e07602cc8b5eef59c8f514Howard Hinnant 2208e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#pragma GCC system_header 2408e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#endif 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 28ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnantstatic const int __limit = 8; 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __stdinbuf 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __stdinbuf 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public basic_streambuf<_CharT, char_traits<_CharT> > 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef _CharT char_type; 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef char_traits<char_type> traits_type; 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::int_type int_type; 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::pos_type pos_type; 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::off_type off_type; 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::state_type state_type; 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit __stdinbuf(FILE* __fp); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected: 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type underflow(); 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate: 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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> 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::__stdinbuf(FILE* __fp) 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __file_(__fp), 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_() 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant imbue(this->getloc()); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::imbue(const locale& __loc) 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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]; 1040949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant int __nread = _VSTD::max(1, __encoding_); 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int __i = 0; __i < __nread; ++__i) 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 107ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant int __c = getc(__file_); 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[__i] = static_cast<char>(__c); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type __sv_st = __st_; 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->in(__st_, __extbuf, __extbuf + __nread, __enxt, 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant &__1buf, &__1buf + 1, __inxt); 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__r) 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 1270949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::ok: 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::partial: 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_ = __sv_st; 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__nread == sizeof(__extbuf)) 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 134ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard 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(); 1430949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::noconv: 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __1buf = static_cast<char_type>(__extbuf[0]); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 1470949eedbd621bc1611266fb180d9a356ee1eaf9fHoward 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 { 153c789025a5a2fed4ff260ac2c95d391e36304cb45Howard Hinnant if (ungetc(traits_type::to_int_type(__extbuf[--__i]), __file_) == EOF) 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::to_int_type(__1buf); 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::pbackfail(int_type __c) 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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 { 1730949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::ok: 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 1750949eedbd621bc1611266fb180d9a356ee1eaf9fHoward 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: 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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(); 186f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant return traits_type::not_eof(__c); 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __stdoutbuf 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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; 198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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 explicit __stdoutbuf(FILE* __fp); 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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) 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __file_(__fp), 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __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 } 245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __extbe = __extbuf; 248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type* __e; 252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, 253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf, 254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf + sizeof(__extbuf), 255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbe); 256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__e == this->pbase()) 257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::noconv) 259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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) 264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) 267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::partial) 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp((char_type*)__e, this->pptr()); 271ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard 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() 286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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{ 310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard 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 317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif // _LIBCPP___STD_STREAM 318