1275793eaSopenharmony_ci 2275793eaSopenharmony_ci#ifndef zfstream_h 3275793eaSopenharmony_ci#define zfstream_h 4275793eaSopenharmony_ci 5275793eaSopenharmony_ci#include <fstream.h> 6275793eaSopenharmony_ci#include "zlib.h" 7275793eaSopenharmony_ci 8275793eaSopenharmony_ciclass gzfilebuf : public streambuf { 9275793eaSopenharmony_ci 10275793eaSopenharmony_cipublic: 11275793eaSopenharmony_ci 12275793eaSopenharmony_ci gzfilebuf( ); 13275793eaSopenharmony_ci virtual ~gzfilebuf(); 14275793eaSopenharmony_ci 15275793eaSopenharmony_ci gzfilebuf *open( const char *name, int io_mode ); 16275793eaSopenharmony_ci gzfilebuf *attach( int file_descriptor, int io_mode ); 17275793eaSopenharmony_ci gzfilebuf *close(); 18275793eaSopenharmony_ci 19275793eaSopenharmony_ci int setcompressionlevel( int comp_level ); 20275793eaSopenharmony_ci int setcompressionstrategy( int comp_strategy ); 21275793eaSopenharmony_ci 22275793eaSopenharmony_ci inline int is_open() const { return (file !=NULL); } 23275793eaSopenharmony_ci 24275793eaSopenharmony_ci virtual streampos seekoff( streamoff, ios::seek_dir, int ); 25275793eaSopenharmony_ci 26275793eaSopenharmony_ci virtual int sync(); 27275793eaSopenharmony_ci 28275793eaSopenharmony_ciprotected: 29275793eaSopenharmony_ci 30275793eaSopenharmony_ci virtual int underflow(); 31275793eaSopenharmony_ci virtual int overflow( int = EOF ); 32275793eaSopenharmony_ci 33275793eaSopenharmony_ciprivate: 34275793eaSopenharmony_ci 35275793eaSopenharmony_ci gzFile file; 36275793eaSopenharmony_ci short mode; 37275793eaSopenharmony_ci short own_file_descriptor; 38275793eaSopenharmony_ci 39275793eaSopenharmony_ci int flushbuf(); 40275793eaSopenharmony_ci int fillbuf(); 41275793eaSopenharmony_ci 42275793eaSopenharmony_ci}; 43275793eaSopenharmony_ci 44275793eaSopenharmony_ciclass gzfilestream_common : virtual public ios { 45275793eaSopenharmony_ci 46275793eaSopenharmony_ci friend class gzifstream; 47275793eaSopenharmony_ci friend class gzofstream; 48275793eaSopenharmony_ci friend gzofstream &setcompressionlevel( gzofstream &, int ); 49275793eaSopenharmony_ci friend gzofstream &setcompressionstrategy( gzofstream &, int ); 50275793eaSopenharmony_ci 51275793eaSopenharmony_cipublic: 52275793eaSopenharmony_ci virtual ~gzfilestream_common(); 53275793eaSopenharmony_ci 54275793eaSopenharmony_ci void attach( int fd, int io_mode ); 55275793eaSopenharmony_ci void open( const char *name, int io_mode ); 56275793eaSopenharmony_ci void close(); 57275793eaSopenharmony_ci 58275793eaSopenharmony_ciprotected: 59275793eaSopenharmony_ci gzfilestream_common(); 60275793eaSopenharmony_ci 61275793eaSopenharmony_ciprivate: 62275793eaSopenharmony_ci gzfilebuf *rdbuf(); 63275793eaSopenharmony_ci 64275793eaSopenharmony_ci gzfilebuf buffer; 65275793eaSopenharmony_ci 66275793eaSopenharmony_ci}; 67275793eaSopenharmony_ci 68275793eaSopenharmony_ciclass gzifstream : public gzfilestream_common, public istream { 69275793eaSopenharmony_ci 70275793eaSopenharmony_cipublic: 71275793eaSopenharmony_ci 72275793eaSopenharmony_ci gzifstream(); 73275793eaSopenharmony_ci gzifstream( const char *name, int io_mode = ios::in ); 74275793eaSopenharmony_ci gzifstream( int fd, int io_mode = ios::in ); 75275793eaSopenharmony_ci 76275793eaSopenharmony_ci virtual ~gzifstream(); 77275793eaSopenharmony_ci 78275793eaSopenharmony_ci}; 79275793eaSopenharmony_ci 80275793eaSopenharmony_ciclass gzofstream : public gzfilestream_common, public ostream { 81275793eaSopenharmony_ci 82275793eaSopenharmony_cipublic: 83275793eaSopenharmony_ci 84275793eaSopenharmony_ci gzofstream(); 85275793eaSopenharmony_ci gzofstream( const char *name, int io_mode = ios::out ); 86275793eaSopenharmony_ci gzofstream( int fd, int io_mode = ios::out ); 87275793eaSopenharmony_ci 88275793eaSopenharmony_ci virtual ~gzofstream(); 89275793eaSopenharmony_ci 90275793eaSopenharmony_ci}; 91275793eaSopenharmony_ci 92275793eaSopenharmony_citemplate<class T> class gzomanip { 93275793eaSopenharmony_ci friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); 94275793eaSopenharmony_cipublic: 95275793eaSopenharmony_ci gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } 96275793eaSopenharmony_ciprivate: 97275793eaSopenharmony_ci gzofstream &(*func)(gzofstream &, T); 98275793eaSopenharmony_ci T val; 99275793eaSopenharmony_ci}; 100275793eaSopenharmony_ci 101275793eaSopenharmony_citemplate<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m) 102275793eaSopenharmony_ci{ 103275793eaSopenharmony_ci return (*m.func)(s, m.val); 104275793eaSopenharmony_ci} 105275793eaSopenharmony_ci 106275793eaSopenharmony_ciinline gzofstream &setcompressionlevel( gzofstream &s, int l ) 107275793eaSopenharmony_ci{ 108275793eaSopenharmony_ci (s.rdbuf())->setcompressionlevel(l); 109275793eaSopenharmony_ci return s; 110275793eaSopenharmony_ci} 111275793eaSopenharmony_ci 112275793eaSopenharmony_ciinline gzofstream &setcompressionstrategy( gzofstream &s, int l ) 113275793eaSopenharmony_ci{ 114275793eaSopenharmony_ci (s.rdbuf())->setcompressionstrategy(l); 115275793eaSopenharmony_ci return s; 116275793eaSopenharmony_ci} 117275793eaSopenharmony_ci 118275793eaSopenharmony_ciinline gzomanip<int> setcompressionlevel(int l) 119275793eaSopenharmony_ci{ 120275793eaSopenharmony_ci return gzomanip<int>(&setcompressionlevel,l); 121275793eaSopenharmony_ci} 122275793eaSopenharmony_ci 123275793eaSopenharmony_ciinline gzomanip<int> setcompressionstrategy(int l) 124275793eaSopenharmony_ci{ 125275793eaSopenharmony_ci return gzomanip<int>(&setcompressionstrategy,l); 126275793eaSopenharmony_ci} 127275793eaSopenharmony_ci 128275793eaSopenharmony_ci#endif 129