00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef GZSTREAM_H
00030 #define GZSTREAM_H 1
00031
00032
00033 #include <iostream>
00034 #include <fstream>
00035 #include <zlib.h>
00036
00037 #ifdef GZSTREAM_NAMESPACE
00038 namespace GZSTREAM_NAMESPACE {
00039 #endif
00040
00041
00042
00043
00044
00045 class gzstreambuf : public std::streambuf {
00046 private:
00047 static const int bufferSize = 47+256;
00048
00049
00050 gzFile file;
00051 char buffer[bufferSize];
00052 char opened;
00053 int mode;
00054
00055 int flush_buffer();
00056 public:
00057 gzstreambuf() : opened(0) {
00058 setp( buffer, buffer + (bufferSize-1));
00059 setg( buffer + 4,
00060 buffer + 4,
00061 buffer + 4);
00062
00063 }
00064 int is_open() { return opened; }
00065 gzstreambuf* open( const char* name, int open_mode);
00066 gzstreambuf* close();
00067 ~gzstreambuf() { close(); }
00068
00069 virtual int overflow( int c = EOF);
00070 virtual int underflow();
00071 virtual int sync();
00072 };
00073
00074 class gzstreambase : virtual public std::ios {
00075 protected:
00076 gzstreambuf buf;
00077 public:
00078 gzstreambase() { init(&buf); }
00079 gzstreambase( const char* name, int open_mode);
00080 ~gzstreambase();
00081 void open( const char* name, int open_mode);
00082 void close();
00083 gzstreambuf* rdbuf() { return &buf; }
00084 };
00085
00086
00087
00088
00089
00090
00091
00092 class igzstream : public gzstreambase, public std::istream {
00093 public:
00094 igzstream() : std::istream( &buf) {}
00095 igzstream( const char* name, int gz_open_mode = std::ios::in)
00096 : gzstreambase( name, gz_open_mode), std::istream( &buf) {}
00097 gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }
00098 void open( const char* name, int gz_open_mode = std::ios::in) {
00099 gzstreambase::open( name, gz_open_mode);
00100 }
00101 };
00102
00103 class ogzstream : public gzstreambase, public std::ostream {
00104 public:
00105 ogzstream() : std::ostream( &buf) {}
00106 ogzstream( const char* name, int mode = std::ios::out)
00107 : gzstreambase( name, mode), std::ostream( &buf) {}
00108 gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); }
00109 void open( const char* name, int gz_open_mode = std::ios::out) {
00110 gzstreambase::open( name, gz_open_mode);
00111 }
00112 };
00113
00114 #ifdef GZSTREAM_NAMESPACE
00115 }
00116 #endif
00117
00118 #endif // GZSTREAM_H
00119
00120
00121