williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: #ifndef _STLP_STREAMBUF_C williamr@2: #define _STLP_STREAMBUF_C williamr@2: williamr@2: #ifndef _STLP_INTERNAL_STREAMBUF williamr@2: # include williamr@2: #endif williamr@2: williamr@2: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: //---------------------------------------------------------------------- williamr@2: // Non-inline basic_streambuf<> member functions. williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_streambuf<_CharT, _Traits>::basic_streambuf() williamr@2: : _M_gbegin(0), _M_gnext(0), _M_gend(0), williamr@2: _M_pbegin(0), _M_pnext(0), _M_pend(0), williamr@2: _M_locale() williamr@2: { williamr@2: // _M_lock._M_initialize(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_streambuf<_CharT, _Traits>::~basic_streambuf() williamr@2: {} williamr@2: williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC locale williamr@2: basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) { williamr@2: this->imbue(__loc); williamr@2: locale __tmp = _M_locale; williamr@2: _M_locale = __loc; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC streamsize williamr@2: basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n) williamr@2: { williamr@2: streamsize __result = 0; williamr@2: const int_type __eof = _Traits::eof(); williamr@2: williamr@2: while (__result < __n) { williamr@2: if (_M_gnext < _M_gend) { williamr@2: size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext), williamr@2: __STATIC_CAST(size_t,__n - __result)); williamr@2: _Traits::copy(__s, _M_gnext, __chunk); williamr@2: __result += __chunk; williamr@2: __s += __chunk; williamr@2: _M_gnext += __chunk; williamr@2: } williamr@2: else { williamr@2: int_type __c = this->sbumpc(); williamr@2: if (!_Traits::eq_int_type(__c, __eof)) { williamr@2: *__s = __c; williamr@2: ++__result; williamr@2: ++__s; williamr@2: } williamr@2: else williamr@2: break; williamr@2: } williamr@2: } williamr@2: williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC streamsize williamr@2: basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n) williamr@2: { williamr@2: streamsize __result = 0; williamr@2: const int_type __eof = _Traits::eof(); williamr@2: williamr@2: while (__result < __n) { williamr@2: if (_M_pnext < _M_pend) { williamr@2: size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), williamr@2: __STATIC_CAST(size_t,__n - __result)); williamr@2: _Traits::copy(_M_pnext, __s, __chunk); williamr@2: __result += __chunk; williamr@2: __s += __chunk; williamr@2: _M_pnext += __chunk; williamr@2: } williamr@2: williamr@2: else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)), williamr@2: __eof)) { williamr@2: ++__result; williamr@2: ++__s; williamr@2: } williamr@2: else williamr@2: break; williamr@2: } williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC streamsize williamr@2: basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n) williamr@2: { williamr@2: streamsize __result = 0; williamr@2: const int_type __eof = _Traits::eof(); williamr@2: williamr@2: while (__result < __n) { williamr@2: if (_M_pnext < _M_pend) { williamr@2: size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), williamr@2: __STATIC_CAST(size_t,__n - __result)); williamr@2: _Traits::assign(_M_pnext, __chunk, __c); williamr@2: __result += __chunk; williamr@2: _M_pnext += __chunk; williamr@2: } williamr@2: williamr@2: else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)), williamr@2: __eof)) williamr@2: ++__result; williamr@2: else williamr@2: break; williamr@2: } williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type williamr@2: basic_streambuf<_CharT, _Traits>::_M_snextc_aux() williamr@2: { williamr@2: int_type __eof = _Traits::eof(); williamr@2: if (_M_gend == _M_gnext) williamr@2: return _Traits::eq_int_type(this->uflow(), __eof) ? __eof : this->sgetc(); williamr@2: else { williamr@2: _M_gnext = _M_gend; williamr@2: return this->underflow(); williamr@2: } williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type williamr@2: basic_streambuf<_CharT, _Traits>::pbackfail(int_type) { williamr@2: return _Traits::eof(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type williamr@2: basic_streambuf<_CharT, _Traits>::overflow(int_type) { williamr@2: return _Traits::eof(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type williamr@2: basic_streambuf<_CharT, _Traits>::uflow() { williamr@2: return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ? williamr@2: _Traits::eof() : williamr@2: _Traits::to_int_type(*_M_gnext++)); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type williamr@2: basic_streambuf<_CharT, _Traits>::underflow() williamr@2: { return _Traits::eof(); } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC streamsize williamr@2: basic_streambuf<_CharT, _Traits>::showmanyc() williamr@2: { return 0; } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC void williamr@2: basic_streambuf<_CharT, _Traits>::imbue(const locale&) {} williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC int williamr@2: basic_streambuf<_CharT, _Traits>::sync() { return 0; } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type williamr@2: basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) williamr@2: { return pos_type(-1); } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type williamr@2: basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, williamr@2: ios_base::openmode) williamr@2: { return pos_type(-1); } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_streambuf<_CharT, _Traits>* williamr@2: basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize) williamr@2: { return this; } williamr@2: williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: # if !defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_streambuf >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # endif /* EXPOSE */ williamr@2: williamr@2: #endif