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/fstream.cc

1443 lines
35 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 __FSTREAM_CC
#define __FSTREAM_CC
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
/***************************************************************************
*
* fstream.cc - Definition for the Standard Library file streams
*
***************************************************************************
*
* 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 <cstdio>
#else
#include <stdio.h>
#endif // _RWSTD_NO_NEW_HEADER
#ifndef _RWSTD_STRICT_ANSI
#include <fcntl.h>
#endif
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
#ifdef __BORLANDC__
template <class T>
void __io_initialize (T& t, T val) { t = val; }
#pragma option -w-par
#endif
/*
* class basic_filebuf
*/
/*
* basic_filebuf()
*/
template<class charT, class traits>
basic_filebuf<charT, traits>::basic_filebuf()
: basic_streambuf<charT, traits>()
, __file(__closed())
, __data(0)
, __read_buff(false)
, __write_buff(false)
, __last_numb_read(0)
, __rwBufferSize(512)
, __absolute_pos(0)
{
__state_beg = new state_t;
__state_end = new state_t;
}
/*
* basic_filebuf(__file_type)
*/
template<class charT, class traits>
basic_filebuf<charT, traits>::basic_filebuf(__file_type fd)
: basic_streambuf<charT, traits>()
, __file(fd)
, __read_buff(false)
, __write_buff(false)
, __last_numb_read(0)
, __rwBufferSize(512)
, __absolute_pos(0)
{
__data = new char_type[__rwBufferSize+1];
__state_beg = new state_t;
__state_end = new state_t;
#ifndef _RWSTD_STRICT_ANSI
if ( fd == 0 )
basic_streambuf<charT,traits>::mode_ = ios_base::in;
else
{
if ( fd < 3 )
basic_streambuf<charT,traits>::mode_ = ios_base::out;
}
#else
if ( fd == stdin )
basic_streambuf<charT,traits>::mode_ = ios_base::in;
else
{
if ( __file_is_std(fd) )
basic_streambuf<charT,traits>::mode_ = ios_base::out;
}
#endif // _RWSTD_STRICT_ANSI
}
/*
* ~basic_filebuf()
*/
template<class charT, class traits>
basic_filebuf<charT, traits>::~basic_filebuf()
{
close();
delete __state_beg;
delete __state_end;
}
/*
* bool is_open() const
*/
template<class charT, class traits>
bool basic_filebuf<charT, traits>::is_open() const
{
#ifndef _RWSTD_STRICT_ANSI
return !(__file == -1);
#else
return !(__file == 0);
#endif
}
/*
* basic_filebuf *open(int fd)
* fstream compatibility
*/
#ifndef _RWSTD_NO_EXTENSION
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_filebuf<charT, traits>::
open(int fd )
{
if(__file != __closed())
return 0;
this->streambuf_init(false);
__file = fd;
__read_buff = false;
__write_buff = false;
__last_numb_read = 0;
delete [] __data;
__data = new char_type[__rwBufferSize+1];
if ( fd == 0 )
basic_streambuf<charT,traits>::mode_ = ios_base::in;
else
{
if ( fd < 3 )
basic_streambuf<charT,traits>::mode_ = ios_base::out;
}
return this;
}
#endif // _RWSTD_NO_EXTENSION
/*
* basic_filebuf *open(const char *, ios_base::openmode, long )
* opens a file and allocates a buffer
*/
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_filebuf<charT, traits>::
open(const char *s, ios_base::openmode mode, long protection)
{
long m;
if ( mode & ios_base::ate )
// m = mode & (~ios_base::ate); // RW_BUG
m = mode & (~ios_base::ate) | ios_base::app; // RW_BUG: fix for bts-46733
else
m = mode;
#ifndef _RWSTD_STRICT_ANSI
// Unset the nocreate/noreplace flags in case they exist,
// these flags are not in the __RWSTD::__rwOpenTable table
m = m & (~ios_base::nocreate);
m = m & (~ios_base::noreplace);
#endif
if(__file != __closed())
return 0;
basic_streambuf<charT,traits>::mode_ = mode;
this->streambuf_init(false);
#ifndef _RWSTD_STRICT_ANSI
if(__RWSTD::__rwOpenTable[m] == -1)
return 0;
int mm = __RWSTD::__rwOpenTable[m];
// now do the right thing for nocreate/noreplace
if ( mode & ios_base::out ) {
if ( mode & ios_base::nocreate )
mm &= ~O_CREAT;
if ( mode & ios_base::noreplace )
mm |= O_EXCL;
}
if((__file = ::open(s, mm, protection)) == __closed())
return 0;
#else
if(__RWSTD::__rwOpenTable[m] == 0)
return 0;
if((__file = fopen(s, __RWSTD::__rwOpenTable[m])) == __closed())
return 0;
setvbuf(__file,0,_IONBF,0);
#endif // _RWSTD_STRICT_ANSI
delete [] __data;
__data = new char_type[__rwBufferSize+1];
if(mode & ios_base::ate)
{
if( (__absolute_pos = __file_seek(__file, 0, SEEK_END))== -1 )
{
close();
delete [] __data;
__data = 0;
__file = __closed();
return 0;
}
}
return this;
}
/*
* basic_filebuf *close()
* closes a file if one was already open. Also deletes the
* data, if it was allocated
*/
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_filebuf<charT, traits>::close()
{
delete __state_beg;
delete __state_end;
__state_beg = new state_t;
__state_end = new state_t;
__absolute_pos = 0;
if ( (__file_is_std(__file)) && (__file != __closed()) )
{
if ( __write_buff )
overflow( traits::eof() );
__read_buff=false;
__write_buff=false;
__last_numb_read=0;
return this;
}
if(__file != __closed())
{
if ( __write_buff )
overflow( traits::eof() );
delete [] __data;
__data = 0;
__read_buff=false;
__write_buff=false;
__last_numb_read=0;
if(__file_close(__file) == -1)
return 0;
__file = __closed();
return this;
}
return 0;
}
/*
* streamsize showmanyc()
*/
template<class charT, class traits>
streamsize
basic_filebuf<charT, traits>::showmanyc()
{
if ( this->gptr() )
return (int)(this->egptr()-this->gptr());
if ( this->pptr() && __read_buff )
return (streamsize)(this->epptr()-this->pptr());
return 0;
}
/*
* int_type overflow(int_type)
* this is called when the put pointer overruns the buffer.
* it should flush what was in the put buffer, and move the pointer
* back to the beginning
*/
template<class charT, class traits>
_TYPENAME basic_filebuf<charT, traits>::int_type
basic_filebuf<charT, traits>::overflow(int_type c)
{
long count = this->pptr() - this->pbase();
bool do_noconv;
if(__file == __closed())
return traits::eof();
if ( (this->pptr()==0) && this->gptr() )
{
this->setp(this->eback(),this->eback()+__rwBufferSize);
pbump((int)(this->gptr()-this->eback()));
this->setg(0,0,0);
if ( this->pptr()<this->epptr() )
{
if( !traits::eq_int_type(c,traits::eof()) )
{
sputc( traits::to_char_type(c) );
this->gbump(1);
__write_buff=true;
return traits::to_int_type(*this->pptr());
}
}
count= this->pptr() - this->pbase();
}
if ( (this->pptr()==0) && (this->gptr()==0) )
this->setp(__data,__data+ __rwBufferSize);
__write_buff= false;
if(count)
{
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
do_noconv = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
do_noconv = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.always_noconv();
if ( do_noconv )
{
if ( __read_buff )
{
if ( __file_seek(__file, -__last_numb_read, SEEK_CUR) == -1 )
return traits::eof();
}
if(!__file_write(__file,(char *)this->pbase(),sizeof(charT),count))
return traits::eof();
}
else
{
long size_to = count*sizeof(charT);
const charT *from_next =0;
char *to= new char[size_to];
char *to_next = 0;
codecvt_base::result conv_result;
if ( __read_buff )
{
if ( __file_seek(__file, -__last_numb_read, SEEK_CUR) == -1 )
return traits::eof();
else
{
state_t *tmp = __state_beg;
__state_beg = __state_end;
__state_end = tmp;
}
}
*__state_beg = *__state_end;
do {
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
conv_result = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
conv_result = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.out(*__state_end,this->pbase(),this->pptr(),from_next,
to,to+size_to,to_next);
if ( conv_result == codecvt_base::noconv ) break;
if ( (conv_result == codecvt_base::partial) || ( from_next != this->pptr() ) )
{
size_to *= 2;
char *to_bis = new char[size_to];
long diff_to = to_next - to;
memcpy(to_bis,to,diff_to);
delete [] to;
to = to_bis;
to_next = to + diff_to;
}
}while( (conv_result == codecvt_base::partial) || ( from_next != this->pptr()));
if ( conv_result==codecvt_base::error )
{
delete [] to;
return traits::eof();
}
if (conv_result == codecvt_base::noconv)
{
if(!__file_write(__file, (char*)this->pbase(), sizeof(charT), count))
{
delete [] to;
return traits::eof();
}
}
else
{
if(!__file_write(__file, to, sizeof(char),to_next-to))
{
delete [] to;
return traits::eof();
}
}
delete [] to;
}
}
this->setp(__data, __data+__rwBufferSize);
this->setg(0,0,0);
__read_buff = false;
__write_buff= false;
__absolute_pos = __file_seek(__file,0,SEEK_CUR);
if( !traits::eq_int_type(c,traits::eof()) )
{
sputc(traits::to_char_type(c));
this->gbump(1);
__write_buff = true;
}
else
this->setp(0,0);
return traits::not_eof(c);
}
/*
* int_type pbackfail(int_type)
*/
template<class charT, class traits>
_TYPENAME basic_filebuf<charT, traits>::int_type
basic_filebuf<charT, traits>::pbackfail(int_type c)
{
if(__file == __closed())
return traits::eof();
if ( (this->gptr()==0) && this->pptr() )
{
if ( __read_buff )
this->setg(this->pbase(),this->pptr(),this->epptr());
else
this->setg(this->pbase(),this->pptr(),this->pptr());
}
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
{
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<charT,traits>* setbuf(char_type*,streamsize)
*/
template<class charT, class traits>
basic_streambuf<charT, traits>*
basic_filebuf<charT, traits>::setbuf(char_type *s, streamsize n)
{
if (n>0)
{
if ( __file != __closed() )
{
if ( !traits::eq_int_type(overflow( traits::eof() ),traits::eof()) )
{
if ( s )
{
delete [] __data;
__rwBufferSize = n-1;
__data=s;
}
else
{
charT *tmp;
__rwBufferSize = n;
tmp = new char_type[__rwBufferSize+1];
delete [] __data;
__data = tmp;
}
this->setp(0,0);
this->setg(0,0,0);
__read_buff=false;
__write_buff=false;
}
}
else
{
if ( s )
{
__rwBufferSize = n-1;
__data =s;
this->setp(0,0);
this->setg(0,0,0);
__write_buff= false;
__read_buff = false;
}
else
__rwBufferSize = n;
}
}
return (basic_streambuf<charT,traits>*)(this);
}
/*
* int_type underflow()
* this is called when the get pointer "underflows" the buffer,
* or when there are no more "get" characters.
*/
template<class charT, class traits>
_TYPENAME basic_filebuf<charT, traits>::int_type
basic_filebuf<charT, traits>::underflow()
{
bool do_noconv;
long offset;
#ifndef __BORLANDC__
offset = 0;
#else
__io_initialize(offset,0L);
#endif
if(__file == __closed())
return traits::eof();
if ( (this->gptr()==0) && this->pptr() )
{
if ( __read_buff )
this->setg(this->pbase(),this->pptr(),this->epptr());
else
this->setg(this->pbase(),this->pptr(),this->pptr());
this->setp(0,0);
}
if(this->gptr() && (this->gptr()<this->egptr()) ) return traits::to_int_type(*this->gptr());
if( ((__write_buff) && this->gptr() ) || ((__write_buff) && this->pptr() ) )
{
if ( traits::eq_int_type(overflow( traits::eof() ),traits::eof()) )
return traits::eof();
this->setg(this->pbase(),this->pptr(),this->epptr());
this->setp(0,0);
__write_buff = false;
}
__absolute_pos = __file_seek(__file,0,SEEK_CUR);
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
do_noconv = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
do_noconv = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.always_noconv();
if ( do_noconv )
{
streamoff last_numb_read = __file_read(__file, (char *)__data,sizeof(charT),__rwBufferSize);
if( last_numb_read <= 0 )
return traits::eof();
offset = last_numb_read/sizeof(charT);
__last_numb_read = __get_chars(__data,__data + last_numb_read);
}
else
{
long from_size = __rwBufferSize*sizeof(charT);
const char *from_next =0;
char *from= new char[from_size];
charT *to_next = 0;
codecvt_base::result conv_result;
streamoff last_numb_read = 0;
long new_numb_read;
do {
new_numb_read = __file_read(__file, from+last_numb_read
,sizeof(char),__rwBufferSize);
if( new_numb_read <= 0 )
break;
last_numb_read += new_numb_read;
*__state_beg = *__state_end;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
conv_result = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
conv_result = use_facet(this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.in(*__state_end,from,from+last_numb_read,from_next,__data,
__data+__rwBufferSize,to_next);
if ( (conv_result == codecvt_base::error) ||
(conv_result == codecvt_base::noconv) ) break;
if ( (to_next != (__data + __rwBufferSize) ) &&
( (size_t)new_numb_read == __rwBufferSize*sizeof(charT) ) )
{
from_size *= 2;
char *from_bis = new char[from_size];
long diff_from = from_next - from;
memcpy(from_bis,from,last_numb_read);
delete [] from;
from = from_bis;
from_next = from + diff_from;
}
} while ( (to_next != (__data + __rwBufferSize) ) &&
( (size_t)new_numb_read == __rwBufferSize*sizeof(charT) ) );
if( last_numb_read <= 0 )
return traits::eof();
__last_numb_read = last_numb_read;
if ( (conv_result==codecvt_base::error) ||
(conv_result==codecvt_base::partial) )
{
delete [] from;
return traits::eof();
}
else
{
if (conv_result==codecvt_base::noconv)
{
memcpy((char*)__data,from,__last_numb_read);
offset = __last_numb_read;
}
else
{
long diff_minus = new_numb_read - (from_next - from);
if ( __file_seek(__file, -diff_minus, SEEK_CUR) == -1 )
return traits::eof();
__last_numb_read -= diff_minus;
offset = to_next - __data;
}
}
delete [] from;
}
if(__last_numb_read)
{
this->setg(__data, __data, __data+offset);
this->setp(0, 0);
__read_buff=true;
return traits::to_int_type(*this->gptr());
}
return traits::eof();
}
/*
* pos_type seekoff(off_type, ios_base::seekdir, ios_base::openmode)
*/
template<class charT, class traits>
_TYPENAME basic_filebuf<charT, traits>::pos_type
basic_filebuf<charT, traits>::seekoff(off_type off,
ios_base::seekdir way,
ios_base::openmode which)
{
off_type loff = off;
pos_type newoff;
if(__file == __closed())
return pos_type(off_type(-1));
if ( (off == off_type(-1)) && (way==ios_base::beg) )
return pos_type(off_type(-1));
if ( (way==ios_base::cur) )
{
streamsize remain_in_buffer=0;
charT * remain_start=0;
charT * remain_end=0;
if ( __read_buff )
{
if ( this->gptr() )
{
if (!this->eback())
remain_in_buffer= this->egptr()-this->gptr();
else
remain_in_buffer= __get_chars(this->gptr(),this->egptr());
remain_start = this->gptr();
remain_end = this->egptr();
}
else
{
if ( this->pbase() )
{
remain_in_buffer= __get_chars(this->pptr(),this->epptr());
remain_start = this->pptr();
remain_end = this->epptr();
}
}
}
else
{
if ( __write_buff )
{
if ( this->pbase() )
{
remain_in_buffer= -(__get_chars(this->pbase(),this->pptr()));
remain_start = this->pbase();
remain_end = this->pptr();
}
else
{
if ( this->eback() )
{
remain_in_buffer= -(__get_chars(this->eback(),this->gptr()));
remain_start = this->eback();
remain_end = this->gptr();
}
}
}
}
int const_conv;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const_conv = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
const_conv = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.encoding();
// If characters are not a constant size can't seek from current position
if ( (off != off_type(0)) && (const_conv <= 0) ) {
return pos_type(off_type(-1));
}
if ( const_conv > 0 )
{
if (off !=off_type(0)) {
if (__write_buff ) {
overflow( traits::eof() );
__write_buff = false;
return ( __file_seek(__file, loff*const_conv,SEEK_CUR)/const_conv);
}
this->setp(0,0);
this->setg(0,0,0);
return ( __file_seek(__file, -((remain_in_buffer-loff)*const_conv), SEEK_CUR)/const_conv);
}
return ( (__file_seek(__file,0,SEEK_CUR)-remain_in_buffer*const_conv)/const_conv);
}
else
{
// First find current position in file
newoff = __file_seek(__file, 0, SEEK_CUR);
// If necessary convert characters in buffer to
// find offset from file position
if (remain_in_buffer != 0 && this->eback())
{
long to_size = __rwBufferSize;
const charT *from = remain_start;
const charT *from_next = from;
const charT *from_end = remain_end;
char *to_base = new char[to_size];
char *to = to_base;
char *to_next = to;
char *to_end = to + to_size;
codecvt_base::result conv_result;
do {
*__state_beg = *__state_end;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
conv_result = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
conv_result = use_facet(this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.out(*__state_end,from,from_end,from_next,to,to_end,to_next);
if ( (conv_result == codecvt_base::error) ||
(conv_result == codecvt_base::noconv) ) break;
if ( to_next == to_end && from_next != from_end )
{
long diff_to = to_next - to_base;
to_size *= 2;
to = new char[to_size];
memcpy(to,to_base,diff_to);
delete [] to_base;
to_base = to;
to = to_base + diff_to;
to_next = to;
from = from_next;
to_end = to_base + to_size;
}
} while ( from_next != from_end );
// Calculate new file position
// The + remain_in_buffer - ... stuff is used to deal
// with WIN32 CR/LF translations (see __get_chars())
if (remain_in_buffer > 0)
newoff -= (to_next - to_base)
+ (remain_in_buffer - (remain_end-remain_start));
else
newoff += (to_next - to_base)
+ (-remain_in_buffer - (remain_end-remain_start));
delete [] to;
}
return newoff;
}
}
int const_conv;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const_conv = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
const_conv = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.encoding();
if ( const_conv < 1 )
{
if ( (way==ios_base::beg) && (off==off_type(0)) )
{
seekpos(0);
}
else
return pos_type(off_type(-1));
}
if ( __write_buff)
{
overflow( traits::eof() );
__write_buff =false;
}
int w = (way == ios_base::beg) ?
SEEK_SET : ((way == ios_base::cur) ? SEEK_CUR : SEEK_END);
newoff = __file_seek(__file, loff*const_conv, w);
this->setp(0,0);
this->setg(0,0,0);
return newoff;
}
/*
* pos_type seekpos(pos_type, ios_base::openmode)
*/
template<class charT, class traits>
_TYPENAME basic_filebuf<charT, traits>::pos_type
basic_filebuf<charT, traits>::
seekpos(pos_type sp, ios_base::openmode which)
{
if(__file == __closed())
return pos_type(off_type(-1));
if( sp == pos_type(off_type(-1)) )
return pos_type(off_type(-1));
int const_conv;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const_conv = use_facet< codecvt<charT,char,state_t> >(this->getloc())
#else
const_conv = use_facet( this->getloc(), (codecvt<charT,char,state_t>* )0)
#endif
.encoding();
if ( const_conv > 0 )
return seekoff(off_type(sp), ios_base::beg, which);
_TYPENAME traits::off_type end_pos = __file_seek(__file,0,SEEK_END);
if ( __file_seek(__file, sp, SEEK_SET) == -1 )
return pos_type(off_type(-1));
this->setp(0,0);
this->setg(0,0,0);
*__state_beg = *__state_end = sp.state();
if ( traits::eq_int_type(underflow(),traits::eof()) && (end_pos > sp))
return pos_type(off_type(-1));
return sp;
}
/*
* int sync()
* this synchronizes the buffers and their streams
*/
template<class charT, class traits>
int basic_filebuf<charT, traits>::sync()
{
if ( this->which_open_mode( ) & ios_base::out )
{
#ifndef _RWSTD_STRICT_ANSI
if ( __file == 1 || __file == 2)
#else
if ( __file == stdout || __file == stderr )
#endif
{
if( traits::eq_int_type(overflow(traits::eof()),traits::eof()) )
return -1;
}
else
{
pos_type p_out = seekoff(0,ios_base::cur,ios_base::out);
pos_type tmp_out = __file_seek(__file,0,SEEK_CUR);
pos_type end_out = __file_seek(__file,0,SEEK_END);
__file_seek(__file,tmp_out,SEEK_SET);
if ( end_out > p_out )
{
if( seekpos(p_out) == pos_type(off_type(-1)))
return -1;
}
else if (__write_buff)
{
if( traits::eq_int_type(overflow(traits::eof()),traits::eof()) )
return -1;
}
}
}
if ( this->which_open_mode( ) & ios_base::in )
{
#ifndef _RWSTD_STRICT_ANSI
if ( __file != 0 )
#else
if ( __file != stdin )
#endif
{
pos_type p_in = seekoff(0,ios_base::cur,ios_base::in);
pos_type tmp_in = __file_seek(__file,0,SEEK_CUR);
pos_type end_in = __file_seek(__file,0,SEEK_END);
__file_seek(__file,tmp_in,SEEK_SET);
if ( end_in > p_in )
{
if( seekpos(p_in) == pos_type(off_type(-1)))
return -1;
}
}
}
return 0;
}
/*
* streamsize xsputn(const char_type *, streamsize)
*/
template<class charT, class traits>
streamsize basic_filebuf<charT, traits>::
xsputn(const char_type *s, streamsize n)
{
if ( !s || (n == 0) ) return 0;
if ( n > __rwBufferSize )
{
if ( traits::eq_int_type(overflow( traits::eof() ),traits::eof()) )
return 0;
char_type *eback_s = this->eback();
char_type *gptr_s = this->gptr();
char_type *egptr_s = this->egptr();
char_type *pbase_s = this->pbase();
char_type *pptr_s = this->pptr();
char_type *epptr_s = this->epptr();
this->setg(0,0,0);
this->setp((char_type *)s,(char_type *)(s+n));
basic_streambuf<charT, traits>::pbump(n);
if ( traits::eq_int_type(overflow( traits::eof() ),traits::eof()) )
return 0;
this->setg(eback_s,gptr_s,egptr_s);
this->setp(pbase_s,epptr_s);
pbump(pptr_s-pbase_s);
return n;
}
else
{
int i=0;
while((i < n) && ( !traits::eq_int_type(sputc(*s++),traits::eof())))
i++;
return i;
}
}
/*
* class basic_ifstream : public basic_istream
*/
/*
* basic_ifstream()
*/
template<class charT, class traits>
basic_ifstream<charT, traits>::basic_ifstream()
: basic_istream<charT, traits>( )
{
init(&__fb);
}
/*
* basic_ifstream(const char *, ios_base::openmode, long)
* opens a filebuf for (most likely) reading
*/
template<class charT, class traits>
basic_ifstream<charT, traits>::basic_ifstream(const char *s,
ios_base::openmode mode,
long protection )
: basic_istream<charT, traits>( )
{
init(&__fb);
open(s, mode, protection);
}
/*
* basic_ifstream(int fd)
* opens a filebuf for reading
*/
#ifndef _RWSTD_NO_EXTENSION
template<class charT, class traits>
basic_ifstream<charT, traits>::
basic_ifstream(int fd)
: basic_istream<charT, traits>( )
{
init(&__fb);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
/*
* basic_ifstream(int fd, char_type *buf, int len)
* opens a filebuf for reading
*/
template<class charT, class traits>
basic_ifstream<charT, traits>::
basic_ifstream(int fd, char_type *buf, int len)
: basic_istream<charT, traits>( )
{
init(&__fb);
if ( ( buf!=0 ) && ( len>0 ) )
__fb.pubsetbuf(buf,len);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
#endif // _RWSTD_NO_EXTENSION
/*
* ~basic_ifstream()
*/
template<class charT, class traits>
basic_ifstream<charT, traits>::~basic_ifstream()
{
}
/*
* basic_filebuf *rdbuf() const
* returns the streambuf associated with this stream
*/
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_ifstream<charT, traits>::rdbuf() const
{
return (basic_filebuf<charT, traits> *)&__fb;
}
/*
* bool is_open()
*/
template<class charT, class traits>
bool basic_ifstream<charT, traits>::is_open()
{
return __fb.is_open();
}
/*
* void open(const char *, ios_base::openmode, long )
* opens up a file
*/
template<class charT, class traits>
void basic_ifstream<charT, traits>::open(const char *s,
ios_base::openmode mode,
long protection )
{
this->clear();
mode |= ios_base::in;
if ( !__fb.open(s, mode, protection) )
this->setstate(ios_base::failbit);
}
/*
* void close()
*/
template<class charT, class traits>
void basic_ifstream<charT, traits>::close()
{
if(!is_open())
return;
if(!__fb.close())
this->setstate(ios_base::failbit);
else
this->clear();
}
/*
* class basic_ofstream : public basic_ostream
*/
/*
* basic_ofstream()
*/
template<class charT, class traits>
basic_ofstream<charT, traits>::basic_ofstream()
: basic_ostream<charT, traits>( )
{
init(&__fb);
}
/*
* basic_ofstream(const char *, ios_base::openmode, long )
*/
template<class charT, class traits>
basic_ofstream<charT, traits>::
basic_ofstream(const char *s, ios_base::openmode mode, long protection)
: basic_ostream<charT, traits>()
{
init(&__fb);
open(s, mode, protection);
}
/*
* basic_ofstream(int fd)
* opens a filebuf for writing
*/
#ifndef _RWSTD_NO_EXTENSION
template<class charT, class traits>
basic_ofstream<charT, traits>::
basic_ofstream(int fd)
: basic_ostream<charT, traits>( )
{
init(&__fb);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
/*
* basic_ofstream(int fd, char_type *buf, int len)
* opens a filebuf for writing
*/
template<class charT, class traits>
basic_ofstream<charT, traits>::
basic_ofstream(int fd, char_type *buf, int len)
: basic_ostream<charT, traits>( )
{
init(&__fb);
if ( ( buf!=0 ) && ( len>0 ) )
__fb.pubsetbuf(buf,len);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
#endif // _RWSTD_NO_EXTENSION
/*
* ~basic_ofstream()
*/
template<class charT, class traits>
basic_ofstream<charT, traits>::~basic_ofstream()
{
}
/*
* basic_filebuf *rdbuf() const
*/
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_ofstream<charT, traits>::rdbuf() const
{
return (basic_filebuf<charT, traits> *)&__fb;
}
/*
* bool is_open()
*/
template<class charT, class traits>
bool basic_ofstream<charT, traits>::is_open()
{
return __fb.is_open();
}
/*
* void open(const char *, ios_base::openmode)
*/
template<class charT, class traits>
void basic_ofstream<charT, traits>::open(const char *s,
ios_base::openmode mode,
long protection )
{
this->clear();
mode |= ios_base::out;
if ( !__fb.open(s, mode, protection) )
this->setstate(ios_base::failbit);
}
/*
* void close()
*/
template<class charT, class traits>
void basic_ofstream<charT, traits>::close()
{
if(!is_open())
return;
if(!__fb.close())
this->setstate(ios_base::failbit);
else
this->clear();
}
/*
* class basic_fstream : public basic_iostream
*/
/*
* basic_fstream()
*/
template<class charT, class traits>
basic_fstream<charT, traits>::basic_fstream()
: basic_iostream<charT, traits>( )
{
init(&__fb);
}
/*
* basic_fstream(const char *, ios_base::openmode, long)
*
* opens a filebuf for reading and writing
*/
template<class charT, class traits>
basic_fstream<charT, traits>::
basic_fstream(const char *s, ios_base::openmode mode, long protection)
: basic_iostream<charT, traits>( )
{
init(&__fb);
open(s, mode, protection);
}
/*
* basic_fstream(int fd)
* opens a filebuf for reading and writing
*/
#ifndef _RWSTD_NO_EXTENSION
template<class charT, class traits>
basic_fstream<charT, traits>::
basic_fstream(int fd)
: basic_iostream<charT, traits>( )
{
init(&__fb);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
/*
* basic_fstream(int fd, char_type *buf, int len)
* opens a filebuf for reading and writing
*/
template<class charT, class traits>
basic_fstream<charT, traits>::
basic_fstream(int fd, char_type *buf, int len)
: basic_iostream<charT, traits>( )
{
init(&__fb);
if ( ( buf!=0 ) && ( len>0 ) )
__fb.pubsetbuf(buf,len);
if ( !__fb.open(fd) )
this->setstate(ios_base::failbit);
}
#endif // _RWSTD_NO_EXTENSION
/*
* ~basic_fstream()
*/
template<class charT, class traits>
basic_fstream<charT, traits>::~basic_fstream()
{
}
/*
* basic_filebuf *rdbuf() const
* returns the streambuf associated with this stream
*/
template<class charT, class traits>
basic_filebuf<charT, traits> *
basic_fstream<charT, traits>::rdbuf() const
{
return (basic_filebuf<charT, traits> *)&__fb;
}
/*
* bool is_open()
*/
template<class charT, class traits>
bool basic_fstream<charT, traits>::is_open()
{
return __fb.is_open();
}
/*
* void open(const char *, ios_base::openmode, long)
* opens up a file
*/
template<class charT, class traits>
void basic_fstream<charT, traits>::
open(const char *s, ios_base::openmode mode, long protection)
{
this->clear();
if ( !__fb.open(s, mode, protection) )
this->setstate(ios_base::failbit);
}
/*
* void close()
*/
template<class charT, class traits>
void basic_fstream<charT, traits>::close()
{
if(!is_open())
return;
if(!__fb.close())
this->setstate(ios_base::failbit);
else
this->clear();
}
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#pragma option pop
#endif /* __FSTREAM_CC */