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