bzip2.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:13k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bzip2.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/20 18:39:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL_COMPRESS__BZIP2__HPP
  10. #define UTIL_COMPRESS__BZIP2__HPP
  11. /*  $Id: bzip2.hpp,v 1000.1 2004/04/20 18:39:51 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Vladimir Ivanov
  37.  *
  38.  * File Description:  BZip2 Compression API
  39.  *
  40.  * NOTE: The bzip2 documentation can be found here: 
  41.  *       http://sources.redhat.com/bzip2/
  42.  */
  43. #include <util/compress/stream.hpp>
  44. #ifdef NCBI_COMPILER_MSVC
  45. #  include <util/compress/bzip2/bzlib.h>
  46. #else
  47. #  include <bzlib.h>
  48. #endif
  49. /** @addtogroup Compression
  50.  *
  51.  * @{
  52.  */
  53. BEGIN_NCBI_SCOPE
  54. //////////////////////////////////////////////////////////////////////////////
  55. //
  56. // Special compression parameters (description from bzip2 docs)
  57. //        
  58. // <verbosity>
  59. //    This parameter should be set to a number between 0 and 4 inclusive.
  60. //    0 is silent, and greater numbers give increasingly verbose
  61. //    monitoring/debugging output. If the library has been compiled with
  62. //    -DBZ_NO_STDIO, no such output will appear for any verbosity setting. 
  63. //
  64. // <work_factor> 
  65. //    Parameter work_factor controls how the compression phase behaves when
  66. //    presented with worst case, highly repetitive, input data.
  67. //    If compression runs into difficulties caused by repetitive data, the
  68. //    library switches from the standard sorting algorithm to a fallback
  69. //    algorithm. The fallback is slower than the standard algorithm by
  70. //    perhaps a factor of three, but always behaves reasonably, no matter
  71. //    how bad the input. Lower values of work_factor reduce the amount of
  72. //    effort the standard algorithm will expend before resorting to the
  73. //    fallback. You should set this parameter carefully; too low, and many
  74. //    inputs will be handled by the fallback algorithm and so compress
  75. //    rather slowly, too high, and your average-to-worst case compression
  76. //    times can become very large. The default value of 30 gives reasonable
  77. //    behaviour over a wide range of circumstances. Allowable values range
  78. //    from 0 to 250 inclusive. 0 is a special case, equivalent to using
  79. //    the default value of 30.
  80. //
  81. // <small_decompress> 
  82. //    If it is nonzero, the library will use an alternative decompression
  83. //    algorithm which uses less memory but at the cost of decompressing more
  84. //    slowly (roughly speaking, half the speed, but the maximum memory
  85. //    requirement drops to around 2300k).
  86. //
  87. //////////////////////////////////////////////////////////////////////////////
  88. //
  89. // CBZip2Compression
  90. //
  91. class NCBI_XUTIL_EXPORT CBZip2Compression : public CCompression 
  92. {
  93. public:
  94.     // 'ctors
  95.     CBZip2Compression(
  96.         ELevel level            = eLevel_Default,
  97.         int    verbosity        = 0,              // [0..4]
  98.         int    work_factor      = 0,              // [0..250] 
  99.         int    small_decompress = 0               // [0,1]
  100.     );
  101.     virtual ~CBZip2Compression(void);
  102.     // Get compression level.
  103.     // NOTE: BZip2 algorithm do not support zero level compression.
  104.     //       So the "eLevel_NoCompression" will be translated to
  105.     //       "eLevel_Lowest".
  106.     virtual ELevel GetLevel(void) const;
  107.     // Return default compression level for a BZip compression algorithm
  108.     virtual ELevel GetDefaultLevel(void) const
  109.         { return eLevel_VeryHigh; };
  110.     //
  111.     // Utility functions 
  112.     //
  113.     // (De)compress the source buffer into the destination buffer.
  114.     // Return TRUE if operation was succesfully or FALSE otherwise.
  115.     // Notice that altogether the total size of the destination buffer must
  116.     // be little more then size of the source buffer. 
  117.     virtual bool CompressBuffer(
  118.         const void* src_buf, unsigned int  src_len,
  119.         void*       dst_buf, unsigned int  dst_size,
  120.         /* out */            unsigned int* dst_len
  121.     );
  122.     virtual bool DecompressBuffer(
  123.         const void* src_buf, unsigned int  src_len,
  124.         void*       dst_buf, unsigned int  dst_size,
  125.         /* out */            unsigned int* dst_len
  126.     );
  127.     // (De)compress file "src_file" and put result to file with name "dst_file".
  128.     // Return TRUE on success, FALSE on error.
  129.     virtual bool CompressFile(
  130.         const string& src_file,
  131.         const string& dst_file,
  132.         size_t        buf_size = kCompressionDefaultBufSize
  133.     );
  134.     virtual bool DecompressFile(
  135.         const string& src_file,
  136.         const string& dst_file, 
  137.         size_t        buf_size = kCompressionDefaultBufSize
  138.     );
  139. protected:
  140.     // Get error description for specified error code
  141.     const char* GetBZip2ErrorDescription(int errcode);
  142.     // Format string with last error description
  143.     string FormatErrorMessage(string where, bool use_stream_data = true) const;
  144. protected:
  145.     bz_stream  m_Stream;         // Compressor stream
  146.     int        m_Verbosity;      // Verbose monitoring/debugging output level
  147.     int        m_WorkFactor;     // See description above
  148.     int        m_SmallDecompress;// Use memory-frugal decompression algorithm
  149. };
  150. //////////////////////////////////////////////////////////////////////////////
  151. //
  152. // CBZip2CompressionFile class
  153. //
  154. // Note, Read() copies data from the compressed file in chunks of size
  155. // BZ_MAX_UNUSED bytes before decompressing it. If the file contains more
  156. // bytes than strictly needed to reach the logical end-of-stream, Read()
  157. // will almost certainly read some of the trailing data before signalling of
  158. // sequence end.
  159. //
  160. class NCBI_XUTIL_EXPORT CBZip2CompressionFile : public CBZip2Compression,
  161.                                                 public CCompressionFile
  162. {
  163. public:
  164.     // 'ctors (for a special parameters description see CBZip2Compression)
  165.     // Throw exception CCompressionException::eCompressionFile on error.
  166.     CBZip2CompressionFile(
  167.         const string& file_name,
  168.         EMode         mode,
  169.         ELevel        level            = eLevel_Default,
  170.         int           verbosity        = 0,
  171.         int           work_factor      = 0,
  172.         int           small_decompress = 0 
  173.     );
  174.     CBZip2CompressionFile(
  175.         ELevel        level            = eLevel_Default,
  176.         int           verbosity        = 0,
  177.         int           work_factor      = 0,
  178.         int           small_decompress = 0 
  179.     );
  180.     ~CBZip2CompressionFile(void);
  181.     // Open a compressed file for reading or writing.
  182.     // Return TRUE if file was opened succesfully or FALSE otherwise.
  183.     virtual bool Open(const string& file_name, EMode mode);
  184.     // Read up to "len" uncompressed bytes from the compressed file "file"
  185.     // into the buffer "buf". Return the number of bytes actually read
  186.     // (0 for end of file, -1 for error).
  187.     // The number of really readed bytes can be less than requested.
  188.     virtual int Read(void* buf, int len);
  189.     // Writes the given number of uncompressed bytes into the compressed file.
  190.     // Return the number of bytes actually written or -1 for error.
  191.     virtual int Write(const void* buf, int len);
  192.     // Flushes all pending output if necessary, closes the compressed file.
  193.     // Return TRUE on success, FALSE on error.
  194.     virtual bool Close(void);
  195. protected:
  196.     FILE*  m_FileStream;  // Underlying file stream
  197.     bool   m_EOF;         // EOF flag for read mode
  198. };
  199. //////////////////////////////////////////////////////////////////////////////
  200. //
  201. // CBZip2Compressor class
  202. //
  203. class NCBI_XUTIL_EXPORT CBZip2Compressor : public CBZip2Compression,
  204.                                            public CCompressionProcessor
  205. {
  206. public:
  207.     // 'ctors
  208.     CBZip2Compressor(
  209.         ELevel level       = eLevel_Default,
  210.         int    verbosity   = 0,              // [0..4]
  211.         int    work_factor = 0               // [0..250] 
  212.     );
  213.     virtual ~CBZip2Compressor(void);
  214. protected:
  215.     virtual EStatus Init   (void);
  216.     virtual EStatus Process(const char* in_buf,  unsigned long  in_len,
  217.                             char*       out_buf, unsigned long  out_size,
  218.                             /* out */            unsigned long* in_avail,
  219.                             /* out */            unsigned long* out_avail);
  220.     virtual EStatus Flush  (char*       out_buf, unsigned long  out_size,
  221.                             /* out */            unsigned long* out_avail);
  222.     virtual EStatus Finish (char*       out_buf, unsigned long  out_size,
  223.                             /* out */            unsigned long* out_avail);
  224.     virtual EStatus End    (void);
  225. };
  226. //////////////////////////////////////////////////////////////////////////////
  227. //
  228. // CBZip2Decompressor class
  229. //
  230. class NCBI_XUTIL_EXPORT CBZip2Decompressor : public CBZip2Compression,
  231.                                              public CCompressionProcessor
  232. {
  233. public:
  234.     // 'ctors
  235.     CBZip2Decompressor(int verbosity        = 0,          // [0..4]
  236.                        int small_decompress = 0);         // [0,1]
  237.     virtual ~CBZip2Decompressor(void);
  238. protected:
  239.     virtual EStatus Init   (void); 
  240.     virtual EStatus Process(const char* in_buf,  unsigned long  in_len,
  241.                             char*       out_buf, unsigned long  out_size,
  242.                             /* out */            unsigned long* in_avail,
  243.                             /* out */            unsigned long* out_avail);
  244.     virtual EStatus Flush  (char*       out_buf, unsigned long  out_size,
  245.                             /* out */            unsigned long* out_avail);
  246.     virtual EStatus Finish (char*       out_buf, unsigned long  out_size,
  247.                             /* out */            unsigned long* out_avail);
  248.     virtual EStatus End    (void);
  249. };
  250. //////////////////////////////////////////////////////////////////////////////
  251. //
  252. // Compression/decompression stream processors (for details see "stream.hpp")
  253. //
  254. class NCBI_XUTIL_EXPORT CBZip2StreamCompressor
  255.     : public CCompressionStreamProcessor
  256. {
  257. public:
  258.     CBZip2StreamCompressor(
  259.         CCompression::ELevel level       = CCompression::eLevel_Default,
  260.         streamsize           in_bufsize  = kCompressionDefaultBufSize,
  261.         streamsize           out_bufsize = kCompressionDefaultBufSize,
  262.         int                  verbosity   = 0,
  263.         int                  work_factor = 0)
  264.         : CCompressionStreamProcessor(
  265.               new CBZip2Compressor(level, verbosity, work_factor),
  266.               eDelete, in_bufsize, out_bufsize)
  267.     {}
  268. };
  269. class NCBI_XUTIL_EXPORT CBZip2StreamDecompressor
  270.     : public CCompressionStreamProcessor
  271. {
  272. public:
  273.     CBZip2StreamDecompressor(
  274.         streamsize  in_bufsize       = kCompressionDefaultBufSize,
  275.         streamsize  out_bufsize      = kCompressionDefaultBufSize,
  276.         int         verbosity        = 0,
  277.         int         small_decompress = 0)
  278.         : CCompressionStreamProcessor(
  279.              new CBZip2Decompressor(verbosity, small_decompress),
  280.              eDelete, in_bufsize, out_bufsize)
  281.     {}
  282. };
  283. END_NCBI_SCOPE
  284. /* @} */
  285. /*
  286.  * ===========================================================================
  287.  * $Log: bzip2.hpp,v $
  288.  * Revision 1000.1  2004/04/20 18:39:51  gouriano
  289.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  290.  *
  291.  * Revision 1.7  2004/04/05 16:55:40  ucko
  292.  * Include the internal bzlib.h when using MSVC until its build system
  293.  * catches up.
  294.  *
  295.  * Revision 1.6  2004/04/05 15:54:12  ucko
  296.  * Default to using external versions of zlib, bzlib, and libpcre if available.
  297.  *
  298.  * Revision 1.5  2003/07/15 15:45:45  ivanov
  299.  * Improved error diagnostics
  300.  *
  301.  * Revision 1.4  2003/07/10 16:22:27  ivanov
  302.  * Added buffer size parameter into [De]CompressFile() functions.
  303.  * Cosmetic changes.
  304.  *
  305.  * Revision 1.3  2003/06/17 15:48:42  ivanov
  306.  * Removed all standalone compression/decompression I/O classes.
  307.  * Added CBZip2Stream[De]compressor classes. Now all bzip2-based I/O stream
  308.  * classes can be constructed using unified CCompression[I/O]Stream
  309.  * (see stream.hpp) and CBZip2Stream[De]compressor classes.
  310.  *
  311.  * Revision 1.2  2003/06/03 20:09:54  ivanov
  312.  * The Compression API redesign. Added some new classes, rewritten old.
  313.  *
  314.  * Revision 1.1  2003/04/07 20:42:11  ivanov
  315.  * Initial revision
  316.  *
  317.  * ===========================================================================
  318.  */
  319. #endif  /* UTIL_COMPRESS__BZIP2__HPP */