-
Notifications
You must be signed in to change notification settings - Fork 5
/
compressor.h
113 lines (102 loc) · 2.62 KB
/
compressor.h
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//
// C++ Interface: compressor
//
// Description:
//
//
// Author: Jamie Nelson <mordecai4d@gmail.com>, (C) 2007
//
// Copyright: See COPYING file that comes with this distribution
//
//
#ifndef COMPRESSOR_H
#define COMPRESSOR_H
#define CHUNK 16384
struct compress_map_data {
unsigned char *saved;
unsigned char *inflated;
bool parsed;
time_t last_accessed;
size_t length;
int copies;
compress_map_data() {
saved = NULL;
inflated = NULL;
parsed = false;
last_accessed = 0;
length = 0;
copies = 1;
}
~compress_map_data() {
copies -= 1;
if (copies == 0 && inflated)
free(inflated);
inflated = NULL;
if (copies == 0 && saved)
free(saved);
saved = NULL;
}
};
class Compressor {
public:
char *InflateFromId(long i);
long CompressToId(const char *in, long i);
long CompressToId(const char *in);
long CompressToId(const char *in, long i, bool comp);
long CompressToId(const char *in, bool comp);
bool DeleteId(long i);
int cleanInflated();
const char * zerr(int ret);
Compressor() {
TopID = 0;
ctr = NULL;
/* allocate deflate state */
istrm.zalloc = Z_NULL;
istrm.zfree = Z_NULL;
istrm.opaque = Z_NULL;
istrm.avail_in = 0;
istrm.next_in = Z_NULL;
dstrm.zalloc = Z_NULL;
dstrm.zfree = Z_NULL;
dstrm.opaque = Z_NULL;//Z_DEFAULT_COMPRESSION
deflateInit(&dstrm, 1);
inflateInit(&istrm);
bigs = 0;
smalls = 0;
}
~Compressor() {
/* clean up and return */
(void)deflateEnd(&dstrm);
(void)inflateEnd(&istrm);
for (std::map<long, compress_map_data *>::iterator z = zmap.begin();z != zmap.end();z++)
delete z->second;
zmap.clear();
}
inline int Bigs() {
return bigs;
}
inline int Smalls() {
return smalls;
}
private:
unsigned char * inf(unsigned char *source, size_t &dest);
unsigned char * def(unsigned char *source, size_t &dest);
z_stream dstrm;
z_stream istrm;
unsigned char *tmp;
int dlen;
string o_s;
long TopID;
std::map<long, compress_map_data *> zmap;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
unsigned char *ctr;
int cur_size;
int last_size;
int read_to;
size_t r_len;
int bigs;
int smalls;
};
extern Compressor compressor;
#endif