Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix unzLocateFile 3rd parameter #746

Merged
merged 1 commit into from
Dec 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions mz_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1093,16 +1093,29 @@ int unzGoToNextFile(unzFile file) {
return err;
}

int unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) {
#ifdef WIN32
# define UNZ_DEFAULT_IGNORE_CASE 1
#else
# define UNZ_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;
int32_t err = MZ_OK;
int32_t result = 0;
uint8_t ignore_case = UNZ_DEFAULT_IGNORE_CASE;

if (!compat)
return UNZ_PARAMERROR;

if (filename_case == 1) {
ignore_case = 0;
} else if (filename_case > 1) {
ignore_case = 1;
}

preserve_index = compat->entry_index;

err = mz_zip_goto_first_entry(compat->handle);
Expand All @@ -1111,12 +1124,7 @@ 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);
}
result = mz_path_compare_wc(filename, file_info->filename, !ignore_case);

if (result == 0)
return MZ_OK;
Expand Down
9 changes: 7 additions & 2 deletions mz_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion test/test_compat.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down