790 lines
19 KiB
C
790 lines
19 KiB
C
|
#ifndef __STREAMBU_H
|
|||
|
#define __STREAMBU_H
|
|||
|
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
|
|||
|
// -*- C++ -*-
|
|||
|
#ifndef __STD_STREAMBUF__
|
|||
|
#define __STD_STREAMBUF__
|
|||
|
|
|||
|
/***************************************************************************
|
|||
|
*
|
|||
|
* streambuf - Declarations for the Standard Library stream buffers
|
|||
|
*
|
|||
|
***************************************************************************
|
|||
|
*
|
|||
|
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
|
|||
|
*
|
|||
|
* This computer software is owned by Rogue Wave Software, Inc. and is
|
|||
|
* protected by U.S. copyright laws and other laws and by international
|
|||
|
* treaties. This computer software is furnished by Rogue Wave Software,
|
|||
|
* Inc. pursuant to a written license agreement and may be used, copied,
|
|||
|
* transmitted, and stored only in accordance with the terms of such
|
|||
|
* license and with the inclusion of the above copyright notice. This
|
|||
|
* computer software or any other copies thereof may not be provided or
|
|||
|
* otherwise made available to any other person.
|
|||
|
*
|
|||
|
* U.S. Government Restricted Rights. This computer software is provided
|
|||
|
* with Restricted Rights. Use, duplication, or disclosure by the
|
|||
|
* Government is subject to restrictions as set forth in subparagraph (c)
|
|||
|
* (1) (ii) of The Rights in Technical Data and Computer Software clause
|
|||
|
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
|
|||
|
* Commercial Computer Software <EFBFBD> Restricted Rights at 48 CFR 52.227-19,
|
|||
|
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
|
|||
|
* Flatiron Parkway, Boulder, Colorado 80301 USA.
|
|||
|
*
|
|||
|
**************************************************************************/
|
|||
|
|
|||
|
#include <stdcomp.h>
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NEW_HEADER
|
|||
|
#include <cstdlib>
|
|||
|
#else
|
|||
|
#include <stdlib.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#include <ios>
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
namespace std {
|
|||
|
#endif
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
class _RWSTDExportTemplate basic_streambuf {
|
|||
|
|
|||
|
public:
|
|||
|
//
|
|||
|
// Types:
|
|||
|
//
|
|||
|
typedef charT char_type;
|
|||
|
typedef _TYPENAME traits::int_type int_type;
|
|||
|
typedef _TYPENAME traits::pos_type pos_type;
|
|||
|
typedef _TYPENAME traits::off_type off_type;
|
|||
|
typedef traits traits_type;
|
|||
|
|
|||
|
virtual ~basic_streambuf();
|
|||
|
|
|||
|
locale pubimbue( const locale& loc);
|
|||
|
locale getloc() const;
|
|||
|
|
|||
|
inline basic_streambuf<char_type, traits> *
|
|||
|
pubsetbuf(char_type *s, streamsize n);
|
|||
|
|
|||
|
inline pos_type pubseekoff(off_type off, ios_base::seekdir way,
|
|||
|
ios_base::openmode which =
|
|||
|
ios_base::in | ios_base::out);
|
|||
|
|
|||
|
inline pos_type pubseekpos(pos_type sp, ios_base::openmode which =
|
|||
|
ios_base::in | ios_base::out);
|
|||
|
|
|||
|
inline int pubsync( );
|
|||
|
inline ios_base::openmode which_open_mode();
|
|||
|
inline streamsize in_avail();
|
|||
|
|
|||
|
inline int_type snextc();
|
|||
|
inline int_type sbumpc();
|
|||
|
inline int_type sgetc();
|
|||
|
inline streamsize sgetn(char_type *s, streamsize n);
|
|||
|
|
|||
|
inline int_type sputbackc(char_type c);
|
|||
|
inline int_type sungetc();
|
|||
|
|
|||
|
inline int_type sputc(char_type c);
|
|||
|
inline streamsize sputn(const char_type *s, streamsize n);
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
_RWSTDMutex buffer_mutex_;
|
|||
|
|
|||
|
void _RW_lock_buffer()
|
|||
|
{
|
|||
|
_RWSTDGuard* tmp = new _RWSTDGuard(buffer_mutex_);
|
|||
|
if ( tmp )
|
|||
|
__buffer_guard = tmp;
|
|||
|
else
|
|||
|
__buffer_guard = 0;
|
|||
|
}
|
|||
|
|
|||
|
void _RW_unlock_buffer()
|
|||
|
{
|
|||
|
if ( __buffer_guard )
|
|||
|
{
|
|||
|
_RWSTDGuard* tmp = __buffer_guard;
|
|||
|
__buffer_guard = 0;
|
|||
|
delete tmp;
|
|||
|
}
|
|||
|
}
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
|
|||
|
protected:
|
|||
|
basic_streambuf();
|
|||
|
|
|||
|
ios_base::openmode mode_;
|
|||
|
|
|||
|
inline char_type *eback() const;
|
|||
|
inline char_type *gptr() const;
|
|||
|
inline char_type *egptr() const;
|
|||
|
inline void gbump(int n);
|
|||
|
inline void setg(char_type *gbeg_arg,char_type *gnext_arg,char_type *gend_arg);
|
|||
|
|
|||
|
inline char_type *pbase() const;
|
|||
|
inline char_type *pptr() const;
|
|||
|
inline char_type *epptr() const;
|
|||
|
inline void pbump(int n);
|
|||
|
inline void setp(char_type *pbeg_arg,char_type *pend_arg);
|
|||
|
|
|||
|
virtual void imbue( const locale& loc);
|
|||
|
|
|||
|
virtual basic_streambuf<charT, traits> *
|
|||
|
setbuf(char_type *s, streamsize n);
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
virtual streamsize showmanyc();
|
|||
|
virtual streamsize xsgetn(char_type *s, streamsize n);
|
|||
|
virtual int_type underflow();
|
|||
|
virtual int_type uflow();
|
|||
|
virtual int_type overflow(int_type c = traits::eof());
|
|||
|
|
|||
|
virtual int_type pbackfail(int_type c = traits::eof());
|
|||
|
virtual streamsize xsputn(const char_type *s, streamsize n);
|
|||
|
|
|||
|
virtual int sync( );
|
|||
|
void streambuf_init(bool set_mode= true);
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
char_type *__gbeg;
|
|||
|
char_type *__gnext;
|
|||
|
char_type *__gend;
|
|||
|
|
|||
|
char_type *__pbeg;
|
|||
|
char_type *__pnext;
|
|||
|
char_type *__pend;
|
|||
|
|
|||
|
locale __loc_buf;
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
_RWSTDGuard *__buffer_guard;
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
};
|
|||
|
/*
|
|||
|
* inline functions
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* int_type snextc()
|
|||
|
* returns the next character
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::snextc()
|
|||
|
{
|
|||
|
if( traits::eq_int_type(sbumpc(),traits::eof()) )
|
|||
|
return traits::eof();
|
|||
|
|
|||
|
return sgetc();
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int_type sbumpc()
|
|||
|
* returns the current character and increments the pointer
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::sbumpc()
|
|||
|
{
|
|||
|
char_type c;
|
|||
|
|
|||
|
if( gptr()>= egptr()) {
|
|||
|
return uflow();
|
|||
|
}
|
|||
|
c=*gptr();
|
|||
|
gbump(1);
|
|||
|
return traits::to_int_type(c);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int_type sgetc()
|
|||
|
* returns the current character
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::sgetc()
|
|||
|
{
|
|||
|
|
|||
|
if(gptr() >= egptr()) {
|
|||
|
return underflow();
|
|||
|
}
|
|||
|
|
|||
|
return traits::to_int_type(*gptr());
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* streamsize sgetn(char_type *, streamsize)
|
|||
|
* reads in 'n' characters into 's'
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline streamsize basic_streambuf<charT, traits>::
|
|||
|
sgetn(char_type *s, streamsize n)
|
|||
|
{
|
|||
|
return xsgetn(s, n);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int_type sputbackc(char_type)
|
|||
|
* puts the character back into the sequence if possible
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::sputbackc(char_type c)
|
|||
|
{
|
|||
|
if( gptr() > eback())
|
|||
|
{
|
|||
|
gbump(-1);
|
|||
|
if( !traits::eq(*gptr(),c) )
|
|||
|
{
|
|||
|
gbump(1);
|
|||
|
return pbackfail(traits::to_int_type(c));
|
|||
|
}
|
|||
|
|
|||
|
return traits::to_int_type(*gptr());
|
|||
|
}
|
|||
|
|
|||
|
return pbackfail(traits::to_int_type(c));
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int sungetc()
|
|||
|
* puts the character back into the sequence. The putback character doesn't
|
|||
|
* have to already be there. Similar to sputbackc(...)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::sungetc()
|
|||
|
{
|
|||
|
if(gptr() > eback())
|
|||
|
{
|
|||
|
gbump(-1);
|
|||
|
return traits::to_int_type(*gptr());
|
|||
|
}
|
|||
|
return pbackfail();
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int sputc(char_type)
|
|||
|
* puts the character into the sequence
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::int_type
|
|||
|
basic_streambuf<charT, traits>::sputc(char_type c)
|
|||
|
{
|
|||
|
|
|||
|
if( pptr() >= epptr() )
|
|||
|
{
|
|||
|
return overflow(traits::to_int_type(c));
|
|||
|
}
|
|||
|
*__pnext++ =c;
|
|||
|
return traits::to_int_type(c);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* streamsize sputn(const char_type *, streamsize)
|
|||
|
* writes n characters from s into the sequence
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline streamsize
|
|||
|
basic_streambuf<charT, traits>::sputn(const char_type *s, streamsize n)
|
|||
|
{
|
|||
|
return xsputn(s, n);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* void gbump(int)
|
|||
|
* increments the get pointer by n. Does no checking to see if this
|
|||
|
* is a valid operation
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline void
|
|||
|
basic_streambuf<charT, traits>::gbump(int n)
|
|||
|
{
|
|||
|
__gnext += n;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* void setg(char_type *, char_type *, char_type *)
|
|||
|
* sets the get pointers
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline void
|
|||
|
basic_streambuf<charT, traits>::
|
|||
|
setg(char_type *gbeg, char_type *gnext, char_type *gend)
|
|||
|
{
|
|||
|
__gbeg = gbeg;
|
|||
|
__gnext = gnext;
|
|||
|
__gend = gend;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* void pbump(int)
|
|||
|
* increments the put pointer. No checking to see if this is valid
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline void
|
|||
|
basic_streambuf<charT, traits>::pbump(int n)
|
|||
|
{
|
|||
|
__pnext += n;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* void setp(char_type *, char_type *)
|
|||
|
* sets up the put pointers
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline void
|
|||
|
basic_streambuf<charT, traits>::
|
|||
|
setp(char_type *pbeg, char_type *pend)
|
|||
|
{
|
|||
|
__pbeg = pbeg;
|
|||
|
__pnext = pbeg;
|
|||
|
__pend = pend;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *eback() const
|
|||
|
* returns the beginning of the get sequence
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::eback() const
|
|||
|
{
|
|||
|
return __gbeg;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *gptr() const
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::gptr() const
|
|||
|
{
|
|||
|
return __gnext;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *egptr() const
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::egptr() const
|
|||
|
{
|
|||
|
return __gend;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *pbase() const
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::pbase() const
|
|||
|
{
|
|||
|
return __pbeg;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *pptr() const
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::pptr() const
|
|||
|
{
|
|||
|
return __pnext;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* char_type *epptr() const
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::char_type *
|
|||
|
basic_streambuf<charT, traits>::epptr() const
|
|||
|
{
|
|||
|
return __pend;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* streamsize in_avail()
|
|||
|
* returns how many characters are available
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline streamsize
|
|||
|
basic_streambuf<charT, traits>::in_avail()
|
|||
|
{
|
|||
|
if(gptr() >= egptr())
|
|||
|
return showmanyc();
|
|||
|
|
|||
|
return ( (streamsize)(egptr() - gptr()) );
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* int pubsync()
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline int
|
|||
|
basic_streambuf<charT, traits>::pubsync()
|
|||
|
{
|
|||
|
return sync();
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* pos_type pubseekoff(off_type, ios_base::seekdir, ios_base::openmode)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::pos_type
|
|||
|
basic_streambuf<charT, traits>::
|
|||
|
pubseekoff(off_type off, ios_base::seekdir way, ios_base::openmode which)
|
|||
|
{
|
|||
|
return seekoff(off, way, which);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* pos_type pubseekpos(pos_type, ios_base::openmode)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME basic_streambuf<charT, traits>::pos_type
|
|||
|
basic_streambuf<charT, traits>::
|
|||
|
pubseekpos(pos_type sp,
|
|||
|
ios_base::openmode which)
|
|||
|
{
|
|||
|
return seekpos(sp, which);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* basic_streambuf *pubsetbuf(char_type *, streamsize)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline basic_streambuf<charT, traits> *
|
|||
|
basic_streambuf<charT, traits>::
|
|||
|
pubsetbuf(char_type *s, streamsize n)
|
|||
|
{
|
|||
|
return setbuf(s, n);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* ios_base::openmode which_open_mode()
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline ios_base::openmode
|
|||
|
basic_streambuf<charT, traits>::which_open_mode()
|
|||
|
{
|
|||
|
return mode_;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* streambuf iterators
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* ostreambuf_iterator
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits >
|
|||
|
class _RWSTDExportTemplate ostreambuf_iterator
|
|||
|
: public iterator<output_iterator_tag,charT,
|
|||
|
_TYPENAME traits::off_type,charT*,charT&>
|
|||
|
{
|
|||
|
|
|||
|
public:
|
|||
|
//
|
|||
|
// Types:
|
|||
|
//
|
|||
|
typedef charT char_type;
|
|||
|
typedef traits traits_type;
|
|||
|
typedef basic_streambuf<charT, traits> streambuf_type;
|
|||
|
typedef basic_ostream<charT, traits> ostream_type;
|
|||
|
|
|||
|
ostreambuf_iterator(ostream_type& s) _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(s.rdbuf())
|
|||
|
{
|
|||
|
if ( s.rdbuf() ) __failed_flag = false;
|
|||
|
else
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
|
|||
|
ostreambuf_iterator(streambuf_type *s) _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(s)
|
|||
|
{
|
|||
|
if ( s ) __failed_flag = false;
|
|||
|
else
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
|
|||
|
ostreambuf_iterator<charT,traits>& operator*()
|
|||
|
{ return *this; }
|
|||
|
ostreambuf_iterator<charT,traits>& operator++()
|
|||
|
{ return *this; }
|
|||
|
ostreambuf_iterator<charT,traits> operator++(int)
|
|||
|
{ return *this; }
|
|||
|
|
|||
|
ostreambuf_iterator<charT,traits>& operator=(charT c)
|
|||
|
{
|
|||
|
if ( !__failed_flag )
|
|||
|
{
|
|||
|
if ( traits::eq_int_type(__sbuf->sputc(c),traits::eof()) )
|
|||
|
__failed_flag=true;
|
|||
|
}
|
|||
|
return *this;
|
|||
|
}
|
|||
|
|
|||
|
bool failed( ) const _RWSTD_INLINE_NO_THROW
|
|||
|
{ return __failed_flag; }
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
private:
|
|||
|
streambuf_type *__sbuf;
|
|||
|
bool __failed_flag;
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
* istreambuf_iterator
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits >
|
|||
|
class _RWSTDExportTemplate istreambuf_iterator
|
|||
|
: public iterator<input_iterator_tag,charT,
|
|||
|
_TYPENAME traits::off_type,charT*,charT&>
|
|||
|
{
|
|||
|
|
|||
|
public:
|
|||
|
//
|
|||
|
// Types:
|
|||
|
//
|
|||
|
typedef charT char_type;
|
|||
|
typedef _TYPENAME traits::int_type int_type;
|
|||
|
typedef traits traits_type;
|
|||
|
|
|||
|
typedef basic_streambuf<charT, traits> streambuf_type;
|
|||
|
typedef basic_istream<charT, traits> istream_type;
|
|||
|
|
|||
|
// class to maintain a character and an associated streambuf
|
|||
|
class proxy {
|
|||
|
char_type __keep;
|
|||
|
streambuf_type *__sbuf;
|
|||
|
|
|||
|
proxy(char_type c, streambuf_type *sbuf)
|
|||
|
: __keep(c), __sbuf(sbuf)
|
|||
|
{ ; }
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
char_type operator*()
|
|||
|
{ return __keep; }
|
|||
|
|
|||
|
friend class istreambuf_iterator<charT, traits>;
|
|||
|
};
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
istreambuf_iterator() _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(0)
|
|||
|
{ __failed_flag = true; }
|
|||
|
istreambuf_iterator(istream_type& s) _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(s.rdbuf())
|
|||
|
{
|
|||
|
if ( s.rdbuf() ) __failed_flag = false;
|
|||
|
else
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
istreambuf_iterator(streambuf_type *s) _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(s)
|
|||
|
{
|
|||
|
if ( s ) __failed_flag = false;
|
|||
|
else
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
istreambuf_iterator(const proxy& p) _RWSTD_INLINE_NO_THROW
|
|||
|
: __sbuf(p.__sbuf)
|
|||
|
{ ; }
|
|||
|
inline char_type operator*();
|
|||
|
inline istreambuf_iterator<charT, traits>& operator++();
|
|||
|
inline proxy operator++(int);
|
|||
|
inline bool equal(istreambuf_iterator<charT, traits>& b);
|
|||
|
|
|||
|
bool failed( ) const _RWSTD_INLINE_NO_THROW
|
|||
|
{ return __failed_flag; }
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
private:
|
|||
|
streambuf_type *__sbuf;
|
|||
|
bool __failed_flag;
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
* inline functions
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* char_type operator*()
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME istreambuf_iterator<charT, traits>::char_type
|
|||
|
istreambuf_iterator<charT, traits>::operator*()
|
|||
|
{
|
|||
|
int_type c;
|
|||
|
|
|||
|
if ( __sbuf && !__failed_flag )
|
|||
|
{
|
|||
|
c= __sbuf->sgetc();
|
|||
|
if ( traits::eq_int_type(c,traits::eof()) )
|
|||
|
{
|
|||
|
__sbuf = 0;
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
}
|
|||
|
else return traits::eof();
|
|||
|
|
|||
|
return traits::to_char_type(c);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* istreambuf_iterator& operator++()
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline istreambuf_iterator<charT, traits>&
|
|||
|
istreambuf_iterator<charT, traits>::operator++()
|
|||
|
{
|
|||
|
if (__sbuf && !__failed_flag )
|
|||
|
{
|
|||
|
__sbuf->sbumpc();
|
|||
|
if ( traits::eq_int_type(__sbuf->sgetc(),traits::eof()) )
|
|||
|
{
|
|||
|
__sbuf = 0;
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
}
|
|||
|
return *this;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* proxy operator++(int)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline _TYPENAME istreambuf_iterator<charT, traits>::proxy
|
|||
|
istreambuf_iterator<charT, traits>::operator++(int)
|
|||
|
{
|
|||
|
|
|||
|
if (__sbuf && !__failed_flag )
|
|||
|
{
|
|||
|
proxy prev(__sbuf->sgetc(), __sbuf);
|
|||
|
__sbuf->sbumpc();
|
|||
|
if ( traits::eq_int_type(__sbuf->sgetc(),traits::eof()) )
|
|||
|
{
|
|||
|
__sbuf = 0;
|
|||
|
__failed_flag = true;
|
|||
|
}
|
|||
|
return prev;
|
|||
|
}
|
|||
|
|
|||
|
charT c=traits::to_char_type(traits::eof());
|
|||
|
return proxy(c, __sbuf);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* bool equal(istreambuf_iterator&)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline bool
|
|||
|
istreambuf_iterator<charT, traits>::
|
|||
|
equal(istreambuf_iterator<charT, traits>& b)
|
|||
|
{
|
|||
|
if( ((__sbuf ==0) && (b.__sbuf==0)) || ((__sbuf !=0) && (b.__sbuf !=0)) )
|
|||
|
return true;
|
|||
|
else
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* bool operator==(istreambuf_iterator& a, istreambuf_iterator& b)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline bool _RWSTDExportTemplate operator==(istreambuf_iterator<charT, traits>& a,
|
|||
|
istreambuf_iterator<charT, traits>& b)
|
|||
|
{
|
|||
|
return a.equal(b);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* bool operator!=(istreambuf_iterator& a, istreambuf_iterator& b)
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
inline bool _RWSTDExportTemplate operator!=(istreambuf_iterator<charT, traits>& a,
|
|||
|
istreambuf_iterator<charT, traits>& b)
|
|||
|
{
|
|||
|
return !(a.equal(b));
|
|||
|
}
|
|||
|
|
|||
|
// end inlining
|
|||
|
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
typedef basic_streambuf<char> streambuf;
|
|||
|
#else
|
|||
|
typedef basic_streambuf<char, char_traits<char> > streambuf;
|
|||
|
#endif // _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_WIDE_CHAR
|
|||
|
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
typedef basic_streambuf<wchar_t> wstreambuf;
|
|||
|
#else
|
|||
|
typedef basic_streambuf<wchar_t, char_traits<wchar_t> > wstreambuf;
|
|||
|
#endif // _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
#endif // _RWSTD_NO_WIDE_CHAR
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef _RWSTD_COMPILE_INSTANTIATE
|
|||
|
#include <streambu.cc>
|
|||
|
#endif
|
|||
|
|
|||
|
#endif // __STD_STREAMBUF__
|
|||
|
|
|||
|
#ifndef __USING_STD_NAMES__
|
|||
|
using namespace std;
|
|||
|
#endif
|
|||
|
|
|||
|
#pragma option pop
|
|||
|
#endif /* __STREAMBU_H */
|