1*212397c6Schristos
2*212397c6Schristos #ifndef zfstream_h
3*212397c6Schristos #define zfstream_h
4*212397c6Schristos
5*212397c6Schristos #include <fstream.h>
6*212397c6Schristos #include "zlib.h"
7*212397c6Schristos
8*212397c6Schristos class gzfilebuf : public streambuf {
9*212397c6Schristos
10*212397c6Schristos public:
11*212397c6Schristos
12*212397c6Schristos gzfilebuf( );
13*212397c6Schristos virtual ~gzfilebuf();
14*212397c6Schristos
15*212397c6Schristos gzfilebuf *open( const char *name, int io_mode );
16*212397c6Schristos gzfilebuf *attach( int file_descriptor, int io_mode );
17*212397c6Schristos gzfilebuf *close();
18*212397c6Schristos
19*212397c6Schristos int setcompressionlevel( int comp_level );
20*212397c6Schristos int setcompressionstrategy( int comp_strategy );
21*212397c6Schristos
is_open()22*212397c6Schristos inline int is_open() const { return (file !=NULL); }
23*212397c6Schristos
24*212397c6Schristos virtual streampos seekoff( streamoff, ios::seek_dir, int );
25*212397c6Schristos
26*212397c6Schristos virtual int sync();
27*212397c6Schristos
28*212397c6Schristos protected:
29*212397c6Schristos
30*212397c6Schristos virtual int underflow();
31*212397c6Schristos virtual int overflow( int = EOF );
32*212397c6Schristos
33*212397c6Schristos private:
34*212397c6Schristos
35*212397c6Schristos gzFile file;
36*212397c6Schristos short mode;
37*212397c6Schristos short own_file_descriptor;
38*212397c6Schristos
39*212397c6Schristos int flushbuf();
40*212397c6Schristos int fillbuf();
41*212397c6Schristos
42*212397c6Schristos };
43*212397c6Schristos
44*212397c6Schristos class gzfilestream_common : virtual public ios {
45*212397c6Schristos
46*212397c6Schristos friend class gzifstream;
47*212397c6Schristos friend class gzofstream;
48*212397c6Schristos friend gzofstream &setcompressionlevel( gzofstream &, int );
49*212397c6Schristos friend gzofstream &setcompressionstrategy( gzofstream &, int );
50*212397c6Schristos
51*212397c6Schristos public:
52*212397c6Schristos virtual ~gzfilestream_common();
53*212397c6Schristos
54*212397c6Schristos void attach( int fd, int io_mode );
55*212397c6Schristos void open( const char *name, int io_mode );
56*212397c6Schristos void close();
57*212397c6Schristos
58*212397c6Schristos protected:
59*212397c6Schristos gzfilestream_common();
60*212397c6Schristos
61*212397c6Schristos private:
62*212397c6Schristos gzfilebuf *rdbuf();
63*212397c6Schristos
64*212397c6Schristos gzfilebuf buffer;
65*212397c6Schristos
66*212397c6Schristos };
67*212397c6Schristos
68*212397c6Schristos class gzifstream : public gzfilestream_common, public istream {
69*212397c6Schristos
70*212397c6Schristos public:
71*212397c6Schristos
72*212397c6Schristos gzifstream();
73*212397c6Schristos gzifstream( const char *name, int io_mode = ios::in );
74*212397c6Schristos gzifstream( int fd, int io_mode = ios::in );
75*212397c6Schristos
76*212397c6Schristos virtual ~gzifstream();
77*212397c6Schristos
78*212397c6Schristos };
79*212397c6Schristos
80*212397c6Schristos class gzofstream : public gzfilestream_common, public ostream {
81*212397c6Schristos
82*212397c6Schristos public:
83*212397c6Schristos
84*212397c6Schristos gzofstream();
85*212397c6Schristos gzofstream( const char *name, int io_mode = ios::out );
86*212397c6Schristos gzofstream( int fd, int io_mode = ios::out );
87*212397c6Schristos
88*212397c6Schristos virtual ~gzofstream();
89*212397c6Schristos
90*212397c6Schristos };
91*212397c6Schristos
92*212397c6Schristos template<class T> class gzomanip {
93*212397c6Schristos friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
94*212397c6Schristos public:
gzomanip(gzofstream & (* f)(gzofstream &,T),T v)95*212397c6Schristos gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
96*212397c6Schristos private:
97*212397c6Schristos gzofstream &(*func)(gzofstream &, T);
98*212397c6Schristos T val;
99*212397c6Schristos };
100*212397c6Schristos
101*212397c6Schristos template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
102*212397c6Schristos {
103*212397c6Schristos return (*m.func)(s, m.val);
104*212397c6Schristos }
105*212397c6Schristos
setcompressionlevel(gzofstream & s,int l)106*212397c6Schristos inline gzofstream &setcompressionlevel( gzofstream &s, int l )
107*212397c6Schristos {
108*212397c6Schristos (s.rdbuf())->setcompressionlevel(l);
109*212397c6Schristos return s;
110*212397c6Schristos }
111*212397c6Schristos
setcompressionstrategy(gzofstream & s,int l)112*212397c6Schristos inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
113*212397c6Schristos {
114*212397c6Schristos (s.rdbuf())->setcompressionstrategy(l);
115*212397c6Schristos return s;
116*212397c6Schristos }
117*212397c6Schristos
setcompressionlevel(int l)118*212397c6Schristos inline gzomanip<int> setcompressionlevel(int l)
119*212397c6Schristos {
120*212397c6Schristos return gzomanip<int>(&setcompressionlevel,l);
121*212397c6Schristos }
122*212397c6Schristos
setcompressionstrategy(int l)123*212397c6Schristos inline gzomanip<int> setcompressionstrategy(int l)
124*212397c6Schristos {
125*212397c6Schristos return gzomanip<int>(&setcompressionstrategy,l);
126*212397c6Schristos }
127*212397c6Schristos
128*212397c6Schristos #endif
129