1*f8a1b7d9SAlexander Kabaev // Stream buffer classes -*- C++ -*-
2*f8a1b7d9SAlexander Kabaev
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
4*f8a1b7d9SAlexander Kabaev //
5*f8a1b7d9SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free
6*f8a1b7d9SAlexander Kabaev // software; you can redistribute it and/or modify it under the
7*f8a1b7d9SAlexander Kabaev // terms of the GNU General Public License as published by the
8*f8a1b7d9SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
9*f8a1b7d9SAlexander Kabaev // any later version.
10*f8a1b7d9SAlexander Kabaev
11*f8a1b7d9SAlexander Kabaev // This library is distributed in the hope that it will be useful,
12*f8a1b7d9SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
13*f8a1b7d9SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*f8a1b7d9SAlexander Kabaev // GNU General Public License for more details.
15*f8a1b7d9SAlexander Kabaev
16*f8a1b7d9SAlexander Kabaev // You should have received a copy of the GNU General Public License along
17*f8a1b7d9SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free
18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19*f8a1b7d9SAlexander Kabaev // USA.
20*f8a1b7d9SAlexander Kabaev
21*f8a1b7d9SAlexander Kabaev // As a special exception, you may use this file as part of a free software
22*f8a1b7d9SAlexander Kabaev // library without restriction. Specifically, if other files instantiate
23*f8a1b7d9SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
24*f8a1b7d9SAlexander Kabaev // this file and link it with other files to produce an executable, this
25*f8a1b7d9SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
26*f8a1b7d9SAlexander Kabaev // the GNU General Public License. This exception does not however
27*f8a1b7d9SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
28*f8a1b7d9SAlexander Kabaev // the GNU General Public License.
29*f8a1b7d9SAlexander Kabaev
30*f8a1b7d9SAlexander Kabaev //
31*f8a1b7d9SAlexander Kabaev // ISO C++ 14882: 27.5 Stream buffers
32*f8a1b7d9SAlexander Kabaev //
33*f8a1b7d9SAlexander Kabaev
34*f8a1b7d9SAlexander Kabaev #include <streambuf>
35*f8a1b7d9SAlexander Kabaev
_GLIBCXX_BEGIN_NAMESPACE(std)36*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
37*f8a1b7d9SAlexander Kabaev
38*f8a1b7d9SAlexander Kabaev template<>
39*f8a1b7d9SAlexander Kabaev streamsize
40*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof(basic_streambuf<char>* __sbin,
41*f8a1b7d9SAlexander Kabaev basic_streambuf<char>* __sbout, bool& __ineof)
42*f8a1b7d9SAlexander Kabaev {
43*f8a1b7d9SAlexander Kabaev typedef basic_streambuf<char>::traits_type traits_type;
44*f8a1b7d9SAlexander Kabaev streamsize __ret = 0;
45*f8a1b7d9SAlexander Kabaev __ineof = true;
46*f8a1b7d9SAlexander Kabaev traits_type::int_type __c = __sbin->sgetc();
47*f8a1b7d9SAlexander Kabaev while (!traits_type::eq_int_type(__c, traits_type::eof()))
48*f8a1b7d9SAlexander Kabaev {
49*f8a1b7d9SAlexander Kabaev const streamsize __n = __sbin->egptr() - __sbin->gptr();
50*f8a1b7d9SAlexander Kabaev if (__n > 1)
51*f8a1b7d9SAlexander Kabaev {
52*f8a1b7d9SAlexander Kabaev const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
53*f8a1b7d9SAlexander Kabaev __sbin->gbump(__wrote);
54*f8a1b7d9SAlexander Kabaev __ret += __wrote;
55*f8a1b7d9SAlexander Kabaev if (__wrote < __n)
56*f8a1b7d9SAlexander Kabaev {
57*f8a1b7d9SAlexander Kabaev __ineof = false;
58*f8a1b7d9SAlexander Kabaev break;
59*f8a1b7d9SAlexander Kabaev }
60*f8a1b7d9SAlexander Kabaev __c = __sbin->underflow();
61*f8a1b7d9SAlexander Kabaev }
62*f8a1b7d9SAlexander Kabaev else
63*f8a1b7d9SAlexander Kabaev {
64*f8a1b7d9SAlexander Kabaev __c = __sbout->sputc(traits_type::to_char_type(__c));
65*f8a1b7d9SAlexander Kabaev if (traits_type::eq_int_type(__c, traits_type::eof()))
66*f8a1b7d9SAlexander Kabaev {
67*f8a1b7d9SAlexander Kabaev __ineof = false;
68*f8a1b7d9SAlexander Kabaev break;
69*f8a1b7d9SAlexander Kabaev }
70*f8a1b7d9SAlexander Kabaev ++__ret;
71*f8a1b7d9SAlexander Kabaev __c = __sbin->snextc();
72*f8a1b7d9SAlexander Kabaev }
73*f8a1b7d9SAlexander Kabaev }
74*f8a1b7d9SAlexander Kabaev return __ret;
75*f8a1b7d9SAlexander Kabaev }
76*f8a1b7d9SAlexander Kabaev
77*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
78*f8a1b7d9SAlexander Kabaev template<>
79*f8a1b7d9SAlexander Kabaev streamsize
__copy_streambufs_eof(basic_streambuf<wchar_t> * __sbin,basic_streambuf<wchar_t> * __sbout,bool & __ineof)80*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
81*f8a1b7d9SAlexander Kabaev basic_streambuf<wchar_t>* __sbout, bool& __ineof)
82*f8a1b7d9SAlexander Kabaev {
83*f8a1b7d9SAlexander Kabaev typedef basic_streambuf<wchar_t>::traits_type traits_type;
84*f8a1b7d9SAlexander Kabaev streamsize __ret = 0;
85*f8a1b7d9SAlexander Kabaev __ineof = true;
86*f8a1b7d9SAlexander Kabaev traits_type::int_type __c = __sbin->sgetc();
87*f8a1b7d9SAlexander Kabaev while (!traits_type::eq_int_type(__c, traits_type::eof()))
88*f8a1b7d9SAlexander Kabaev {
89*f8a1b7d9SAlexander Kabaev const streamsize __n = __sbin->egptr() - __sbin->gptr();
90*f8a1b7d9SAlexander Kabaev if (__n > 1)
91*f8a1b7d9SAlexander Kabaev {
92*f8a1b7d9SAlexander Kabaev const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
93*f8a1b7d9SAlexander Kabaev __sbin->gbump(__wrote);
94*f8a1b7d9SAlexander Kabaev __ret += __wrote;
95*f8a1b7d9SAlexander Kabaev if (__wrote < __n)
96*f8a1b7d9SAlexander Kabaev {
97*f8a1b7d9SAlexander Kabaev __ineof = false;
98*f8a1b7d9SAlexander Kabaev break;
99*f8a1b7d9SAlexander Kabaev }
100*f8a1b7d9SAlexander Kabaev __c = __sbin->underflow();
101*f8a1b7d9SAlexander Kabaev }
102*f8a1b7d9SAlexander Kabaev else
103*f8a1b7d9SAlexander Kabaev {
104*f8a1b7d9SAlexander Kabaev __c = __sbout->sputc(traits_type::to_char_type(__c));
105*f8a1b7d9SAlexander Kabaev if (traits_type::eq_int_type(__c, traits_type::eof()))
106*f8a1b7d9SAlexander Kabaev {
107*f8a1b7d9SAlexander Kabaev __ineof = false;
108*f8a1b7d9SAlexander Kabaev break;
109*f8a1b7d9SAlexander Kabaev }
110*f8a1b7d9SAlexander Kabaev ++__ret;
111*f8a1b7d9SAlexander Kabaev __c = __sbin->snextc();
112*f8a1b7d9SAlexander Kabaev }
113*f8a1b7d9SAlexander Kabaev }
114*f8a1b7d9SAlexander Kabaev return __ret;
115*f8a1b7d9SAlexander Kabaev }
116*f8a1b7d9SAlexander Kabaev #endif
117*f8a1b7d9SAlexander Kabaev
118*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
119