epoc32/include/stdapis/stlportv5/stl/_ostream.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
/*
williamr@2
     2
 * Copyright (c) 1999
williamr@2
     3
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     4
 *
williamr@4
     5
 * Copyright (c) 1999
williamr@2
     6
 * Boris Fomitchev
williamr@2
     7
 *
williamr@2
     8
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
     9
 * or implied. Any use is at your own risk.
williamr@2
    10
 *
williamr@4
    11
 * Permission to use or copy this software for any purpose is hereby granted
williamr@2
    12
 * without fee, provided the above notices are retained on all copies.
williamr@2
    13
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    14
 * provided the above notices are retained, and a notice that the code was
williamr@2
    15
 * modified is included with the above copyright notice.
williamr@2
    16
 *
williamr@4
    17
 */
williamr@2
    18
#ifndef _STLP_OSTREAM_C
williamr@2
    19
#define _STLP_OSTREAM_C
williamr@2
    20
williamr@2
    21
#ifndef _STLP_INTERNAL_OSTREAM_H
williamr@4
    22
#  include <stl/_ostream.h>
williamr@2
    23
#endif
williamr@2
    24
williamr@2
    25
#if !defined (_STLP_INTERNAL_NUM_PUT_H)
williamr@4
    26
#  include <stl/_num_put.h>            // For basic_streambuf and iterators
williamr@2
    27
#endif
williamr@2
    28
williamr@2
    29
_STLP_BEGIN_NAMESPACE
williamr@2
    30
williamr@2
    31
//----------------------------------------------------------------------
williamr@2
    32
// Definitions of non-inline member functions.
williamr@2
    33
williamr@2
    34
// Constructor, destructor
williamr@2
    35
williamr@2
    36
template <class _CharT, class _Traits>
williamr@4
    37
basic_ostream<_CharT, _Traits>::basic_ostream(basic_streambuf<_CharT, _Traits>* __buf)
williamr@4
    38
    : basic_ios<_CharT, _Traits>() {
williamr@2
    39
  this->init(__buf);
williamr@2
    40
}
williamr@2
    41
williamr@2
    42
template <class _CharT, class _Traits>
williamr@4
    43
basic_ostream<_CharT, _Traits>::~basic_ostream()
williamr@2
    44
{}
williamr@2
    45
williamr@2
    46
// Output directly from a streambuf.
williamr@2
    47
template <class _CharT, class _Traits>
williamr@4
    48
basic_ostream<_CharT, _Traits>&
williamr@4
    49
basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<_CharT, _Traits>* __from) {
williamr@2
    50
  sentry __sentry(*this);
williamr@2
    51
  if (__sentry) {
williamr@2
    52
    if (__from) {
williamr@2
    53
      bool __any_inserted = __from->gptr() != __from->egptr()
williamr@2
    54
        ? this->_M_copy_buffered(__from, this->rdbuf())
williamr@2
    55
        : this->_M_copy_unbuffered(__from, this->rdbuf());
williamr@2
    56
      if (!__any_inserted)
williamr@2
    57
        this->setstate(ios_base::failbit);
williamr@2
    58
    }
williamr@2
    59
    else
williamr@2
    60
      this->setstate(ios_base::badbit);
williamr@2
    61
  }
williamr@2
    62
williamr@2
    63
  return *this;
williamr@2
    64
}
williamr@2
    65
williamr@2
    66
// Helper functions for the streambuf version of operator<<.  The
williamr@2
    67
// exception-handling code is complicated because exceptions thrown
williamr@2
    68
// while extracting characters are treated differently than exceptions
williamr@2
    69
// thrown while inserting characters.
williamr@2
    70
williamr@2
    71
template <class _CharT, class _Traits>
williamr@2
    72
bool basic_ostream<_CharT, _Traits>
williamr@2
    73
  ::_M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@4
    74
                     basic_streambuf<_CharT, _Traits>* __to) {
williamr@2
    75
  bool __any_inserted = false;
williamr@2
    76
williamr@2
    77
  while (__from->egptr() != __from->gptr()) {
williamr@2
    78
    const ptrdiff_t __avail = __from->egptr() - __from->gptr();
williamr@2
    79
williamr@2
    80
    streamsize __nwritten;
williamr@2
    81
    _STLP_TRY {
williamr@2
    82
      __nwritten = __to->sputn(__from->gptr(), __avail);
williamr@2
    83
      __from->gbump((int)__nwritten);
williamr@2
    84
    }
williamr@2
    85
    _STLP_CATCH_ALL {
williamr@2
    86
      this->_M_handle_exception(ios_base::badbit);
williamr@2
    87
      return __any_inserted;
williamr@2
    88
    }
williamr@2
    89
williamr@2
    90
    if (__nwritten == __avail) {
williamr@2
    91
      _STLP_TRY {
williamr@2
    92
        if (this->_S_eof(__from->sgetc()))
williamr@2
    93
          return true;
williamr@2
    94
        else
williamr@2
    95
          __any_inserted = true;
williamr@2
    96
      }
williamr@2
    97
      _STLP_CATCH_ALL {
williamr@2
    98
        this->_M_handle_exception(ios_base::failbit);
williamr@2
    99
        return false;
williamr@2
   100
      }
williamr@2
   101
    }
williamr@2
   102
    else if (__nwritten != 0)
williamr@2
   103
      return true;
williamr@2
   104
    else
williamr@2
   105
      return __any_inserted;
williamr@2
   106
  }
williamr@2
   107
williamr@2
   108
  // No characters are in the buffer, but we aren't at EOF.  Switch to
williamr@2
   109
  // unbuffered mode.
williamr@2
   110
  return __any_inserted || this->_M_copy_unbuffered(__from, __to);
williamr@2
   111
}
williamr@2
   112
williamr@4
   113
/*
williamr@4
   114
 * Helper struct (guard) to put back a character in a streambuf
williamr@4
   115
 * whenever an exception or an eof occur.
williamr@4
   116
 */
williamr@4
   117
template <class _CharT, class _Traits>
williamr@4
   118
struct _SPutBackC {
williamr@4
   119
  typedef basic_streambuf<_CharT, _Traits> _StreamBuf;
williamr@4
   120
  typedef typename _StreamBuf::int_type int_type;
williamr@4
   121
  _SPutBackC(_StreamBuf *pfrom)
williamr@4
   122
    : __pfrom(pfrom), __c(0), __do_guard(false) {}
williamr@4
   123
  ~_SPutBackC() {
williamr@4
   124
    if (__do_guard) {
williamr@4
   125
      __pfrom->sputbackc(_Traits::to_char_type(__c));
williamr@4
   126
    }
williamr@4
   127
  }
williamr@4
   128
williamr@4
   129
  void guard(int_type c) {
williamr@4
   130
    __c = c;
williamr@4
   131
    __do_guard = true;
williamr@4
   132
  }
williamr@4
   133
  void release() {
williamr@4
   134
    __do_guard = false;
williamr@4
   135
  }
williamr@4
   136
williamr@4
   137
private:
williamr@4
   138
  _StreamBuf *__pfrom;
williamr@4
   139
  int_type __c;
williamr@4
   140
  bool __do_guard;
williamr@4
   141
};
williamr@4
   142
williamr@2
   143
template <class _CharT, class _Traits>
williamr@2
   144
bool basic_ostream<_CharT, _Traits>
williamr@2
   145
  ::_M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@4
   146
                       basic_streambuf<_CharT, _Traits>* __to) {
williamr@4
   147
  typedef _SPutBackC<_CharT, _Traits> _SPutBackCGuard;
williamr@2
   148
  bool __any_inserted = false;
williamr@4
   149
  int_type __c;
williamr@2
   150
williamr@4
   151
  _STLP_TRY {
williamr@4
   152
    _SPutBackCGuard __cguard(__from);
williamr@4
   153
    for (;;) {
williamr@2
   154
      _STLP_TRY {
williamr@4
   155
        __c = __from->sbumpc();
williamr@2
   156
      }
williamr@2
   157
      _STLP_CATCH_ALL {
williamr@4
   158
        this->_M_handle_exception(ios_base::failbit);
williamr@2
   159
        return __any_inserted;
williamr@2
   160
      }
williamr@2
   161
williamr@4
   162
      if ( this->_S_eof(__c) )
williamr@4
   163
        return __any_inserted;
williamr@2
   164
williamr@4
   165
      __cguard.guard(__c);
williamr@4
   166
      if ( this->_S_eof( __to->sputc(_Traits::to_char_type(__c)) ) ) {
williamr@2
   167
        return __any_inserted;
williamr@2
   168
      }
williamr@2
   169
williamr@4
   170
      __cguard.release();
williamr@4
   171
      __any_inserted = true;
williamr@2
   172
    }
williamr@2
   173
  }
williamr@4
   174
  _STLP_CATCH_ALL {
williamr@4
   175
    this->_M_handle_exception(ios_base::badbit);
williamr@4
   176
    return __any_inserted;
williamr@4
   177
  }
williamr@2
   178
}
williamr@2
   179
williamr@4
   180
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   181
williamr@2
   182
// Helper function for numeric output.
williamr@2
   183
template <class _CharT, class _Traits, class _Number>
williamr@2
   184
basic_ostream<_CharT, _Traits>&  _STLP_CALL
williamr@4
   185
__put_num(basic_ostream<_CharT, _Traits>& __os, _Number __x) {
williamr@2
   186
  typedef typename basic_ostream<_CharT, _Traits>::sentry _Sentry;
williamr@2
   187
  _Sentry __sentry(__os);
williamr@2
   188
  bool __failed = true;
williamr@2
   189
williamr@2
   190
  if (__sentry) {
williamr@2
   191
    _STLP_TRY {
williamr@4
   192
      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > _NumPut;
williamr@4
   193
      __failed = (use_facet<_NumPut>(__os.getloc())).put(ostreambuf_iterator<_CharT, _Traits>(__os.rdbuf()),
williamr@2
   194
                                                         __os, __os.fill(),
williamr@2
   195
                                                         __x).failed();
williamr@2
   196
    }
williamr@2
   197
    _STLP_CATCH_ALL {
williamr@2
   198
      __os._M_handle_exception(ios_base::badbit);
williamr@2
   199
    }
williamr@2
   200
  }
williamr@2
   201
  if (__failed)
williamr@4
   202
    __os.setstate(ios_base::badbit);
williamr@2
   203
  return __os;
williamr@2
   204
}
williamr@2
   205
williamr@4
   206
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   207
williamr@4
   208
/*
williamr@4
   209
 * In the following operators we try to limit code bloat by limiting the
williamr@4
   210
 * number of __put_num instanciations.
williamr@4
   211
 */
williamr@4
   212
template <class _CharT, class _Traits>
williamr@4
   213
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __x) {
williamr@4
   214
  _STLP_STATIC_ASSERT( sizeof(short) <= sizeof(long) )
williamr@4
   215
  long __tmp = ((this->flags() & _Basic_ios::basefield) != ios_base::dec) ?
williamr@4
   216
                  __STATIC_CAST(long, __STATIC_CAST(unsigned short, __x)): __x;
williamr@4
   217
  return _STLP_PRIV __put_num(*this, __tmp);
williamr@4
   218
}
williamr@2
   219
williamr@2
   220
template <class _CharT, class _Traits>
williamr@4
   221
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __x) {
williamr@4
   222
  _STLP_STATIC_ASSERT( sizeof(unsigned short) <= sizeof(unsigned long) )
williamr@4
   223
  return _STLP_PRIV __put_num(*this, __STATIC_CAST(unsigned long,__x));
williamr@4
   224
}
williamr@4
   225
williamr@4
   226
template <class _CharT, class _Traits>
williamr@4
   227
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __x) {
williamr@4
   228
  _STLP_STATIC_ASSERT( sizeof(int) <= sizeof(long) )
williamr@4
   229
  long __tmp = ((this->flags() & _Basic_ios::basefield) != ios_base::dec) ?
williamr@4
   230
                  __STATIC_CAST(long, __STATIC_CAST(unsigned int, __x)): __x;
williamr@4
   231
  return _STLP_PRIV __put_num(*this, __tmp);
williamr@4
   232
}
williamr@4
   233
williamr@4
   234
template <class _CharT, class _Traits>
williamr@4
   235
#if defined (_WIN64) || !defined (_STLP_MSVC) || (_STLP_MSVC < 1300)
williamr@4
   236
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __x) {
williamr@4
   237
  _STLP_STATIC_ASSERT( sizeof(unsigned int) <= sizeof(unsigned long) )
williamr@4
   238
#else
williamr@4
   239
/* We define this operator with size_t rather than unsigned int to avoid
williamr@4
   240
 * 64 bits warning.
williamr@4
   241
 */
williamr@4
   242
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(size_t __x) {
williamr@4
   243
  _STLP_STATIC_ASSERT( sizeof(size_t) <= sizeof(unsigned long) )
williamr@4
   244
#endif
williamr@4
   245
  return _STLP_PRIV __put_num(*this,  __STATIC_CAST(unsigned long,__x));
williamr@4
   246
}
williamr@4
   247
williamr@4
   248
template <class _CharT, class _Traits>
williamr@4
   249
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __x)
williamr@4
   250
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   251
williamr@4
   252
template <class _CharT, class _Traits>
williamr@4
   253
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __x)
williamr@4
   254
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   255
williamr@4
   256
#ifdef _STLP_LONG_LONG
williamr@4
   257
template <class _CharT, class _Traits>
williamr@4
   258
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<< (_STLP_LONG_LONG __x)
williamr@4
   259
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   260
williamr@4
   261
template <class _CharT, class _Traits>
williamr@4
   262
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<< (unsigned _STLP_LONG_LONG __x)
williamr@4
   263
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   264
#endif
williamr@4
   265
williamr@4
   266
template <class _CharT, class _Traits>
williamr@4
   267
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __x)
williamr@4
   268
{ return _STLP_PRIV __put_num(*this,  __STATIC_CAST(double,__x)); }
williamr@4
   269
williamr@4
   270
template <class _CharT, class _Traits>
williamr@4
   271
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __x)
williamr@4
   272
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   273
williamr@4
   274
#ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   275
template <class _CharT, class _Traits>
williamr@4
   276
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __x)
williamr@4
   277
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   278
#endif
williamr@4
   279
williamr@4
   280
template <class _CharT, class _Traits>
williamr@4
   281
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __x)
williamr@4
   282
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   283
williamr@4
   284
#ifndef _STLP_NO_BOOL
williamr@4
   285
template <class _CharT, class _Traits>
williamr@4
   286
basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __x)
williamr@4
   287
{ return _STLP_PRIV __put_num(*this,  __x); }
williamr@4
   288
#endif
williamr@4
   289
williamr@4
   290
template <class _CharT, class _Traits>
williamr@4
   291
void basic_ostream<_CharT, _Traits>::_M_put_char(_CharT __c) {
williamr@2
   292
  sentry __sentry(*this);
williamr@2
   293
  if (__sentry) {
williamr@2
   294
    bool __failed = true;
williamr@2
   295
    _STLP_TRY {
williamr@2
   296
      streamsize __npad = this->width() > 0 ? this->width() - 1 : 0;
williamr@2
   297
      //      if (__npad <= 1)
williamr@2
   298
      if (__npad == 0)
williamr@2
   299
        __failed = this->_S_eof(this->rdbuf()->sputc(__c));
williamr@2
   300
      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
williamr@2
   301
        __failed = this->_S_eof(this->rdbuf()->sputc(__c));
williamr@4
   302
        __failed = __failed ||
williamr@2
   303
                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   304
      }
williamr@2
   305
      else {
williamr@2
   306
        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   307
        __failed = __failed || this->_S_eof(this->rdbuf()->sputc(__c));
williamr@2
   308
      }
williamr@2
   309
williamr@2
   310
      this->width(0);
williamr@2
   311
    }
williamr@2
   312
    _STLP_CATCH_ALL {
williamr@2
   313
      this->_M_handle_exception(ios_base::badbit);
williamr@2
   314
    }
williamr@2
   315
williamr@2
   316
    if (__failed)
williamr@2
   317
      this->setstate(ios_base::badbit);
williamr@2
   318
  }
williamr@2
   319
}
williamr@2
   320
williamr@2
   321
template <class _CharT, class _Traits>
williamr@4
   322
void basic_ostream<_CharT, _Traits>::_M_put_nowiden(const _CharT* __s) {
williamr@2
   323
  sentry __sentry(*this);
williamr@2
   324
  if (__sentry) {
williamr@2
   325
    bool __failed = true;
williamr@2
   326
    streamsize __n = _Traits::length(__s);
williamr@2
   327
    streamsize __npad = this->width() > __n ? this->width() - __n : 0;
williamr@2
   328
williamr@2
   329
    _STLP_TRY {
williamr@2
   330
      if (__npad == 0)
williamr@2
   331
        __failed = this->rdbuf()->sputn(__s, __n) != __n;
williamr@2
   332
      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
williamr@2
   333
        __failed = this->rdbuf()->sputn(__s, __n) != __n;
williamr@4
   334
        __failed = __failed ||
williamr@2
   335
                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   336
      }
williamr@2
   337
      else {
williamr@2
   338
        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   339
        __failed = __failed || this->rdbuf()->sputn(__s, __n) != __n;
williamr@2
   340
      }
williamr@2
   341
williamr@2
   342
      this->width(0);
williamr@2
   343
    }
williamr@2
   344
    _STLP_CATCH_ALL {
williamr@2
   345
      this->_M_handle_exception(ios_base::badbit);
williamr@2
   346
    }
williamr@2
   347
williamr@2
   348
    if (__failed)
williamr@2
   349
      this->setstate(ios_base::failbit);
williamr@2
   350
  }
williamr@2
   351
}
williamr@2
   352
williamr@2
   353
template <class _CharT, class _Traits>
williamr@4
   354
void basic_ostream<_CharT, _Traits>::_M_put_widen(const char* __s) {
williamr@2
   355
  sentry __sentry(*this);
williamr@2
   356
  if (__sentry) {
williamr@2
   357
    bool __failed = true;
williamr@2
   358
    streamsize __n = char_traits<char>::length(__s);
williamr@2
   359
    streamsize __npad = this->width() > __n ? this->width() - __n : 0;
williamr@2
   360
williamr@2
   361
    _STLP_TRY {
williamr@2
   362
      if (__npad == 0)
williamr@2
   363
        __failed = !this->_M_put_widen_aux(__s, __n);
williamr@2
   364
      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
williamr@2
   365
        __failed = !this->_M_put_widen_aux(__s, __n);
williamr@4
   366
        __failed = __failed ||
williamr@2
   367
                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   368
      }
williamr@2
   369
      else {
williamr@2
   370
        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
williamr@2
   371
        __failed = __failed || !this->_M_put_widen_aux(__s, __n);
williamr@2
   372
      }
williamr@2
   373
williamr@2
   374
      this->width(0);
williamr@2
   375
    }
williamr@2
   376
    _STLP_CATCH_ALL {
williamr@2
   377
      this->_M_handle_exception(ios_base::badbit);
williamr@2
   378
    }
williamr@2
   379
williamr@2
   380
    if (__failed)
williamr@2
   381
      this->setstate(ios_base::failbit);
williamr@2
   382
  }
williamr@2
   383
}
williamr@2
   384
williamr@2
   385
template <class _CharT, class _Traits>
williamr@2
   386
bool basic_ostream<_CharT, _Traits>::_M_put_widen_aux(const char* __s,
williamr@4
   387
                                                      streamsize __n) {
williamr@2
   388
  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
williamr@2
   389
williamr@2
   390
  for ( ; __n > 0 ; --__n)
williamr@2
   391
    if (this->_S_eof(__buf->sputc(this->widen(*__s++))))
williamr@2
   392
      return false;
williamr@2
   393
  return true;
williamr@2
   394
}
williamr@2
   395
williamr@2
   396
// Unformatted output of a single character.
williamr@2
   397
template <class _CharT, class _Traits>
williamr@4
   398
basic_ostream<_CharT, _Traits>&
williamr@4
   399
basic_ostream<_CharT, _Traits>::put(char_type __c) {
williamr@2
   400
  sentry __sentry(*this);
williamr@2
   401
  bool __failed = true;
williamr@2
   402
williamr@2
   403
  if (__sentry) {
williamr@2
   404
    _STLP_TRY {
williamr@2
   405
      __failed = this->_S_eof(this->rdbuf()->sputc(__c));
williamr@2
   406
    }
williamr@2
   407
    _STLP_CATCH_ALL {
williamr@2
   408
      this->_M_handle_exception(ios_base::badbit);
williamr@2
   409
    }
williamr@2
   410
  }
williamr@2
   411
williamr@2
   412
  if (__failed)
williamr@2
   413
    this->setstate(ios_base::badbit);
williamr@2
   414
williamr@2
   415
  return *this;
williamr@2
   416
}
williamr@2
   417
williamr@2
   418
// Unformatted output of a single character.
williamr@2
   419
template <class _CharT, class _Traits>
williamr@4
   420
basic_ostream<_CharT, _Traits>&
williamr@4
   421
basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) {
williamr@2
   422
  sentry __sentry(*this);
williamr@2
   423
  bool __failed = true;
williamr@2
   424
williamr@2
   425
  if (__sentry) {
williamr@2
   426
    _STLP_TRY {
williamr@2
   427
      __failed = this->rdbuf()->sputn(__s, __n) != __n;
williamr@2
   428
    }
williamr@2
   429
    _STLP_CATCH_ALL {
williamr@2
   430
      this->_M_handle_exception(ios_base::badbit);
williamr@2
   431
    }
williamr@2
   432
  }
williamr@2
   433
williamr@2
   434
  if (__failed)
williamr@2
   435
    this->setstate(ios_base::badbit);
williamr@2
   436
williamr@2
   437
  return *this;
williamr@2
   438
}
williamr@2
   439
williamr@2
   440
_STLP_END_NAMESPACE
williamr@2
   441
williamr@4
   442
#endif /* _STLP_OSTREAM_C */
williamr@2
   443
williamr@4
   444
// Local Variables:
williamr@4
   445
// mode:C++
williamr@4
   446
// End: