File: ZlibDecompressor.cpp

package info (click to toggle)
minetestmapper 20180325-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 236 kB
  • sloc: cpp: 2,101; ansic: 32; makefile: 9; sh: 9
file content (71 lines) | stat: -rw-r--r-- 1,524 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * =====================================================================
 *        Version:  1.0
 *        Created:  18.09.2012 10:20:47
 *         Author:  Miroslav Bendík
 *        Company:  LinuxOS.sk
 * =====================================================================
 */

#include <zlib.h>
#include <stdint.h>
#include "ZlibDecompressor.h"

ZlibDecompressor::ZlibDecompressor(const unsigned char *data, std::size_t size):
	m_data(data),
	m_seekPos(0),
	m_size(size)
{
}

ZlibDecompressor::~ZlibDecompressor()
{
}

void ZlibDecompressor::setSeekPos(std::size_t seekPos)
{
	m_seekPos = seekPos;
}

std::size_t ZlibDecompressor::seekPos() const
{
	return m_seekPos;
}

ustring ZlibDecompressor::decompress()
{
	const unsigned char *data = m_data + m_seekPos;
	const std::size_t size = m_size - m_seekPos;

	ustring buffer;
	const size_t BUFSIZE = 128 * 1024;
	uint8_t temp_buffer[BUFSIZE];

	z_stream strm;
	strm.zalloc = Z_NULL;
	strm.zfree = Z_NULL;
	strm.opaque = Z_NULL;
	strm.next_in = Z_NULL;
	strm.avail_in = size;

	if (inflateInit(&strm) != Z_OK) {
		throw DecompressError();
	}

	strm.next_in = const_cast<unsigned char *>(data);
	int ret = 0;
	do {
		strm.avail_out = BUFSIZE;
		strm.next_out = temp_buffer;
		ret = inflate(&strm, Z_NO_FLUSH);
		buffer += ustring(reinterpret_cast<unsigned char *>(temp_buffer), BUFSIZE - strm.avail_out);
	} while (ret == Z_OK);
	if (ret != Z_STREAM_END) {
		throw DecompressError();
	}
	m_seekPos += strm.next_in - data;
	(void)inflateEnd(&strm);

	return buffer;
}