7#include <thirdparty/lzx.h>
17inline bool bit_scan_forward(uint32_t v, uint32_t* out_first_set_index) {
19 *out_first_set_index = i - 1;
22inline bool bit_scan_forward(uint64_t v, uint32_t* out_first_set_index) {
23 int i = __builtin_ffsll(v);
24 *out_first_set_index = i - 1;
28inline bool bit_scan_forward(int32_t v, uint32_t* out_first_set_index) {
29 return bit_scan_forward(
static_cast<uint32_t
>(v), out_first_set_index);
31inline bool bit_scan_forward(int64_t v, uint32_t* out_first_set_index) {
32 return bit_scan_forward(
static_cast<uint64_t
>(v), out_first_set_index);
35mspackMemoryFile_t* mspack_memory_open(mspack_system* sys,
void* buffer,
const size_t size)
40 memfile->buffer = buffer;
41 memfile->buffer_size = (off_t)size;
52int mspack_memory_read(mspack_file* file,
void* buffer,
int chars)
55 const off_t remaining = memfile->buffer_size - memfile->offset;
56 const off_t total = std::min(
static_cast<off_t
>(chars), remaining);
57 std::memcpy(buffer, (uint8_t*)memfile->buffer + memfile->offset, total);
58 memfile->offset += total;
62int mspack_memory_write(mspack_file* file,
void* buffer,
int chars)
65 const off_t remaining = memfile->buffer_size - memfile->offset;
66 const off_t total = std::min(
static_cast<off_t
>(chars), remaining);
67 std::memcpy((uint8_t*)memfile->buffer + memfile->offset, buffer, total);
68 memfile->offset += total;
72void* mspack_memory_alloc(mspack_system*,
size_t chars)
74 return calloc(chars, 1);
77void mspack_memory_free(
void* ptr)
82void mspack_memory_copy(
void* src,
void* dest,
size_t chars)
84 memcpy(dest, src, chars);
87mspack_system* mspack_memory_sys_create()
89 auto sys = (mspack_system*)calloc(1,
sizeof(mspack_system));
92 sys->read = mspack_memory_read;
93 sys->write = mspack_memory_write;
94 sys->alloc = mspack_memory_alloc;
95 sys->free = mspack_memory_free;
96 sys->copy = mspack_memory_copy;
100void mspack_memory_sys_destroy(
struct mspack_system* sys) { free(sys); }
102int lzx_decompress(
const void *lzx_data,
size_t lzx_len,
void *dest,
size_t dest_len, uint32_t window_size,
void *window_data,
size_t window_data_len)
106 uint32_t window_bits;
107 if (!bit_scan_forward(window_size, &window_bits))
110 mspack_system* sys = mspack_memory_sys_create();
113 lzxd_stream* lzxd = lzxd_init(sys, (mspack_file*)lzxsrc, (mspack_file*)lzxdst, window_bits, 0, 0x8000, (off_t)dest_len, 0);
119 auto padding_len = window_size - window_data_len;
120 memset(&lzxd->window[0], 0, padding_len);
121 memcpy(&lzxd->window[padding_len], window_data, window_data_len);
122 lzxd->ref_data_size = window_size;
125 res = lzxd_decompress(lzxd, (off_t)dest_len);
133 mspack_memory_close(lzxsrc);
139 mspack_memory_close(lzxdst);
145 mspack_memory_sys_destroy(sys);