diff --git a/libretro-common/file/archive_file.c b/libretro-common/file/archive_file.c index becdf6345b..ca55e5d093 100644 --- a/libretro-common/file/archive_file.c +++ b/libretro-common/file/archive_file.c @@ -496,7 +496,6 @@ static bool file_archive_walk(const char *file, const char *valid_exts, int file_archive_parse_file_progress(file_archive_transfer_t *state) { - /* FIXME: this estimate is worse than before */ ptrdiff_t delta = 0; if (!state || state->archive_size == 0) @@ -504,7 +503,10 @@ int file_archive_parse_file_progress(file_archive_transfer_t *state) delta = state->directory - state->data; - return (int)(delta * 100 / state->archive_size); + if (!state->start_delta) + state->start_delta = delta; + + return (int)(((delta - state->start_delta) * 100) / (state->archive_size - state->start_delta)); } /** diff --git a/libretro-common/file/archive_file_zlib.c b/libretro-common/file/archive_file_zlib.c index 293deb9f3a..07fec55fd4 100644 --- a/libretro-common/file/archive_file_zlib.c +++ b/libretro-common/file/archive_file_zlib.c @@ -240,7 +240,7 @@ static int zip_file_read( const char *needle, void **buf, const char *optional_outfile) { - file_archive_transfer_t zlib = {ARCHIVE_TRANSFER_NONE, 0, NULL, NULL, NULL, NULL, NULL, NULL }; + file_archive_transfer_t zlib = {0}; struct archive_extract_userdata userdata = {{0}}; bool returnerr = true; int ret = 0; diff --git a/libretro-common/include/file/archive_file.h b/libretro-common/include/file/archive_file.h index 3861f6ac89..02c193b9e3 100644 --- a/libretro-common/include/file/archive_file.h +++ b/libretro-common/include/file/archive_file.h @@ -64,6 +64,7 @@ typedef struct file_archive_transfer { enum file_archive_transfer_type type; int32_t archive_size; + ptrdiff_t start_delta; file_archive_file_data_t *handle; void *stream; const uint8_t *footer;