This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/istream.cc

1832 lines
43 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __ISTREAM_CC
#define __ISTREAM_CC
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
/***************************************************************************
*
* istream.cc - istream definitions
*
***************************************************************************
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
***************************************************************************
*
* 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 Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#ifndef _RWSTD_NO_NEW_HEADER
#include <cctype>
#else
#include <ctype.h>
#endif
#include <ios>
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
/*
* basic_istream manipulators
* skips the next available white spaces
*/
template<class charT, class traits>
basic_istream<charT, traits>&
_RWSTDExportTemplate ws(basic_istream<charT, traits>& is)
{
_TYPENAME traits::int_type c;
#ifdef _RWSTD_MULTI_THREAD
if ( is.rdbuf() )
is.istream_sentry_guard = new _RWSTDGuard(is.rdbuf()->buffer_mutex_);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#endif // _RWSTD_MULTI_THREAD
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const ctype<charT>& ct = use_facet< ctype<charT> >(is.getloc());
#else
const ctype<charT>& ct = use_facet(is.getloc(),(ctype<charT>*)0);
#endif
while((c = is.rdbuf()->sgetc()),
( !traits::eq_int_type(c,traits::eof()) && ct.is(ct.space,c) ))
is.rdbuf()->snextc();
if( traits::eq_int_type(c,traits::eof()) )
is.setstate(ios_base::eofbit);
#if defined (_RWSTD_MULTI_THREAD) && !defined (_RWSTD_NO_EXCEPTIONS)
} catch(...)
{
if ( is.rdbuf() )
delete is.istream_sentry_guard;
throw;
}
#endif // _RWSTD_MULTI_THREAD etc.
#ifdef _RWSTD_MULTI_THREAD
if ( is.rdbuf() )
delete is.istream_sentry_guard;
#endif
return is;
}
/*
* basic_istream(basic_streambuf *)
*/
template<class charT, class traits>
basic_istream<charT, traits>::
basic_istream(basic_streambuf<charT, traits> *sb)
: __chcount(0)
{
if ( sb )
{
if ( sb->which_open_mode() & ios_base::in )
this->init(sb);
else
this->init(0);
}
else
this->init(0);
}
/*
* basic_istream( )
*/
template<class charT, class traits>
basic_istream<charT, traits>::
basic_istream( )
: __chcount(0)
{
}
/*
* ~basic_istream();
*/
template<class charT, class traits>
basic_istream<charT, traits>::~basic_istream()
{
}
/*
* istream_type& operator>>(istream_type& (*pf)(istream_type&))
* for functions relating to istreams
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
operator>>(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&))
{
(*pf)(*this);
return *this;
}
/*
* istream_type& operator>>(ios_base& (*pf)(ios_base&))
* for manipulators relating to the ios_base class
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
operator>>(ios_base& (*pf)(ios_base&))
{
(*pf)(*this);
return *this;
}
/*
* istream_type& operator>>(ios_type& (*pf)(ios_type&))
* used to set one of the ios states (ios manipulator)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
operator>>(basic_ios<charT, traits>& (*pf)(basic_ios<charT, traits>&))
{
(*pf)(*this);
return *this;
}
/*
* basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>, charT *)
* read in a charT *.
*/
template<class charT, class traits>
basic_istream<charT, traits>&
_RWSTDExportTemplate operator>>(basic_istream<charT, traits>& is, charT *p)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
if ( p!=0 )
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(is);
if(ipfx)
{
charT *op = p;
_TYPENAME traits::int_type c = 0;
int len;
if ( is.width() == 0 ) len=0;
else len=is.width();
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const ctype<charT>& ct = use_facet< ctype<charT> >(is.getloc());
#else
const ctype<charT>& ct = use_facet(is.getloc(), (ctype<charT>*)0);
#endif
while(--len &&
(c = is.rdbuf()->sgetc(),!( traits::eq_int_type(c,traits::eof()) ||
ct.is(ct.space,c))))
{
*p++ = c;
is.rdbuf()->sbumpc();
}
if( traits::eq_int_type(c,traits::eof()) )
err = ((p == op) ?
(ios_base::eofbit | ios_base::failbit) : ios_base::eofbit);
*p = charT ('\0');
is.width(0);
}
}
else
err = ios_base::failbit;
#ifndef _RWSTD_NO_EXCEPTIONS
} // end try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
is.setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) is.setstate(err);
return is;
}
/*
* basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT& )
* read in a character
*/
template<class charT, class traits>
basic_istream<charT, traits>&
_RWSTDExportTemplate operator>>(basic_istream<charT,traits>& is, charT& c)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(is);
if(ipfx)
{
_TYPENAME traits::int_type tmp = is.rdbuf()->sbumpc();
if ( traits::eq_int_type(traits::eof(),tmp) )
err = ios_base::failbit | ios_base::eofbit;
else
c = traits::to_char_type(tmp);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
is.setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) is.setstate(err);
return is;
}
#ifndef _RWSTD_NO_SIGNED_CHAR_IN_STREAMS
/*
* istream& operator>>(basic_istream<char,traits>&,unsigned char& )
*/
template <class traits>
basic_istream<char, traits>&
_RWSTDExportTemplate operator>>(basic_istream<char, traits>& is, unsigned char& uc)
{
is >> (char &)uc;
return is;
}
/*
* istream& operator>>(basic_istream<char, traits>&, signed char& )
*/
template <class traits>
basic_istream<char, traits>&
_RWSTDExportTemplate operator>>(basic_istream<char, traits>& is, signed char& sc)
{
is >> (char &)sc;
return is;
}
/*
* istream& operator>>(basic_istream<char, traits>&, unsigned char* )
*/
template <class traits>
basic_istream<char, traits>&
_RWSTDExportTemplate operator>>(basic_istream<char, traits>& is,unsigned char* uc)
{
is >> (char *)uc;
return is;
}
/*
* istream& operator>>(basic_istream<char, traits>&,signed char* )
*/
template <class traits>
basic_istream<char, traits>&
_RWSTDExportTemplate operator>>(basic_istream<char, traits>& is, signed char* sc)
{
is >> (char *)sc;
return is;
}
#endif // _RWSTD_NO_SIGNED_CHAR_IN_STREAMS
#ifndef _RWSTD_NO_BOOL
/*
* istream_type& operator>>(bool&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(bool& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,n);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
#endif // _RWSTD_NO_BOOL
/*
* istream_type& operator>>(short&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(short& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
long l;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,l);
n=(short)l;
if ( (n!=l) && ((unsigned short)n != l) )
err |= ios_base::failbit;
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(unsigned short&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(unsigned short& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,n);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(int&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(int& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
long l;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,l);
n=(int)l;
if ( (n!=l) && ((unsigned int)n!=(unsigned long)l) )
err |= ios_base::failbit;
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(unsigned int&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(unsigned int& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,n);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(long&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(long& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,n);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(unsigned long&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(unsigned long& n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,n);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(float&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(float& f)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,f);
}
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(double&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(double& f)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,f);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(long double&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(long double& f)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,f);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(_RWSTD_LONG_LONG&)
*/
#ifdef _RWSTD_LONG_LONG
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(_RWSTD_LONG_LONG& ll)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx) {
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,ll);
}
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(unsigned _RWSTD_LONG_LONG&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(unsigned _RWSTD_LONG_LONG& ull)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx) {
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,ull);
}
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
#endif // _RWSTD_LONG_LONG
/*
* istream_type& operator>>(void*&)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(void*& p)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
use_facet<num_get<charT,istreambuf_iterator<charT,traits> > >(this->getloc())
#else
use_facet(this->getloc(),(num_get<charT,istreambuf_iterator<charT,traits> >*)0)
#endif
.get(istreambuf_iterator<charT,traits>(*this),istreambuf_iterator<charT,traits>(),*this,err,p);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(basic_streambuf&)
* reads characters from the stream and inserts them into 'sb'
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(streambuf_type& sb)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
int_type c;
if ( traits::eq_int_type(this->rdbuf()->sgetc(),traits::eof()) )
err = ios_base::failbit;
while( !traits::eq_int_type( (c = this->rdbuf()->sgetc()),traits::eof()) ) {
if( traits::eq_int_type(sb.sputc(c),traits::eof()) ) {
err = ios_base::failbit;
break;
}
this->rdbuf()->sbumpc();
}
if( traits::eq_int_type(c,traits::eof()) )
err |= ios_base::eofbit;
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::failbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& operator>>(basic_streambuf *)
* reads characters from the stream and inserts them into 'sb'
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::operator>>(streambuf_type *sb)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
if ( sb!=0 )
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this);
if(ipfx)
{
int_type c;
if ( traits::eq_int_type(this->rdbuf()->sgetc(),traits::eof()) )
err = ios_base::failbit;
while( !traits::eq_int_type( (c = this->rdbuf()->sgetc()),traits::eof()) )
{
if( traits::eq_int_type(sb->sputc(c),traits::eof()) )
{
err = ios_base::failbit;
break;
}
this->rdbuf()->sbumpc();
}
if( traits::eq_int_type(c,traits::eof()) )
err |= ios_base::eofbit;
}
}
else
err = ios_base::failbit;
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::failbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& get(char_type *, streamsize, char_type)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
get(char_type *s, streamsize n, char_type delim)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
__chcount = 0;
if (s!=0)
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
if(ipfx)
{
char_type *op = s;
int_type c = 0;
while(--n > 0 && (c = this->rdbuf()->sgetc()) != delim &&
( !traits::eq_int_type(c,traits::eof()) ))
{
*s++ = c;
++__chcount;
this->rdbuf()->snextc();
}
if( traits::eq_int_type(c,traits::eof()) )
err = ((s == op) ? (ios_base::eofbit | ios_base::failbit) :
ios_base::eofbit);
}
*s = 0; //terminate with null
}
else
err = ios_base::badbit;
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& get(char_type&)
* gets a single character, first skipping white space.
* see also: int_type get();
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::get(char_type& s)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
__chcount = 0;
if(ipfx)
{
int_type tmp = this->rdbuf()->sbumpc();
if ( traits::eq_int_type(tmp,traits::eof()) )
{
err = ios_base::failbit | ios_base::eofbit;
}
else
{
s = traits::to_char_type(tmp);
__chcount = 1;
}
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& get(basic_streambuf&, char_type)
* insert characters into sb upto delim
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
get(streambuf_type& sb, char_type delim)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
__chcount = 0;
if(ipfx)
{
int_type c;
while(((c = this->rdbuf()->sgetc()) != delim) &&
( !traits::eq_int_type(c,traits::eof()) ))
{
if( traits::eq_int_type(sb.sputc(c),traits::eof()) ) {
err = ios_base::failbit;
break;
}
++__chcount;
this->rdbuf()->sbumpc();
}
if(c == traits::eof())
err |= ios_base::eofbit;
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& getline(char_type *, streamsize, char_type)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::
getline(char_type *s, streamsize n, char_type delim)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
__chcount = 0;
if (s!=0)
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
if(ipfx) {
char_type *op = s;
int_type c = 0;
while( --n > 0 && !traits::eq_int_type( (c = this->rdbuf()->sgetc()),traits::eof()) )
{
++__chcount;
this->rdbuf()->sbumpc();
if(c == delim)
break;
*s++ = c;
}
*s = 0;
if( traits::eq_int_type(c,traits::eof()) ) {
err = (s == op) ? (ios_base::eofbit | ios_base::failbit)
: ios_base::eofbit;
}
// RW_BUG: fix for bts-43439
else if ( c == delim )
; // we've already extracted the delim
else if ( this->rdbuf()->sgetc() == delim )
this->rdbuf()->sbumpc(); // eat the delimiter
else if ( n == 0 )
err |= ios_base::failbit; // too much data
}
*s = 0; //terminate with null
}
else
err = ios_base::badbit;
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& ignore(streamsize, int_type)
* this ignores n characters or until delim
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::ignore(streamsize n, int_type delim)
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
__chcount = 0;
if(ipfx)
{
int_type c = 0;
while(--n >= 0 && !traits::eq_int_type( (c = this->rdbuf()->sgetc()),traits::eof()) )
{
++__chcount;
this->rdbuf()->sbumpc();
if(c == delim)
break;
}
if( traits::eq_int_type(c,traits::eof()) )
this->setstate(ios_base::eofbit);
}
return *this;
}
/*
* istream_type& read(char_type *, streamsize)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::read(char_type *s, streamsize n)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
__chcount = 0;
if (s!=0)
{
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
if(ipfx)
{
int_type c = 0;
while((--n >= 0) && !traits::eq_int_type( (c = this->rdbuf()->sgetc()),traits::eof()))
{
*s++ = c;
++__chcount;
this->rdbuf()->sbumpc();
}
if( traits::eq_int_type(c,traits::eof()) )
err = (n >= 0) ? (ios_base::eofbit | ios_base::failbit) : ios_base::eofbit;
}
}
else
err = ios_base::badbit;
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
/*
* streamsize readsome(char_type *, streamsize)
*/
template<class charT, class traits>
streamsize
basic_istream<charT, traits>::readsome(char_type *s, streamsize n)
{
int navail = this->rdbuf()->in_avail();
if(navail == -1)
{
this->setstate(ios_base::eofbit);
return 0;
}
if(navail == 0 ) return 0;
if ( this->good() )
{
if(n < navail)
{
read(s, n);
return (n);
}
read(s, navail);
return (streamsize)(navail);
}
else
{
if ( !(this->rdstate() & ios_base::failbit) )
this->setstate(ios_base::failbit);
}
return 0;
}
/*
* int_type peek()
*/
template<class charT, class traits>
_TYPENAME basic_istream<charT, traits>::int_type
basic_istream<charT, traits>::peek()
{
__chcount = 0;
if(this->good())
{
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() )
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
_TYPENAME traits::int_type tmp = this->rdbuf()->sgetc();
if ( !traits::eq_int_type( tmp,traits::eof() ) )
__chcount = 1;
return tmp;
}
return traits::eof();
}
/*
* pos_type tellg()
*/
template<class charT, class traits>
_TYPENAME basic_istream<charT, traits>::pos_type
basic_istream<charT, traits>::tellg()
{
ios_base::iostate err = 0;
pos_type p;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() ) {
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif // _RWSTD_MULTI_THREAD
if ( this->fail() ) return pos_type(off_type(-1));
p = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
#ifdef _RWSTD_MULTI_THREAD
}
#endif // _RWSTD_MULTI_THREAD
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
return p;
}
/*
* istream_type& putback(char_type)
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::putback(char_type c)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() )
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
if (this->good())
{
if( traits::eq_int_type(this->rdbuf()->sputbackc(c),traits::eof()) )
err = ios_base::badbit;
}
else
{
if ( !(this->rdstate() & ios_base::failbit) )
this->setstate(ios_base::failbit);
}
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return *this;
}
/*
* istream_type& unget()
*/
template<class charT, class traits>
basic_istream<charT, traits>&
basic_istream<charT, traits>::unget()
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() )
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
if (this->good())
{
if( traits::eq_int_type(this->rdbuf()->sungetc(),traits::eof()) )
err = ios_base::badbit;
}
else
{
if ( !(this->rdstate() & ios_base::failbit) )
this->setstate(ios_base::failbit);
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return *this;
}
/*
* streamsize gcount() const
*/
template<class charT, class traits>
streamsize basic_istream<charT, traits>::gcount() const
{
return __chcount;
}
/*
* int sync()
*/
template<class charT, class traits>
int basic_istream<charT, traits>::sync()
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() )
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
if(this->rdbuf())
{
if(this->rdbuf()->pubsync() == -1)
err = ios_base::badbit;
else
{
if ( this->rdstate() & ios_base::eofbit )
clear( this->rdstate() & ~(ios_base::eofbit | ios_base::failbit));
return 0;
}
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) this->setstate(err);
return -1;
}
// string extractor and getline
#ifndef _RWSTD_NO_NAMESPACE
}
namespace __rwstd {
#endif
template <class streamT, class stringT, class traits>
streamT& _RWSTDExportTemplate rw_extract_string(streamT& is, stringT& s, traits)
{
_TYPENAME streamT::int_type c;
_RW_STD::ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME streamT::sentry ipfx(is);
if(ipfx)
{
s.erase();
c = is.rdbuf()->sbumpc();
const _RW_STD::ctype<_TYPENAME streamT::char_type>& ctype_facet =
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
_RW_STD::use_facet<_RW_STD::ctype<_TYPENAME streamT::char_type> >(is.getloc());
#else
_RW_STD::use_facet(is.getloc(),(_RW_STD::ctype<_TYPENAME streamT::char_type>*)0);
#endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
_TYPENAME stringT::size_type i = 0, len = 32;
_TYPENAME stringT::value_type* buff = new _TYPENAME stringT::value_type[len+1];
_TYPENAME stringT::value_type* ptr = buff;
_TYPENAME stringT::size_type end = s.max_size();
if (is.width())
end = (end > (_TYPENAME stringT::size_type)is.width()) ? is.width() : end;
while ( !traits::eq_int_type(c,traits::eof()) && !ctype_facet.is(ctype_facet.space,c) )
{
if (i == len)
{
_TYPENAME stringT::size_type oldlen = len;
len *= 2;
_TYPENAME stringT::value_type* tmp = new _TYPENAME stringT::value_type[len+1];
traits::move(tmp,buff,oldlen);
delete [] buff;
buff = tmp;
ptr = buff + i;
}
*ptr++ = traits::to_char_type(c);
i++;
if ( i == end ) break;
c = is.rdbuf()->sbumpc();
}
*ptr = traits::to_char_type(0);
s.assign(buff,i);
delete [] buff;
if ( i == 0 ) err |= _RW_STD::ios_base::failbit;
if ( traits::eq_int_type(c,traits::eof()) )
err |= _RW_STD::ios_base::eofbit;
}
is.width(0);
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
is.setstate(_RW_STD::ios_base::badbit);
}
catch( _RW_STD::ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) is.setstate(err);
return is;
}
#ifndef _RWSTD_NO_NAMESPACE
}
namespace std {
#endif
template<class charT, class traits, class Allocator>
basic_istream<charT,traits>&
_RWSTDExportTemplate getline (basic_istream<charT,traits>& is,
basic_string<charT,traits,Allocator>& str,
charT delim )
{
_TYPENAME traits::int_type c;
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT,traits>::sentry ipfx(is,1);
if(ipfx)
{
c = is.rdbuf()->sbumpc();
_TYPENAME Allocator::size_type i = 0, len = 32;
charT* buff = new charT[len+1];
charT* ptr = buff;
bool found = false; // RW_BUG: (bts-43483)
while ( !traits::eq_int_type(c,traits::eof()) )
{
if (i == len)
{
_TYPENAME Allocator::size_type oldlen = len;
len *= 2;
charT* tmp = new charT[len+1];
traits::move(tmp,buff,oldlen);
delete [] buff;
buff = tmp;
ptr = buff + i;
}
if ( traits::eq(traits::to_char_type(c),delim) )
{
found = true; // RW_BUG: (bts-43483)
break;
}
i++; // RW_BUG: (bts-43483)
if (i == str.max_size())
{
err |= ios_base::failbit;
break;
}
*ptr++ = traits::to_char_type(c);
c = is.rdbuf()->sbumpc();
}
*ptr = traits::to_char_type(0);
str.assign(buff,i);
delete [] buff;
if ( traits::eq_int_type(c,traits::eof()) )
err |= ios_base::eofbit;
if ( i==0 && !found ) // RW_BUG: (bts-43483)
err |= ios_base::failbit;
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
is.setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif
if ( err ) is.setstate(err);
return is;
}
/*
* class basic_iostream
*/
/*
* basic_iostream(basic_streambuf *)
*/
template<class charT, class traits>
basic_iostream<charT, traits>::
basic_iostream(basic_streambuf<charT, traits> *sb)
:basic_istream<charT, traits>(sb)
,basic_ostream<charT, traits>(sb)
{
}
/*
* basic_iostream( )
*/
template<class charT, class traits>
basic_iostream<charT, traits>::
basic_iostream( )
:basic_istream<charT, traits>()
,basic_ostream<charT, traits>()
{
}
/*
* ~basic_iostream()
*/
template<class charT, class traits>
basic_iostream<charT, traits>::
~basic_iostream()
{
}
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#pragma option pop
#endif /* __ISTREAM_CC */