#include "iostreamP.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "builtinbuf.h"
void filebuf::init()
{
_IO_file_init(this);
}
filebuf::filebuf()
{
_IO_file_init(this);
}
#if !_IO_UNIFIED_JUMPTABLES
filebuf* filebuf::__new()
{
filebuf *fb = new filebuf;
_IO_JUMPS(fb) = &_IO_file_jumps;
fb->_vtable() = builtinbuf_vtable;
return fb;
}
#endif
filebuf::filebuf(int fd)
{
_IO_file_init(this);
_IO_file_attach(this, fd);
}
filebuf::filebuf(int fd, char* p, int len)
{
_IO_file_init(this);
_IO_file_attach(this, fd);
setbuf(p, len);
}
filebuf::~filebuf()
{
if (_IO_file_is_open(this))
{
_IO_do_flush (this);
if (!(xflags() & _IO_DELETE_DONT_CLOSE))
_IO_SYSCLOSE (this);
}
}
#if defined (__APPLE_CC__) && __APPLE_CC__ <= 808
static int workaround_open(const char *filename, int mode, int prot)
{
return ::open(filename, mode, prot);
}
#endif
filebuf* filebuf::open(const char *filename, ios::openmode mode, int prot)
{
if (_IO_file_is_open (this))
return NULL;
int posix_mode;
int read_write;
if (mode & ios::app)
mode |= ios::out;
if ((mode & (ios::in|ios::out)) == (ios::in|ios::out)) {
posix_mode = O_RDWR;
read_write = 0;
}
else if (mode & ios::out)
posix_mode = O_WRONLY, read_write = _IO_NO_READS;
else if (mode & (int)ios::in)
posix_mode = O_RDONLY, read_write = _IO_NO_WRITES;
else
posix_mode = 0, read_write = _IO_NO_READS+_IO_NO_WRITES;
if (mode & ios::binary)
{
mode &= ~ios::binary;
#ifdef O_BINARY
posix_mode |= O_BINARY;
#endif
}
if ((mode & (int)ios::trunc) || mode == (int)ios::out)
posix_mode |= O_TRUNC;
if (mode & ios::app)
posix_mode |= O_APPEND, read_write |= _IO_IS_APPENDING;
if (!(mode & (int)ios::nocreate) && mode != ios::in)
posix_mode |= O_CREAT;
if (mode & (int)ios::noreplace)
posix_mode |= O_EXCL;
#if _G_HAVE_IO_FILE_OPEN
return (filebuf*)_IO_file_open (this, filename, posix_mode, prot,
read_write, 0);
#else
#if defined (__APPLE_CC__) && __APPLE_CC__ <= 808
int fd = workaround_open(filename, posix_mode, prot);
#else
int fd = ::open(filename, posix_mode, prot);
#endif
if (fd < 0)
return NULL;
_fileno = fd;
xsetflags(read_write, _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
if (mode & (ios::ate|ios::app)) {
if (pubseekoff(0, ios::end) == EOF)
return NULL;
}
_IO_link_in(this);
return this;
#endif
}
filebuf* filebuf::open(const char *filename, const char *mode)
{
#if _G_IO_IO_FILE_VERSION == 0x20001
return (filebuf*)_IO_file_fopen(this, filename, mode, 0);
#else
return (filebuf*)_IO_file_fopen(this, filename, mode);
#endif
}
filebuf* filebuf::attach(int fd)
{
return (filebuf*)_IO_file_attach(this, fd);
}
streambuf* filebuf::setbuf(char* p, int len)
{
return (streambuf*)_IO_file_setbuf (this, p, len);
}
int filebuf::doallocate() { return _IO_file_doallocate(this); }
int filebuf::overflow(int c)
{
return _IO_file_overflow(this, c);
}
int filebuf::underflow()
{
return _IO_file_underflow(this);
}
int filebuf::sync()
{
return _IO_file_sync(this);
}
streampos filebuf::seekoff(streamoff offset, _seek_dir dir, int mode)
{
return _IO_file_seekoff (this, offset, dir, mode);
}
filebuf* filebuf::close()
{
return (_IO_file_close_it(this) ? (filebuf*)NULL : this);
}
streamsize filebuf::sys_read(char* buf, streamsize size)
{
return _IO_file_read(this, buf, size);
}
streampos filebuf::sys_seek(streamoff offset, _seek_dir dir)
{
return _IO_file_seek(this, offset, dir);
}
streamsize filebuf::sys_write(const char *buf, streamsize n)
{
return _IO_file_write (this, buf, n);
}
int filebuf::sys_stat(void* st)
{
return _IO_file_stat (this, st);
}
int filebuf::sys_close()
{
return _IO_file_close (this);
}
streamsize filebuf::xsputn(const char *s, streamsize n)
{
return _IO_file_xsputn(this, s, n);
}
streamsize filebuf::xsgetn(char *s, streamsize n)
{
return streambuf::xsgetn(s, n);
}
const int filebuf::openprot = 0644;