Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

474 lines
14 KiB

// ostream standard header
#ifndef _OSTREAM_
#define _OSTREAM_
#include <ios>
#ifdef _MSC_VER
#pragma pack(push,8)
#endif /* _MSC_VER */
// I/O exception macros
#define _TRY_IO_BEGIN _TRY_BEGIN
#define _CATCH_IO_END _CATCH_ALL \
setstate(ios_base::badbit, true); _CATCH_END
#define _CATCH_IO_(x) _CATCH_ALL \
(x).setstate(ios_base::badbit, true); _CATCH_END
_STD_BEGIN
// TEMPLATE CLASS basic_ostream
template<class _E, class _Tr = char_traits<_E> >
class basic_ostream : virtual public basic_ios<_E, _Tr> {
public:
typedef basic_ostream<_E, _Tr> _Myt;
typedef basic_ios<_E, _Tr> _Myios;
typedef basic_streambuf<_E, _Tr> _Mysb;
typedef ostreambuf_iterator<_E, _Tr> _Iter;
typedef num_put<_E, _Iter> _Nput;
explicit basic_ostream(basic_streambuf<_E, _Tr> *_S,
bool _Isstd = false, bool _Doinit = true)
{if (_Doinit)
init(_S, _Isstd); }
basic_ostream(_Uninitialized)
{_Addstd(); }
virtual ~basic_ostream()
{}
class sentry {
public:
explicit sentry(_Myt& _Os)
: _Ok(_Os.opfx()), _Ostr(_Os) {}
~sentry()
{if (!uncaught_exception())
_Ostr.osfx(); }
operator bool() const
{return (_Ok); }
private:
bool _Ok;
_Myt& _Ostr;
};
bool opfx()
{if (good() && tie() != 0)
tie()->flush();
return (good()); }
void osfx()
{if (flags() & unitbuf)
flush(); }
_Myt& operator<<(_Myt& (__cdecl *_F)(_Myt&))
{return ((*_F)(*this)); }
_Myt& operator<<(_Myios& (__cdecl *_F)(_Myios&))
{(*_F)(*(_Myios *)this);
return (*this); }
_Myt& operator<<(ios_base& (__cdecl *_F)(ios_base&))
{(*_F)(*(ios_base *)this);
return (*this); }
_Myt& operator<<(_Bool _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(short _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
fmtflags _Bfl = flags() & basefield;
long _Y = (_Bfl == oct || _Bfl == hex)
? (long)(unsigned short)_X : (long)_X;
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _Y).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(unsigned short _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), (unsigned long)_X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(int _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
fmtflags _Bfl = flags() & basefield;
long _Y = (_Bfl == oct || _Bfl == hex)
? (long)(unsigned int)_X : (long)_X;
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _Y).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(unsigned int _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), (unsigned long)_X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(long _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(unsigned long _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
#ifdef _WIN64
_Myt& operator<<(__int64 _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(unsigned __int64 _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
#endif // _WIN64
_Myt& operator<<(float _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), (double)_X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(double _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(long double _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(const void *_X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (_Ok)
{const _Nput& _Fac = _USE(getloc(), _Nput);
_TRY_IO_BEGIN
if (_Fac.put(_Iter(rdbuf()), *this,
fill(), _X).failed())
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& operator<<(_Mysb *_Pb)
{iostate _St = goodbit;
bool _Copied = false;
const sentry _Ok(*this);
if (_Ok && _Pb != 0)
for (int_type _C = _Tr::eof(); ; _Copied = true)
{_TRY_BEGIN
_C = _Tr::eq_int_type(_Tr::eof(), _C)
? _Pb->sgetc() : _Pb->snextc();
_CATCH_ALL
setstate(failbit);
_RERAISE;
_CATCH_END
if (_Tr::eq_int_type(_Tr::eof(),_C))
break;
_TRY_IO_BEGIN
if (_Tr::eq_int_type(_Tr::eof(),
rdbuf()->sputc(_Tr::to_char_type(_C))))
{_St |= badbit;
break; }
_CATCH_IO_END }
width(0);
setstate(!_Copied ? _St | failbit : _St);
return (*this); }
_Myt& put(_E _X)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (!_Ok)
_St |= badbit;
else
{_TRY_IO_BEGIN
if (_Tr::eq_int_type(_Tr::eof(),
rdbuf()->sputc(_X)))
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& write(const _E *_S, streamsize _N)
{iostate _St = goodbit;
const sentry _Ok(*this);
if (!_Ok)
_St |= badbit;
else
{_TRY_IO_BEGIN
if (rdbuf()->sputn(_S, _N) != _N)
_St |= badbit;
_CATCH_IO_END }
setstate(_St);
return (*this); }
_Myt& flush()
{iostate _St = goodbit;
if (!fail() && rdbuf()->pubsync() == -1)
_St |= badbit;
setstate(_St);
return (*this); }
_Myt& seekp(pos_type _P)
{if (!fail())
rdbuf()->pubseekpos(_P, out);
return (*this); }
_Myt& seekp(off_type _O, ios_base::seekdir _W)
{if (!fail())
rdbuf()->pubseekoff(_O, _W, out);
return (*this); }
pos_type tellp()
{if (!fail())
return (rdbuf()->pubseekoff(0, cur, out));
else
return (streampos(_BADOFF)); }
};
#ifdef _DLL
#ifdef __FORCE_INSTANCE
template class _CRTIMP2 basic_ostream<char, char_traits<char> >;
template class _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >;
#else // __FORCE_INSTANCE
#pragma warning(disable:4231) /* the extern before template is a non-standard extension */
extern template class _CRTIMP2 basic_ostream<char, char_traits<char> >;
extern template class _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >;
#pragma warning(default:4231) /* restore previous warning */
#endif // __FORCE_INSTANCE
#endif // _DLL
// INSERTERS
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const _E *_X)
{typedef basic_ostream<_E, _Tr> _Myos;
ios_base::iostate _St = ios_base::goodbit;
size_t _N = _Tr::length(_X);
size_t _M = _O.width() <= 0 || _O.width() <= _N
? 0 : _O.width() - _N;
const _Myos::sentry _Ok(_O);
if (!_Ok)
_St |= ios_base::badbit;
else
{_TRY_IO_BEGIN
if ((_O.flags() & ios_base::adjustfield)
!= ios_base::left)
for (; 0 < _M; --_M)
if (_Tr::eq_int_type(_Tr::eof(),
_O.rdbuf()->sputc(_O.fill())))
{_St |= ios_base::badbit;
break; }
if (_St == ios_base::goodbit
&& _O.rdbuf()->sputn(_X, (int)_N) != _N)
_St |= ios_base::badbit;
if (_St == ios_base::goodbit)
for (; 0 < _M; --_M)
if (_Tr::eq_int_type(_Tr::eof(),
_O.rdbuf()->sputc(_O.fill())))
{_St |= ios_base::badbit;
break; }
_O.width(0);
_CATCH_IO_(_O) }
_O.setstate(_St);
return (_O); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, _E _C)
{typedef basic_ostream<_E, _Tr> _Myos;
ios_base::iostate _St = ios_base::goodbit;
const _Myos::sentry _Ok(_O);
if (_Ok)
{size_t _M = _O.width() <= 1 ? 0 : _O.width() - 1;
_TRY_IO_BEGIN
if ((_O.flags() & ios_base::adjustfield)
!= ios_base::left)
for (; _St == ios_base::goodbit && 0 < _M; --_M)
if (_Tr::eq_int_type(_Tr::eof(),
_O.rdbuf()->sputc(_O.fill())))
_St |= ios_base::badbit;
if (_St == ios_base::goodbit
&& _Tr::eq_int_type(_Tr::eof(),
_O.rdbuf()->sputc(_C)))
_St |= ios_base::badbit;
for (; _St == ios_base::goodbit && 0 < _M; --_M)
if (_Tr::eq_int_type(_Tr::eof(),
_O.rdbuf()->sputc(_O.fill())))
_St |= ios_base::badbit;
_CATCH_IO_(_O) }
_O.width(0);
_O.setstate(_St);
return (_O); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const signed char *_X)
{return (_O << (const char *)_X); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const signed char _C)
{return (_O << (char)_C); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const unsigned char *_X)
{return (_O << (const char *)_X); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const unsigned char _C)
{return (_O << (char)_C); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>& __cdecl operator<<(
basic_ostream<_E, _Tr>& _O, const signed short *_X)
{return (_O << (const wchar_t *)_X); }
// MANIPULATORS
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>&
__cdecl endl(basic_ostream<_E, _Tr>& _O)
{_O.put(_O.widen('\n'));
_O.flush();
return (_O); }
_CRTIMP2 inline basic_ostream<char, char_traits<char> >&
__cdecl endl(basic_ostream<char, char_traits<char> >& _O)
{_O.put('\n');
_O.flush();
return (_O); }
_CRTIMP2 inline basic_ostream<wchar_t, char_traits<wchar_t> >&
__cdecl endl(basic_ostream<wchar_t,
char_traits<wchar_t> >& _O)
{_O.put('\n');
_O.flush();
return (_O); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>&
__cdecl ends(basic_ostream<_E, _Tr>& _O)
{_O.put(_E('\0'));
return (_O); }
_CRTIMP2 inline basic_ostream<char, char_traits<char> >&
__cdecl ends(basic_ostream<char, char_traits<char> >& _O)
{_O.put('\0');
return (_O); }
_CRTIMP2 inline basic_ostream<wchar_t, char_traits<wchar_t> >&
__cdecl ends(basic_ostream<wchar_t,
char_traits<wchar_t> >& _O)
{_O.put('\0');
return (_O); }
template<class _E, class _Tr> inline
basic_ostream<_E, _Tr>&
__cdecl flush(basic_ostream<_E, _Tr>& _O)
{_O.flush();
return (_O); }
_CRTIMP2 inline basic_ostream<char, char_traits<char> >&
__cdecl flush(basic_ostream<char, char_traits<char> >& _O)
{_O.flush();
return (_O); }
_CRTIMP2 inline basic_ostream<wchar_t, char_traits<wchar_t> >&
__cdecl flush(basic_ostream<wchar_t,
char_traits<wchar_t> >& _O)
{_O.flush();
return (_O); }
#ifdef _DLL
#ifndef CRTDLL2
#pragma warning(disable:4231) /* the extern before template is a non-standard extension */
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, const char *);
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, char);
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, const signed char *);
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, const signed char);
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, const unsigned char *);
extern template _CRTIMP2 basic_ostream<char, char_traits<char> >& __cdecl operator<<(
basic_ostream<char, char_traits<char> >&, const unsigned char);
extern template _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
basic_ostream<wchar_t, char_traits<wchar_t> >&, const wchar_t *);
extern template _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
basic_ostream<wchar_t, char_traits<wchar_t> >&, wchar_t);
extern template _CRTIMP2 basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
basic_ostream<wchar_t, char_traits<wchar_t> >&, const signed short *);
#pragma warning(default:4231) /* restore previous warning */
#endif // CRTDLL2
#endif // _DLL
_STD_END
#ifdef _MSC_VER
#pragma pack(pop)
#endif /* _MSC_VER */
#endif /* _OSTREAM_ */
/*
* Copyright (c) 1994 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
*/