177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Implementation of the classes in header <strstream>.
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// WARNING: The classes defined in <strstream> are DEPRECATED.  This
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// header is defined in section D.7.1 of the C++ standard, and it
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// MAY BE REMOVED in a future standard revision.  You should use the
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// header <sstream> instead.
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stlport_prefix.h"
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <strstream>
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm>
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <limits>
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// strstreambuf constructor, destructor.
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(streamsize initial_capacity)
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   : _M_alloc_fun(0), _M_free_fun(0),
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner     _M_dynamic(true), _M_frozen(false), _M_constant(false) {
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t n = (sizeof(streamsize) > sizeof(size_t)) ? __STATIC_CAST(size_t, (min)(__STATIC_CAST(streamsize, (numeric_limits<size_t>::max)()),
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                                                 (max)(initial_capacity, streamsize(16))))
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                   : __STATIC_CAST(size_t, (max)(initial_capacity, streamsize(16)));
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* buf = _M_alloc(n);
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (buf) {
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    setp(buf, buf + n);
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    setg(buf, buf, buf);
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(__alloc_fn alloc_f, __free_fn free_f)
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(alloc_f), _M_free_fun(free_f),
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(true), _M_frozen(false), _M_constant(false) {
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t n = 16;
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* buf = _M_alloc(n);
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (buf) {
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    setp(buf, buf + n);
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    setg(buf, buf, buf);
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(char* get, streamsize n, char* put)
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(false) {
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(get, put, n);
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(signed char* get, streamsize n, signed char* put)
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(false) {
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(__REINTERPRET_CAST(char*,get), __REINTERPRET_CAST(char*,put), n);
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(unsigned char* get, streamsize n,
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                           unsigned char* put)
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(false) {
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(__REINTERPRET_CAST(char*,get), __REINTERPRET_CAST(char*,put), n);
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(const char* get, streamsize n)
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(true) {
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(__CONST_CAST(char*,get), 0, n);
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(const signed char* get, streamsize n)
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(true) {
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(__REINTERPRET_CAST(char*, __CONST_CAST(signed char*,get)), 0, n);
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::strstreambuf(const unsigned char* get, streamsize n)
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_alloc_fun(0), _M_free_fun(0),
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_dynamic(false), _M_frozen(false), _M_constant(true) {
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_setup(__REINTERPRET_CAST(char*, __CONST_CAST(unsigned char*,get)), 0, n);
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::~strstreambuf() {
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (_M_dynamic && !_M_frozen)
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_free(eback());
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid strstreambuf::freeze(bool frozenflag) {
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (_M_dynamic)
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_frozen = frozenflag;
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* strstreambuf::str() {
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  freeze(true);
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return eback();
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint strstreambuf::pcount() const {
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return int(pptr() ? pptr() - pbase() : 0);
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::int_type strstreambuf::overflow(int_type c) {
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (c == traits_type::eof())
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return traits_type::not_eof(c);
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Try to expand the buffer.
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (pptr() == epptr() && _M_dynamic && !_M_frozen && !_M_constant) {
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ptrdiff_t old_size = epptr() - pbase();
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ptrdiff_t new_size = (max)(2 * old_size, ptrdiff_t(1));
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    char* buf = _M_alloc(new_size);
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (buf) {
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memcpy(buf, pbase(), old_size);
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      char* old_buffer = pbase();
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      bool reposition_get = false;
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      ptrdiff_t old_get_offset;
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (gptr() != 0) {
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        reposition_get = true;
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        old_get_offset = gptr() - eback();
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setp(buf, buf + new_size);
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pbump((int)old_size);
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (reposition_get)
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        setg(buf, buf + old_get_offset, buf + (max)(old_get_offset, old_size));
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_free(old_buffer);
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (pptr() != epptr()) {
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *pptr() = traits_type::to_char_type(c);
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    pbump(1);
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return c;
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return traits_type::eof();
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::int_type strstreambuf::pbackfail(int_type c) {
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (gptr() != eback()) {
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (c == traits_type::eof()) {
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      gbump(-1);
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return traits_type::not_eof(c);
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (c == gptr()[-1]) {
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      gbump(-1);
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return c;
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (!_M_constant) {
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      gbump(-1);
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      *gptr() = traits_type::to_char_type(c);
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return c;
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return traits_type::eof();
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::int_type strstreambuf::underflow() {
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (gptr() == egptr() && pptr() && pptr() > egptr())
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    setg(eback(), gptr(), pptr());
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (gptr() != egptr())
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return (unsigned char) *gptr();
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return _Traits::eof();
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbasic_streambuf<char, char_traits<char> >*
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::setbuf(char*, streamsize) {
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return this;
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::pos_type
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::seekoff(off_type off,
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                      ios_base::seekdir dir, ios_base::openmode mode) {
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  bool do_get = false;
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  bool do_put = false;
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((mode & (ios_base::in | ios_base::out)) ==
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          (ios_base::in | ios_base::out) &&
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (dir == ios_base::beg || dir == ios_base::end))
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    do_get = do_put = true;
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (mode & ios_base::in)
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    do_get = true;
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (mode & ios_base::out)
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    do_put = true;
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // !gptr() is here because, according to D.7.1 paragraph 4, the seekable
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // area is undefined if there is no get area.
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ((!do_get && !do_put) || (do_put && !pptr()) || !gptr())
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(off_type(-1));
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* seeklow  = eback();
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char* seekhigh = epptr() ? epptr() : egptr();
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  off_type newoff;
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch(dir) {
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::beg:
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    newoff = 0;
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::end:
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    newoff = seekhigh - seeklow;
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::cur:
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    newoff = do_put ? pptr() - seeklow : gptr() - seeklow;
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  default:
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(off_type(-1));
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  off += newoff;
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (off < 0 || off > seekhigh - seeklow)
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(off_type(-1));
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (do_put) {
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (seeklow + __STATIC_CAST(ptrdiff_t, off) < pbase()) {
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setp(seeklow, epptr());
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pbump((int)off);
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else {
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setp(pbase(), epptr());
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pbump((int)(off - (pbase() - seeklow)));
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (do_get) {
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (off <= egptr() - seeklow)
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setg(seeklow, seeklow + __STATIC_CAST(ptrdiff_t, off), egptr());
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (off <= pptr() - seeklow)
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setg(seeklow, seeklow + __STATIC_CAST(ptrdiff_t, off), pptr());
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setg(seeklow, seeklow + __STATIC_CAST(ptrdiff_t, off), epptr());
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return pos_type(newoff);
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::pos_type
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf::seekpos(pos_type pos, ios_base::openmode mode) {
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return seekoff(pos - pos_type(off_type(0)), ios_base::beg, mode);
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* strstreambuf::_M_alloc(size_t n) {
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (_M_alloc_fun)
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return __STATIC_CAST(char*,_M_alloc_fun(n));
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return new char[n];
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid strstreambuf::_M_free(char* p) {
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (p) {
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (_M_free_fun)
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_free_fun(p);
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      delete[] p;
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid strstreambuf::_M_setup(char* get, char* put, streamsize n) {
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (get) {
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t N = n > 0 ? size_t(n) : n == 0 ? strlen(get) : size_t(INT_MAX);
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (put) {
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setg(get, get, get + N);
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setp(put, put + N);
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else {
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      setg(get, get, get + N);
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class istrstream
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneristrstream::istrstream(char* s)
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_istream<char, char_traits<char> >(0), _M_buf(s, 0) {
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  this->init(&_M_buf);
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneristrstream::istrstream(const char* s)
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_istream<char, char_traits<char> >(0), _M_buf(s, 0) {
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  this->init(&_M_buf);
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneristrstream::istrstream(char* s, streamsize n)
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_istream<char, char_traits<char> >(0), _M_buf(s, n) {
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  this->init(&_M_buf);
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneristrstream::istrstream(const char* s, streamsize n)
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_istream<char, char_traits<char> >(0), _M_buf(s, n) {
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  this->init(&_M_buf);
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneristrstream::~istrstream() {}
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf* istrstream::rdbuf() const {
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __CONST_CAST(strstreambuf*,&_M_buf);
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* istrstream::str() { return _M_buf.str(); }
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class ostrstream
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerostrstream::ostrstream()
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_ostream<char, char_traits<char> >(0), _M_buf() {
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  basic_ios<char, char_traits<char> >::init(&_M_buf);
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerostrstream::ostrstream(char* s, int n, ios_base::openmode mode)
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_ostream<char, char_traits<char> >(0),
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_buf(s, n, mode & ios_base::app ? s + strlen(s) : s) {
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  basic_ios<char, char_traits<char> >::init(&_M_buf);
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerostrstream::~ostrstream() {}
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf* ostrstream::rdbuf() const {
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __CONST_CAST(strstreambuf*,&_M_buf);
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid ostrstream::freeze(bool freezeflag) {
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_buf.freeze(freezeflag);
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* ostrstream::str() {
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _M_buf.str();
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint ostrstream::pcount() const {
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _M_buf.pcount();
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class strstream
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstream::strstream()
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_iostream<char, char_traits<char> >(0), _M_buf() {
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  basic_ios<char, char_traits<char> >::init(&_M_buf);
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstream::strstream(char* s, int n, ios_base::openmode mode)
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : basic_iostream<char, char_traits<char> >(0),
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_buf(s, n, mode & ios_base::app ? s + strlen(s) : s) {
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  basic_ios<char, char_traits<char> >::init(&_M_buf);
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstream::~strstream() {}
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstrstreambuf* strstream::rdbuf() const {
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __CONST_CAST(strstreambuf*,&_M_buf);
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid strstream::freeze(bool freezeflag) {
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_buf.freeze(freezeflag);
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint strstream::pcount() const {
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _M_buf.pcount();
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* strstream::str() {
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _M_buf.str();
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
392