-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshl.c
79 lines (72 loc) · 2.38 KB
/
shl.c
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
#include "rt/ustd.h"
#include "shl/sqz/sqz.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
static struct {
uint8_t data[1024];
size_t written;
size_t bytes;
} io;
static void put_byte(struct range_coder* rc, uint8_t b) {
(void)rc; // `rc` unused. No bounds check:
io.data[io.written++] = b;
}
static uint8_t get_byte(struct range_coder* rc) {
(void)rc; // `rc` unused. No bounds check:
return io.data[io.bytes++];
}
static errno_t lorem_ipsum(void) {
const char* text = "Lorem ipsum dolor sit amet. "
"Lorem ipsum dolor sit amet. "
"Lorem ipsum dolor sit amet. ";
size_t input_size = strlen(text);
uint64_t compressed_size = 0;
{
static struct sqz compress;
compress.that = 0;
assert(sizeof(io.data) > input_size * 2);
sqz_init(&compress);
compress.rc.write = put_byte;
// window_bits: 11 (2KB)
sqz_compress(&compress, text, input_size, 1u << 11);
if (compress.rc.error != 0) {
printf("Compression error: %d\n", compress.rc.error);
return compress.rc.error;
}
compressed_size = io.written;
printf("%d into %d bytes\n", (int)input_size, (int)compressed_size);
}
{
static char decompressed_data[1024];
static struct sqz decompress;
assert(sizeof(decompressed_data) > input_size);
sqz_init(&decompress);
decompress.rc.read = get_byte;
uint64_t decompressed = sqz_decompress(&decompress, decompressed_data,
input_size);
if (decompress.rc.error != 0) {
printf("Decompression error: %d\n", decompress.rc.error);
return decompress.rc.error;
} else {
if (decompressed != strlen(text)) {
printf("Decompressed size does not match original size\n");
return EINVAL;
}
}
if (memcmp(decompressed_data, text, (size_t)decompressed) != 0) {
printf("Decompressed data does not match original data\n");
return EINVAL;
}
printf("Decompression successful.\n");
}
return 0;
}
int main(int argc, const char* argv[]) {
(void)argc; (void)argv;
return (int)lorem_ipsum();
}
#define sqz_implementation
#include "shl/sqz/sqz.h"
#define rt_implementation
#include "rt/rt.h"