| Index: third_party/libc++/src/strstream.cpp
|
| ===================================================================
|
| --- third_party/libc++/src/strstream.cpp (revision 0)
|
| +++ third_party/libc++/src/strstream.cpp (revision 0)
|
| @@ -0,0 +1,329 @@
|
| +//===------------------------ strstream.cpp -------------------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is dual licensed under the MIT and the University of Illinois Open
|
| +// Source Licenses. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +#include "strstream"
|
| +#include "algorithm"
|
| +#include "climits"
|
| +#include "cstring"
|
| +
|
| +_LIBCPP_BEGIN_NAMESPACE_STD
|
| +
|
| +strstreambuf::strstreambuf(streamsize __alsize)
|
| + : __strmode_(__dynamic),
|
| + __alsize_(__alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*))
|
| + : __strmode_(__dynamic),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(__palloc),
|
| + __pfree_(__pfree)
|
| +{
|
| +}
|
| +
|
| +void
|
| +strstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg)
|
| +{
|
| + if (__n == 0)
|
| + __n = static_cast<streamsize>(strlen(__gnext));
|
| + else if (__n < 0)
|
| + __n = INT_MAX;
|
| + if (__pbeg == nullptr)
|
| + setg(__gnext, __gnext, __gnext + __n);
|
| + else
|
| + {
|
| + setg(__gnext, __gnext, __pbeg);
|
| + setp(__pbeg, __pbeg + __n);
|
| + }
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(char* __gnext, streamsize __n, char* __pbeg)
|
| + : __strmode_(),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init(__gnext, __n, __pbeg);
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(const char* __gnext, streamsize __n)
|
| + : __strmode_(__constant),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init((char*)__gnext, __n, nullptr);
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg)
|
| + : __strmode_(),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init((char*)__gnext, __n, (char*)__pbeg);
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(const signed char* __gnext, streamsize __n)
|
| + : __strmode_(__constant),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init((char*)__gnext, __n, nullptr);
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg)
|
| + : __strmode_(),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init((char*)__gnext, __n, (char*)__pbeg);
|
| +}
|
| +
|
| +strstreambuf::strstreambuf(const unsigned char* __gnext, streamsize __n)
|
| + : __strmode_(__constant),
|
| + __alsize_(__default_alsize),
|
| + __palloc_(nullptr),
|
| + __pfree_(nullptr)
|
| +{
|
| + __init((char*)__gnext, __n, nullptr);
|
| +}
|
| +
|
| +strstreambuf::~strstreambuf()
|
| +{
|
| + if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
|
| + {
|
| + if (__pfree_)
|
| + __pfree_(eback());
|
| + else
|
| + delete [] eback();
|
| + }
|
| +}
|
| +
|
| +void
|
| +strstreambuf::swap(strstreambuf& __rhs)
|
| +{
|
| + streambuf::swap(__rhs);
|
| + _VSTD::swap(__strmode_, __rhs.__strmode_);
|
| + _VSTD::swap(__alsize_, __rhs.__alsize_);
|
| + _VSTD::swap(__palloc_, __rhs.__palloc_);
|
| + _VSTD::swap(__pfree_, __rhs.__pfree_);
|
| +}
|
| +
|
| +void
|
| +strstreambuf::freeze(bool __freezefl)
|
| +{
|
| + if (__strmode_ & __dynamic)
|
| + {
|
| + if (__freezefl)
|
| + __strmode_ |= __frozen;
|
| + else
|
| + __strmode_ &= ~__frozen;
|
| + }
|
| +}
|
| +
|
| +char*
|
| +strstreambuf::str()
|
| +{
|
| + if (__strmode_ & __dynamic)
|
| + __strmode_ |= __frozen;
|
| + return eback();
|
| +}
|
| +
|
| +int
|
| +strstreambuf::pcount() const
|
| +{
|
| + return static_cast<int>(pptr() - pbase());
|
| +}
|
| +
|
| +strstreambuf::int_type
|
| +strstreambuf::overflow(int_type __c)
|
| +{
|
| + if (__c == EOF)
|
| + return int_type(0);
|
| + if (pptr() == epptr())
|
| + {
|
| + if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0)
|
| + return int_type(EOF);
|
| + size_t old_size = static_cast<size_t> ((epptr() ? epptr() : egptr()) - eback());
|
| + size_t new_size = max<size_t>(static_cast<size_t>(__alsize_), 2*old_size);
|
| + if (new_size == 0)
|
| + new_size = __default_alsize;
|
| + char* buf = nullptr;
|
| + if (__palloc_)
|
| + buf = static_cast<char*>(__palloc_(new_size));
|
| + else
|
| + buf = new char[new_size];
|
| + if (buf == nullptr)
|
| + return int_type(EOF);
|
| + memcpy(buf, eback(), static_cast<size_t>(old_size));
|
| + ptrdiff_t ninp = gptr() - eback();
|
| + ptrdiff_t einp = egptr() - eback();
|
| + ptrdiff_t nout = pptr() - pbase();
|
| + ptrdiff_t eout = epptr() - pbase();
|
| + if (__strmode_ & __allocated)
|
| + {
|
| + if (__pfree_)
|
| + __pfree_(eback());
|
| + else
|
| + delete [] eback();
|
| + }
|
| + setg(buf, buf + ninp, buf + einp);
|
| + setp(buf + einp, buf + einp + eout);
|
| + pbump(static_cast<int>(nout));
|
| + __strmode_ |= __allocated;
|
| + }
|
| + *pptr() = static_cast<char>(__c);
|
| + pbump(1);
|
| + return int_type((unsigned char)__c);
|
| +}
|
| +
|
| +strstreambuf::int_type
|
| +strstreambuf::pbackfail(int_type __c)
|
| +{
|
| + if (eback() == gptr())
|
| + return EOF;
|
| + if (__c == EOF)
|
| + {
|
| + gbump(-1);
|
| + return int_type(0);
|
| + }
|
| + if (__strmode_ & __constant)
|
| + {
|
| + if (gptr()[-1] == static_cast<char>(__c))
|
| + {
|
| + gbump(-1);
|
| + return __c;
|
| + }
|
| + return EOF;
|
| + }
|
| + gbump(-1);
|
| + *gptr() = static_cast<char>(__c);
|
| + return __c;
|
| +}
|
| +
|
| +strstreambuf::int_type
|
| +strstreambuf::underflow()
|
| +{
|
| + if (gptr() == egptr())
|
| + {
|
| + if (egptr() >= pptr())
|
| + return EOF;
|
| + setg(eback(), gptr(), pptr());
|
| + }
|
| + return int_type((unsigned char)*gptr());
|
| +}
|
| +
|
| +strstreambuf::pos_type
|
| +strstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which)
|
| +{
|
| + off_type __p(-1);
|
| + bool pos_in = (__which & ios::in) != 0;
|
| + bool pos_out = (__which & ios::out) != 0;
|
| + bool legal = false;
|
| + switch (__way)
|
| + {
|
| + case ios::beg:
|
| + case ios::end:
|
| + if (pos_in || pos_out)
|
| + legal = true;
|
| + break;
|
| + case ios::cur:
|
| + if (pos_in != pos_out)
|
| + legal = true;
|
| + break;
|
| + }
|
| + if (pos_in && gptr() == nullptr)
|
| + legal = false;
|
| + if (pos_out && pptr() == nullptr)
|
| + legal = false;
|
| + if (legal)
|
| + {
|
| + off_type newoff;
|
| + char* seekhigh = epptr() ? epptr() : egptr();
|
| + switch (__way)
|
| + {
|
| + case ios::beg:
|
| + newoff = 0;
|
| + break;
|
| + case ios::cur:
|
| + newoff = (pos_in ? gptr() : pptr()) - eback();
|
| + break;
|
| + case ios::end:
|
| + newoff = seekhigh - eback();
|
| + break;
|
| + }
|
| + newoff += __off;
|
| + if (0 <= newoff && newoff <= seekhigh - eback())
|
| + {
|
| + char* newpos = eback() + newoff;
|
| + if (pos_in)
|
| + setg(eback(), newpos, _VSTD::max(newpos, egptr()));
|
| + if (pos_out)
|
| + {
|
| + // min(pbase, newpos), newpos, epptr()
|
| + __off = epptr() - newpos;
|
| + setp(min(pbase(), newpos), epptr());
|
| + pbump(static_cast<int>((epptr() - pbase()) - __off));
|
| + }
|
| + __p = newoff;
|
| + }
|
| + }
|
| + return pos_type(__p);
|
| +}
|
| +
|
| +strstreambuf::pos_type
|
| +strstreambuf::seekpos(pos_type __sp, ios_base::openmode __which)
|
| +{
|
| + off_type __p(-1);
|
| + bool pos_in = (__which & ios::in) != 0;
|
| + bool pos_out = (__which & ios::out) != 0;
|
| + if (pos_in || pos_out)
|
| + {
|
| + if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr)))
|
| + {
|
| + off_type newoff = __sp;
|
| + char* seekhigh = epptr() ? epptr() : egptr();
|
| + if (0 <= newoff && newoff <= seekhigh - eback())
|
| + {
|
| + char* newpos = eback() + newoff;
|
| + if (pos_in)
|
| + setg(eback(), newpos, _VSTD::max(newpos, egptr()));
|
| + if (pos_out)
|
| + {
|
| + // min(pbase, newpos), newpos, epptr()
|
| + off_type temp = epptr() - newpos;
|
| + setp(min(pbase(), newpos), epptr());
|
| + pbump(static_cast<int>((epptr() - pbase()) - temp));
|
| + }
|
| + __p = newoff;
|
| + }
|
| + }
|
| + }
|
| + return pos_type(__p);
|
| +}
|
| +
|
| +istrstream::~istrstream()
|
| +{
|
| +}
|
| +
|
| +ostrstream::~ostrstream()
|
| +{
|
| +}
|
| +
|
| +strstream::~strstream()
|
| +{
|
| +}
|
| +
|
| +_LIBCPP_END_NAMESPACE_STD
|
|
|
| Property changes on: third_party/libc++/src/strstream.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|