-
Notifications
You must be signed in to change notification settings - Fork 154
Expand file tree
/
Copy pathzif.cpp
More file actions
102 lines (92 loc) · 2.97 KB
/
zif.cpp
File metadata and controls
102 lines (92 loc) · 2.97 KB
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
/** Implementation for gzip-like compression and uncompression interface */
#ifndef DISCARD_TEXT_COMPRESSION
#include <stdio.h>
#include "zlib/zlib.h"
#include "zif.h"
static char zif_error_buf[132];
const char* zif_error(void)
{
return zif_error_buf;
}
int zif_compress(struct zif_t* zs)
{
if (zs == nullptr) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: null zif_t in zif_compress");
return -1;
}
unsigned long cbl = (unsigned long) zs->compressed_buf_len;
int rv = compress((Bytef*) zs->compressed_buf,
&cbl,
(const Bytef*) zs->uncompressed_buf,
(unsigned long) zs->uncompressed_buf_len);
zs->compressed_buf_len = cbl;
if (rv == Z_OK) {
zif_error_buf[0] = '\0';
return 0;
}
else if (rv == Z_MEM_ERROR) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: not enough memory");
return -2;
}
else if (rv == Z_BUF_ERROR) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: output buf too small");
return -3;
}
else {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: unexpected error in zif_compress %d", rv);
return -4;
}
}
int zif_uncompress(struct zif_t* zs)
{
if (zs == nullptr) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: null zif_t in zif_uncompress");
return -1;
}
if (zs->compressed_buf_len == 0) {
zs->uncompressed_buf_len = 0;
zs->uncompressed_buf[0] = '\0';
return 0;
}
size_t original_ulen = zs->uncompressed_buf_len;
unsigned long ubl = (unsigned long) zs->uncompressed_buf_len;
int rv = uncompress((Bytef*) zs->uncompressed_buf,
&ubl,
(const Bytef*) zs->compressed_buf,
(unsigned long) zs->compressed_buf_len);
zs->uncompressed_buf_len = ubl;
if (rv == Z_OK) {
zif_error_buf[0] = '\0'; // clear error message
// null terminate if there is space
if (zs->uncompressed_buf_len < original_ulen) {
((char*) zs->uncompressed_buf)[zs->uncompressed_buf_len] = '\0';
}
return 0;
}
else if (rv == Z_MEM_ERROR) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: not enough memory");
return -2;
}
else if (rv == Z_BUF_ERROR) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: output buf too small");
return -3;
}
else if (rv == Z_DATA_ERROR) {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: corrupted data");
return -4;
}
else {
snprintf(zif_error_buf, sizeof(zif_error_buf),
"FATAL: zif: unexpected error in zif_uncompress %d", rv);
return -5;
}
}
#endif // DISCARD_TEXT_COMPRESSION