Skip to content

Commit

Permalink
Fix unzLocateFile 3rd parameter
Browse files Browse the repository at this point in the history
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 zlib-ng#745.
  • Loading branch information
tuliom committed Dec 8, 2023
1 parent ef3ef9a commit bb621ad
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 9 deletions.
25 changes: 19 additions & 6 deletions mz_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
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

0 comments on commit bb621ad

Please sign in to comment.