home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 7662 / gttool_src_bin.7z / gttool / src / compression.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2014-02-04  |  2.1 KB  |  80 lines

  1. #include "compression.h"
  2.  
  3. #include <zlib.h>
  4.  
  5. int inflate(const void* const in, const size_t in_size, void* const out, size_t* const out_size, int window_bits)
  6. {
  7.     assert(in != nullptr);
  8.     assert(out != nullptr);
  9.     assert(out_size != nullptr);
  10.  
  11.     z_stream stream;
  12.     int result;
  13.  
  14.     memset(&stream, 0, sizeof(stream));
  15.  
  16.     stream.zalloc = static_cast<alloc_func>(Z_NULL);
  17.     stream.zfree = static_cast<free_func>(Z_NULL);
  18.     stream.opaque = static_cast<voidpf>(Z_NULL);
  19.  
  20.     stream.next_in = const_cast<z_const Bytef*>(static_cast<const Bytef*>(in));
  21.     stream.avail_in = static_cast<uInt>(in_size);
  22.     stream.next_out = static_cast<Bytef*>(out);
  23.     stream.avail_out = static_cast<uInt>(*out_size);
  24.  
  25.     result = inflateInit2(&stream, window_bits);
  26.     if (result != Z_OK)
  27.         return result;
  28.  
  29.     result = inflate(&stream, Z_FINISH);
  30.     if (result != Z_STREAM_END) {
  31.         inflateEnd(&stream);
  32.         if (result == Z_NEED_DICT || (result == Z_BUF_ERROR && stream.avail_in == 0))
  33.             return Z_DATA_ERROR;
  34.         return result;
  35.     }
  36.  
  37.     *out_size = stream.total_out;
  38.  
  39.     result = inflateEnd(&stream);
  40.  
  41.     return result;
  42. }
  43.  
  44. int deflate(const void* const in, const size_t in_size, void* const out, size_t* const out_size, int window_bits, int level)
  45. {
  46.     assert(in != nullptr);
  47.     assert(out != nullptr);
  48.     assert(out_size != nullptr);
  49.  
  50.     z_stream stream;
  51.     int result;
  52.  
  53.     memset(&stream, 0, sizeof(stream));
  54.  
  55.     stream.zalloc = static_cast<alloc_func>(Z_NULL);
  56.     stream.zfree = static_cast<free_func>(Z_NULL);
  57.     stream.opaque = static_cast<voidpf>(Z_NULL);
  58.  
  59.     stream.next_in = const_cast<z_const Bytef*>(static_cast<const Bytef*>(in));
  60.     stream.avail_in = static_cast<uInt>(in_size);
  61.     stream.next_out = static_cast<Bytef*>(out);
  62.     stream.avail_out = static_cast<uInt>(*out_size);
  63.  
  64.     result = deflateInit2(&stream, level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY);
  65.     if (result != Z_OK)
  66.         return result;
  67.  
  68.     result = deflate(&stream, Z_FINISH);
  69.     if (result != Z_STREAM_END) {
  70.         deflateEnd(&stream);
  71.         return result == Z_OK ? Z_BUF_ERROR : result;
  72.     }
  73.  
  74.     *out_size = stream.total_out;
  75.  
  76.     result = deflateEnd(&stream);
  77.  
  78.     return result;
  79. }
  80.