__std_stream revision 0949eedbd621bc1611266fb180d9a356ee1eaf9f
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#pragma GCC system_header 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic const unsigned __limit = 8; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __stdinbuf 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __stdinbuf 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public basic_streambuf<_CharT, char_traits<_CharT> > 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef _CharT char_type; 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef char_traits<char_type> traits_type; 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::int_type int_type; 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::pos_type pos_type; 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::off_type off_type; 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::state_type state_type; 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit __stdinbuf(FILE* __fp); 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected: 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type underflow(); 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type uflow(); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type pbackfail(int_type __c = traits_type::eof()); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual void imbue(const locale& __loc); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate: 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant FILE* __file_; 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const codecvt<char_type, char, state_type>* __cv_; 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type __st_; 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int __encoding_; 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool __always_noconv_; 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdinbuf(const __stdinbuf&); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdinbuf& operator=(const __stdinbuf&); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int_type __getchar(bool __consume); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::__stdinbuf(FILE* __fp) 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __file_(__fp), 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_() 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant imbue(this->getloc()); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::imbue(const locale& __loc) 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __encoding_ = __cv_->encoding(); 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_ = __cv_->always_noconv(); 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__encoding_ > __limit) 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __throw_runtime_error("unsupported locale for standard input"); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::underflow() 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __getchar(false); 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::uflow() 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __getchar(true); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::__getchar(bool __consume) 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 1000949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant int __nread = _VSTD::max(1, __encoding_); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int __i = 0; __i < __nread; ++__i) 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __c = getc(__file_); 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[__i] = static_cast<char>(__c); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type __1buf; 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__always_noconv_) 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __1buf = static_cast<char_type>(__extbuf[0]); 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char* __enxt; 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* __inxt; 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type __sv_st = __st_; 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->in(__st_, __extbuf, __extbuf + __nread, __enxt, 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant &__1buf, &__1buf + 1, __inxt); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__r) 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 1230949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::ok: 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::partial: 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_ = __sv_st; 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__nread == sizeof(__extbuf)) 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __c = getc(__file_); 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__c == EOF) 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[__nread] = static_cast<char>(__c); 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ++__nread; 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::error: 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 1390949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::noconv: 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __1buf = static_cast<char_type>(__extbuf[0]); 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 1430949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant } while (__r == _VSTD::codecvt_base::partial); 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!__consume) 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int __i = __nread; __i > 0;) 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (ungetc(__extbuf[--__i], __file_) == EOF) 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::to_int_type(__1buf); 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdinbuf<_CharT>::int_type 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdinbuf<_CharT>::pbackfail(int_type __c) 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (traits_type::eq_int_type(__c, traits_type::eof())) 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return __c; 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __enxt; 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type __ci = traits_type::to_char_type(__c); 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type* __inxt; 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant switch (__cv_->out(__st_, &__ci, &__ci + 1, __inxt, 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf, __extbuf + sizeof(__extbuf), __enxt)) 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 1690949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::ok: 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 1710949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant case _VSTD::codecvt_base::noconv: 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf[0] = static_cast<char>(__c); 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __enxt = __extbuf + 1; 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::partial: 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case codecvt_base::error: 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant while (__enxt > __extbuf) 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (ungetc(*--__enxt, __file_) == EOF) 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 182f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant return traits_type::not_eof(__c); 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __stdoutbuf 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __stdoutbuf 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public basic_streambuf<_CharT, char_traits<_CharT> > 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef _CharT char_type; 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef char_traits<char_type> traits_type; 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::int_type int_type; 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::pos_type pos_type; 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::off_type off_type; 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename traits_type::state_type state_type; 198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit __stdoutbuf(FILE* __fp); 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected: 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type overflow (int_type __c = traits_type::eof()); 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int sync(); 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual void imbue(const locale& __loc); 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate: 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant FILE* __file_; 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const codecvt<char_type, char, state_type>* __cv_; 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant state_type __st_; 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant bool __always_noconv_; 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdoutbuf(const __stdoutbuf&); 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __stdoutbuf& operator=(const __stdoutbuf&); 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp) 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : __file_(__fp), 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __st_(), 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_(__cv_->always_noconv()) 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypename __stdoutbuf<_CharT>::int_type 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::overflow(int_type __c) 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type __1buf; 231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (!traits_type::eq_int_type(__c, traits_type::eof())) 232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp(&__1buf, &__1buf+1); 234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant *this->pptr() = traits_type::to_char_type(__c); 235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->pbump(1); 236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__always_noconv_) 237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(this->pbase(), sizeof(char_type), 1, __file_) != 1) 239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __extbe = __extbuf; 244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char_type* __e; 248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, 249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf, 250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf + sizeof(__extbuf), 251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbe); 252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__e == this->pbase()) 253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::noconv) 255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(this->pbase(), 1, 1, __file_) != 1) 257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else if (__r == codecvt_base::ok || __r == codecvt_base::partial) 260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); 262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) 263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::partial) 265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp((char_type*)__e, this->pptr()); 267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->pbump(this->epptr() - this->pbase()); 268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::eof(); 272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (__r == codecvt_base::partial); 273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant this->setp(0, 0); 275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return traits_type::not_eof(__c); 277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::sync() 282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char __extbuf[__limit]; 284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant codecvt_base::result __r; 285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do 286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char* __extbe; 288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __r = __cv_->unshift(__st_, __extbuf, 289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbuf + sizeof(__extbuf), 290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __extbe); 291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); 292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) 293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (__r == codecvt_base::partial); 295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (__r == codecvt_base::error) 296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (fflush(__file_)) 298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return -1; 299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return 0; 300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> 303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__stdoutbuf<_CharT>::imbue(const locale& __loc) 305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant sync(); 307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __always_noconv_ = __cv_->always_noconv(); 309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD 312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif // _LIBCPP___STD_STREAM 314