#ifndef __SSTREAM_CC #define __SSTREAM_CC #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig /*************************************************************************** * * sstream.cc - Declarations for the Standard Library basic strings * *************************************************************************** * * 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_NAMESPACE namespace std { #endif /* * basic_stringbuf(basic_ios::openmode) */ template basic_stringbuf:: basic_stringbuf( ios_base::openmode which) : basic_streambuf() , __data(0) , __length(0) , __end_pos(0) { this->setp(0,0); this->setg(0,0,0); basic_streambuf::mode_ = which; } /* * basic_stringbuf(const basic_string, ios_base::openmode) */ template basic_stringbuf:: basic_stringbuf(const string_type& s, ios_base::openmode which) : basic_streambuf() , __length(s.length()) { basic_streambuf::mode_ = which; __data = new charT[__length]; if(s.data()) traits::copy(__data, s.data(), __length); if(which & ios_base::in) this->setg(__data, __data, __data+__length); if(which & ios_base::out) this->setp(__data, __data+__length); if(which & ( ios_base::app | ios_base::ate ) ) pbump(__length); __end_pos = __length; } /* * virtual ~basic_stringbuf() */ template basic_stringbuf::~basic_stringbuf() { if ( __data ) delete [] __data; } /* * basic_string str() const */ template basic_string basic_stringbuf::str() const { if ( __end_pos == 0 ) return string_type(); if ( (__end_pos > ( this->pptr() - this->pbase() )) && (__end_pos > ( this->egptr() - this->eback() )) ) return string_type(__data, __end_pos); else { if ( ( this->pptr() - this->pbase() ) > ( this->egptr() - this->eback() ) ) return string_type(__data, this->pptr() - this->pbase() ); else return string_type(__data, this->egptr() - this->eback() ); } } /* * void str(const basic_string&) */ template void basic_stringbuf:: str(const string_type& s) { if ( __data ) delete [] __data; __length = s.length(); if(__length == 0) { this->setg(0,0,0); this->setp(0,0); __data = 0; __end_pos = 0; return; } __data = new charT[__length]; if(s.data()) traits::copy(__data, s.data(), __length); if(basic_streambuf::mode_ & ios_base::in) this->setg(__data, __data, __data+__length); if(basic_streambuf::mode_ & ios_base::out) { this->setp(__data, __data+__length); if( (basic_streambuf::mode_ & ios_base::app) || (basic_streambuf::mode_ & ios_base::ate ) ) this->pbump(__length); } __end_pos = __length; } /* * int_type overflow(int_type) */ template _TYPENAME basic_stringbuf::int_type basic_stringbuf::overflow(int_type c) { if((basic_streambuf::mode_ & ios_base::out) == 0) { return traits::eof(); } charT *temp; int old_numb_of_elements,new_numb_of_elements; const int increment=128; int_type var; if (this->pptr()) { old_numb_of_elements = this->pptr() - __data; new_numb_of_elements = old_numb_of_elements + increment; temp = new charT[new_numb_of_elements]; traits::copy(temp, __data, old_numb_of_elements); this->setp (temp,temp+new_numb_of_elements); this->pbump(old_numb_of_elements); charT *tmp=temp+(this->gptr()-this->eback()); this->setg(temp, tmp, this->pptr()+1); delete [] __data; __data = temp; } else { new_numb_of_elements=increment; temp = new charT[new_numb_of_elements]; this->setp(temp,temp+new_numb_of_elements); if((basic_streambuf::mode_ & ios_base::in) != 0) this->setg(temp, temp , temp); __data =temp; } if ( traits::eq_int_type(c,traits::eof()) ) var = traits::not_eof(c); else var = sputc(c); if ( (this->pptr() - this->pbase()) > __end_pos ) __end_pos = this->pptr() - this->pbase(); return var; } /* * int_type pbackfail(int_type) */ template _TYPENAME basic_stringbuf::int_type basic_stringbuf::pbackfail(int_type c) { if ( (!traits::eq_int_type(c,traits::eof())) && (this->gptr()>this->eback()) ) { if ( traits::eq(*(this->gptr()-1),traits::to_char_type(c)) ) { this->gbump(-1); return c; } else { if( basic_streambuf::mode_ & ios_base::out ) { this->gbump(-1); *this->gptr()=traits::to_char_type(c); return c; } } } if ( (traits::eq_int_type(c,traits::eof())) && (this->gptr()>this->eback()) ) { this->gbump(-1); return traits::not_eof(c); } return traits::eof(); } /* * basic_streambuf* setbuf(char_type* s, streamsize n) */ template basic_streambuf* basic_stringbuf::setbuf(char_type* s, streamsize n) { if((basic_streambuf::mode_ & ios_base::out) != 0) { if ( n > ( this->pptr() - this->pbase() ) ) { if ( s == 0 ) s = new charT[n]; if ( s ) { int old_numb_of_elements; if (this->pptr()) { old_numb_of_elements = this->pptr() - __data; traits::copy(s, __data, old_numb_of_elements); this->setp (s,s+n-1); this->pbump(old_numb_of_elements); charT *tmp=s+(this->gptr()-this->eback()); this->setg(s, tmp, this->pptr()+1); delete [] __data; __data = s; } else { this->setp(s,s+n-1); if((basic_streambuf::mode_ & ios_base::in) != 0) this->setg(s, s , s); __data =s; } } else return (basic_streambuf*)(0); } else return (basic_streambuf*)(0); } return (basic_streambuf*)(this); } /* * int_type underflow() */ template _TYPENAME basic_stringbuf::int_type basic_stringbuf::underflow() { if(this->gptr() && (this->gptr()egptr()) ) return traits::to_int_type(*this->gptr()); if(((this->pptr() != 0) && ( (this->pptr() > this->egptr()) || ( __end_pos > (this->egptr() - this->eback()) ) ) ) && (!this->gptr())) { if ( __end_pos > ( this->pptr() - this->pbase() ) ) this->setg(this->pbase(), this->pbase(), this->pbase()+__end_pos ); else this->setg(this->pbase(), this->pbase(), this->pptr()); return traits::to_int_type(*this->gptr()); } if((this->pptr() != 0) && ( (this->pptr() > this->egptr()) || ( __end_pos > ( this->egptr() - this->eback() )) ) ) { if ( __end_pos > ( this->pptr() - this->pbase() ) ) this->setg(this->eback(),this->gptr(),this->eback()+__end_pos); else this->setg(this->eback(), this->gptr(), this->pptr()); return traits::to_int_type(*this->gptr()); } return traits::eof(); } /* * pos_type seekoff(off_type, ios_base::seekdir, ios_base::openmode) */ template _TYPENAME basic_stringbuf::pos_type basic_stringbuf:: seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which) { streamsize newoff; if((which & ios_base::in) && (which & ios_base::out)) { if ( (way==ios_base::beg) || (way==ios_base::end) ) { if ( seekoff(off,way,ios_base::out) == pos_type(off_type(-1)) ) return pos_type(off_type(-1)); return seekoff(off,way,ios_base::in); } else return pos_type(off_type(-1)); } if((which & ios_base::in) && (this->gptr()!=0)) { if ( (this->egptr() - this->eback()) > __end_pos ) __end_pos = this->egptr() - this->eback(); if ( (this->pptr() - this->pbase()) > __end_pos ) __end_pos = this->pptr() - this->pbase(); if(way == ios_base::beg) newoff = 0; if(way == ios_base::cur) newoff = this->gptr() - this->eback(); if(way == ios_base::end) newoff = __end_pos; if ( newoff<0 ) return pos_type(off_type(-1)); if ( ((this->eback()+long(newoff)+long(off))> this->egptr()) || ((newoff+off)< 0) ) return pos_type(-1); this->setg(this->eback(), this->eback() + long(newoff) + long(off), this->egptr()); return pos_type(newoff+off); } if((which & ios_base::in) && (this->gptr()==0) && (this->egptr()==0) && (this->eback()==0) ) return pos_type(0); if((which & ios_base::out) && (this->pptr()!=0) && !(basic_streambuf::mode_ & ios_base::app) ) { if ( (this->egptr() - this->eback()) > __end_pos ) __end_pos = this->egptr() - this->eback(); if ( (this->pptr() - this->pbase()) > __end_pos ) __end_pos = this->pptr() - this->pbase(); if(way == ios_base::beg) newoff = 0; if(way == ios_base::cur) newoff = this->pptr() - this->pbase(); if(way == ios_base::end) newoff = __end_pos; if ( (this->pptr() - this->pbase()) > __end_pos ) __end_pos = this->pptr() - this->pbase(); if ( ((newoff+off)<0) || ((this->pbase()+long(newoff)+long(off))> this->epptr()) ) return pos_type(off_type(-1)); this->pbump( newoff+off-(this->pptr()-this->pbase()) ); if (this->eback() !=0 && this->gptr()<=this->pptr() ) this->setg(this->eback(),this->gptr(),this->pptr()); else { if ( (basic_streambuf::mode_ & ios_base::out ) && !(basic_streambuf::mode_ & ios_base::in ) ) this->setg(this->pbase(),this->pptr(),this->pptr()); } return pos_type(newoff+off); } else { if ( basic_streambuf::mode_ & ios_base::app ) return pos_type(this->pptr()-this->pbase()); if((which & ios_base::out) && (this->pptr()==0) && (this->epptr()==0) && (this->pbase()==0) ) return pos_type(0); } return pos_type(off_type(-1)); } /* * pos_type seekpos(pos_type, ios_base::openmode) */ template _TYPENAME basic_stringbuf::pos_type basic_stringbuf:: seekpos(pos_type sp, ios_base::openmode which) { streamsize newoff = sp; if((which & ios_base::in) && (which & ios_base::out)) { if ( seekpos(sp,ios_base::out) == pos_type(off_type(-1)) ) return pos_type(off_type(-1)); return seekpos(sp,ios_base::in); } if((which & ios_base::in) && (this->gptr()!=0)) { if ( newoff<0 ) return pos_type(off_type(-1)); if ( (this->eback()+long(newoff))> this->egptr() ) return pos_type(off_type(-1)); this->setg(this->eback(), this->eback() + long(newoff), this->egptr()); return pos_type(newoff); } if((which & ios_base::out) && (this->pptr()!=0) && !(basic_streambuf::mode_ & ios_base::app) ) { if ( (newoff<0) || ((this->pbase()+long(newoff))> this->epptr()) ) return pos_type(off_type(-1)); if ( (this->pptr() - this->pbase()) > __end_pos ) __end_pos = this->pptr() - this->pbase(); this->pbump( newoff-(this->pptr()-this->pbase()) ); if (this->eback() !=0 && this->gptr()<=this->pptr() ) this->setg(this->eback(),this->gptr(),this->pptr()); else { if ( (basic_streambuf::mode_ & ios_base::out ) && !(basic_streambuf::mode_ & ios_base::in ) ) this->setg(this->pbase(),this->pptr(),this->epptr()); } return pos_type(newoff); } else if ( basic_streambuf::mode_ & ios_base::app ) return pos_type(this->pptr()-this->pbase()); return pos_type(off_type(-1)); } /* * streamsize xsputn(const char_type *, streamsize) */ template streamsize basic_stringbuf:: xsputn(const char_type *s, streamsize n) { if ( !s || (n == 0) ) return 0; if ( n > ( this->epptr()-this->pptr()+128 ) ) { if ( setbuf(0, this->pptr()-this->pbase()+n+128)== 0) { return 0; } traits::copy(this->pptr(), s, n); this->pbump(n); __end_pos = (this->pptr() - this->pbase()); } else { int i=0; while((i < n) && ( !traits::eq_int_type(sputc(*s++),traits::eof()))) i++; return i; } return n; } /* * class basic_istringstream */ /* * basic_istringstream(ios_base::openmode) */ template basic_istringstream:: basic_istringstream(ios_base::openmode m) : basic_istream( ) , __sb(m | ios_base::in) { init(&__sb); } /* * basic_istringstream(const basic_string&, ios_base::openmode) */ template basic_istringstream:: basic_istringstream(const string_type& s, ios_base::openmode which) : basic_istream( ) , __sb(s, which | ios_base::in) { init(&__sb); } /* * virtual ~basic_istringstream() */ template basic_istringstream::~basic_istringstream() { } /* * basic_stringbuf *rdbuf() const */ template basic_stringbuf * basic_istringstream::rdbuf() const { return (basic_stringbuf *)&__sb; } /* * basic_string str() const */ template basic_string basic_istringstream::str() const { return __sb.str(); } /* * void str(const basic_string& ) */ template void basic_istringstream::str(const string_type& s) { __sb.str(s); } /* * class basic_ostringstring */ /* * basic_ostringstream(ios_base::openmode) */ template basic_ostringstream:: basic_ostringstream(ios_base::openmode w) : basic_ostream( ) , __sb(w | ios_base::out ) { init(&__sb); } /* * basic_ostringstream(const basic_string&, ios_base::openmode) */ template basic_ostringstream:: basic_ostringstream(const string_type& s, ios_base::openmode which) : basic_ostream( ) , __sb(s, which | ios_base::out ) { init(&__sb); } /* * virtual ~basic_ostringstream() */ template basic_ostringstream::~basic_ostringstream() { } /* * basic_stringbuf *rdbuf() const */ template basic_stringbuf * basic_ostringstream::rdbuf() const { return (basic_stringbuf *)&__sb; } /* * basic_string str() const */ template basic_string basic_ostringstream::str() const { return __sb.str(); } /* * void str(const basic_string& s) */ template void basic_ostringstream:: str(const string_type& s) { __sb.str(s); } /* * class basic_stringstream */ /* * basic_stringstream(ios_base::openmode) */ template basic_stringstream:: basic_stringstream(ios_base::openmode w) : basic_iostream( ) , __sb(w) { init(&__sb); } /* * basic_stringstream(const basic_string&, ios_base::openmode) */ template basic_stringstream:: basic_stringstream(const string_type& s, ios_base::openmode which) : basic_iostream( ) , __sb(s, which) { init(&__sb); } /* * virtual ~basic_stringstream() */ template basic_stringstream::~basic_stringstream() { } /* * basic_stringbuf *rdbuf() const */ template basic_stringbuf * basic_stringstream::rdbuf() const { return (basic_stringbuf *)&__sb; } /* * basic_string str() const */ template basic_string basic_stringstream::str() const { return __sb.str(); } /* * void str(const basic_string& s) */ template void basic_stringstream:: str(const string_type& s) { __sb.str(s); } #ifndef _RWSTD_NO_NAMESPACE } #endif #pragma option pop #endif /* __SSTREAM_CC */