lib/uzlib/lz77: Always use separate history buffer.

Because we only use the streaming source, this is just extra code size.

Saves 64 bytes on PYBV11.

Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
pull/11905/head
Jim Mussared 2023-06-27 22:03:52 +10:00 zatwierdzone przez Damien George
rodzic c4feb806e0
commit 82db9926ed
1 zmienionych plików z 9 dodań i 31 usunięć

Wyświetl plik

@ -56,13 +56,6 @@ static size_t uzlib_lz77_search_max_match(struct uzlib_lz77_state *state, const
// Compress the given chunk of data. // Compress the given chunk of data.
void uzlib_lz77_compress(struct uzlib_lz77_state *state, const uint8_t *src, unsigned len) { void uzlib_lz77_compress(struct uzlib_lz77_state *state, const uint8_t *src, unsigned len) {
bool use_src_as_history = false;
if (state->hist_buf == NULL) {
use_src_as_history = true;
state->hist_buf = (uint8_t *)src;
state->hist_len = 0;
}
const uint8_t *top = src + len; const uint8_t *top = src + len;
while (src < top) { while (src < top) {
// Look for a match in the history window. // Look for a match in the history window.
@ -77,31 +70,16 @@ void uzlib_lz77_compress(struct uzlib_lz77_state *state, const uint8_t *src, uns
zlib_match(&state->outbuf, match_offset, match_len); zlib_match(&state->outbuf, match_offset, match_len);
} }
// Advance the history window. // Push the bytes into the history buffer.
if (use_src_as_history) { size_t mask = state->hist_max - 1;
// Use src as the history, so advance it. while (match_len--) {
state->hist_len += match_len; uint8_t b = *src++;
if (state->hist_len > state->hist_max) { state->hist_buf[(state->hist_start + state->hist_len) & mask] = b;
state->hist_buf += state->hist_len - state->hist_max; if (state->hist_len == state->hist_max) {
state->hist_len = state->hist_max; state->hist_start = (state->hist_start + 1) & mask;
} } else {
src += match_len; ++state->hist_len;
} else {
// Push the bytes into the history buffer.
size_t mask = state->hist_max - 1;
while (match_len--) {
uint8_t b = *src++;
state->hist_buf[(state->hist_start + state->hist_len) & mask] = b;
if (state->hist_len == state->hist_max) {
state->hist_start = (state->hist_start + 1) & mask;
} else {
++state->hist_len;
}
} }
} }
} }
if (use_src_as_history) {
state->hist_buf = NULL;
}
} }