mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-12 00:58:20 +03:00
Temp commit. Sound
This commit is contained in:
+38
-6
@@ -34,6 +34,37 @@ namespace deflate {
|
||||
return result >= 0 ? result : result - 0x10;
|
||||
}
|
||||
|
||||
int32_t compress_gzip(const void* src, size_t src_length, void** dst,
|
||||
size_t* dst_length, int32_t compression_level, const char* file_name) {
|
||||
if (!src_length)
|
||||
return -1;
|
||||
else if (!src)
|
||||
return -2;
|
||||
else if (!dst)
|
||||
return -3;
|
||||
else if (!dst_length)
|
||||
return -4;
|
||||
|
||||
struct libdeflate_compressor* c = libdeflate_alloc_compressor(compression_level);
|
||||
if (!c)
|
||||
return -5;
|
||||
|
||||
int32_t result = compress_static(c, src, src_length, dst, dst_length, compression_level, MODE_GZIP);
|
||||
libdeflate_free_compressor(c);
|
||||
if (result < 0)
|
||||
return result - 0x10;
|
||||
|
||||
size_t file_name_length = utf8_length(file_name);
|
||||
void* temp = force_malloc(*dst_length + file_name_length + 1);
|
||||
size_t t = (size_t)temp;
|
||||
size_t d = (size_t)*dst;
|
||||
memcpy((void*)t, (void*)d, 0x0A);
|
||||
memcpy((void*)(t + 0x0A), file_name, file_name_length + 1);
|
||||
memcpy((void*)(t + 0x0A + file_name_length + 1), (void*)(d + 0x0A), *dst_length - 0x0A);
|
||||
((uint8_t*)t)[0x03] |= 0x08;
|
||||
return result;
|
||||
}
|
||||
|
||||
int32_t decompress(const void* src, size_t src_length, void** dst,
|
||||
size_t* dst_length, mode mode) {
|
||||
if (!src_length)
|
||||
@@ -69,6 +100,7 @@ namespace deflate {
|
||||
dst_max_length = libdeflate_deflate_compress_bound(c, src_length);
|
||||
break;
|
||||
}
|
||||
|
||||
*dst = force_malloc(dst_max_length);
|
||||
if (!*dst)
|
||||
return -1;
|
||||
@@ -93,12 +125,12 @@ namespace deflate {
|
||||
|
||||
void* temp = force_malloc(dst_act_length);
|
||||
if (!temp) {
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
return -2;
|
||||
}
|
||||
|
||||
memcpy(temp, *dst, dst_act_length);
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
*dst = temp;
|
||||
*dst_length = dst_act_length;
|
||||
return 0;
|
||||
@@ -126,11 +158,11 @@ namespace deflate {
|
||||
|
||||
switch (result) {
|
||||
case LIBDEFLATE_BAD_DATA:
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
return -2;
|
||||
break;
|
||||
case LIBDEFLATE_INSUFFICIENT_SPACE:
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
*dst_length *= 2;
|
||||
decompress_static(d, src, src_length, dst, dst_length, mode);
|
||||
break;
|
||||
@@ -140,12 +172,12 @@ namespace deflate {
|
||||
|
||||
void* temp = force_malloc(dst_act_length);
|
||||
if (!temp) {
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
return -3;
|
||||
}
|
||||
|
||||
memcpy(temp, *dst, dst_act_length);
|
||||
free(*dst);
|
||||
free_def(*dst);
|
||||
*dst = temp;
|
||||
*dst_length = dst_act_length;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user