diff --git a/file_ops.c b/file_ops.c index 6c706c03e5..170b6a0ece 100644 --- a/file_ops.c +++ b/file_ops.c @@ -395,11 +395,12 @@ static int zip_file_decompressed(const char *name, const char *valid_exts, { int ret = 0; zlib_file_handle_t handle = {0}; - if (!file_archive_inflate_data_to_file_init(&handle, cdata, csize, size)) + handle.backend = file_archive_get_default_file_backend(); + if (!handle.backend->stream_decompress_data_to_file_init(&handle, cdata, csize, size)) return false; do{ - ret = file_archive_inflate_data_to_file_iterate(handle.stream); + ret = handle.backend->stream_decompress_data_to_file_iterate(handle.stream); }while(ret == 0); handle.real_checksum = file_archive_crc32_calculate(0, handle.data, size); diff --git a/libretro-common/file/file_archive.c b/libretro-common/file/file_archive.c index fc893044ff..ecf5bac3a7 100644 --- a/libretro-common/file/file_archive.c +++ b/libretro-common/file/file_archive.c @@ -412,68 +412,6 @@ void zlib_deflate_init(void *data, int level) deflateInit(stream, level); } -bool file_archive_inflate_data_to_file_init( - zlib_file_handle_t *handle, - const uint8_t *cdata, uint32_t csize, uint32_t size) -{ - z_stream *stream = NULL; - - if (!handle) - return false; - - if (!handle->backend) - handle->backend = file_archive_get_default_file_backend(); - - if (!(handle->stream = (z_stream*)handle->backend->stream_new())) - goto error; - - if (inflateInit2(handle->stream, -MAX_WBITS) != Z_OK) - goto error; - - handle->data = (uint8_t*)malloc(size); - - if (!handle->data) - goto error; - - stream = (z_stream*)handle->stream; - - if (!stream) - goto error; - - handle->backend->stream_set(stream, csize, size, - (const uint8_t*)cdata, handle->data); - - return true; - -error: - if (handle->stream) - handle->backend->stream_free(handle->stream); - free(handle->stream); - if (handle->data) - free(handle->data); - - return false; -} - -int file_archive_inflate_data_to_file_iterate(void *data) -{ - int zstatus; - z_stream *stream = (z_stream*)data; - - if (!stream) - return -1; - - zstatus = inflate(stream, Z_NO_FLUSH); - - if (zstatus == Z_STREAM_END) - return 1; - - if (zstatus != Z_OK && zstatus != Z_BUF_ERROR) - return -1; - - return 0; -} - uint32_t file_archive_crc32_calculate( uint32_t crc, const uint8_t *data, @@ -750,12 +688,14 @@ bool file_archive_perform_mode(const char *path, const char *valid_exts, { int ret = 0; zlib_file_handle_t handle = {0}; - if (!file_archive_inflate_data_to_file_init(&handle, + handle.backend = file_archive_get_default_file_backend(); + + if (!handle.backend->stream_decompress_data_to_file_init(&handle, cdata, csize, size)) return false; do{ - ret = file_archive_inflate_data_to_file_iterate(handle.stream); + ret = handle.backend->stream_decompress_data_to_file_iterate(handle.stream); }while(ret == 0); if (!file_archive_inflate_data_to_file(&handle, diff --git a/libretro-common/file/file_archive_zlib.c b/libretro-common/file/file_archive_zlib.c index 69313431af..e8d157ed0a 100644 --- a/libretro-common/file/file_archive_zlib.c +++ b/libretro-common/file/file_archive_zlib.c @@ -129,6 +129,64 @@ static bool zlib_stream_decompress_init(void *data) return true; } +static bool zlib_stream_decompress_data_to_file_init( + zlib_file_handle_t *handle, + const uint8_t *cdata, uint32_t csize, uint32_t size) +{ + z_stream *stream = NULL; + + if (!handle) + return false; + + if (!(handle->stream = (z_stream*)zlib_stream_new())) + goto error; + + if (inflateInit2(handle->stream, -MAX_WBITS) != Z_OK) + goto error; + + handle->data = (uint8_t*)malloc(size); + + if (!handle->data) + goto error; + + stream = (z_stream*)handle->stream; + + if (!stream) + goto error; + + zlib_stream_set(stream, csize, size, + (const uint8_t*)cdata, handle->data); + + return true; + +error: + zlib_stream_free(handle->stream); + free(handle->stream); + if (handle->data) + free(handle->data); + + return false; +} + +static int zlib_stream_decompress_data_to_file_iterate(void *data) +{ + int zstatus; + z_stream *stream = (z_stream*)data; + + if (!stream) + return -1; + + zstatus = inflate(stream, Z_NO_FLUSH); + + if (zstatus == Z_STREAM_END) + return 1; + + if (zstatus != Z_OK && zstatus != Z_BUF_ERROR) + return -1; + + return 0; +} + const struct zlib_file_backend zlib_backend = { zlib_stream_new, zlib_stream_free, @@ -138,6 +196,8 @@ const struct zlib_file_backend zlib_backend = { zlib_stream_get_total_out, zlib_stream_decrement_total_out, zlib_stream_decompress_init, + zlib_stream_decompress_data_to_file_init, + zlib_stream_decompress_data_to_file_iterate, zlib_stream_compress_free, zlib_stream_compress_data_to_file, "zlib" diff --git a/libretro-common/formats/png/rpng.c b/libretro-common/formats/png/rpng.c index ff9c85aecc..a85e89dd06 100644 --- a/libretro-common/formats/png/rpng.c +++ b/libretro-common/formats/png/rpng.c @@ -699,7 +699,7 @@ static int rpng_load_image_argb_process_inflate_init(rpng_t *rpng, if (!to_continue) goto end; - zstatus = file_archive_inflate_data_to_file_iterate(rpng->process.stream); + zstatus = rpng->process.stream_backend->stream_decompress_data_to_file_iterate(rpng->process.stream); switch (zstatus) { diff --git a/libretro-common/include/file/file_archive.h b/libretro-common/include/file/file_archive.h index f400a3a8eb..fe23385ce9 100644 --- a/libretro-common/include/file/file_archive.h +++ b/libretro-common/include/file/file_archive.h @@ -37,6 +37,14 @@ enum zlib_transfer_type ZLIB_TRANSFER_DEINIT_ERROR }; +typedef struct zlib_handle +{ + void *stream; + uint8_t *data; + uint32_t real_checksum; + const struct zlib_file_backend *backend; +} zlib_file_handle_t; + struct zlib_file_backend { void *(*stream_new)(void); @@ -48,6 +56,9 @@ struct zlib_file_backend uint64_t (*stream_get_total_out)(void*); void (*stream_decrement_total_out)(void *, unsigned); bool (*stream_decompress_init)(void *); + bool (*stream_decompress_data_to_file_init)( + zlib_file_handle_t *, const uint8_t *, uint32_t, uint32_t); + int (*stream_decompress_data_to_file_iterate)(void *data); void (*stream_compress_free)(void *); int (*stream_compress_data_to_file)(void *); const char *ident; @@ -64,13 +75,6 @@ typedef struct zlib_transfer const struct zlib_file_backend *backend; } zlib_transfer_t; -typedef struct zlib_handle -{ - void *stream; - uint8_t *data; - uint32_t real_checksum; - const struct zlib_file_backend *backend; -} zlib_file_handle_t; /* Returns true when parsing should continue. False to stop. */ typedef int (*file_archive_file_cb)(const char *name, const char *valid_exts, @@ -133,12 +137,6 @@ bool file_archive_extract_first_content_file(char *zip_path, size_t zip_path_siz **/ struct string_list *file_archive_get_file_list(const char *path, const char *valid_exts); -bool file_archive_inflate_data_to_file_init( - zlib_file_handle_t *handle, - const uint8_t *cdata, uint32_t csize, uint32_t size); - -int file_archive_inflate_data_to_file_iterate(void *data); - /** * file_archive_inflate_data_to_file: * @path : filename path of archive.