|
|
@@ -25,8 +25,6 @@ uint8_t* ZipCompressor::compress(void* data, size_t in_size, size_t& out_size)
|
|
|
assert(in_size > 0);
|
|
|
|
|
|
m_data_list.clear();
|
|
|
-// uint8_t* out_data = (uint8_t*)m_allocator->allocate(sizeof(uint8_t) * in_size);
|
|
|
-// uint8_t* last_byte = out_data;
|
|
|
|
|
|
// memory's chunk max dimension
|
|
|
const size_t CHUNK_SIZE = 16384;
|
|
|
@@ -53,7 +51,6 @@ uint8_t* ZipCompressor::compress(void* data, size_t in_size, size_t& out_size)
|
|
|
{
|
|
|
size_t this_step_bytes = math::min(CHUNK_SIZE, in_size - bytes_read);
|
|
|
memcpy(in, (uint8_t*)data, sizeof(uint8_t) * this_step_bytes);
|
|
|
-// read_data_block(in, this_step_bytes);
|
|
|
|
|
|
strm.avail_in = this_step_bytes;
|
|
|
strm.next_in = in;
|
|
|
@@ -71,10 +68,7 @@ uint8_t* ZipCompressor::compress(void* data, size_t in_size, size_t& out_size)
|
|
|
have = CHUNK_SIZE - strm.avail_out;
|
|
|
if (have > 0)
|
|
|
{
|
|
|
-// memcpy(last_byte, out, sizeof(uint8_t) * have);
|
|
|
m_data_list.push(out, have);
|
|
|
-// last_byte += sizeof(uint8_t) * have;
|
|
|
- //stream->write_data_block(out, have);
|
|
|
}
|
|
|
} while (strm.avail_out == 0);
|
|
|
assert(strm.avail_in == 0); /* all input will be used */
|
|
|
@@ -94,7 +88,78 @@ uint8_t* ZipCompressor::compress(void* data, size_t in_size, size_t& out_size)
|
|
|
|
|
|
uint8_t* ZipCompressor::decompress(const void* data, size_t in_size, size_t& out_size)
|
|
|
{
|
|
|
+ m_data_list.clear();
|
|
|
+
|
|
|
+ const size_t CHUNK_SIZE = 16384;
|
|
|
+ int32_t ret;
|
|
|
+ unsigned have;
|
|
|
+ z_stream strm;
|
|
|
+ uint8_t in[CHUNK_SIZE];
|
|
|
+ uint8_t out[CHUNK_SIZE];
|
|
|
+
|
|
|
+ /* allocate inflate state */
|
|
|
+ strm.zalloc = Z_NULL;
|
|
|
+ strm.zfree = Z_NULL;
|
|
|
+ strm.opaque = Z_NULL;
|
|
|
+ strm.avail_in = 0;
|
|
|
+ strm.next_in = Z_NULL;
|
|
|
+ ret = inflateInit(&strm);
|
|
|
+
|
|
|
+ assert(ret == Z_OK);
|
|
|
+
|
|
|
+ size_t bytes_read = 0;
|
|
|
+
|
|
|
+ /* decompress until deflate stream ends or end of file */
|
|
|
+ do
|
|
|
+ {
|
|
|
+ size_t this_step_bytes = math::min(CHUNK_SIZE, in_size - bytes_read);
|
|
|
+ memcpy(in, (uint8_t*)data, sizeof(uint8_t) * this_step_bytes);
|
|
|
+
|
|
|
+ strm.avail_in = this_step_bytes;
|
|
|
+ strm.next_in = in;
|
|
|
+ if (strm.avail_in == 0)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* run inflate() on input until output buffer not full */
|
|
|
+ do {
|
|
|
+ strm.avail_out = CHUNK_SIZE;
|
|
|
+ strm.next_out = out;
|
|
|
+ ret = inflate(&strm, Z_NO_FLUSH);
|
|
|
+
|
|
|
+ assert(ret != Z_STREAM_ERROR); /* state not clobbered */
|
|
|
+
|
|
|
+ switch (ret)
|
|
|
+ {
|
|
|
+ case Z_NEED_DICT:
|
|
|
+ {
|
|
|
+ ret = Z_DATA_ERROR; /* and fall through */
|
|
|
+ }
|
|
|
+ case Z_DATA_ERROR:
|
|
|
+ case Z_MEM_ERROR:
|
|
|
+ {
|
|
|
+ (void)inflateEnd(&strm);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ have = CHUNK_SIZE - strm.avail_out;
|
|
|
+ if (have > 0)
|
|
|
+ {
|
|
|
+ m_data_list.push(out, have);
|
|
|
+ }
|
|
|
+ } while (strm.avail_out == 0);
|
|
|
+
|
|
|
+ bytes_read += this_step_bytes;
|
|
|
+ /* done when inflate() says it's done */
|
|
|
+ } while (ret != Z_STREAM_END);
|
|
|
+
|
|
|
+ /* clean up and return */
|
|
|
+ (void)inflateEnd(&strm);
|
|
|
+
|
|
|
+ out_size = strm.total_out;
|
|
|
|
|
|
+ return m_data_list.begin();
|
|
|
}
|
|
|
|
|
|
}
|