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