| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 | 
							- /*
 
-  * A C++ I/O streams interface to the zlib gz* functions
 
-  *
 
-  * by Ludwig Schwardt <schwardt@sun.ac.za>
 
-  * original version by Kevin Ruland <kevin@rodin.wustl.edu>
 
-  *
 
-  * This version is standard-compliant and compatible with gcc 3.x.
 
-  */
 
- #ifndef ZFSTREAM_H
 
- #define ZFSTREAM_H
 
- #include <istream>  // not iostream, since we don't need cin/cout
 
- #include <ostream>
 
- #include "zlib.h"
 
- /*****************************************************************************/
 
- /**
 
-  *  @brief  Gzipped file stream buffer class.
 
-  *
 
-  *  This class implements basic_filebuf for gzipped files. It doesn't yet support
 
-  *  seeking (allowed by zlib but slow/limited), putback and read/write access
 
-  *  (tricky). Otherwise, it attempts to be a drop-in replacement for the standard
 
-  *  file streambuf.
 
- */
 
- class gzfilebuf : public std::streambuf
 
- {
 
- public:
 
-   //  Default constructor.
 
-   gzfilebuf();
 
-   //  Destructor.
 
-   virtual
 
-   ~gzfilebuf();
 
-   /**
 
-    *  @brief  Set compression level and strategy on the fly.
 
-    *  @param  comp_level  Compression level (see zlib.h for allowed values)
 
-    *  @param  comp_strategy  Compression strategy (see zlib.h for allowed values)
 
-    *  @return  Z_OK on success, Z_STREAM_ERROR otherwise.
 
-    *
 
-    *  Unfortunately, these parameters cannot be modified separately, as the
 
-    *  previous zfstream version assumed. Since the strategy is seldom changed,
 
-    *  it can default and setcompression(level) then becomes like the old
 
-    *  setcompressionlevel(level).
 
-   */
 
-   int
 
-   setcompression(int comp_level,
 
-                  int comp_strategy = Z_DEFAULT_STRATEGY);
 
-   /**
 
-    *  @brief  Check if file is open.
 
-    *  @return  True if file is open.
 
-   */
 
-   bool
 
-   is_open() const { return (file != NULL); }
 
-   /**
 
-    *  @brief  Open gzipped file.
 
-    *  @param  name  File name.
 
-    *  @param  mode  Open mode flags.
 
-    *  @return  @c this on success, NULL on failure.
 
-   */
 
-   gzfilebuf*
 
-   open(const char* name,
 
-        std::ios_base::openmode mode);
 
-   /**
 
-    *  @brief  Attach to already open gzipped file.
 
-    *  @param  fd  File descriptor.
 
-    *  @param  mode  Open mode flags.
 
-    *  @return  @c this on success, NULL on failure.
 
-   */
 
-   gzfilebuf*
 
-   attach(int fd,
 
-          std::ios_base::openmode mode);
 
-   /**
 
-    *  @brief  Close gzipped file.
 
-    *  @return  @c this on success, NULL on failure.
 
-   */
 
-   gzfilebuf*
 
-   close();
 
- protected:
 
-   /**
 
-    *  @brief  Convert ios open mode int to mode string used by zlib.
 
-    *  @return  True if valid mode flag combination.
 
-   */
 
-   bool
 
-   open_mode(std::ios_base::openmode mode,
 
-             char* c_mode) const;
 
-   /**
 
-    *  @brief  Number of characters available in stream buffer.
 
-    *  @return  Number of characters.
 
-    *
 
-    *  This indicates number of characters in get area of stream buffer.
 
-    *  These characters can be read without accessing the gzipped file.
 
-   */
 
-   virtual std::streamsize
 
-   showmanyc();
 
-   /**
 
-    *  @brief  Fill get area from gzipped file.
 
-    *  @return  First character in get area on success, EOF on error.
 
-    *
 
-    *  This actually reads characters from gzipped file to stream
 
-    *  buffer. Always buffered.
 
-   */
 
-   virtual int_type
 
-   underflow();
 
-   /**
 
-    *  @brief  Write put area to gzipped file.
 
-    *  @param  c  Extra character to add to buffer contents.
 
-    *  @return  Non-EOF on success, EOF on error.
 
-    *
 
-    *  This actually writes characters in stream buffer to
 
-    *  gzipped file. With unbuffered output this is done one
 
-    *  character at a time.
 
-   */
 
-   virtual int_type
 
-   overflow(int_type c = traits_type::eof());
 
-   /**
 
-    *  @brief  Installs external stream buffer.
 
-    *  @param  p  Pointer to char buffer.
 
-    *  @param  n  Size of external buffer.
 
-    *  @return  @c this on success, NULL on failure.
 
-    *
 
-    *  Call setbuf(0,0) to enable unbuffered output.
 
-   */
 
-   virtual std::streambuf*
 
-   setbuf(char_type* p,
 
-          std::streamsize n);
 
-   /**
 
-    *  @brief  Flush stream buffer to file.
 
-    *  @return  0 on success, -1 on error.
 
-    *
 
-    *  This calls underflow(EOF) to do the job.
 
-   */
 
-   virtual int
 
-   sync();
 
- //
 
- // Some future enhancements
 
- //
 
- //  virtual int_type uflow();
 
- //  virtual int_type pbackfail(int_type c = traits_type::eof());
 
- //  virtual pos_type
 
- //  seekoff(off_type off,
 
- //          std::ios_base::seekdir way,
 
- //          std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
 
- //  virtual pos_type
 
- //  seekpos(pos_type sp,
 
- //          std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
 
- private:
 
-   /**
 
-    *  @brief  Allocate internal buffer.
 
-    *
 
-    *  This function is safe to call multiple times. It will ensure
 
-    *  that a proper internal buffer exists if it is required. If the
 
-    *  buffer already exists or is external, the buffer pointers will be
 
-    *  reset to their original state.
 
-   */
 
-   void
 
-   enable_buffer();
 
-   /**
 
-    *  @brief  Destroy internal buffer.
 
-    *
 
-    *  This function is safe to call multiple times. It will ensure
 
-    *  that the internal buffer is deallocated if it exists. In any
 
-    *  case, it will also reset the buffer pointers.
 
-   */
 
-   void
 
-   disable_buffer();
 
-   /**
 
-    *  Underlying file pointer.
 
-   */
 
-   gzFile file;
 
-   /**
 
-    *  Mode in which file was opened.
 
-   */
 
-   std::ios_base::openmode io_mode;
 
-   /**
 
-    *  @brief  True if this object owns file descriptor.
 
-    *
 
-    *  This makes the class responsible for closing the file
 
-    *  upon destruction.
 
-   */
 
-   bool own_fd;
 
-   /**
 
-    *  @brief  Stream buffer.
 
-    *
 
-    *  For simplicity this remains allocated on the free store for the
 
-    *  entire life span of the gzfilebuf object, unless replaced by setbuf.
 
-   */
 
-   char_type* buffer;
 
-   /**
 
-    *  @brief  Stream buffer size.
 
-    *
 
-    *  Defaults to system default buffer size (typically 8192 bytes).
 
-    *  Modified by setbuf.
 
-   */
 
-   std::streamsize buffer_size;
 
-   /**
 
-    *  @brief  True if this object owns stream buffer.
 
-    *
 
-    *  This makes the class responsible for deleting the buffer
 
-    *  upon destruction.
 
-   */
 
-   bool own_buffer;
 
- };
 
- /*****************************************************************************/
 
- /**
 
-  *  @brief  Gzipped file input stream class.
 
-  *
 
-  *  This class implements ifstream for gzipped files. Seeking and putback
 
-  *  is not supported yet.
 
- */
 
- class gzifstream : public std::istream
 
- {
 
- public:
 
-   //  Default constructor
 
-   gzifstream();
 
-   /**
 
-    *  @brief  Construct stream on gzipped file to be opened.
 
-    *  @param  name  File name.
 
-    *  @param  mode  Open mode flags (forced to contain ios::in).
 
-   */
 
-   explicit
 
-   gzifstream(const char* name,
 
-              std::ios_base::openmode mode = std::ios_base::in);
 
-   /**
 
-    *  @brief  Construct stream on already open gzipped file.
 
-    *  @param  fd    File descriptor.
 
-    *  @param  mode  Open mode flags (forced to contain ios::in).
 
-   */
 
-   explicit
 
-   gzifstream(int fd,
 
-              std::ios_base::openmode mode = std::ios_base::in);
 
-   /**
 
-    *  Obtain underlying stream buffer.
 
-   */
 
-   gzfilebuf*
 
-   rdbuf() const
 
-   { return const_cast<gzfilebuf*>(&sb); }
 
-   /**
 
-    *  @brief  Check if file is open.
 
-    *  @return  True if file is open.
 
-   */
 
-   bool
 
-   is_open() { return sb.is_open(); }
 
-   /**
 
-    *  @brief  Open gzipped file.
 
-    *  @param  name  File name.
 
-    *  @param  mode  Open mode flags (forced to contain ios::in).
 
-    *
 
-    *  Stream will be in state good() if file opens successfully;
 
-    *  otherwise in state fail(). This differs from the behavior of
 
-    *  ifstream, which never sets the state to good() and therefore
 
-    *  won't allow you to reuse the stream for a second file unless
 
-    *  you manually clear() the state. The choice is a matter of
 
-    *  convenience.
 
-   */
 
-   void
 
-   open(const char* name,
 
-        std::ios_base::openmode mode = std::ios_base::in);
 
-   /**
 
-    *  @brief  Attach to already open gzipped file.
 
-    *  @param  fd  File descriptor.
 
-    *  @param  mode  Open mode flags (forced to contain ios::in).
 
-    *
 
-    *  Stream will be in state good() if attach succeeded; otherwise
 
-    *  in state fail().
 
-   */
 
-   void
 
-   attach(int fd,
 
-          std::ios_base::openmode mode = std::ios_base::in);
 
-   /**
 
-    *  @brief  Close gzipped file.
 
-    *
 
-    *  Stream will be in state fail() if close failed.
 
-   */
 
-   void
 
-   close();
 
- private:
 
-   /**
 
-    *  Underlying stream buffer.
 
-   */
 
-   gzfilebuf sb;
 
- };
 
- /*****************************************************************************/
 
- /**
 
-  *  @brief  Gzipped file output stream class.
 
-  *
 
-  *  This class implements ofstream for gzipped files. Seeking and putback
 
-  *  is not supported yet.
 
- */
 
- class gzofstream : public std::ostream
 
- {
 
- public:
 
-   //  Default constructor
 
-   gzofstream();
 
-   /**
 
-    *  @brief  Construct stream on gzipped file to be opened.
 
-    *  @param  name  File name.
 
-    *  @param  mode  Open mode flags (forced to contain ios::out).
 
-   */
 
-   explicit
 
-   gzofstream(const char* name,
 
-              std::ios_base::openmode mode = std::ios_base::out);
 
-   /**
 
-    *  @brief  Construct stream on already open gzipped file.
 
-    *  @param  fd    File descriptor.
 
-    *  @param  mode  Open mode flags (forced to contain ios::out).
 
-   */
 
-   explicit
 
-   gzofstream(int fd,
 
-              std::ios_base::openmode mode = std::ios_base::out);
 
-   /**
 
-    *  Obtain underlying stream buffer.
 
-   */
 
-   gzfilebuf*
 
-   rdbuf() const
 
-   { return const_cast<gzfilebuf*>(&sb); }
 
-   /**
 
-    *  @brief  Check if file is open.
 
-    *  @return  True if file is open.
 
-   */
 
-   bool
 
-   is_open() { return sb.is_open(); }
 
-   /**
 
-    *  @brief  Open gzipped file.
 
-    *  @param  name  File name.
 
-    *  @param  mode  Open mode flags (forced to contain ios::out).
 
-    *
 
-    *  Stream will be in state good() if file opens successfully;
 
-    *  otherwise in state fail(). This differs from the behavior of
 
-    *  ofstream, which never sets the state to good() and therefore
 
-    *  won't allow you to reuse the stream for a second file unless
 
-    *  you manually clear() the state. The choice is a matter of
 
-    *  convenience.
 
-   */
 
-   void
 
-   open(const char* name,
 
-        std::ios_base::openmode mode = std::ios_base::out);
 
-   /**
 
-    *  @brief  Attach to already open gzipped file.
 
-    *  @param  fd  File descriptor.
 
-    *  @param  mode  Open mode flags (forced to contain ios::out).
 
-    *
 
-    *  Stream will be in state good() if attach succeeded; otherwise
 
-    *  in state fail().
 
-   */
 
-   void
 
-   attach(int fd,
 
-          std::ios_base::openmode mode = std::ios_base::out);
 
-   /**
 
-    *  @brief  Close gzipped file.
 
-    *
 
-    *  Stream will be in state fail() if close failed.
 
-   */
 
-   void
 
-   close();
 
- private:
 
-   /**
 
-    *  Underlying stream buffer.
 
-   */
 
-   gzfilebuf sb;
 
- };
 
- /*****************************************************************************/
 
- /**
 
-  *  @brief  Gzipped file output stream manipulator class.
 
-  *
 
-  *  This class defines a two-argument manipulator for gzofstream. It is used
 
-  *  as base for the setcompression(int,int) manipulator.
 
- */
 
- template<typename T1, typename T2>
 
-   class gzomanip2
 
-   {
 
-   public:
 
-     // Allows insertor to peek at internals
 
-     template <typename Ta, typename Tb>
 
-       friend gzofstream&
 
-       operator<<(gzofstream&,
 
-                  const gzomanip2<Ta,Tb>&);
 
-     // Constructor
 
-     gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2),
 
-               T1 v1,
 
-               T2 v2);
 
-   private:
 
-     // Underlying manipulator function
 
-     gzofstream&
 
-     (*func)(gzofstream&, T1, T2);
 
-     // Arguments for manipulator function
 
-     T1 val1;
 
-     T2 val2;
 
-   };
 
- /*****************************************************************************/
 
- // Manipulator function thunks through to stream buffer
 
- inline gzofstream&
 
- setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
 
- {
 
-   (gzs.rdbuf())->setcompression(l, s);
 
-   return gzs;
 
- }
 
- // Manipulator constructor stores arguments
 
- template<typename T1, typename T2>
 
-   inline
 
-   gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2),
 
-                               T1 v1,
 
-                               T2 v2)
 
-   : func(f), val1(v1), val2(v2)
 
-   { }
 
- // Insertor applies underlying manipulator function to stream
 
- template<typename T1, typename T2>
 
-   inline gzofstream&
 
-   operator<<(gzofstream& s, const gzomanip2<T1,T2>& m)
 
-   { return (*m.func)(s, m.val1, m.val2); }
 
- // Insert this onto stream to simplify setting of compression level
 
- inline gzomanip2<int,int>
 
- setcompression(int l, int s = Z_DEFAULT_STRATEGY)
 
- { return gzomanip2<int,int>(&setcompression, l, s); }
 
- #endif // ZFSTREAM_H
 
 
  |