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