__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