Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/nall/gzip.hpp
2 views
1
#ifndef NALL_GZIP_HPP
2
#define NALL_GZIP_HPP
3
4
#include <nall/file.hpp>
5
#include <nall/inflate.hpp>
6
7
namespace nall {
8
9
struct gzip {
10
string filename;
11
uint8_t *data;
12
unsigned size;
13
14
inline bool decompress(const string &filename);
15
inline bool decompress(const uint8_t *data, unsigned size);
16
17
inline gzip();
18
inline ~gzip();
19
};
20
21
bool gzip::decompress(const string &filename) {
22
uint8_t *data;
23
unsigned size;
24
if(file::read(filename, data, size) == false) return false;
25
bool result = decompress(data, size);
26
delete[] data;
27
return result;
28
}
29
30
bool gzip::decompress(const uint8_t *data, unsigned size) {
31
if(size < 18) return false;
32
if(data[0] != 0x1f) return false;
33
if(data[1] != 0x8b) return false;
34
unsigned cm = data[2];
35
unsigned flg = data[3];
36
unsigned mtime = data[4];
37
mtime |= data[5] << 8;
38
mtime |= data[6] << 16;
39
mtime |= data[7] << 24;
40
unsigned xfl = data[8];
41
unsigned os = data[9];
42
unsigned p = 10;
43
unsigned isize = data[size - 4];
44
isize |= data[size - 3] << 8;
45
isize |= data[size - 2] << 16;
46
isize |= data[size - 1] << 24;
47
filename = "";
48
49
if(flg & 0x04) { //FEXTRA
50
unsigned xlen = data[p + 0];
51
xlen |= data[p + 1] << 8;
52
p += 2 + xlen;
53
}
54
55
if(flg & 0x08) { //FNAME
56
char buffer[PATH_MAX];
57
for(unsigned n = 0; n < PATH_MAX; n++, p++) {
58
buffer[n] = data[p];
59
if(data[p] == 0) break;
60
}
61
if(data[p++]) return false;
62
filename = buffer;
63
}
64
65
if(flg & 0x10) { //FCOMMENT
66
while(data[p++]);
67
}
68
69
if(flg & 0x02) { //FHCRC
70
p += 2;
71
}
72
73
this->size = isize;
74
this->data = new uint8_t[this->size];
75
return inflate(this->data, this->size, data + p, size - p - 8);
76
}
77
78
gzip::gzip() : data(nullptr) {
79
}
80
81
gzip::~gzip() {
82
if(data) delete[] data;
83
}
84
85
}
86
87
#endif
88
89