Skip to content

Commit fa62060

Browse files
change lz4 compression format
1 parent 982f2e7 commit fa62060

2 files changed

Lines changed: 34 additions & 20 deletions

File tree

Makefile

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,6 @@ SOURCES = $(SRCDIR)/appvar.c \
7676
$(DEPDIR)/zx/zx0/compress.c \
7777
$(DEPDIR)/libyaml/src/api.c \
7878
$(DEPDIR)/lz4/lib/lz4.c \
79-
$(DEPDIR)/lz4/lib/lz4frame.c \
80-
$(DEPDIR)/lz4/lib/lz4hc.c \
81-
$(DEPDIR)/lz4/lib/xxhash.c \
8279
$(DEPDIR)/libyaml/src/dumper.c \
8380
$(DEPDIR)/libyaml/src/loader.c \
8481
$(DEPDIR)/libyaml/src/parser.c \

src/compress.c

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@
3434

3535
#include "deps/zx/zx7/zx7.h"
3636
#include "deps/zx/zx0/zx0.h"
37-
#include "deps/lz4/lib/lz4frame.h"
38-
#include "deps/lz4/lib/lz4hc.h"
37+
#include "deps/lz4/lib/lz4.h"
3938

4039
#include <string.h>
4140

41+
#define LZ4_SIZE_PREFIX_BYTES 3
42+
4243
static uint8_t *compress_zx7(void *data, size_t *size)
4344
{
4445
uint8_t *compressed_data;
@@ -102,9 +103,10 @@ static uint8_t *compress_lz4(void *data, size_t *size)
102103
uint8_t *compressed_data;
103104
const char *input;
104105
size_t orig_size;
105-
size_t max_compressed_size;
106-
size_t compressed_size;
107-
LZ4F_preferences_t preferences = LZ4F_INIT_PREFERENCES;
106+
int input_size;
107+
int max_compressed_size;
108+
int compressed_size;
109+
size_t total_size;
108110

109111
if (size == NULL || data == NULL)
110112
{
@@ -114,30 +116,45 @@ static uint8_t *compress_lz4(void *data, size_t *size)
114116
input = data;
115117
orig_size = *size;
116118

117-
preferences.compressionLevel = LZ4HC_CLEVEL_MAX;
118-
preferences.frameInfo.contentChecksumFlag = LZ4F_noContentChecksum;
119+
if (orig_size > LZ4_MAX_INPUT_SIZE)
120+
{
121+
LOG_ERROR("LZ4 compression failed: input too large.\n");
122+
return NULL;
123+
}
119124

120-
max_compressed_size = LZ4F_compressFrameBound(orig_size, &preferences);
121-
compressed_data = memory_alloc(max_compressed_size);
125+
input_size = (int)orig_size;
126+
max_compressed_size = LZ4_compressBound(input_size);
127+
compressed_data = memory_alloc((size_t)max_compressed_size + LZ4_SIZE_PREFIX_BYTES);
122128
if (compressed_data == NULL)
123129
{
124130
return NULL;
125131
}
126132

127-
compressed_size = LZ4F_compressFrame(compressed_data, max_compressed_size,
128-
input, orig_size, &preferences);
129-
130-
if (LZ4F_isError(compressed_size))
133+
compressed_size = LZ4_compress_default(input, (char *)(compressed_data + LZ4_SIZE_PREFIX_BYTES),
134+
input_size, max_compressed_size);
135+
136+
if (compressed_size <= 0)
131137
{
132138
free(compressed_data);
133-
LOG_ERROR("LZ4 frame compression failed: %s\n",
134-
LZ4F_getErrorName(compressed_size));
139+
LOG_ERROR("LZ4 block compression failed.\n");
135140
return NULL;
136141
}
137142

138-
LOG_DEBUG("Compressed size: %zu -> %zu\n", orig_size, compressed_size);
143+
if (compressed_size > 0xFFFFFF)
144+
{
145+
free(compressed_data);
146+
LOG_ERROR("LZ4 compression failed: output too large for 3-byte size.\n");
147+
return NULL;
148+
}
139149

140-
*size = compressed_size;
150+
compressed_data[0] = (uint8_t)(compressed_size & 0xFF);
151+
compressed_data[1] = (uint8_t)((compressed_size >> 8) & 0xFF);
152+
compressed_data[2] = (uint8_t)((compressed_size >> 16) & 0xFF);
153+
154+
total_size = (size_t)compressed_size + LZ4_SIZE_PREFIX_BYTES;
155+
LOG_DEBUG("Compressed size: %zu -> %zu (lz4 block)\n", orig_size, total_size);
156+
157+
*size = total_size;
141158

142159
return compressed_data;
143160
}

0 commit comments

Comments
 (0)