williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. 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: williamr@2: #ifndef _STLP_SSTREAM_C williamr@2: #define _STLP_SSTREAM_C williamr@2: williamr@2: #ifndef _STLP_SSTREAM_H williamr@2: # include williamr@2: #include williamr@2: #endif williamr@2: williamr@2: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) williamr@2: williamr@2: # if defined ( _STLP_NESTED_TYPE_PARAM_BUG ) williamr@2: // no wint_t is supported for this mode williamr@2: # define __BSB_int_type__ int williamr@2: # define __BSB_pos_type__ streampos williamr@2: # else williamr@2: # define __BSB_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::int_type williamr@2: # define __BSB_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type williamr@2: # endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Non-inline stringbuf member functions. williamr@2: williamr@2: // Constructors. Note that the base class constructor sets all of the williamr@2: // get and area pointers to null. williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_stringbuf<_CharT, _Traits, _Alloc> williamr@2: ::basic_stringbuf(ios_base::openmode __mode) williamr@2: : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str() williamr@2: { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (_M_mode & ios_base::out) { williamr@2: if (_M_mode & (ios_base::app | ios_base::ate)) williamr@2: //increment the streampos to reflect the current streampos while writing williamr@2: _M_str._M_stream_pos += _M_str.size(); williamr@2: } williamr@2: #endif williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_stringbuf<_CharT, _Traits, _Alloc> williamr@2: ::basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __s, ios_base::openmode __mode) williamr@2: : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str(__s) williamr@2: { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (_M_mode & ios_base::out) { williamr@2: if (_M_mode & (ios_base::app | ios_base::ate)) williamr@2: //increment the streampos to reflect the current streampos while writing williamr@2: _M_str._M_stream_pos += _M_str.size(); williamr@2: } williamr@2: #endif williamr@2: _M_set_ptrs(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_stringbuf<_CharT, _Traits, _Alloc>::~basic_stringbuf() williamr@2: {} williamr@2: williamr@2: // Set the underlying string to a new value. williamr@2: template williamr@2: _STLP_EXP_DECLSPEC void williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::str(const basic_string<_CharT, _Traits, _Alloc>& __s) williamr@2: { williamr@2: _M_str = __s; williamr@2: _M_set_ptrs(); williamr@2: } williamr@2: williamr@2: template williamr@2: void williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::_M_set_ptrs() { williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: _CharT* __data_end = __data_ptr + _M_str.size(); williamr@2: // The initial read position is the beginning of the string. williamr@2: if (_M_mode & ios_base::in) { williamr@2: if (_M_mode & ios_base::ate) williamr@2: this->setg(__data_ptr, __data_end, __data_end); williamr@2: else williamr@2: this->setg(__data_ptr, __data_ptr, __data_end); williamr@2: } williamr@2: williamr@2: // The initial write position is the beginning of the string. williamr@2: if (_M_mode & ios_base::out) { williamr@2: if (_M_mode & (ios_base::app | ios_base::ate)) williamr@2: this->setp(__data_end, __data_end); williamr@2: else williamr@2: this->setp(__data_ptr, __data_end); williamr@2: } williamr@2: } williamr@2: williamr@2: // Precondition: gptr() >= egptr(). Returns a character, if one is available. williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_int_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::underflow() williamr@2: { williamr@2: return this->gptr() != this->egptr() williamr@2: ? _Traits::to_int_type(*this->gptr()) williamr@2: : _Traits::eof(); williamr@2: } williamr@2: williamr@2: // Precondition: gptr() >= egptr(). williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_int_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::uflow() williamr@2: { williamr@2: if (this->gptr() != this->egptr()) { williamr@2: int_type __c = _Traits::to_int_type(*this->gptr()); williamr@2: this->gbump(1); williamr@2: return __c; williamr@2: } williamr@2: else williamr@2: return _Traits::eof(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_int_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::pbackfail(int_type __c) williamr@2: { williamr@2: if (this->gptr() != this->eback()) { williamr@2: if (!_Traits::eq_int_type(__c, _Traits::eof())) { williamr@2: williamr@2: if (_Traits::eq(_Traits::to_char_type(__c), this->gptr()[-1]) williamr@2: || _M_mode == (ios_base::in | ios_base::out)) { williamr@2: this->gbump(-1); williamr@2: *this->gptr() = _Traits::to_char_type(__c); williamr@2: return _Traits::not_eof(__c); williamr@2: } williamr@2: else{ williamr@2: return _Traits::eof(); williamr@2: } williamr@2: } williamr@2: else { williamr@2: this->gbump(-1); williamr@2: return _Traits::not_eof(__c); williamr@2: } williamr@2: } williamr@2: else williamr@2: return _Traits::eof(); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_int_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(int_type __c) williamr@2: { williamr@2: // fbp : reverse order of "ifs" to pass Dietmar's test. williamr@2: // Apparently, standard allows overflow with eof even for read-only streams. williamr@2: if (!_Traits::eq_int_type(__c, _Traits::eof())) { williamr@2: if (_M_mode & ios_base::out) { williamr@2: if (!(_M_mode & ios_base::in)) { williamr@2: // It's a write-only streambuf, so we can use special append buffer. williamr@2: if (this->pptr() == this->epptr()) williamr@2: this->_M_append_buffer(); williamr@2: williamr@2: if (this->pptr() != this->epptr()) { williamr@2: *this->pptr() = _Traits::to_char_type(__c); williamr@2: this->pbump(1); williamr@2: return __c; williamr@2: } williamr@2: else williamr@2: return _Traits::eof(); williamr@2: } williamr@2: williamr@2: else { williamr@2: // We're not using a special append buffer, just the string itself. williamr@2: if (this->pptr() == this->epptr()) { williamr@2: ptrdiff_t __offset = this->gptr() - this->eback(); williamr@2: _M_str.push_back(_Traits::to_char_type(__c)); williamr@2: williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: size_t __data_size = _M_str.size(); williamr@2: williamr@2: this->setg(__data_ptr, __data_ptr + __offset, __data_ptr+__data_size); williamr@2: this->setp(__data_ptr, __data_ptr + __data_size); williamr@2: this->pbump((int)__data_size); williamr@2: return __c; williamr@2: } williamr@2: else { williamr@2: *this->pptr() = _Traits::to_char_type(__c); williamr@2: this->pbump(1); williamr@2: return __c; williamr@2: } williamr@2: } williamr@2: } williamr@2: else // Overflow always fails if it's read-only williamr@2: return _Traits::eof(); williamr@2: } williamr@2: else // __c is EOF, so we don't have to do anything williamr@2: return _Traits::not_eof(__c); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC streamsize williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::xsputn(const char_type* __s, williamr@2: streamsize __n) williamr@2: { williamr@2: streamsize __nwritten = 0; williamr@2: williamr@2: if ((_M_mode & ios_base::out) && __n > 0) { williamr@2: // If the put pointer is somewhere in the middle of the string, williamr@2: // then overwrite instead of append. williamr@2: if (this->pbase() == _M_str.data() ) { williamr@2: ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); williamr@2: if (__avail > __n) { williamr@2: _Traits::copy(this->pptr(), __s, __n); williamr@2: this->pbump((int)__n); williamr@2: #ifdef __SYMBIAN32__ williamr@2: // _M_str._M_stream_pos += __n; //increment streampos to number of characters in stream williamr@2: #endif williamr@2: return __n; williamr@2: } williamr@2: else { williamr@2: _Traits::copy(this->pptr(), __s, __avail); williamr@2: __nwritten += __avail; williamr@2: __n -= __avail; williamr@2: __s += __avail; williamr@2: #ifdef __SYMBIAN32__ williamr@2: // _M_str._M_stream_pos += __avail;//increment streampos to number of characters in stream williamr@2: #endif williamr@2: this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); williamr@2: } williamr@2: } williamr@2: williamr@2: // At this point we know we're appending. williamr@2: if (_M_mode & ios_base::in) { williamr@2: ptrdiff_t __get_offset = this->gptr() - this->eback(); williamr@2: _M_str.append(__s, __s + __n); williamr@2: williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: size_t __data_size = _M_str.size(); williamr@2: williamr@2: this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size); williamr@2: this->setp(__data_ptr, __data_ptr + __data_size); williamr@2: this->pbump((int)__data_size); williamr@2: } williamr@2: else { williamr@2: _M_append_buffer(); williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (_M_str._M_stream_pos >= 0 williamr@2: && (_M_str._M_stream_pos < _M_str.size())) { williamr@2: if((_M_str.size() - _M_str._M_stream_pos) >= __n) williamr@2: _M_str.replace(_M_str._M_stream_pos, __n, __s); williamr@2: else williamr@2: { williamr@2: _M_str.replace(_M_str._M_stream_pos, (_M_str.size() - _M_str._M_stream_pos), __s); williamr@2: _M_str.append(__s + (__n - (_M_str.size() - _M_str._M_stream_pos)), __s + __n); williamr@2: } williamr@2: } else { williamr@2: _M_str.append(__s, __s + __n); williamr@2: } williamr@2: _M_str._M_stream_pos += __n; williamr@2: #else //__SYMBIAN32__ williamr@2: _M_str.append(__s, __s + __n); williamr@2: #endif // __SYMBIAN32__ williamr@2: } williamr@2: __nwritten += __n; williamr@2: } williamr@2: williamr@2: return __nwritten; williamr@2: } williamr@2: williamr@2: template williamr@2: streamsize williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::_M_xsputnc(char_type __c, williamr@2: streamsize __n) williamr@2: { williamr@2: streamsize __nwritten = 0; williamr@2: williamr@2: if ((_M_mode & ios_base::out) && __n > 0) { williamr@2: // If the put pointer is somewhere in the middle of the string, williamr@2: // then overwrite instead of append. williamr@2: if (this->pbase() == _M_str.data()) { williamr@2: ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); williamr@2: if (__avail > __n) { williamr@2: _Traits::assign(this->pptr(), __n, __c); williamr@2: this->pbump((int)__n); williamr@2: return __n; williamr@2: } williamr@2: else { williamr@2: _Traits::assign(this->pptr(), __avail, __c); williamr@2: __nwritten += __avail; williamr@2: __n -= __avail; williamr@2: this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); williamr@2: } williamr@2: } williamr@2: williamr@2: // At this point we know we're appending. williamr@2: if (this->_M_mode & ios_base::in) { williamr@2: ptrdiff_t __get_offset = this->gptr() - this->eback(); williamr@2: _M_str.append(__n, __c); williamr@2: williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: size_t __data_size = _M_str.size(); williamr@2: williamr@2: this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size); williamr@2: this->setp(__data_ptr, __data_ptr + __data_size); williamr@2: this->pbump((int)__data_size); williamr@2: williamr@2: } williamr@2: else { williamr@2: _M_append_buffer(); williamr@2: // _M_str.append(__n, __c); williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (_M_str._M_stream_pos >= 0 williamr@2: && (_M_str._M_stream_pos < _M_str.size())) { williamr@2: if((_M_str.size() - _M_str._M_stream_pos) >= __n) williamr@2: _M_str.replace(_M_str._M_stream_pos,__n, __n, __c); williamr@2: else williamr@2: { williamr@2: _M_str.replace(_M_str._M_stream_pos, (_M_str.size() - _M_str._M_stream_pos), (_M_str.size() - _M_str._M_stream_pos), __c); williamr@2: _M_str.append(__n, __c); williamr@2: } williamr@2: } else { williamr@2: _M_str.append(__n, __c); williamr@2: } williamr@2: _M_str._M_stream_pos += __n; williamr@2: #else //__SYMBIAN32__ williamr@2: _M_str.append(__n, __c); williamr@2: #endif // __SYMBIAN32__ williamr@2: } williamr@2: williamr@2: __nwritten += __n; williamr@2: } williamr@2: williamr@2: return __nwritten; williamr@2: } williamr@2: williamr@2: // According to the C++ standard the effects of setbuf are implementation williamr@2: // defined, except that setbuf(0, 0) has no effect. In this implementation, williamr@2: // setbuf(, n), for n > 0, calls reserve(n) on the underlying williamr@2: // string. williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_streambuf<_CharT, _Traits>* williamr@2: #ifdef __SYMBIAN32__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::setbuf(_CharT* __s, streamsize __n) williamr@2: #else williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::setbuf(_CharT*, streamsize __n) williamr@2: #endif //__SYMBIAN32__ williamr@2: { williamr@2: if (__n > 0) { williamr@2: bool __do_get_area = false; williamr@2: bool __do_put_area = false; williamr@2: ptrdiff_t __offg = 0; williamr@2: ptrdiff_t __offp = 0; williamr@2: williamr@2: if (this->pbase() == _M_str.data()) { williamr@2: __do_put_area = true; williamr@2: __offp = this->pptr() - this->pbase(); williamr@2: } williamr@2: williamr@2: if (this->eback() == _M_str.data()) { williamr@2: __do_get_area = true; williamr@2: __offg = this->gptr() - this->eback(); williamr@2: } williamr@2: williamr@2: if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) williamr@2: _M_append_buffer(); williamr@2: williamr@2: _M_str.reserve(__n); williamr@2: williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: #ifdef __SYMBIAN32__ williamr@2: size_t __data_size = __n; williamr@2: memmove(__data_ptr, __s, __n*sizeof(_CharT)); williamr@2: _M_str._M_start = __data_ptr; williamr@2: _M_str._M_finish = __data_ptr+__n; williamr@2: #else williamr@2: size_t __data_size = _M_str.size(); williamr@2: #endif //__SYMBIAN32__ williamr@2: williamr@2: if (__do_get_area) { williamr@2: #ifdef __SYMBIAN32__ williamr@2: this->setg(__data_ptr, __data_ptr, __data_ptr+__data_size); williamr@2: #else williamr@2: this->setg(__data_ptr, __data_ptr + __offg, __data_ptr+__data_size); williamr@2: #endif //__SYMBIAN32__ williamr@2: } williamr@2: williamr@2: if (__do_put_area) { williamr@2: this->setp(__data_ptr, __data_ptr+__data_size); williamr@2: #ifndef __SYMBIAN32__ williamr@2: this->pbump((int)__offp); williamr@2: #endif //__SYMBIAN32__ williamr@2: } williamr@2: } williamr@2: williamr@2: return this; williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_pos_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>::seekoff(off_type __off, williamr@2: ios_base::seekdir __dir, williamr@2: ios_base::openmode __mode) williamr@2: { williamr@2: bool __stl_in = false; williamr@2: bool __stl_out = false; williamr@2: williamr@2: if ((__mode & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) ) { williamr@2: if (__dir == ios_base::beg || __dir == ios_base::end) williamr@2: __stl_in = __stl_out = true; williamr@2: } williamr@2: else if (__mode & ios_base::in) williamr@2: __stl_in = true; williamr@2: else if (__mode & ios_base::out) williamr@2: __stl_out = true; williamr@2: williamr@2: if (!__stl_in && !__stl_out) williamr@2: return pos_type(off_type(-1)); williamr@2: else if ((__stl_in && (!(_M_mode & ios_base::in) || this->gptr() == 0)) || williamr@2: (__stl_out && (!(_M_mode & ios_base::out) || this->pptr() == 0))) williamr@2: return pos_type(off_type(-1)); williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (_M_mode & ios_base::out) williamr@2: #else williamr@2: if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) williamr@2: #endif williamr@2: _M_append_buffer(); williamr@2: williamr@2: streamoff __newoff; williamr@2: switch(__dir) { williamr@2: case ios_base::beg: williamr@2: __newoff = 0; williamr@2: break; williamr@2: case ios_base::end: williamr@2: __newoff = _M_str.size(); williamr@2: break; williamr@2: case ios_base::cur: williamr@2: __newoff = __stl_in ? this->gptr() - this->eback() williamr@2: #ifdef __SYMBIAN32__ williamr@2: : ((this->pbase() != this->_M_str) ? _M_str._M_stream_pos williamr@2: : this->pptr() - this->pbase()); williamr@2: #else williamr@2: : this->pptr() - this->pbase(); williamr@2: #endif //__SYMBIAN32__ williamr@2: break; williamr@2: default: williamr@2: return pos_type(off_type(-1)); williamr@2: } williamr@2: williamr@2: __off += __newoff; williamr@2: williamr@2: if (__stl_in) { williamr@2: ptrdiff_t __n = this->egptr() - this->eback(); williamr@2: williamr@2: if (__off < 0 || __off > __n) williamr@2: return pos_type(off_type(-1)); williamr@2: else williamr@2: this->setg(this->eback(), this->eback() + __off, this->eback() + __n); williamr@2: } williamr@2: williamr@2: if (__stl_out) { williamr@2: ptrdiff_t __n; williamr@2: #ifdef __SYMBIAN32__ williamr@2: //if (this->pbase() != this->_M_str) { williamr@2: void* __data_ptr1 = reinterpret_cast(this->pbase()); williamr@2: _CharT* __data_ptr2 = __CONST_CAST(_CharT*,this->_M_str.data()); williamr@2: williamr@2: if (__data_ptr1 != __data_ptr2) { williamr@2: __n = _M_str.size(); williamr@2: } else { williamr@2: #endif // __SYMBIAN32__ williamr@2: __n = this->epptr() - this->pbase(); williamr@2: #ifdef __SYMBIAN32__ williamr@2: } williamr@2: #endif //__SYMBIAN32__ williamr@2: if (__off < 0 || __off > __n) williamr@2: return pos_type(off_type(-1)); williamr@2: else { williamr@2: #ifdef __SYMBIAN32__ williamr@2: void* __data_ptr1 = reinterpret_cast(this->pbase()); williamr@2: _CharT* __data_ptr2 = __CONST_CAST(_CharT*,this->_M_str.data()); williamr@2: williamr@2: if (__data_ptr1 != __data_ptr2) { williamr@2: _M_str._M_stream_pos = __off; williamr@2: } else { williamr@2: #endif //__SYMBIAN32__ williamr@2: this->setp(this->pbase(), this->pbase() + __n); williamr@2: this->pbump((int)__off); williamr@2: #ifdef __SYMBIAN32__ williamr@2: } williamr@2: #endif // __SYMBIAN32__ williamr@2: } williamr@2: } williamr@2: williamr@2: return pos_type(__off); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC __BSB_pos_type__ williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc> williamr@2: ::seekpos(pos_type __pos, ios_base::openmode __mode) williamr@2: { williamr@2: bool __stl_in = (__mode & ios_base::in) != 0; williamr@2: bool __stl_out = (__mode & ios_base::out) != 0; williamr@2: williamr@2: if ((__stl_in && (!(_M_mode & ios_base::in) || this->gptr() == 0)) || williamr@2: (__stl_out && (!(_M_mode & ios_base::out) || this->pptr() == 0)) || williamr@2: (!__stl_in && !__stl_out)) williamr@2: return pos_type(off_type(-1)); williamr@2: williamr@2: const off_type __n = __pos - pos_type(off_type(0)); williamr@2: if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) williamr@2: _M_append_buffer(); williamr@2: williamr@2: if (__stl_in) { williamr@2: if (__n < 0 || __n > this->egptr() - this->eback()) williamr@2: return pos_type(off_type(-1)); williamr@2: this->setg(this->eback(), this->eback() + __n, this->egptr()); williamr@2: } williamr@2: williamr@2: if (__stl_out) { williamr@2: if (__n < 0 || size_t(__n) > _M_str.size()) williamr@2: return pos_type(off_type(-1)); williamr@2: williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); williamr@2: size_t __data_size = _M_str.size(); williamr@2: williamr@2: this->setp(__data_ptr, __data_ptr+__data_size); williamr@2: this->pbump((int)__n); williamr@2: } williamr@2: williamr@2: return __pos; williamr@2: } williamr@2: williamr@2: // This is declared as a const member function because it is williamr@2: // called by basic_stringbuf<>::str(). Precondition: this is a williamr@2: // write-only stringbuf. We can't use an output buffer for read- williamr@2: // write stringbufs. Postcondition: pptr is reset to the beginning williamr@2: // of the buffer. williamr@2: template williamr@2: void basic_stringbuf<_CharT, _Traits, _Alloc>::_M_append_buffer() const williamr@2: williamr@2: { williamr@2: // Do we have a buffer to append? williamr@2: if (this->pbase() == this->_M_Buf && this->pptr() != this->_M_Buf) { williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this); williamr@2: #ifdef __SYMBIAN32__ williamr@2: size_t __n = this->pptr() - this->pbase(); williamr@2: if (__this->_M_str._M_stream_pos >= 0 williamr@2: && (__this->_M_str._M_stream_pos != __this->_M_str.size())) { williamr@2: { williamr@2: *(this->pptr()) = (_CharT)0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: __this->_M_str.replace(_M_str._M_stream_pos, __n, (const _CharT*)this->pbase(), (const _CharT*)this->pptr()-(const _CharT*)this->pbase()); williamr@2: #else williamr@2: __this->_M_str.replace(_M_str._M_stream_pos, __n, (const _CharT*)this->pbase()); williamr@2: williamr@2: #endif williamr@2: } williamr@2: } else { williamr@2: __this->_M_str.append((const _CharT*)this->pbase(), (const _CharT*)this->pptr()); williamr@2: } williamr@2: __this->_M_str._M_stream_pos += __n; williamr@2: #else // __SYMBAIN32__ williamr@2: __this->_M_str.append((const _CharT*)this->pbase(), (const _CharT*)this->pptr()); williamr@2: #endif // __SYMBIAN32__ williamr@2: __this->setp(__CONST_CAST(_CharT*,_M_Buf), williamr@2: __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz))); williamr@2: } williamr@2: williamr@2: // Have we run off the end of the string? williamr@2: else if (this->pptr() == this->epptr()) { williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this); williamr@2: __this->setp(__CONST_CAST(_CharT*,_M_Buf), williamr@2: __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz))); williamr@2: __this->_M_str._M_stream_pos = __this->_M_str._M_finish - __this->_M_str._M_start; williamr@2: } williamr@2: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Non-inline istringstream member functions. williamr@2: williamr@2: template williamr@2: basic_istringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_istringstream(ios_base::openmode __mode) williamr@2: : basic_istream<_CharT, _Traits>(0), williamr@2: _M_buf(__mode | ios_base::in) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_istringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_istringstream(const _String& __str,ios_base::openmode __mode) williamr@2: : basic_istream<_CharT, _Traits>(0), williamr@2: _M_buf(__str, __mode | ios_base::in) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_istringstream<_CharT, _Traits, _Alloc>::~basic_istringstream() williamr@2: {} williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Non-inline ostringstream member functions. williamr@2: williamr@2: template williamr@2: basic_ostringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_ostringstream(ios_base::openmode __mode) williamr@2: : basic_ostream<_CharT, _Traits>(0), williamr@2: _M_buf(__mode | ios_base::out) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_ostringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_ostringstream(const _String& __str, ios_base::openmode __mode) williamr@2: : basic_ostream<_CharT, _Traits>(0), williamr@2: _M_buf(__str, __mode | ios_base::out) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_ostringstream<_CharT, _Traits, _Alloc>::~basic_ostringstream() williamr@2: {} williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Non-inline stringstream member functions. williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_stringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_stringstream(ios_base::openmode __mode) williamr@2: : basic_iostream<_CharT, _Traits>(0), _M_buf(__mode) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_EXP_DECLSPEC basic_stringstream<_CharT, _Traits, _Alloc> williamr@2: ::basic_stringstream(const _String& __str, ios_base::openmode __mode) williamr@2: : basic_iostream<_CharT, _Traits>(0), _M_buf(__str, __mode) williamr@2: { williamr@2: this->init(&_M_buf); williamr@2: } williamr@2: williamr@2: template williamr@2: basic_stringstream<_CharT, _Traits, _Alloc>::~basic_stringstream() williamr@2: {} williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # undef __BSB_int_type__ williamr@2: # undef __BSB_pos_type__ williamr@2: williamr@2: # endif /* EXPOSE */ williamr@2: williamr@2: #endif /* _STLP_SSTREAM_C */