__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