5#include "sw/device/lib/base/lz4.h"
9int LZ4_decompress(
const char *src_in,
char *dst_in,
int compressed_size,
11 const uint8_t *src = (
const uint8_t *)src_in;
12 const uint8_t *src_end = src + compressed_size;
13 uint8_t *dst = (uint8_t *)dst_in;
14 uint8_t *dst_end = dst + dst_capacity;
15 uint8_t *dst_ptr = dst;
17 while (src < src_end) {
18 uint8_t token = *src++;
21 unsigned int lit_len = token >> 4;
33 if ((
size_t)(src_end - src) < lit_len ||
34 (
size_t)(dst_end - dst_ptr) < lit_len) {
38 unsigned int l = lit_len;
49 if (src + 2 > src_end)
51 uint16_t offset = (uint16_t)(src[0] | (src[1] << 8));
54 if (offset == 0 || offset > (
size_t)(dst_ptr - dst)) {
58 unsigned int match_len = token & 0x0F;
59 if (match_len == 15) {
71 if ((
size_t)(dst_end - dst_ptr) < match_len) {
75 const uint8_t *match_ptr = dst_ptr - offset;
76 unsigned int m = match_len;
78 *dst_ptr++ = *match_ptr++;
82 return (
int)(dst_ptr - dst);