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