129 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | 
 | ||
|  | #ifndef zfstream_h
 | ||
|  | #define zfstream_h
 | ||
|  | 
 | ||
|  | #include <fstream.h>
 | ||
|  | #include "zlib.h"
 | ||
|  | 
 | ||
|  | class gzfilebuf : public streambuf { | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |   gzfilebuf( ); | ||
|  |   virtual ~gzfilebuf(); | ||
|  | 
 | ||
|  |   gzfilebuf *open( const char *name, int io_mode ); | ||
|  |   gzfilebuf *attach( int file_descriptor, int io_mode ); | ||
|  |   gzfilebuf *close(); | ||
|  | 
 | ||
|  |   int setcompressionlevel( int comp_level ); | ||
|  |   int setcompressionstrategy( int comp_strategy ); | ||
|  | 
 | ||
|  |   inline int is_open() const { return (file !=NULL); } | ||
|  | 
 | ||
|  |   virtual streampos seekoff( streamoff, ios::seek_dir, int ); | ||
|  | 
 | ||
|  |   virtual int sync(); | ||
|  | 
 | ||
|  | protected: | ||
|  | 
 | ||
|  |   virtual int underflow(); | ||
|  |   virtual int overflow( int = EOF ); | ||
|  | 
 | ||
|  | private: | ||
|  | 
 | ||
|  |   gzFile file; | ||
|  |   short mode; | ||
|  |   short own_file_descriptor; | ||
|  | 
 | ||
|  |   int flushbuf(); | ||
|  |   int fillbuf(); | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | class gzfilestream_common : virtual public ios { | ||
|  | 
 | ||
|  |   friend class gzifstream; | ||
|  |   friend class gzofstream; | ||
|  |   friend gzofstream &setcompressionlevel( gzofstream &, int ); | ||
|  |   friend gzofstream &setcompressionstrategy( gzofstream &, int ); | ||
|  | 
 | ||
|  | public: | ||
|  |   virtual ~gzfilestream_common(); | ||
|  | 
 | ||
|  |   void attach( int fd, int io_mode ); | ||
|  |   void open( const char *name, int io_mode ); | ||
|  |   void close(); | ||
|  | 
 | ||
|  | protected: | ||
|  |   gzfilestream_common(); | ||
|  | 
 | ||
|  | private: | ||
|  |   gzfilebuf *rdbuf(); | ||
|  | 
 | ||
|  |   gzfilebuf buffer; | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | class gzifstream : public gzfilestream_common, public istream { | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |   gzifstream(); | ||
|  |   gzifstream( const char *name, int io_mode = ios::in ); | ||
|  |   gzifstream( int fd, int io_mode = ios::in ); | ||
|  | 
 | ||
|  |   virtual ~gzifstream(); | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | class gzofstream : public gzfilestream_common, public ostream { | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |   gzofstream(); | ||
|  |   gzofstream( const char *name, int io_mode = ios::out ); | ||
|  |   gzofstream( int fd, int io_mode = ios::out ); | ||
|  | 
 | ||
|  |   virtual ~gzofstream(); | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T> class gzomanip { | ||
|  |   friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); | ||
|  | public: | ||
|  |   gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } | ||
|  | private: | ||
|  |   gzofstream &(*func)(gzofstream &, T); | ||
|  |   T val; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m) | ||
|  | { | ||
|  |   return (*m.func)(s, m.val); | ||
|  | } | ||
|  | 
 | ||
|  | inline gzofstream &setcompressionlevel( gzofstream &s, int l ) | ||
|  | { | ||
|  |   (s.rdbuf())->setcompressionlevel(l); | ||
|  |   return s; | ||
|  | } | ||
|  | 
 | ||
|  | inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) | ||
|  | { | ||
|  |   (s.rdbuf())->setcompressionstrategy(l); | ||
|  |   return s; | ||
|  | } | ||
|  | 
 | ||
|  | inline gzomanip<int> setcompressionlevel(int l) | ||
|  | { | ||
|  |   return gzomanip<int>(&setcompressionlevel,l); | ||
|  | } | ||
|  | 
 | ||
|  | inline gzomanip<int> setcompressionstrategy(int l) | ||
|  | { | ||
|  |   return gzomanip<int>(&setcompressionstrategy,l); | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |