simplify search in zip file directory

Some zip archives do not have separate entries for directories (hrs.zip).
This commit is contained in:
Roman Fomin 2024-08-17 10:02:04 +07:00
parent 0880d6f52c
commit cfad4e9a35

View File

@ -108,58 +108,27 @@ static boolean W_ZIP_AddDir(w_handle_t handle, const char *path,
boolean is_root = (path[0] == '.'); boolean is_root = (path[0] == '.');
int index = 0;
char *dir = M_StringDuplicate(path); char *dir = M_StringDuplicate(path);
ConvertSlashes(dir);
if (!is_root)
{
ConvertSlashes(dir);
char *s = M_StringJoin(dir, "/");
index = mz_zip_reader_locate_file(zip, s, NULL, 0);
free(s);
if (index < 0)
{
free(dir);
return false;
}
++index;
}
int startlump = numlumps; int startlump = numlumps;
char *subdir = NULL; for (int index = 0 ; index < mz_zip_reader_get_num_files(zip); ++index)
for ( ; index < mz_zip_reader_get_num_files(zip); ++index)
{ {
mz_zip_archive_file_stat stat; mz_zip_archive_file_stat stat;
mz_zip_reader_file_stat(zip, index, &stat); mz_zip_reader_file_stat(zip, index, &stat);
if (stat.m_is_directory) if (stat.m_is_directory)
{ {
if (subdir)
{
free(subdir);
}
subdir = M_StringDuplicate(stat.m_filename);
subdir[strlen(subdir) - 1] = '\0';
continue; continue;
} }
char *name = M_DirName(stat.m_filename); char *name = M_DirName(stat.m_filename);
if (subdir && !strcasecmp(name, subdir)) if (!is_root && strcasecmp(name, dir))
{ {
free(name); free(name);
continue; continue;
} }
else if (strcasecmp(name, dir))
{
free(name);
break;
}
free(name); free(name);
if (is_root && M_StringCaseEndsWith(stat.m_filename, ".wad")) if (is_root && M_StringCaseEndsWith(stat.m_filename, ".wad"))
@ -197,10 +166,6 @@ static boolean W_ZIP_AddDir(w_handle_t handle, const char *path,
W_AddMarker(end_marker); W_AddMarker(end_marker);
} }
if (subdir)
{
free(subdir);
}
free(dir); free(dir);
return true; return true;
} }