strstream.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------ strstream.cpp -------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "strstream"
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm"
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "climits"
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cstring"
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(streamsize __alsize)
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(__dynamic),
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__alsize),
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*))
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(__dynamic),
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(__palloc),
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(__pfree)
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg)
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__n == 0)
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __n = strlen(__gnext);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__n < 0)
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __n = INT_MAX;
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__pbeg == nullptr)
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(__gnext, __gnext, __gnext + __n);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(__gnext, __gnext, __pbeg);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setp(__pbeg, __pbeg + __n);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(char* __gnext, streamsize __n, char* __pbeg)
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(),
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(__gnext, __n, __pbeg);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const char* __gnext, streamsize __n)
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(__constant),
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init((char*)__gnext, __n, nullptr);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg)
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(),
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init((char*)__gnext, __n, (char*)__pbeg);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const signed char* __gnext, streamsize __n)
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(__constant),
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init((char*)__gnext, __n, nullptr);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg)
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(),
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init((char*)__gnext, __n, (char*)__pbeg);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(const unsigned char* __gnext, streamsize __n)
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __strmode_(__constant),
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__default_alsize),
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(nullptr),
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(nullptr)
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init((char*)__gnext, __n, nullptr);
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::strstreambuf(strstreambuf&& __rhs)
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : streambuf(__rhs),
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __strmode_(__rhs.__strmode_),
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __alsize_(__rhs.__alsize_),
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __palloc_(__rhs.__palloc_),
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __pfree_(__rhs.__pfree_)
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rhs.setg(nullptr, nullptr, nullptr);
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rhs.setp(nullptr, nullptr);
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf&
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::operator=(strstreambuf&& __rhs)
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__pfree_)
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __pfree_(eback());
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            delete [] eback();
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    streambuf::operator=(__rhs);
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __strmode_ = __rhs.__strmode_;
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __alsize_ = __rhs.__alsize_;
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __palloc_ = __rhs.__palloc_;
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __pfree_ = __rhs.__pfree_;
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rhs.setg(nullptr, nullptr, nullptr);
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rhs.setp(nullptr, nullptr);
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13573d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::~strstreambuf()
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__pfree_)
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __pfree_(eback());
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            delete [] eback();
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::swap(strstreambuf& __rhs)
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    streambuf::swap(__rhs);
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _STD::swap(__strmode_, __rhs.__strmode_);
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _STD::swap(__alsize_, __rhs.__alsize_);
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _STD::swap(__palloc_, __rhs.__palloc_);
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _STD::swap(__pfree_, __rhs.__pfree_);
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::freeze(bool __freezefl)
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __dynamic)
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__freezefl)
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __strmode_ |= __frozen;
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __strmode_ &= ~__frozen;
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar*
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::str()
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __dynamic)
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __strmode_ |= __frozen;
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return eback();
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pcount() const
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(pptr() - pbase());
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::overflow(int_type __c)
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__c == EOF)
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return int_type(0);
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pptr() == epptr())
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0)
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return int_type(EOF);
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        streamsize old_size = (epptr() ? epptr() : egptr()) - eback();
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        streamsize new_size = max<streamsize>(__alsize_, 2*old_size);
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* buf = nullptr;
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__palloc_)
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            buf = static_cast<char*>(__palloc_(new_size));
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            buf = new char[new_size];
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (buf == nullptr)
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return int_type(EOF);
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        memcpy(buf, eback(), old_size);
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t ninp = gptr()  - eback();
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t einp = egptr() - eback();
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t nout = pptr()  - pbase();
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t eout = epptr() - pbase();
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__strmode_ & __allocated)
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__pfree_)
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __pfree_(eback());
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                delete [] eback();
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(buf, buf + ninp, buf + einp);
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setp(buf + einp, buf + einp + eout);
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        pbump(nout);
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __strmode_ |= __allocated;
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    *pptr() = static_cast<char>(__c);
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pbump(1);
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return int_type((unsigned char)__c);
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pbackfail(int_type __c)
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (eback() == gptr())
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return EOF;
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__c == EOF)
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        gbump(-1);
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return int_type(0);
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __constant)
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (gptr()[-1] == static_cast<char>(__c))
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            gbump(-1);
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __c;
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return EOF;
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    gbump(-1);
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    *gptr() = static_cast<char>(__c);
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __c;
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::underflow()
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (gptr() == egptr())
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (egptr() >= pptr())
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return EOF;
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(eback(), gptr(), pptr());
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return int_type((unsigned char)*gptr());
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which)
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    off_type __p(-1);
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool pos_in = __which & ios::in;
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool pos_out = __which & ios::out;
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool legal = false;
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__way)
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::beg:
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::end:
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (pos_in || pos_out)
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            legal = true;
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::cur:
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (pos_in != pos_out)
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            legal = true;
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_in && gptr() == nullptr)
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        legal = false;
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_out && pptr() == nullptr)
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        legal = false;
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (legal)
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        off_type newoff;
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* seekhigh = epptr() ? epptr() : egptr();
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__way)
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::beg:
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = 0;
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::cur:
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = (pos_in ? gptr() : pptr()) - eback();
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::end:
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = seekhigh - eback();
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        newoff += __off;
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= newoff && newoff <= seekhigh - eback())
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* newpos = eback() + newoff;
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (pos_in)
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                setg(eback(), newpos, max(newpos, egptr()));
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (pos_out)
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                // min(pbase, newpos), newpos, epptr()
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __off = epptr() - newpos;
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                setp(min(pbase(), newpos), epptr());
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pbump(static_cast<int>((epptr() - pbase()) - __off));
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __p = newoff;
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return pos_type(__p);
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekpos(pos_type __sp, ios_base::openmode __which)
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    off_type __p(-1);
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool pos_in = __which & ios::in;
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool pos_out = __which & ios::out;
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_in || pos_out)
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr)))
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            off_type newoff = __sp;
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* seekhigh = epptr() ? epptr() : egptr();
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (0 <= newoff && newoff <= seekhigh - eback())
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                char* newpos = eback() + newoff;
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (pos_in)
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    setg(eback(), newpos, max(newpos, egptr()));
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (pos_out)
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    // min(pbase, newpos), newpos, epptr()
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    off_type temp = epptr() - newpos;
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    setp(min(pbase(), newpos), epptr());
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    pbump(static_cast<int>((epptr() - pbase()) - temp));
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __p = newoff;
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return pos_type(__p);
347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantistrstream::~istrstream()
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantostrstream::~ostrstream()
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstream::~strstream()
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
362