1 // Stream buffer classes -*- C++ -*- 2 3 // Copyright (C) 1997-2017 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. 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 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. 19 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/>. 24 25 /** @file bits/streambuf.tcc 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{streambuf} 28 */ 29 30 // 31 // ISO C++ 14882: 27.5 Stream buffers 32 // 33 34 #ifndef _STREAMBUF_TCC 35 #define _STREAMBUF_TCC 1 36 37 #pragma GCC system_header 38 39 namespace std _GLIBCXX_VISIBILITY(default) 40 { 41 _GLIBCXX_BEGIN_NAMESPACE_VERSION 42 43 template<typename _CharT, typename _Traits> 44 streamsize 45 basic_streambuf<_CharT, _Traits>:: xsgetn(char_type * __s,streamsize __n)46 xsgetn(char_type* __s, streamsize __n) 47 { 48 streamsize __ret = 0; 49 while (__ret < __n) 50 { 51 const streamsize __buf_len = this->egptr() - this->gptr(); 52 if (__buf_len) 53 { 54 const streamsize __remaining = __n - __ret; 55 const streamsize __len = std::min(__buf_len, __remaining); 56 traits_type::copy(__s, this->gptr(), __len); 57 __ret += __len; 58 __s += __len; 59 this->__safe_gbump(__len); 60 } 61 62 if (__ret < __n) 63 { 64 const int_type __c = this->uflow(); 65 if (!traits_type::eq_int_type(__c, traits_type::eof())) 66 { 67 traits_type::assign(*__s++, traits_type::to_char_type(__c)); 68 ++__ret; 69 } 70 else 71 break; 72 } 73 } 74 return __ret; 75 } 76 77 template<typename _CharT, typename _Traits> 78 streamsize 79 basic_streambuf<_CharT, _Traits>:: xsputn(const char_type * __s,streamsize __n)80 xsputn(const char_type* __s, streamsize __n) 81 { 82 streamsize __ret = 0; 83 while (__ret < __n) 84 { 85 const streamsize __buf_len = this->epptr() - this->pptr(); 86 if (__buf_len) 87 { 88 const streamsize __remaining = __n - __ret; 89 const streamsize __len = std::min(__buf_len, __remaining); 90 traits_type::copy(this->pptr(), __s, __len); 91 __ret += __len; 92 __s += __len; 93 this->__safe_pbump(__len); 94 } 95 96 if (__ret < __n) 97 { 98 int_type __c = this->overflow(traits_type::to_int_type(*__s)); 99 if (!traits_type::eq_int_type(__c, traits_type::eof())) 100 { 101 ++__ret; 102 ++__s; 103 } 104 else 105 break; 106 } 107 } 108 return __ret; 109 } 110 111 // Conceivably, this could be used to implement buffer-to-buffer 112 // copies, if this was ever desired in an un-ambiguous way by the 113 // standard. 114 template<typename _CharT, typename _Traits> 115 streamsize __copy_streambufs_eof(basic_streambuf<_CharT,_Traits> * __sbin,basic_streambuf<_CharT,_Traits> * __sbout,bool & __ineof)116 __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin, 117 basic_streambuf<_CharT, _Traits>* __sbout, 118 bool& __ineof) 119 { 120 streamsize __ret = 0; 121 __ineof = true; 122 typename _Traits::int_type __c = __sbin->sgetc(); 123 while (!_Traits::eq_int_type(__c, _Traits::eof())) 124 { 125 __c = __sbout->sputc(_Traits::to_char_type(__c)); 126 if (_Traits::eq_int_type(__c, _Traits::eof())) 127 { 128 __ineof = false; 129 break; 130 } 131 ++__ret; 132 __c = __sbin->snextc(); 133 } 134 return __ret; 135 } 136 137 template<typename _CharT, typename _Traits> 138 inline streamsize __copy_streambufs(basic_streambuf<_CharT,_Traits> * __sbin,basic_streambuf<_CharT,_Traits> * __sbout)139 __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin, 140 basic_streambuf<_CharT, _Traits>* __sbout) 141 { 142 bool __ineof; 143 return __copy_streambufs_eof(__sbin, __sbout, __ineof); 144 } 145 146 // Inhibit implicit instantiations for required instantiations, 147 // which are defined via explicit instantiations elsewhere. 148 #if _GLIBCXX_EXTERN_TEMPLATE 149 extern template class basic_streambuf<char>; 150 extern template 151 streamsize 152 __copy_streambufs(basic_streambuf<char>*, 153 basic_streambuf<char>*); 154 extern template 155 streamsize 156 __copy_streambufs_eof(basic_streambuf<char>*, 157 basic_streambuf<char>*, bool&); 158 159 #ifdef _GLIBCXX_USE_WCHAR_T 160 extern template class basic_streambuf<wchar_t>; 161 extern template 162 streamsize 163 __copy_streambufs(basic_streambuf<wchar_t>*, 164 basic_streambuf<wchar_t>*); 165 extern template 166 streamsize 167 __copy_streambufs_eof(basic_streambuf<wchar_t>*, 168 basic_streambuf<wchar_t>*, bool&); 169 #endif 170 #endif 171 172 _GLIBCXX_END_NAMESPACE_VERSION 173 } // namespace std 174 175 #endif 176