]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/src/c++98/streambuf.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / src / c++98 / streambuf.cc
CommitLineData
2bf8accc
PC
1// Stream buffer classes -*- C++ -*-
2
83ffe9cd 3// Copyright (C) 2004-2023 Free Software Foundation, Inc.
2bf8accc
PC
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
748086b7 8// Free Software Foundation; either version 3, or (at your option)
2bf8accc
PC
9// any later version.
10
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.
15
748086b7
JJ
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.
2bf8accc 19
748086b7
JJ
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/>.
2bf8accc
PC
24
25//
26// ISO C++ 14882: 27.5 Stream buffers
27//
28
29#include <streambuf>
30
12ffa228
BK
31namespace std _GLIBCXX_VISIBILITY(default)
32{
33_GLIBCXX_BEGIN_NAMESPACE_VERSION
3cbc7af0 34
2bf8accc
PC
35 template<>
36 streamsize
6f4d3d86
PC
37 __copy_streambufs_eof(basic_streambuf<char>* __sbin,
38 basic_streambuf<char>* __sbout, bool& __ineof)
2bf8accc
PC
39 {
40 typedef basic_streambuf<char>::traits_type traits_type;
41 streamsize __ret = 0;
6f4d3d86 42 __ineof = true;
2bf8accc
PC
43 traits_type::int_type __c = __sbin->sgetc();
44 while (!traits_type::eq_int_type(__c, traits_type::eof()))
45 {
cdcdee12 46 const streamsize __n = __sbin->egptr() - __sbin->gptr();
2bf8accc
PC
47 if (__n > 1)
48 {
cdcdee12 49 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
1139a735 50 __sbin->__safe_gbump(__wrote);
2bf8accc
PC
51 __ret += __wrote;
52 if (__wrote < __n)
6f4d3d86
PC
53 {
54 __ineof = false;
55 break;
56 }
2bf8accc
PC
57 __c = __sbin->underflow();
58 }
59 else
60 {
61 __c = __sbout->sputc(traits_type::to_char_type(__c));
62 if (traits_type::eq_int_type(__c, traits_type::eof()))
6f4d3d86
PC
63 {
64 __ineof = false;
65 break;
66 }
2bf8accc
PC
67 ++__ret;
68 __c = __sbin->snextc();
69 }
70 }
71 return __ret;
72 }
73
74#ifdef _GLIBCXX_USE_WCHAR_T
75 template<>
76 streamsize
6f4d3d86
PC
77 __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
78 basic_streambuf<wchar_t>* __sbout, bool& __ineof)
2bf8accc
PC
79 {
80 typedef basic_streambuf<wchar_t>::traits_type traits_type;
81 streamsize __ret = 0;
6f4d3d86 82 __ineof = true;
2bf8accc
PC
83 traits_type::int_type __c = __sbin->sgetc();
84 while (!traits_type::eq_int_type(__c, traits_type::eof()))
85 {
cdcdee12 86 const streamsize __n = __sbin->egptr() - __sbin->gptr();
2bf8accc
PC
87 if (__n > 1)
88 {
cdcdee12 89 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n);
1139a735 90 __sbin->__safe_gbump(__wrote);
2bf8accc
PC
91 __ret += __wrote;
92 if (__wrote < __n)
6f4d3d86
PC
93 {
94 __ineof = false;
95 break;
96 }
2bf8accc
PC
97 __c = __sbin->underflow();
98 }
99 else
100 {
101 __c = __sbout->sputc(traits_type::to_char_type(__c));
102 if (traits_type::eq_int_type(__c, traits_type::eof()))
6f4d3d86
PC
103 {
104 __ineof = false;
105 break;
106 }
2bf8accc
PC
107 ++__ret;
108 __c = __sbin->snextc();
109 }
110 }
111 return __ret;
112 }
113#endif
3cbc7af0 114
12ffa228
BK
115_GLIBCXX_END_NAMESPACE_VERSION
116} // namespace