mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
cf93ecbbb2
The whole repository is now buildable with GNU Make Landlock sandboxing. This proves that no Makefile targets exist which touch files other than their declared prerequisites. In order to do this, we had to: 1. Stop code morphing GCC output in package.com and instead run a newly introduced FIXUPOBJ.COM command after GCC invocations. 2. Disable all the crumby Python unit tests that do things like create files in the current directory, or rename() files between folders. This ended up being a lot of tests, but most of them are still ok. 3. Introduce an .UNSANDBOXED variable to GNU Make to disable Landlock. We currently only do this for things like `make tags`. 4. This change deletes some GNU Make code that was preventing the execve() optimization from working. This means it should no longer be necessary in most cases for command invocations to be indirected through the cocmd interpreter. 5. Missing dependencies had to be declared in certain places, in cases where they couldn't be automatically determined by MKDEPS.COM 6. The libcxx header situation has finally been tamed. One of the things that makes this difficult is MKDEPS.COM only wants to consider the first 64kb of a file, in order to go fast. But libcxx likes to have #include lines buried after huge documentation. 7. An .UNVEIL variable has been introduced to GNU Make just in case we ever wish to explicitly specify additional things that need to be whitelisted which aren't strictly prerequisites. This works in a manner similar to the recently introduced .EXTRA_PREREQS feature. There's now a new build/bootstrap/make.com prebuilt binary available. It should no longer be possible to write invalid Makefile code.
985 lines
33 KiB
C++
985 lines
33 KiB
C++
// -*- C++ -*-
|
|
//===--------------------------- sstream ----------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_SSTREAM
|
|
#define _LIBCPP_SSTREAM
|
|
|
|
#include "third_party/libcxx/__config"
|
|
#include "third_party/libcxx/ostream"
|
|
#include "third_party/libcxx/istream"
|
|
#include "third_party/libcxx/string"
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_PUSH_MACROS
|
|
#include "third_party/libcxx/__undef_macros"
|
|
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
/*
|
|
sstream synopsis
|
|
|
|
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
|
class basic_stringbuf
|
|
: public basic_streambuf<charT, traits>
|
|
{
|
|
public:
|
|
typedef charT char_type;
|
|
typedef traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef Allocator allocator_type;
|
|
|
|
// 27.8.1.1 Constructors:
|
|
explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out);
|
|
explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str,
|
|
ios_base::openmode which = ios_base::in | ios_base::out);
|
|
basic_stringbuf(basic_stringbuf&& rhs);
|
|
|
|
// 27.8.1.2 Assign and swap:
|
|
basic_stringbuf& operator=(basic_stringbuf&& rhs);
|
|
void swap(basic_stringbuf& rhs);
|
|
|
|
// 27.8.1.3 Get and set:
|
|
basic_string<char_type, traits_type, allocator_type> str() const;
|
|
void str(const basic_string<char_type, traits_type, allocator_type>& s);
|
|
|
|
protected:
|
|
// 27.8.1.4 Overridden virtual functions:
|
|
virtual int_type underflow();
|
|
virtual int_type pbackfail(int_type c = traits_type::eof());
|
|
virtual int_type overflow (int_type c = traits_type::eof());
|
|
virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize);
|
|
virtual pos_type seekoff(off_type off, ios_base::seekdir way,
|
|
ios_base::openmode which = ios_base::in | ios_base::out);
|
|
virtual pos_type seekpos(pos_type sp,
|
|
ios_base::openmode which = ios_base::in | ios_base::out);
|
|
};
|
|
|
|
template <class charT, class traits, class Allocator>
|
|
void swap(basic_stringbuf<charT, traits, Allocator>& x,
|
|
basic_stringbuf<charT, traits, Allocator>& y);
|
|
|
|
typedef basic_stringbuf<char> stringbuf;
|
|
typedef basic_stringbuf<wchar_t> wstringbuf;
|
|
|
|
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
|
class basic_istringstream
|
|
: public basic_istream<charT, traits>
|
|
{
|
|
public:
|
|
typedef charT char_type;
|
|
typedef traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef Allocator allocator_type;
|
|
|
|
// 27.8.2.1 Constructors:
|
|
explicit basic_istringstream(ios_base::openmode which = ios_base::in);
|
|
explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str,
|
|
ios_base::openmode which = ios_base::in);
|
|
basic_istringstream(basic_istringstream&& rhs);
|
|
|
|
// 27.8.2.2 Assign and swap:
|
|
basic_istringstream& operator=(basic_istringstream&& rhs);
|
|
void swap(basic_istringstream& rhs);
|
|
|
|
// 27.8.2.3 Members:
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
basic_string<char_type, traits_type, allocator_type> str() const;
|
|
void str(const basic_string<char_type, traits_type, allocator_type>& s);
|
|
};
|
|
|
|
template <class charT, class traits, class Allocator>
|
|
void swap(basic_istringstream<charT, traits, Allocator>& x,
|
|
basic_istringstream<charT, traits, Allocator>& y);
|
|
|
|
typedef basic_istringstream<char> istringstream;
|
|
typedef basic_istringstream<wchar_t> wistringstream;
|
|
|
|
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
|
class basic_ostringstream
|
|
: public basic_ostream<charT, traits>
|
|
{
|
|
public:
|
|
// types:
|
|
typedef charT char_type;
|
|
typedef traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef Allocator allocator_type;
|
|
|
|
// 27.8.3.1 Constructors/destructor:
|
|
explicit basic_ostringstream(ios_base::openmode which = ios_base::out);
|
|
explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str,
|
|
ios_base::openmode which = ios_base::out);
|
|
basic_ostringstream(basic_ostringstream&& rhs);
|
|
|
|
// 27.8.3.2 Assign/swap:
|
|
basic_ostringstream& operator=(basic_ostringstream&& rhs);
|
|
void swap(basic_ostringstream& rhs);
|
|
|
|
// 27.8.3.3 Members:
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
basic_string<char_type, traits_type, allocator_type> str() const;
|
|
void str(const basic_string<char_type, traits_type, allocator_type>& s);
|
|
};
|
|
|
|
template <class charT, class traits, class Allocator>
|
|
void swap(basic_ostringstream<charT, traits, Allocator>& x,
|
|
basic_ostringstream<charT, traits, Allocator>& y);
|
|
|
|
typedef basic_ostringstream<char> ostringstream;
|
|
typedef basic_ostringstream<wchar_t> wostringstream;
|
|
|
|
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
|
class basic_stringstream
|
|
: public basic_iostream<charT, traits>
|
|
{
|
|
public:
|
|
// types:
|
|
typedef charT char_type;
|
|
typedef traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef Allocator allocator_type;
|
|
|
|
// constructors/destructor
|
|
explicit basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in);
|
|
explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str,
|
|
ios_base::openmode which = ios_base::out|ios_base::in);
|
|
basic_stringstream(basic_stringstream&& rhs);
|
|
|
|
// 27.8.5.1 Assign/swap:
|
|
basic_stringstream& operator=(basic_stringstream&& rhs);
|
|
void swap(basic_stringstream& rhs);
|
|
|
|
// Members:
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
basic_string<char_type, traits_type, allocator_type> str() const;
|
|
void str(const basic_string<char_type, traits_type, allocator_type>& str);
|
|
};
|
|
|
|
template <class charT, class traits, class Allocator>
|
|
void swap(basic_stringstream<charT, traits, Allocator>& x,
|
|
basic_stringstream<charT, traits, Allocator>& y);
|
|
|
|
typedef basic_stringstream<char> stringstream;
|
|
typedef basic_stringstream<wchar_t> wstringstream;
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
// basic_stringbuf
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
class _LIBCPP_TEMPLATE_VIS basic_stringbuf
|
|
: public basic_streambuf<_CharT, _Traits>
|
|
{
|
|
public:
|
|
typedef _CharT char_type;
|
|
typedef _Traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef _Allocator allocator_type;
|
|
|
|
typedef basic_string<char_type, traits_type, allocator_type> string_type;
|
|
|
|
private:
|
|
|
|
string_type __str_;
|
|
mutable char_type* __hm_;
|
|
ios_base::openmode __mode_;
|
|
|
|
public:
|
|
// 27.8.1.1 Constructors:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_stringbuf(const string_type& __s,
|
|
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
basic_stringbuf(basic_stringbuf&& __rhs);
|
|
|
|
// 27.8.1.2 Assign and swap:
|
|
basic_stringbuf& operator=(basic_stringbuf&& __rhs);
|
|
#endif
|
|
void swap(basic_stringbuf& __rhs);
|
|
|
|
// 27.8.1.3 Get and set:
|
|
string_type str() const;
|
|
void str(const string_type& __s);
|
|
|
|
protected:
|
|
// 27.8.1.4 Overridden virtual functions:
|
|
virtual int_type underflow();
|
|
virtual int_type pbackfail(int_type __c = traits_type::eof());
|
|
virtual int_type overflow (int_type __c = traits_type::eof());
|
|
virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
|
|
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
virtual pos_type seekpos(pos_type __sp,
|
|
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
};
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode __wch)
|
|
: __hm_(0),
|
|
__mode_(__wch)
|
|
{
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(const string_type& __s,
|
|
ios_base::openmode __wch)
|
|
: __str_(__s.get_allocator()),
|
|
__hm_(0),
|
|
__mode_(__wch)
|
|
{
|
|
str(__s);
|
|
}
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs)
|
|
: __mode_(__rhs.__mode_)
|
|
{
|
|
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
|
ptrdiff_t __binp = -1;
|
|
ptrdiff_t __ninp = -1;
|
|
ptrdiff_t __einp = -1;
|
|
if (__rhs.eback() != nullptr)
|
|
{
|
|
__binp = __rhs.eback() - __p;
|
|
__ninp = __rhs.gptr() - __p;
|
|
__einp = __rhs.egptr() - __p;
|
|
}
|
|
ptrdiff_t __bout = -1;
|
|
ptrdiff_t __nout = -1;
|
|
ptrdiff_t __eout = -1;
|
|
if (__rhs.pbase() != nullptr)
|
|
{
|
|
__bout = __rhs.pbase() - __p;
|
|
__nout = __rhs.pptr() - __p;
|
|
__eout = __rhs.epptr() - __p;
|
|
}
|
|
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
|
__str_ = _VSTD::move(__rhs.__str_);
|
|
__p = const_cast<char_type*>(__str_.data());
|
|
if (__binp != -1)
|
|
this->setg(__p + __binp, __p + __ninp, __p + __einp);
|
|
if (__bout != -1)
|
|
{
|
|
this->setp(__p + __bout, __p + __eout);
|
|
this->__pbump(__nout);
|
|
}
|
|
__hm_ = __hm == -1 ? nullptr : __p + __hm;
|
|
__p = const_cast<char_type*>(__rhs.__str_.data());
|
|
__rhs.setg(__p, __p, __p);
|
|
__rhs.setp(__p, __p);
|
|
__rhs.__hm_ = __p;
|
|
this->pubimbue(__rhs.getloc());
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>&
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs)
|
|
{
|
|
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
|
ptrdiff_t __binp = -1;
|
|
ptrdiff_t __ninp = -1;
|
|
ptrdiff_t __einp = -1;
|
|
if (__rhs.eback() != nullptr)
|
|
{
|
|
__binp = __rhs.eback() - __p;
|
|
__ninp = __rhs.gptr() - __p;
|
|
__einp = __rhs.egptr() - __p;
|
|
}
|
|
ptrdiff_t __bout = -1;
|
|
ptrdiff_t __nout = -1;
|
|
ptrdiff_t __eout = -1;
|
|
if (__rhs.pbase() != nullptr)
|
|
{
|
|
__bout = __rhs.pbase() - __p;
|
|
__nout = __rhs.pptr() - __p;
|
|
__eout = __rhs.epptr() - __p;
|
|
}
|
|
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
|
__str_ = _VSTD::move(__rhs.__str_);
|
|
__p = const_cast<char_type*>(__str_.data());
|
|
if (__binp != -1)
|
|
this->setg(__p + __binp, __p + __ninp, __p + __einp);
|
|
else
|
|
this->setg(nullptr, nullptr, nullptr);
|
|
if (__bout != -1)
|
|
{
|
|
this->setp(__p + __bout, __p + __eout);
|
|
this->__pbump(__nout);
|
|
}
|
|
else
|
|
this->setp(nullptr, nullptr);
|
|
|
|
__hm_ = __hm == -1 ? nullptr : __p + __hm;
|
|
__mode_ = __rhs.__mode_;
|
|
__p = const_cast<char_type*>(__rhs.__str_.data());
|
|
__rhs.setg(__p, __p, __p);
|
|
__rhs.setp(__p, __p);
|
|
__rhs.__hm_ = __p;
|
|
this->pubimbue(__rhs.getloc());
|
|
return *this;
|
|
}
|
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs)
|
|
{
|
|
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
|
ptrdiff_t __rbinp = -1;
|
|
ptrdiff_t __rninp = -1;
|
|
ptrdiff_t __reinp = -1;
|
|
if (__rhs.eback() != nullptr)
|
|
{
|
|
__rbinp = __rhs.eback() - __p;
|
|
__rninp = __rhs.gptr() - __p;
|
|
__reinp = __rhs.egptr() - __p;
|
|
}
|
|
ptrdiff_t __rbout = -1;
|
|
ptrdiff_t __rnout = -1;
|
|
ptrdiff_t __reout = -1;
|
|
if (__rhs.pbase() != nullptr)
|
|
{
|
|
__rbout = __rhs.pbase() - __p;
|
|
__rnout = __rhs.pptr() - __p;
|
|
__reout = __rhs.epptr() - __p;
|
|
}
|
|
ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
|
__p = const_cast<char_type*>(__str_.data());
|
|
ptrdiff_t __lbinp = -1;
|
|
ptrdiff_t __lninp = -1;
|
|
ptrdiff_t __leinp = -1;
|
|
if (this->eback() != nullptr)
|
|
{
|
|
__lbinp = this->eback() - __p;
|
|
__lninp = this->gptr() - __p;
|
|
__leinp = this->egptr() - __p;
|
|
}
|
|
ptrdiff_t __lbout = -1;
|
|
ptrdiff_t __lnout = -1;
|
|
ptrdiff_t __leout = -1;
|
|
if (this->pbase() != nullptr)
|
|
{
|
|
__lbout = this->pbase() - __p;
|
|
__lnout = this->pptr() - __p;
|
|
__leout = this->epptr() - __p;
|
|
}
|
|
ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p;
|
|
_VSTD::swap(__mode_, __rhs.__mode_);
|
|
__str_.swap(__rhs.__str_);
|
|
__p = const_cast<char_type*>(__str_.data());
|
|
if (__rbinp != -1)
|
|
this->setg(__p + __rbinp, __p + __rninp, __p + __reinp);
|
|
else
|
|
this->setg(nullptr, nullptr, nullptr);
|
|
if (__rbout != -1)
|
|
{
|
|
this->setp(__p + __rbout, __p + __reout);
|
|
this->__pbump(__rnout);
|
|
}
|
|
else
|
|
this->setp(nullptr, nullptr);
|
|
__hm_ = __rhm == -1 ? nullptr : __p + __rhm;
|
|
__p = const_cast<char_type*>(__rhs.__str_.data());
|
|
if (__lbinp != -1)
|
|
__rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp);
|
|
else
|
|
__rhs.setg(nullptr, nullptr, nullptr);
|
|
if (__lbout != -1)
|
|
{
|
|
__rhs.setp(__p + __lbout, __p + __leout);
|
|
__rhs.__pbump(__lnout);
|
|
}
|
|
else
|
|
__rhs.setp(nullptr, nullptr);
|
|
__rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm;
|
|
locale __tl = __rhs.getloc();
|
|
__rhs.pubimbue(this->getloc());
|
|
this->pubimbue(__tl);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x,
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>& __y)
|
|
{
|
|
__x.swap(__y);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_string<_CharT, _Traits, _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::str() const
|
|
{
|
|
if (__mode_ & ios_base::out)
|
|
{
|
|
if (__hm_ < this->pptr())
|
|
__hm_ = this->pptr();
|
|
return string_type(this->pbase(), __hm_, __str_.get_allocator());
|
|
}
|
|
else if (__mode_ & ios_base::in)
|
|
return string_type(this->eback(), this->egptr(), __str_.get_allocator());
|
|
return string_type(__str_.get_allocator());
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
|
{
|
|
__str_ = __s;
|
|
__hm_ = 0;
|
|
if (__mode_ & ios_base::in)
|
|
{
|
|
__hm_ = const_cast<char_type*>(__str_.data()) + __str_.size();
|
|
this->setg(const_cast<char_type*>(__str_.data()),
|
|
const_cast<char_type*>(__str_.data()),
|
|
__hm_);
|
|
}
|
|
if (__mode_ & ios_base::out)
|
|
{
|
|
typename string_type::size_type __sz = __str_.size();
|
|
__hm_ = const_cast<char_type*>(__str_.data()) + __sz;
|
|
__str_.resize(__str_.capacity());
|
|
this->setp(const_cast<char_type*>(__str_.data()),
|
|
const_cast<char_type*>(__str_.data()) + __str_.size());
|
|
if (__mode_ & (ios_base::app | ios_base::ate))
|
|
{
|
|
while (__sz > INT_MAX)
|
|
{
|
|
this->pbump(INT_MAX);
|
|
__sz -= INT_MAX;
|
|
}
|
|
if (__sz > 0)
|
|
this->pbump(__sz);
|
|
}
|
|
}
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::underflow()
|
|
{
|
|
if (__hm_ < this->pptr())
|
|
__hm_ = this->pptr();
|
|
if (__mode_ & ios_base::in)
|
|
{
|
|
if (this->egptr() < __hm_)
|
|
this->setg(this->eback(), this->gptr(), __hm_);
|
|
if (this->gptr() < this->egptr())
|
|
return traits_type::to_int_type(*this->gptr());
|
|
}
|
|
return traits_type::eof();
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c)
|
|
{
|
|
if (__hm_ < this->pptr())
|
|
__hm_ = this->pptr();
|
|
if (this->eback() < this->gptr())
|
|
{
|
|
if (traits_type::eq_int_type(__c, traits_type::eof()))
|
|
{
|
|
this->setg(this->eback(), this->gptr()-1, __hm_);
|
|
return traits_type::not_eof(__c);
|
|
}
|
|
if ((__mode_ & ios_base::out) ||
|
|
traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
|
|
{
|
|
this->setg(this->eback(), this->gptr()-1, __hm_);
|
|
*this->gptr() = traits_type::to_char_type(__c);
|
|
return __c;
|
|
}
|
|
}
|
|
return traits_type::eof();
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c)
|
|
{
|
|
if (!traits_type::eq_int_type(__c, traits_type::eof()))
|
|
{
|
|
ptrdiff_t __ninp = this->gptr() - this->eback();
|
|
if (this->pptr() == this->epptr())
|
|
{
|
|
if (!(__mode_ & ios_base::out))
|
|
return traits_type::eof();
|
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
try
|
|
{
|
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
|
ptrdiff_t __nout = this->pptr() - this->pbase();
|
|
ptrdiff_t __hm = __hm_ - this->pbase();
|
|
__str_.push_back(char_type());
|
|
__str_.resize(__str_.capacity());
|
|
char_type* __p = const_cast<char_type*>(__str_.data());
|
|
this->setp(__p, __p + __str_.size());
|
|
this->__pbump(__nout);
|
|
__hm_ = this->pbase() + __hm;
|
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
}
|
|
catch (...)
|
|
{
|
|
return traits_type::eof();
|
|
}
|
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
|
}
|
|
__hm_ = _VSTD::max(this->pptr() + 1, __hm_);
|
|
if (__mode_ & ios_base::in)
|
|
{
|
|
char_type* __p = const_cast<char_type*>(__str_.data());
|
|
this->setg(__p, __p + __ninp, __hm_);
|
|
}
|
|
return this->sputc(traits_type::to_char_type(__c));
|
|
}
|
|
return traits_type::not_eof(__c);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off,
|
|
ios_base::seekdir __way,
|
|
ios_base::openmode __wch)
|
|
{
|
|
if (__hm_ < this->pptr())
|
|
__hm_ = this->pptr();
|
|
if ((__wch & (ios_base::in | ios_base::out)) == 0)
|
|
return pos_type(-1);
|
|
if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out)
|
|
&& __way == ios_base::cur)
|
|
return pos_type(-1);
|
|
const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data();
|
|
off_type __noff;
|
|
switch (__way)
|
|
{
|
|
case ios_base::beg:
|
|
__noff = 0;
|
|
break;
|
|
case ios_base::cur:
|
|
if (__wch & ios_base::in)
|
|
__noff = this->gptr() - this->eback();
|
|
else
|
|
__noff = this->pptr() - this->pbase();
|
|
break;
|
|
case ios_base::end:
|
|
__noff = __hm;
|
|
break;
|
|
default:
|
|
return pos_type(-1);
|
|
}
|
|
__noff += __off;
|
|
if (__noff < 0 || __hm < __noff)
|
|
return pos_type(-1);
|
|
if (__noff != 0)
|
|
{
|
|
if ((__wch & ios_base::in) && this->gptr() == 0)
|
|
return pos_type(-1);
|
|
if ((__wch & ios_base::out) && this->pptr() == 0)
|
|
return pos_type(-1);
|
|
}
|
|
if (__wch & ios_base::in)
|
|
this->setg(this->eback(), this->eback() + __noff, __hm_);
|
|
if (__wch & ios_base::out)
|
|
{
|
|
this->setp(this->pbase(), this->epptr());
|
|
this->pbump(__noff);
|
|
}
|
|
return pos_type(__noff);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp,
|
|
ios_base::openmode __wch)
|
|
{
|
|
return seekoff(__sp, ios_base::beg, __wch);
|
|
}
|
|
|
|
// basic_istringstream
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
class _LIBCPP_TEMPLATE_VIS basic_istringstream
|
|
: public basic_istream<_CharT, _Traits>
|
|
{
|
|
public:
|
|
typedef _CharT char_type;
|
|
typedef _Traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef _Allocator allocator_type;
|
|
|
|
typedef basic_string<char_type, traits_type, allocator_type> string_type;
|
|
|
|
private:
|
|
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
|
|
|
public:
|
|
// 27.8.2.1 Constructors:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_istringstream(ios_base::openmode __wch = ios_base::in);
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_istringstream(const string_type& __s,
|
|
ios_base::openmode __wch = ios_base::in);
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_istringstream(basic_istringstream&& __rhs);
|
|
|
|
// 27.8.2.2 Assign and swap:
|
|
basic_istringstream& operator=(basic_istringstream&& __rhs);
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void swap(basic_istringstream& __rhs);
|
|
|
|
// 27.8.2.3 Members:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
string_type str() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void str(const string_type& __s);
|
|
};
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(ios_base::openmode __wch)
|
|
: basic_istream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__wch | ios_base::in)
|
|
{
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(const string_type& __s,
|
|
ios_base::openmode __wch)
|
|
: basic_istream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__s, __wch | ios_base::in)
|
|
{
|
|
}
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(basic_istringstream&& __rhs)
|
|
: basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
|
__sb_(_VSTD::move(__rhs.__sb_))
|
|
{
|
|
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_istringstream<_CharT, _Traits, _Allocator>&
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::operator=(basic_istringstream&& __rhs)
|
|
{
|
|
basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
|
|
__sb_ = _VSTD::move(__rhs.__sb_);
|
|
return *this;
|
|
}
|
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void basic_istringstream<_CharT, _Traits, _Allocator>::swap(basic_istringstream& __rhs)
|
|
{
|
|
basic_istream<char_type, traits_type>::swap(__rhs);
|
|
__sb_.swap(__rhs.__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x,
|
|
basic_istringstream<_CharT, _Traits, _Allocator>& __y)
|
|
{
|
|
__x.swap(__y);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
|
{
|
|
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_string<_CharT, _Traits, _Allocator>
|
|
basic_istringstream<_CharT, _Traits, _Allocator>::str() const
|
|
{
|
|
return __sb_.str();
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
|
{
|
|
__sb_.str(__s);
|
|
}
|
|
|
|
// basic_ostringstream
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
class _LIBCPP_TEMPLATE_VIS basic_ostringstream
|
|
: public basic_ostream<_CharT, _Traits>
|
|
{
|
|
public:
|
|
typedef _CharT char_type;
|
|
typedef _Traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef _Allocator allocator_type;
|
|
|
|
typedef basic_string<char_type, traits_type, allocator_type> string_type;
|
|
|
|
private:
|
|
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
|
|
|
public:
|
|
// 27.8.2.1 Constructors:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out);
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_ostringstream(const string_type& __s,
|
|
ios_base::openmode __wch = ios_base::out);
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_ostringstream(basic_ostringstream&& __rhs);
|
|
|
|
// 27.8.2.2 Assign and swap:
|
|
basic_ostringstream& operator=(basic_ostringstream&& __rhs);
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void swap(basic_ostringstream& __rhs);
|
|
|
|
// 27.8.2.3 Members:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
string_type str() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void str(const string_type& __s);
|
|
};
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(ios_base::openmode __wch)
|
|
: basic_ostream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__wch | ios_base::out)
|
|
{
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(const string_type& __s,
|
|
ios_base::openmode __wch)
|
|
: basic_ostream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__s, __wch | ios_base::out)
|
|
{
|
|
}
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(basic_ostringstream&& __rhs)
|
|
: basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
|
__sb_(_VSTD::move(__rhs.__sb_))
|
|
{
|
|
basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>&
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::operator=(basic_ostringstream&& __rhs)
|
|
{
|
|
basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
|
|
__sb_ = _VSTD::move(__rhs.__sb_);
|
|
return *this;
|
|
}
|
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::swap(basic_ostringstream& __rhs)
|
|
{
|
|
basic_ostream<char_type, traits_type>::swap(__rhs);
|
|
__sb_.swap(__rhs.__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x,
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>& __y)
|
|
{
|
|
__x.swap(__y);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
|
{
|
|
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_string<_CharT, _Traits, _Allocator>
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::str() const
|
|
{
|
|
return __sb_.str();
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
|
{
|
|
__sb_.str(__s);
|
|
}
|
|
|
|
// basic_stringstream
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
class _LIBCPP_TEMPLATE_VIS basic_stringstream
|
|
: public basic_iostream<_CharT, _Traits>
|
|
{
|
|
public:
|
|
typedef _CharT char_type;
|
|
typedef _Traits traits_type;
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
typedef _Allocator allocator_type;
|
|
|
|
typedef basic_string<char_type, traits_type, allocator_type> string_type;
|
|
|
|
private:
|
|
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
|
|
|
public:
|
|
// 27.8.2.1 Constructors:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_stringstream(const string_type& __s,
|
|
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_stringstream(basic_stringstream&& __rhs);
|
|
|
|
// 27.8.2.2 Assign and swap:
|
|
basic_stringstream& operator=(basic_stringstream&& __rhs);
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void swap(basic_stringstream& __rhs);
|
|
|
|
// 27.8.2.3 Members:
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
string_type str() const;
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void str(const string_type& __s);
|
|
};
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(ios_base::openmode __wch)
|
|
: basic_iostream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__wch)
|
|
{
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(const string_type& __s,
|
|
ios_base::openmode __wch)
|
|
: basic_iostream<_CharT, _Traits>(&__sb_),
|
|
__sb_(__s, __wch)
|
|
{
|
|
}
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(basic_stringstream&& __rhs)
|
|
: basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
|
__sb_(_VSTD::move(__rhs.__sb_))
|
|
{
|
|
basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringstream<_CharT, _Traits, _Allocator>&
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::operator=(basic_stringstream&& __rhs)
|
|
{
|
|
basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
|
|
__sb_ = _VSTD::move(__rhs.__sb_);
|
|
return *this;
|
|
}
|
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::swap(basic_stringstream& __rhs)
|
|
{
|
|
basic_iostream<char_type, traits_type>::swap(__rhs);
|
|
__sb_.swap(__rhs.__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x,
|
|
basic_stringstream<_CharT, _Traits, _Allocator>& __y)
|
|
{
|
|
__x.swap(__y);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
|
{
|
|
return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
basic_string<_CharT, _Traits, _Allocator>
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::str() const
|
|
{
|
|
return __sb_.str();
|
|
}
|
|
|
|
template <class _CharT, class _Traits, class _Allocator>
|
|
void
|
|
basic_stringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
|
{
|
|
__sb_.str(__s);
|
|
}
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
_LIBCPP_POP_MACROS
|
|
|
|
#endif // _LIBCPP_SSTREAM
|