#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 #else #include #endif #include #ifndef _RWSTD_NO_NAMESPACE namespace std { #endif /* * basic_istream manipulators * skips the next available white spaces */ template basic_istream& _RWSTDExportTemplate ws(basic_istream& 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& ct = use_facet< ctype >(is.getloc()); #else const ctype& ct = use_facet(is.getloc(),(ctype*)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 basic_istream:: basic_istream(basic_streambuf *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 basic_istream:: basic_istream( ) : __chcount(0) { } /* * ~basic_istream(); */ template basic_istream::~basic_istream() { } /* * istream_type& operator>>(istream_type& (*pf)(istream_type&)) * for functions relating to istreams */ template basic_istream& basic_istream:: operator>>(basic_istream& (*pf)(basic_istream&)) { (*pf)(*this); return *this; } /* * istream_type& operator>>(ios_base& (*pf)(ios_base&)) * for manipulators relating to the ios_base class */ template basic_istream& basic_istream:: 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 basic_istream& basic_istream:: operator>>(basic_ios& (*pf)(basic_ios&)) { (*pf)(*this); return *this; } /* * basic_istream& operator>>(basic_istream, charT *) * read in a charT *. */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& is, charT *p) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif if ( p!=0 ) { _TYPENAME basic_istream::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& ct = use_facet< ctype >(is.getloc()); #else const ctype& ct = use_facet(is.getloc(), (ctype*)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& operator>>(basic_istream&, charT& ) * read in a character */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& is, charT& c) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::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&,unsigned char& ) */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& is, unsigned char& uc) { is >> (char &)uc; return is; } /* * istream& operator>>(basic_istream&, signed char& ) */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& is, signed char& sc) { is >> (char &)sc; return is; } /* * istream& operator>>(basic_istream&, unsigned char* ) */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& is,unsigned char* uc) { is >> (char *)uc; return is; } /* * istream& operator>>(basic_istream&,signed char* ) */ template basic_istream& _RWSTDExportTemplate operator>>(basic_istream& 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 basic_istream& basic_istream::operator>>(bool& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(short& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { long l; #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(unsigned short& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(int& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { long l; #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(unsigned int& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(long& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(unsigned long& n) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(float& f) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(double& f) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(long double& f) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(_RWSTD_LONG_LONG& ll) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(unsigned _RWSTD_LONG_LONG& ull) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(void*& p) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::sentry ipfx(*this); if(ipfx) { #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE use_facet > >(this->getloc()) #else use_facet(this->getloc(),(num_get >*)0) #endif .get(istreambuf_iterator(*this),istreambuf_iterator(),*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 basic_istream& basic_istream::operator>>(streambuf_type& sb) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::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 basic_istream& basic_istream::operator>>(streambuf_type *sb) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif if ( sb!=0 ) { _TYPENAME basic_istream::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 basic_istream& basic_istream:: 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::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 basic_istream& basic_istream::get(char_type& s) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::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 basic_istream& basic_istream:: get(streambuf_type& sb, char_type delim) { ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::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 basic_istream& basic_istream:: 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::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 basic_istream& basic_istream::ignore(streamsize n, int_type delim) { _TYPENAME basic_istream::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 basic_istream& basic_istream::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::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 streamsize basic_istream::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 _TYPENAME basic_istream::int_type basic_istream::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 _TYPENAME basic_istream::pos_type basic_istream::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 basic_istream& basic_istream::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 basic_istream& basic_istream::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 streamsize basic_istream::gcount() const { return __chcount; } /* * int sync() */ template int basic_istream::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 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 basic_istream& _RWSTDExportTemplate getline (basic_istream& is, basic_string& str, charT delim ) { _TYPENAME traits::int_type c; ios_base::iostate err = 0; #ifndef _RWSTD_NO_EXCEPTIONS try { #endif _TYPENAME basic_istream::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 basic_iostream:: basic_iostream(basic_streambuf *sb) :basic_istream(sb) ,basic_ostream(sb) { } /* * basic_iostream( ) */ template basic_iostream:: basic_iostream( ) :basic_istream() ,basic_ostream() { } /* * ~basic_iostream() */ template basic_iostream:: ~basic_iostream() { } #ifndef _RWSTD_NO_NAMESPACE } #endif #pragma option pop #endif /* __ISTREAM_CC */