Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libstdc++-v3 / src / c++98 / streambuf.cc
blob3acf7600e7a653d5a6f6c78bf1f62bf09e7e65f3
1 // Stream buffer classes -*- C++ -*-
3 // Copyright (C) 2004-2018 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
26 // ISO C++ 14882: 27.5 Stream buffers
29 #include <streambuf>
31 namespace std _GLIBCXX_VISIBILITY(default)
33 _GLIBCXX_BEGIN_NAMESPACE_VERSION
35 template<>
36 streamsize
37 __copy_streambufs_eof(basic_streambuf<char>* __sbin,
38 basic_streambuf<char>* __sbout, bool& __ineof)
40 typedef basic_streambuf<char>::traits_type traits_type;
41 streamsize __ret = 0;
42 __ineof = true;
43 traits_type::int_type __c = __sbin->sgetc();
44 while (!traits_type::eq_int_type(__c, traits_type::eof()))
46 const streamsize __n = __sbin->egptr() - __sbin->gptr();
47 if (__n > 1)
49 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
50 __sbin->__safe_gbump(__wrote);
51 __ret += __wrote;
52 if (__wrote < __n)
54 __ineof = false;
55 break;
57 __c = __sbin->underflow();
59 else
61 __c = __sbout->sputc(traits_type::to_char_type(__c));
62 if (traits_type::eq_int_type(__c, traits_type::eof()))
64 __ineof = false;
65 break;
67 ++__ret;
68 __c = __sbin->snextc();
71 return __ret;
74 #ifdef _GLIBCXX_USE_WCHAR_T
75 template<>
76 streamsize
77 __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
78 basic_streambuf<wchar_t>* __sbout, bool& __ineof)
80 typedef basic_streambuf<wchar_t>::traits_type traits_type;
81 streamsize __ret = 0;
82 __ineof = true;
83 traits_type::int_type __c = __sbin->sgetc();
84 while (!traits_type::eq_int_type(__c, traits_type::eof()))
86 const streamsize __n = __sbin->egptr() - __sbin->gptr();
87 if (__n > 1)
89 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
90 __sbin->__safe_gbump(__wrote);
91 __ret += __wrote;
92 if (__wrote < __n)
94 __ineof = false;
95 break;
97 __c = __sbin->underflow();
99 else
101 __c = __sbout->sputc(traits_type::to_char_type(__c));
102 if (traits_type::eq_int_type(__c, traits_type::eof()))
104 __ineof = false;
105 break;
107 ++__ret;
108 __c = __sbin->snextc();
111 return __ret;
113 #endif
115 _GLIBCXX_END_NAMESPACE_VERSION
116 } // namespace