diff options
Diffstat (limited to 'contrib/libstdc++/include/bits/streambuf.tcc')
| -rw-r--r-- | contrib/libstdc++/include/bits/streambuf.tcc | 31 | 
1 files changed, 21 insertions, 10 deletions
| diff --git a/contrib/libstdc++/include/bits/streambuf.tcc b/contrib/libstdc++/include/bits/streambuf.tcc index 2f790e902cb7..c8084ee68ada 100644 --- a/contrib/libstdc++/include/bits/streambuf.tcc +++ b/contrib/libstdc++/include/bits/streambuf.tcc @@ -208,19 +208,28 @@ namespace std        try   	{  	  while (__testput && __bufsize != -1) -	    { -	      __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize); -	      __ret += __xtrct; -	      __sbin->_M_in_cur_move(__xtrct); -	      if (__xtrct == __bufsize) +  	    { + 	      if (__bufsize != 0 && __sbin->gptr() != NULL)   		{ -		  if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof())) +		  __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize); +		  __ret += __xtrct; +		  __sbin->_M_in_cur_move(__xtrct); +		  if (__xtrct != __bufsize)  		    break; -		  __bufsize = __sbin->in_avail();  		} -	      else -		break; -	    } + 	      else  +		{ +		  _CharT __buf[256]; +		  streamsize __charsread = __sbin->sgetn(__buf, sizeof(__buf)); +		  __xtrct = __sbout->sputn(__buf, __charsread); +		  __ret += __xtrct; +		  if (__xtrct != __charsread) +		    break; +		} + 	      if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof())) +  		break; + 	      __bufsize = __sbin->in_avail(); +  	    }  	}        catch(exception& __fail)   	{ @@ -240,11 +249,13 @@ namespace std      __copy_streambufs(basic_ios<char>&, basic_streambuf<char>*,  		      basic_streambuf<char>*);  +#ifdef _GLIBCPP_USE_WCHAR_T    extern template class basic_streambuf<wchar_t>;    extern template      streamsize      __copy_streambufs(basic_ios<wchar_t>&, basic_streambuf<wchar_t>*,  		      basic_streambuf<wchar_t>*);  +#endif  } // namespace std  #endif  | 
