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.h

567 lines
16 KiB
C
Raw Normal View History

#ifndef __ISTREAM_H
#define __ISTREAM_H
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
// -*- C++ -*-
#ifndef __STD_ISTREAM__
#define __STD_ISTREAM__
/***************************************************************************
*
* istream - Declarations for the Standard Library istreams
*
***************************************************************************
*
* 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>
#include <ios>
#include <ostream>
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
extern istream _RWSTDExport cin;
#ifndef _RWSTD_NO_WIDE_CHAR
extern wistream _RWSTDExport wcin;
#endif
template<class charT, class traits>
class _RWSTDExportTemplate basic_istream : virtual public basic_ios<charT, traits>
{
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;
typedef basic_istream<charT, traits> istream_type;
typedef basic_ios<charT, traits> ios_type;
typedef basic_streambuf<charT, traits> streambuf_type;
_EXPLICIT basic_istream(basic_streambuf<charT, traits> *sb);
#if defined ( __SUNPRO_CC )
_EXPLICIT basic_istream(EmptyCtor) : basic_ios<charT, traits>(1) {}
#endif
virtual ~basic_istream();
class sentry
{
public:
inline _EXPLICIT sentry(basic_istream<charT,traits>& stream,
bool noskipws = 0)
: __stream(stream)
{
#ifdef _RWSTD_MULTI_THREAD
if ( stream.rdbuf() )
__guard = new _RWSTDGuard(stream.rdbuf()->buffer_mutex_);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#endif // _RWSTD_MULTI_THREAD
if(!(stream.good()))
{
stream.setstate(ios_base::failbit);
__ok = false;
}
else
{
if(stream.tie())
stream.tie()->flush();
if(!noskipws && (stream.flags() & ios_base::skipws))
{
int_type c;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const ctype<charT>& ct = use_facet< ctype<charT> >(stream.getloc());
#else
const ctype<charT>& ct = use_facet(stream.getloc(),(ctype<charT>*)0);
#endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
while((c = stream.rdbuf()->sgetc()),
( !traits::eq_int_type(c,traits::eof()) && ct.is(ct.space,c) ))
{
stream.rdbuf()->snextc();
}
if( traits::eq_int_type(c,traits::eof()) )
{
stream.setstate(ios_base::eofbit);
}
}
if(!(stream.good()))
{
stream.setstate(ios_base::failbit);
__ok = false;
}
else
__ok =true;
}
#if defined (_RWSTD_MULTI_THREAD) && !defined (_RWSTD_NO_EXCEPTIONS)
} catch(...)
{
if ( __stream.rdbuf() )
delete __guard;
throw;
}
#endif // _RWSTD_MULTI_THREAD etc.
}
~sentry() {
#ifdef _RWSTD_MULTI_THREAD
if ( __stream.rdbuf() )
delete __guard;
#endif // _RWSTD_MULTI_THREAD
}
operator bool () { return __ok; }
private:
basic_istream<charT,traits>& __stream;
bool __ok;
#ifdef _RWSTD_MULTI_THREAD
_RWSTDGuard* __guard;
#endif
};
istream_type& operator>>(istream_type& (*pf)(istream_type&));
istream_type& operator>>(ios_base& (*pf)(ios_base&));
istream_type& operator>>(ios_type& (*pf)(ios_type&));
#ifndef _RWSTD_NO_BOOL
istream_type& operator>>(bool& n);
#endif
istream_type& operator>>(short& n);
istream_type& operator>>(unsigned short& n);
istream_type& operator>>(int& n);
istream_type& operator>>(unsigned int& n);
istream_type& operator>>(long& n);
istream_type& operator>>(unsigned long& n);
istream_type& operator>>(float& f);
istream_type& operator>>(double& f);
istream_type& operator>>(long double& f);
#ifdef _RWSTD_LONG_LONG
istream_type& operator>>(_RWSTD_LONG_LONG& n);
istream_type& operator>>(unsigned _RWSTD_LONG_LONG& n);
#endif
istream_type& operator>>(void*& p);
istream_type& operator>>(streambuf_type& sb);
istream_type& operator>>(streambuf_type *sb);
int_type get()
{
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 = this->rdbuf()->sbumpc();
if( traits::eq_int_type(c,traits::eof()) )
{
err = ios_base::eofbit | ios_base::failbit;
}
else
{
__chcount = 1;
return c;
}
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
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 traits::eof();
}
istream_type& get(char_type *s, streamsize n, char_type delim);
istream_type& get(char_type *s, streamsize n)
{ return get(s,n,this->widen('\n')); }
istream_type& get(char_type& c);
istream_type& get(streambuf_type& sb, char_type delim);
istream_type& get(streambuf_type& sb)
{ return get(sb,this->widen('\n')); }
istream_type& getline(char_type *s, streamsize n, char_type delim);
istream_type& getline(char_type *s, streamsize n)
{ return getline(s,n,this->widen('\n')); }
istream_type& ignore(streamsize n = 1, int_type delim = traits::eof());
istream_type& read(char_type *s, streamsize n);
streamsize readsome(char_type *s, streamsize n);
int_type peek();
pos_type tellg();
//
// The seekg functions are inlined for portability
//
istream_type& seekg(pos_type pos)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
if ( this->rdstate() & ios_base::eofbit )
clear( this->rdstate() & ~ios_base::eofbit );
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() ) {
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif // _RWSTD_MULTI_THREAD
// using fail will disable seek when at end of char buffer, bad() would work better
if ( !this->fail() )
this->rdbuf()->pubseekpos(pos, ios_base::in);
#ifdef _RWSTD_MULTI_THREAD
}
#endif // _RWSTD_MULTI_THREAD
#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
return *this;
}
istream_type& seekg(off_type off, ios_base::seekdir dir)
{
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->fail() )
{
this->rdbuf()->pubseekoff(off, dir, ios_base::in);
}
#ifdef _RWSTD_MULTI_THREAD
}
#endif
#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 // _RWSTD_NO_EXCEPTIONS
return *this;
}
int sync();
istream_type& putback(char_type c);
istream_type& unget();
streamsize gcount() const;
#ifdef _RWSTD_MULTI_THREAD
_RWSTDGuard *istream_sentry_guard;
#endif
protected:
basic_istream( );
private:
streamsize __chcount;
};
/*
* Class basic_iostream
*/
template<class charT, class traits>
class _RWSTDExportTemplate basic_iostream : public basic_istream<charT, traits>,
public basic_ostream<charT, traits>
{
public:
_EXPLICIT basic_iostream(basic_streambuf<charT, traits> *sb);
virtual ~basic_iostream();
protected:
_EXPLICIT basic_iostream();
};
//
// istream iterator.
//
#ifdef _RWSTD_NO_UNDEFINED_FRIEND
template <class T, class charT, class traits, class Distance>
class _RWSTDExportTemplate istream_iterator;
template <class T, class charT, class traits, class Distance>
bool operator==
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#endif
#if !defined(_MSC_VER) || defined(__BORLANDC__)
template <class T, class charT, class traits, class Distance>
#else
template <class T, class charT=char, class traits=char_traits<charT>, class Distance=ptrdiff_t>
#endif
class _RWSTDExportTemplate istream_iterator
: public iterator<input_iterator_tag,T,Distance,const T*, const T&>
{
#ifdef __TURBOC__
friend inline bool (std::operator==) (
const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#else
friend inline bool operator== (
const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#endif
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_istream<charT,traits> istream_type;
typedef T value_type;
istream_iterator () : stream(&cin), end_marker(false) {}
istream_iterator (basic_istream<charT,traits>& s) : stream(&s) { read(); }
istream_iterator ( const istream_iterator<T,charT,traits,Distance>& x )
: stream(x.stream) , value(x.value) , end_marker(x.end_marker)
{ ; }
const T& operator* () const { return value; }
#ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
const T* operator->() const { return &value; }
#endif // _RWSTD_NO_NONCLASS_ARROW_RETURN
istream_iterator<T,charT,traits,Distance>& operator++ ()
{
read();
return *this;
}
istream_iterator<T,charT,traits,Distance> operator++ (int)
{
istream_iterator<T,charT,traits,Distance> tmp = *this;
read();
return tmp;
}
protected:
basic_istream<charT,traits>* stream;
T value;
bool end_marker;
void read ()
{
end_marker = (*stream) ? true : false;
if (end_marker) *stream >> value;
end_marker = (*stream) ? true : false;
}
};
template <class T, class charT, class traits, class Distance>
inline bool operator==
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return x.stream == y.stream && x.end_marker == y.end_marker ||
x.end_marker == false && y.end_marker == false;
}
#ifndef _RWSTD_NO_NAMESPACE
template <class T, class charT, class traits, class Distance>
inline bool operator!=
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return !(x == y);
}
#endif
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
ws(basic_istream<charT, traits>& is);
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
typedef basic_istream<char> istream;
#else
typedef basic_istream<char, char_traits<char> > istream;
#endif
#ifndef _RWSTD_NO_WIDE_CHAR
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
typedef basic_istream<wchar_t> wistream;
#else
typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
#endif
#endif
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
typedef basic_iostream<char> iostream;
#else
typedef basic_iostream<char, char_traits<char> > iostream;
#endif
#ifndef _RWSTD_NO_WIDE_CHAR
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
typedef basic_iostream<wchar_t> wiostream;
#else
typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;
#endif
#endif
// charT and charT* extractors
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<charT, traits>&, charT& );
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<charT, traits>&, charT* );
// signed and unsigned extractors
#ifndef _RWSTD_NO_SIGNED_CHAR_IN_STREAMS
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, unsigned char& );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, signed char& );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, unsigned char* );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, signed char* );
#endif
// String extractor and getline
#ifndef _RWSTD_NO_NAMESPACE
}
namespace __rwstd {
#endif
template <class streamT, class stringT, class traits>
streamT& rw_extract_string(streamT& is, stringT& s, traits);
#ifndef _RWSTD_NO_NAMESPACE
}
namespace std {
#endif
template<class charT, class traits, class Allocator>
inline basic_istream<charT, traits>&
operator>> (basic_istream<charT,traits>& is,
basic_string<charT,traits,Allocator>& s)
{
return __RWSTD::rw_extract_string(is,s,traits());
}
template<class charT, class traits, class Allocator>
basic_istream<charT, traits>& _RWSTDExportTemplate
getline( basic_istream<charT, traits>&,
basic_string<charT, traits, Allocator>&,
charT delim );
template<class charT, class traits, class Allocator>
inline basic_istream<charT, traits>&
getline( basic_istream<charT, traits>& is,
basic_string<charT, traits, Allocator>& str )
{ return getline(is,str,is.widen('\n')); }
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#ifdef _RWSTD_COMPILE_INSTANTIATE
#include <istream.cc>
#endif
#endif // __STD__ISTREAM__
#ifndef __USING_STD_NAMES__
using namespace std;
#endif
#pragma option pop
#endif /* __ISTREAM_H */