| // ============================================================================ | |
| // gzstream, C++ iostream classes wrapping the zlib compression library. | |
| // Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner | |
| // | |
| // This library is free software; you can redistribute it and/or | |
| // modify it under the terms of the GNU Lesser General Public | |
| // License as published by the Free Software Foundation; either | |
| // version 2.1 of the License, or (at your option) any later version. | |
| // | |
| // This library is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| // Lesser General Public License for more details. | |
| // | |
| // You should have received a copy of the GNU Lesser General Public | |
| // License along with this library; if not, write to the Free Software | |
| // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| // ============================================================================ | |
| // | |
| // File : gzstream.h | |
| // Revision : $Revision: 1.5 $ | |
| // Revision_date : $Date: 2002/04/26 23:30:15 $ | |
| // Author(s) : Deepak Bandyopadhyay, Lutz Kettner | |
| // | |
| // Standard streambuf implementation following Nicolai Josuttis, "The | |
| // Standard C++ Library". | |
| // ============================================================================ | |
| #ifndef GZSTREAM_H | |
| #define GZSTREAM_H 1 | |
| // standard C++ with new header file names and std:: namespace | |
| #include <iostream> | |
| #include <fstream> | |
| #include <zlib.h> | |
| #ifdef GZSTREAM_NAMESPACE | |
| namespace GZSTREAM_NAMESPACE { | |
| #endif | |
| // ---------------------------------------------------------------------------- | |
| // Internal classes to implement gzstream. See below for user classes. | |
| // ---------------------------------------------------------------------------- | |
| class gzstreambuf : public std::streambuf { | |
| private: | |
| static const int bufferSize = 47+256; // size of data buff | |
| // totals 512 bytes under g++ for igzstream at the end. | |
| gzFile file; // file handle for compressed file | |
| char buffer[bufferSize]; // data buffer | |
| char opened; // open/close state of stream | |
| int mode; // I/O mode | |
| int flush_buffer(); | |
| public: | |
| gzstreambuf() : opened(0) { | |
| setp( buffer, buffer + (bufferSize-1)); | |
| setg( buffer + 4, // beginning of putback area | |
| buffer + 4, // read position | |
| buffer + 4); // end position | |
| // ASSERT: both input & output capabilities will not be used together | |
| } | |
| int is_open() { return opened; } | |
| gzstreambuf* open( const char* name, int open_mode); | |
| gzstreambuf* close(); | |
| ~gzstreambuf() { close(); } | |
| virtual int overflow( int c = EOF); | |
| virtual int underflow(); | |
| virtual int sync(); | |
| }; | |
| class gzstreambase : virtual public std::ios { | |
| protected: | |
| gzstreambuf buf; | |
| public: | |
| gzstreambase() { init(&buf); } | |
| gzstreambase( const char* name, int open_mode); | |
| ~gzstreambase(); | |
| int is_open() { return buf.is_open(); } | |
| void open( const char* name, int open_mode); | |
| void close(); | |
| gzstreambuf* rdbuf() { return &buf; } | |
| }; | |
| // ---------------------------------------------------------------------------- | |
| // User classes. Use igzstream and ogzstream analogously to ifstream and | |
| // ofstream respectively. They read and write files based on the gz* | |
| // function interface of the zlib. Files are compatible with gzip compression. | |
| // ---------------------------------------------------------------------------- | |
| class igzstream : public gzstreambase, public std::istream { | |
| public: | |
| igzstream() : std::istream( &buf) {} | |
| igzstream( const char* name, int open_mode = std::ios::in) | |
| : gzstreambase( name, open_mode | std::ios::in), std::istream( &buf) {} | |
| gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); } | |
| void open( const char* name, int open_mode = std::ios::in) { | |
| gzstreambase::open( name, open_mode); | |
| } | |
| }; | |
| class ogzstream : public gzstreambase, public std::ostream { | |
| public: | |
| ogzstream() : std::ostream( &buf) {} | |
| ogzstream( const char* name, int mode = std::ios::out) | |
| : gzstreambase( name, mode | std::ios::out), std::ostream( &buf) {} | |
| gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); } | |
| void open( const char* name, int open_mode = std::ios::out) { | |
| gzstreambase::open( name, open_mode); | |
| } | |
| }; | |
| #ifdef GZSTREAM_NAMESPACE | |
| } // namespace GZSTREAM_NAMESPACE | |
| #endif | |
| #endif // GZSTREAM_H | |
| // ============================================================================ | |
| // EOF // | |