/*************************************************************************** * * ostream.cc - Definitions for the Standard Library ostream classes * * $Id: ostream.cc 612563 2008-01-16 20:31:30Z sebor $ * *************************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * Copyright 1994-2008 Rogue Wave Software, Inc. * **************************************************************************/ _RWSTD_NAMESPACE (std) { template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::flush () { if (this->rdbuf ()) { // see LWG issue 581 const sentry __opfx (*this); if (__opfx) { int __res = 0; _TRY { __res = this->rdbuf ()->pubsync (); } _CATCH (...) { this->setstate (ios_base::badbit | _RW::__rw_rethrow); } if (-1 == __res) this->setstate (ios_base::badbit); } } return *this; } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp (pos_type __pos) { _RWSTD_ASSERT (0 != this->rdbuf ()); if (!this->fail ()) { _RWSTD_MT_GUARD (this->_C_bufmutex ()); pos_type __res = 0; _TRY { __res = this->rdbuf ()->pubseekpos (__pos, ios_base::out); } _CATCH (...) { this->setstate (ios_base::badbit | _RW::__rw_rethrow); } if (-1 == __res) this->setstate (ios_base::failbit); // lwg issue 129 } return *this; } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp (off_type __off, ios_base::seekdir __dir) { _RWSTD_ASSERT (0 != this->rdbuf ()); if (!this->fail ()) { _RWSTD_MT_GUARD (this->_C_bufmutex ()); off_type __res = 0; _TRY { __res = this->rdbuf()->pubseekoff (__off, __dir, ios_base::out); } _CATCH (...) { this->setstate (ios_base::badbit | _RW::__rw_rethrow); } if (-1 == __res) this->setstate (ios_base::failbit); // lwg issue 129 } return *this; } template _TYPENAME basic_ostream<_CharT, _Traits>::pos_type basic_ostream<_CharT, _Traits>::tellp () { _RWSTD_ASSERT (0 != this->rdbuf ()); if (!this->fail ()) { _RWSTD_MT_GUARD (this->_C_bufmutex ()); _TRY { return this->rdbuf()->pubseekoff (0, ios_base::cur, ios_base::out); } _CATCH (...) { this->setstate (ios_base::badbit | _RW::__rw_rethrow); } } return pos_type (off_type (-1)); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>:: operator<< (basic_streambuf *__sb) { if (!__sb) { this->setstate (ios_base::badbit); return *this; } ios_base::iostate __err = ios_base::goodbit; streamsize __nget = 0; // number of extracted characters if (__sb->_C_mode () & ios_base::in) { const sentry __opfx (*this); _TRY { if (__opfx) { basic_streambuf* const __rdbuf = this->rdbuf (); for (const int_type __eof = traits_type::eof (); ; ++__nget) { // determine the amount of available space in our buffer // into which it is safe (i.e., w/o calling overridden // virtuals on the buffer object or risking exceptions) // to copy the contents of the source stream buffer const streamsize __navail = streamsize (__rdbuf->epptr () - __rdbuf->pptr ()); if (__navail > 1) { // copy 2 or more characters directly into buffer const streamsize __n = __sb->sgetn (__rdbuf->pptr (), __navail); if (__n < 0) { __err = ios_base::failbit; break; } if (!__n) break; __rdbuf->pbump (__n); __nget += __n; } else { // if space for less than 2 characters is available // try to retrieve and insert a single character int_type __c = __sb->sgetc (); // 27.6.2.5.3, p7, bullet 1 if (traits_type::eq_int_type (__eof, __c)) break; __c = __rdbuf->sputc (traits_type::to_char_type(__c)); if (traits_type::eq_int_type (__eof, __c)) { __err = ios_base::failbit; break; } // 27.6.2.5.3, p7, bullet 2: extract character // only if it has been successfully inserted __sb->snextc (); } } } } _CATCH (...) { this->setstate (ios_base::badbit | _RW::__rw_rethrow); } } // 27.6.2.5.3.8 if (!__nget) __err |= ios_base::failbit; if (__err) this->setstate (__err); return *this; } #ifdef _RWSTD_NO_UNDEFINED_TEMPLATES template basic_ostream<_CharT, _Traits>::sentry:: sentry (const sentry &__rhs) : _RW::__rw_guard (0), _C_strm (__rhs._C_strm) { _RWSTD_ASSERT (!"not callable"); } template void basic_ostream<_CharT, _Traits>::sentry:: operator= (const sentry&) { _RWSTD_ASSERT (!"not callable"); } #endif // _RWSTD_NO_UNDEFINED_TEMPLATES } // namespace std