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)
37ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        __n = static_cast<streamsize>(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{
644c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    __init(const_cast<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{
734c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<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{
824c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    __init(const_cast<char *>(reinterpret_cast<const 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{
914c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<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{
1004c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, nullptr);
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::~strstreambuf()
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__pfree_)
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __pfree_(eback());
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            delete [] eback();
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::swap(strstreambuf& __rhs)
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    streambuf::swap(__rhs);
1180949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__strmode_, __rhs.__strmode_);
1190949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__alsize_, __rhs.__alsize_);
1200949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__palloc_, __rhs.__palloc_);
1210949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__pfree_, __rhs.__pfree_);
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::freeze(bool __freezefl)
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __dynamic)
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__freezefl)
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __strmode_ |= __frozen;
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __strmode_ &= ~__frozen;
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar*
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::str()
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __dynamic)
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __strmode_ |= __frozen;
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return eback();
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pcount() const
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(pptr() - pbase());
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::overflow(int_type __c)
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__c == EOF)
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return int_type(0);
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pptr() == epptr())
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0)
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return int_type(EOF);
1593e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow        size_t old_size = static_cast<size_t> ((epptr() ? epptr() : egptr()) - eback());
1603e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow        size_t new_size = max<size_t>(static_cast<size_t>(__alsize_), 2*old_size);
161b74309e3ad06106480d94f93eca0fa491743ae87Howard Hinnant        if (new_size == 0)
162b74309e3ad06106480d94f93eca0fa491743ae87Howard Hinnant            new_size = __default_alsize;
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* buf = nullptr;
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__palloc_)
1653e005bf6b2649da693d6c3109b5947890a0ffec3Marshall Clow            buf = static_cast<char*>(__palloc_(new_size));
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            buf = new char[new_size];
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (buf == nullptr)
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return int_type(EOF);
170ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        memcpy(buf, eback(), static_cast<size_t>(old_size));
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t ninp = gptr()  - eback();
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t einp = egptr() - eback();
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t nout = pptr()  - pbase();
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ptrdiff_t eout = epptr() - pbase();
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__strmode_ & __allocated)
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__pfree_)
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __pfree_(eback());
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                delete [] eback();
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(buf, buf + ninp, buf + einp);
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setp(buf + einp, buf + einp + eout);
184ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        pbump(static_cast<int>(nout));
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __strmode_ |= __allocated;
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    *pptr() = static_cast<char>(__c);
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pbump(1);
1894c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return int_type(static_cast<unsigned char>(__c));
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pbackfail(int_type __c)
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (eback() == gptr())
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return EOF;
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__c == EOF)
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        gbump(-1);
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return int_type(0);
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__strmode_ & __constant)
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (gptr()[-1] == static_cast<char>(__c))
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            gbump(-1);
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __c;
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return EOF;
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    gbump(-1);
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    *gptr() = static_cast<char>(__c);
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __c;
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::int_type
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::underflow()
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (gptr() == egptr())
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (egptr() >= pptr())
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return EOF;
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setg(eback(), gptr(), pptr());
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2254c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return int_type(static_cast<unsigned char>(*gptr()));
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which)
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    off_type __p(-1);
2329de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow    bool pos_in = (__which & ios::in) != 0;
2339de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow    bool pos_out = (__which & ios::out) != 0;
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool legal = false;
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__way)
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::beg:
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::end:
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (pos_in || pos_out)
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            legal = true;
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios::cur:
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (pos_in != pos_out)
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            legal = true;
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_in && gptr() == nullptr)
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        legal = false;
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_out && pptr() == nullptr)
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        legal = false;
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (legal)
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        off_type newoff;
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* seekhigh = epptr() ? epptr() : egptr();
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__way)
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::beg:
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = 0;
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::cur:
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = (pos_in ? gptr() : pptr()) - eback();
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case ios::end:
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            newoff = seekhigh - eback();
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        newoff += __off;
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= newoff && newoff <= seekhigh - eback())
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* newpos = eback() + newoff;
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (pos_in)
2720949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant                setg(eback(), newpos, _VSTD::max(newpos, egptr()));
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (pos_out)
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                // min(pbase, newpos), newpos, epptr()
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __off = epptr() - newpos;
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                setp(min(pbase(), newpos), epptr());
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pbump(static_cast<int>((epptr() - pbase()) - __off));
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __p = newoff;
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return pos_type(__p);
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::pos_type
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstreambuf::seekpos(pos_type __sp, ios_base::openmode __which)
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    off_type __p(-1);
2909de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow    bool pos_in = (__which & ios::in) != 0;
2919de3d4cab3ac91362e2a30406cd005cdc581eec5Marshall Clow    bool pos_out = (__which & ios::out) != 0;
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (pos_in || pos_out)
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr)))
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            off_type newoff = __sp;
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* seekhigh = epptr() ? epptr() : egptr();
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (0 <= newoff && newoff <= seekhigh - eback())
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                char* newpos = eback() + newoff;
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (pos_in)
3020949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant                    setg(eback(), newpos, _VSTD::max(newpos, egptr()));
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (pos_out)
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    // min(pbase, newpos), newpos, epptr()
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    off_type temp = epptr() - newpos;
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    setp(min(pbase(), newpos), epptr());
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    pbump(static_cast<int>((epptr() - pbase()) - temp));
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __p = newoff;
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return pos_type(__p);
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantistrstream::~istrstream()
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantostrstream::~ostrstream()
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstrstream::~strstream()
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
330