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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/************
*
* This file is part of a tool for reading 3D content in the PRC format.
* Copyright (C) 2008 Orest Shardt <shardtor (at) gmail dot com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*************/
#include "inflation.h"
using std::istream;
using std::ios;
using std::cout;
using std::cerr;
using std::endl;
using std::exit;
int decompress(char* inb, int fileLength, char* &outb)
{
const int CHUNK = 16384;
unsigned int resultSize = 0;
outb = (char*) realloc(outb,CHUNK);
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.avail_in = fileLength;
strm.next_in = (unsigned char*)inb;
strm.opaque = Z_NULL;
int code = inflateInit(&strm);
if(code != Z_OK)
return -1;
strm.next_out = (unsigned char*)outb;
strm.avail_out = CHUNK;
code = inflate(&strm,Z_NO_FLUSH);
resultSize = CHUNK-strm.avail_out;
unsigned int size = CHUNK;
while(code == Z_OK)
{
outb = (char*) realloc(outb,2*size);
if(outb == NULL)
{
cerr << "Ran out of memory while decompressing." << endl;
exit(1);
}
strm.next_out = (Bytef*)(outb + resultSize);
strm.avail_out += size;
size *= 2;
code = inflate(&strm,Z_NO_FLUSH);
resultSize = size - strm.avail_out;
}
code = inflateEnd(&strm);
if(code != Z_OK)
{
free(outb);
return 0;
}
return resultSize;
}
int decompress(istream &input,char* &result)
{
input.seekg(0,ios::end);
int fileLength = input.tellg();
input.seekg(0,ios::beg);
char *inb = new char[fileLength];
input.read(inb,fileLength);
int code = decompress(inb,fileLength,result);
delete[] inb;
return code;
}
|