1 // Stream buffer classes -*- C++ -*- 2 3 // Copyright (C) 2004-2016 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 // 26 // ISO C++ 14882: 27.5 Stream buffers 27 // 28 29 #include <streambuf> 30 31 namespace std _GLIBCXX_VISIBILITY(default) 32 { 33 _GLIBCXX_BEGIN_NAMESPACE_VERSION 34 35 template<> 36 streamsize __copy_streambufs_eof(basic_streambuf<char> * __sbin,basic_streambuf<char> * __sbout,bool & __ineof)37 __copy_streambufs_eof(basic_streambuf<char>* __sbin, 38 basic_streambuf<char>* __sbout, bool& __ineof) 39 { 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())) 45 { 46 const streamsize __n = __sbin->egptr() - __sbin->gptr(); 47 if (__n > 1) 48 { 49 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n); 50 __sbin->__safe_gbump(__wrote); 51 __ret += __wrote; 52 if (__wrote < __n) 53 { 54 __ineof = false; 55 break; 56 } 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())) 63 { 64 __ineof = false; 65 break; 66 } 67 ++__ret; 68 __c = __sbin->snextc(); 69 } 70 } 71 return __ret; 72 } 73 74 #ifdef _GLIBCXX_USE_WCHAR_T 75 template<> 76 streamsize __copy_streambufs_eof(basic_streambuf<wchar_t> * __sbin,basic_streambuf<wchar_t> * __sbout,bool & __ineof)77 __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin, 78 basic_streambuf<wchar_t>* __sbout, bool& __ineof) 79 { 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())) 85 { 86 const streamsize __n = __sbin->egptr() - __sbin->gptr(); 87 if (__n > 1) 88 { 89 const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n); 90 __sbin->__safe_gbump(__wrote); 91 __ret += __wrote; 92 if (__wrote < __n) 93 { 94 __ineof = false; 95 break; 96 } 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())) 103 { 104 __ineof = false; 105 break; 106 } 107 ++__ret; 108 __c = __sbin->snextc(); 109 } 110 } 111 return __ret; 112 } 113 #endif 114 115 _GLIBCXX_END_NAMESPACE_VERSION 116 } // namespace 117