xref: /netbsd-src/external/gpl3/gdb/dist/zlib/contrib/iostream/zfstream.h (revision 212397c69a103ae7e5eafa8731ddfae671d2dee7)
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