sgstream: implement gzipped output file stream (gzofstream)
Add missing output implementation for gzfilebuf.
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
|
||||
using std::string;
|
||||
using std::istream;
|
||||
using std::ostream;
|
||||
|
||||
sg_gzifstream::sg_gzifstream()
|
||||
: istream(&gzbuf)
|
||||
@@ -146,3 +147,44 @@ skipcomment( istream& in )
|
||||
return in;
|
||||
}
|
||||
|
||||
|
||||
sg_gzofstream::sg_gzofstream()
|
||||
: ostream(&gzbuf)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Open a file for gzipped writing.
|
||||
//
|
||||
sg_gzofstream::sg_gzofstream( const string& name, ios_openmode io_mode )
|
||||
: ostream(&gzbuf)
|
||||
{
|
||||
this->open( name, io_mode );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Attach a stream to an already opened file descriptor.
|
||||
//
|
||||
sg_gzofstream::sg_gzofstream( int fd, ios_openmode io_mode )
|
||||
: ostream(&gzbuf)
|
||||
{
|
||||
gzbuf.attach( fd, io_mode );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Open a file for gzipped writing.
|
||||
//
|
||||
void
|
||||
sg_gzofstream::open( const string& name, ios_openmode io_mode )
|
||||
{
|
||||
gzbuf.open( name.c_str(), io_mode );
|
||||
}
|
||||
|
||||
void
|
||||
sg_gzofstream::attach( int fd, ios_openmode io_mode )
|
||||
{
|
||||
gzbuf.attach( fd, io_mode );
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
# include <istream>
|
||||
# include <ostream>
|
||||
|
||||
#include <string>
|
||||
|
||||
@@ -115,6 +116,58 @@ std::istream& skipws( std::istream& in );
|
||||
*/
|
||||
std::istream& skipcomment( std::istream& in );
|
||||
|
||||
/**
|
||||
* An envelope class for gzofstream.
|
||||
*/
|
||||
class sg_gzofstream : private gzofstream_base, public std::ostream
|
||||
{
|
||||
public:
|
||||
/** Default constructor */
|
||||
sg_gzofstream();
|
||||
|
||||
/**
|
||||
* Constructor to open a file for writing.
|
||||
* @param name name of file
|
||||
* @param io_mode file open mode(s) "or'd" together
|
||||
*/
|
||||
sg_gzofstream( const std::string& name,
|
||||
ios_openmode io_mode = ios_out | ios_binary );
|
||||
|
||||
/**
|
||||
* Constructor that attaches itself to an existing file descriptor.
|
||||
* @param fd file descriptor
|
||||
* @param io_mode file open mode(s) "or'd" together
|
||||
*/
|
||||
sg_gzofstream( int fd, ios_openmode io_mode = ios_out|ios_binary );
|
||||
|
||||
/**
|
||||
* Attempt to open a file for writing.
|
||||
* @param name name of file
|
||||
* @param io_mode file open mode(s) "or'd" together
|
||||
*/
|
||||
void open( const std::string& name,
|
||||
ios_openmode io_mode = ios_out|ios_binary );
|
||||
|
||||
/**
|
||||
* Attach to an existing file descriptor.
|
||||
* @param fd file descriptor
|
||||
* @param io_mode file open mode(s) "or'd" together
|
||||
*/
|
||||
void attach( int fd, ios_openmode io_mode = ios_out|ios_binary );
|
||||
|
||||
/**
|
||||
* Close the stream.
|
||||
*/
|
||||
void close() { gzbuf.close(); }
|
||||
|
||||
/** @return true if the file is successfully opened, false otherwise. */
|
||||
bool is_open() { return gzbuf.is_open(); }
|
||||
|
||||
private:
|
||||
// Not defined!
|
||||
sg_gzofstream( const sg_gzofstream& );
|
||||
void operator= ( const sg_gzofstream& );
|
||||
};
|
||||
|
||||
#endif /* _SGSTREAM_HXX */
|
||||
|
||||
|
||||
@@ -39,7 +39,9 @@ gzfilebuf::gzfilebuf()
|
||||
mode(ios_openmode(0)),
|
||||
own_file_descriptor(false),
|
||||
ibuf_size(0),
|
||||
ibuffer(0)
|
||||
ibuffer(0),
|
||||
obuf_size(0),
|
||||
obuffer(0)
|
||||
{
|
||||
// try {
|
||||
ibuf_size = page_size / sizeof(char);
|
||||
@@ -59,6 +61,8 @@ gzfilebuf::~gzfilebuf()
|
||||
if ( own_file_descriptor )
|
||||
this->close();
|
||||
delete [] ibuffer;
|
||||
if (obuffer)
|
||||
delete [] obuffer;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -153,17 +157,17 @@ gzfilebuf::close()
|
||||
return this;
|
||||
}
|
||||
|
||||
// int
|
||||
// gzfilebuf::setcompressionlevel( int comp_level )
|
||||
// {
|
||||
// return gzsetparams(file, comp_level, -2);
|
||||
// }
|
||||
int
|
||||
gzfilebuf::setcompressionlevel( int comp_level )
|
||||
{
|
||||
return gzsetparams(file, comp_level, -2);
|
||||
}
|
||||
|
||||
// int
|
||||
// gzfilebuf::setcompressionstrategy( int comp_strategy )
|
||||
// {
|
||||
// return gzsetparams(file, -2, comp_strategy);
|
||||
// }
|
||||
int
|
||||
gzfilebuf::setcompressionstrategy( int comp_strategy )
|
||||
{
|
||||
return gzsetparams(file, -2, comp_strategy);
|
||||
}
|
||||
|
||||
|
||||
std::streampos
|
||||
@@ -173,10 +177,9 @@ gzfilebuf::seekoff( std::streamoff, ios_seekdir, ios_openmode )
|
||||
}
|
||||
|
||||
gzfilebuf::int_type
|
||||
gzfilebuf::overflow( int_type )
|
||||
gzfilebuf::overflow( int_type c )
|
||||
{
|
||||
#if 0
|
||||
if ( !is_open() || !(mode & ios::out) )
|
||||
if ( !is_open() || !(mode & ios_out) )
|
||||
return EOF;
|
||||
|
||||
if ( !base() )
|
||||
@@ -207,7 +210,6 @@ gzfilebuf::overflow( int_type )
|
||||
*pptr() = c;
|
||||
pbump(1);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -223,6 +225,22 @@ gzfilebuf::sync()
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
gzfilebuf::out_waiting()
|
||||
{
|
||||
char* q = pbase();
|
||||
int n = pptr() - q;
|
||||
return n>0;
|
||||
}
|
||||
|
||||
char
|
||||
gzfilebuf::allocate()
|
||||
{
|
||||
obuf_size = page_size / sizeof(char);
|
||||
obuffer = new char [ibuf_size];
|
||||
return 0;
|
||||
}
|
||||
|
||||
gzfilebuf::int_type
|
||||
gzfilebuf::flushbuf()
|
||||
{
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
/**
|
||||
* Open a stream
|
||||
* @param name file name
|
||||
* @param io_mode mdoe flags
|
||||
* @param io_mode mode flags
|
||||
* @return file stream
|
||||
*/
|
||||
gzfilebuf* open( const char* name, ios_openmode io_mode );
|
||||
@@ -83,8 +83,8 @@ public:
|
||||
/** Close stream */
|
||||
gzfilebuf* close();
|
||||
|
||||
// int setcompressionlevel( int comp_level );
|
||||
// int setcompressionstrategy( int comp_strategy );
|
||||
int setcompressionlevel( int comp_level );
|
||||
int setcompressionstrategy( int comp_strategy );
|
||||
|
||||
/** @return true if open, false otherwise */
|
||||
bool is_open() const { return (file != NULL); }
|
||||
@@ -100,6 +100,11 @@ protected:
|
||||
virtual int_type underflow();
|
||||
|
||||
virtual int_type overflow( int_type c = parent::traits_type::eof() );
|
||||
bool out_waiting();
|
||||
char* base() {return obuffer;}
|
||||
int blen() {return ibuf_size;}
|
||||
char allocate();
|
||||
|
||||
private:
|
||||
|
||||
int_type flushbuf();
|
||||
@@ -118,6 +123,10 @@ private:
|
||||
int ibuf_size;
|
||||
char* ibuffer;
|
||||
|
||||
// Put (output) buffer.
|
||||
int obuf_size;
|
||||
char* obuffer;
|
||||
|
||||
enum { page_size = 4096 };
|
||||
|
||||
private:
|
||||
@@ -136,5 +145,14 @@ struct gzifstream_base
|
||||
gzfilebuf gzbuf;
|
||||
};
|
||||
|
||||
#endif // _zfstream_hxx
|
||||
/**
|
||||
* document me too
|
||||
*/
|
||||
struct gzofstream_base
|
||||
{
|
||||
gzofstream_base() {}
|
||||
|
||||
gzfilebuf gzbuf;
|
||||
};
|
||||
|
||||
#endif // _zfstream_hxx
|
||||
|
||||
Reference in New Issue
Block a user