From bb621adbbbc5fc53c607fc664b638fd771051195 Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Fri, 8 Dec 2023 11:56:40 -0300 Subject: [PATCH] Fix unzLocateFile 3rd parameter Replace the previous type with one that is compatible with an int in order to be identical to the interface used in madler's zlib. Fixes #745. --- mz_compat.c | 25 +++++++++++++++++++------ mz_compat.h | 9 +++++++-- test/test_compat.cc | 2 +- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/mz_compat.c b/mz_compat.c index 1eba3757..ae5a3aa7 100644 --- a/mz_compat.c +++ b/mz_compat.c @@ -1093,7 +1093,13 @@ int unzGoToNextFile(unzFile file) { return err; } -int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) { +#ifdef WIN32 +#define DEFAULT_IGNORE_CASE 1 +#else +#define DEFAULT_IGNORE_CASE 0 +#endif + +int unzLocateFile(unzFile file, const char *filename, unzFileNameCase filename_case) { mz_compat *compat = (mz_compat *)file; mz_zip_file *file_info = NULL; uint64_t preserve_index = 0; @@ -1111,12 +1117,19 @@ int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filena if (err != MZ_OK) break; - if ((intptr_t)filename_compare_func > 2) { - result = filename_compare_func(file, filename, file_info->filename); - } else { - int32_t case_sensitive = (int32_t)(intptr_t)filename_compare_func; - result = mz_path_compare_wc(filename, file_info->filename, !case_sensitive); + uint8_t ignore_case; + switch (filename_case) { + case 0: + ignore_case = DEFAULT_IGNORE_CASE; + break; + case 1: + ignore_case = 0; + break; + case 2: // Fall through. + default: + ignore_case = 1; } + result = mz_path_compare_wc(filename, file_info->filename, !ignore_case); if (result == 0) return MZ_OK; diff --git a/mz_compat.h b/mz_compat.h index fc05d150..dc158a5f 100644 --- a/mz_compat.h +++ b/mz_compat.h @@ -308,7 +308,12 @@ typedef struct unz_file_info_s { /***************************************************************************/ -typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2); +/* Possible values: + 0 - Uses OS default, e.g. Windows ignores case. + 1 - Is case sensitive. + >= 2 - Ignore case. +*/ +typedef int unzFileNameCase; typedef int (*unzIteratorFunction)(unzFile file); typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename, uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, @@ -349,7 +354,7 @@ ZEXPORT int unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_in ZEXPORT int unzGoToFirstFile(unzFile file); ZEXPORT int unzGoToNextFile(unzFile file); -ZEXPORT int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func); +ZEXPORT int unzLocateFile(unzFile file, const char *filename, unzFileNameCase filename_case); ZEXPORT int unzGetLocalExtrafield(unzFile file, void *buf, unsigned int len); diff --git a/test/test_compat.cc b/test/test_compat.cc index 5cec66c9..e7488468 100644 --- a/test/test_compat.cc +++ b/test/test_compat.cc @@ -90,7 +90,7 @@ static void test_unzip_compat(unzFile unzip) { EXPECT_EQ(global_info64.number_disk_with_CD, 0) << "invalid disk with cd 64-bit"; - EXPECT_EQ(err = unzLocateFile(unzip, "test.txt", (unzFileNameComparer)(void *)1), UNZ_OK) + EXPECT_EQ(err = unzLocateFile(unzip, "test.txt", 1), UNZ_OK) << "cannot locate test file (err: " << err << ")"; EXPECT_EQ(err = unzGoToFirstFile(unzip), UNZ_OK);