1*e4b17023SJohn Marino // Stream buffer classes -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 4*e4b17023SJohn Marino // Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino // 27*e4b17023SJohn Marino // ISO C++ 14882: 27.5 Stream buffers 28*e4b17023SJohn Marino // 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino #include <streambuf> 31*e4b17023SJohn Marino 32*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 33*e4b17023SJohn Marino { 34*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino template<> 37*e4b17023SJohn Marino streamsize __copy_streambufs_eof(basic_streambuf<char> * __sbin,basic_streambuf<char> * __sbout,bool & __ineof)38*e4b17023SJohn Marino __copy_streambufs_eof(basic_streambuf<char>* __sbin, 39*e4b17023SJohn Marino basic_streambuf<char>* __sbout, bool& __ineof) 40*e4b17023SJohn Marino { 41*e4b17023SJohn Marino typedef basic_streambuf<char>::traits_type traits_type; 42*e4b17023SJohn Marino streamsize __ret = 0; 43*e4b17023SJohn Marino __ineof = true; 44*e4b17023SJohn Marino traits_type::int_type __c = __sbin->sgetc(); 45*e4b17023SJohn Marino while (!traits_type::eq_int_type(__c, traits_type::eof())) 46*e4b17023SJohn Marino { 47*e4b17023SJohn Marino const streamsize __n = __sbin->egptr() - __sbin->gptr(); 48*e4b17023SJohn Marino if (__n > 1) 49*e4b17023SJohn Marino { 50*e4b17023SJohn Marino const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n); 51*e4b17023SJohn Marino __sbin->__safe_gbump(__wrote); 52*e4b17023SJohn Marino __ret += __wrote; 53*e4b17023SJohn Marino if (__wrote < __n) 54*e4b17023SJohn Marino { 55*e4b17023SJohn Marino __ineof = false; 56*e4b17023SJohn Marino break; 57*e4b17023SJohn Marino } 58*e4b17023SJohn Marino __c = __sbin->underflow(); 59*e4b17023SJohn Marino } 60*e4b17023SJohn Marino else 61*e4b17023SJohn Marino { 62*e4b17023SJohn Marino __c = __sbout->sputc(traits_type::to_char_type(__c)); 63*e4b17023SJohn Marino if (traits_type::eq_int_type(__c, traits_type::eof())) 64*e4b17023SJohn Marino { 65*e4b17023SJohn Marino __ineof = false; 66*e4b17023SJohn Marino break; 67*e4b17023SJohn Marino } 68*e4b17023SJohn Marino ++__ret; 69*e4b17023SJohn Marino __c = __sbin->snextc(); 70*e4b17023SJohn Marino } 71*e4b17023SJohn Marino } 72*e4b17023SJohn Marino return __ret; 73*e4b17023SJohn Marino } 74*e4b17023SJohn Marino 75*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_WCHAR_T 76*e4b17023SJohn Marino template<> 77*e4b17023SJohn Marino streamsize __copy_streambufs_eof(basic_streambuf<wchar_t> * __sbin,basic_streambuf<wchar_t> * __sbout,bool & __ineof)78*e4b17023SJohn Marino __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin, 79*e4b17023SJohn Marino basic_streambuf<wchar_t>* __sbout, bool& __ineof) 80*e4b17023SJohn Marino { 81*e4b17023SJohn Marino typedef basic_streambuf<wchar_t>::traits_type traits_type; 82*e4b17023SJohn Marino streamsize __ret = 0; 83*e4b17023SJohn Marino __ineof = true; 84*e4b17023SJohn Marino traits_type::int_type __c = __sbin->sgetc(); 85*e4b17023SJohn Marino while (!traits_type::eq_int_type(__c, traits_type::eof())) 86*e4b17023SJohn Marino { 87*e4b17023SJohn Marino const streamsize __n = __sbin->egptr() - __sbin->gptr(); 88*e4b17023SJohn Marino if (__n > 1) 89*e4b17023SJohn Marino { 90*e4b17023SJohn Marino const streamsize __wrote = __sbout->sputn(__sbin->gptr(), __n); 91*e4b17023SJohn Marino __sbin->__safe_gbump(__wrote); 92*e4b17023SJohn Marino __ret += __wrote; 93*e4b17023SJohn Marino if (__wrote < __n) 94*e4b17023SJohn Marino { 95*e4b17023SJohn Marino __ineof = false; 96*e4b17023SJohn Marino break; 97*e4b17023SJohn Marino } 98*e4b17023SJohn Marino __c = __sbin->underflow(); 99*e4b17023SJohn Marino } 100*e4b17023SJohn Marino else 101*e4b17023SJohn Marino { 102*e4b17023SJohn Marino __c = __sbout->sputc(traits_type::to_char_type(__c)); 103*e4b17023SJohn Marino if (traits_type::eq_int_type(__c, traits_type::eof())) 104*e4b17023SJohn Marino { 105*e4b17023SJohn Marino __ineof = false; 106*e4b17023SJohn Marino break; 107*e4b17023SJohn Marino } 108*e4b17023SJohn Marino ++__ret; 109*e4b17023SJohn Marino __c = __sbin->snextc(); 110*e4b17023SJohn Marino } 111*e4b17023SJohn Marino } 112*e4b17023SJohn Marino return __ret; 113*e4b17023SJohn Marino } 114*e4b17023SJohn Marino #endif 115*e4b17023SJohn Marino 116*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 117*e4b17023SJohn Marino } // namespace 118