blob: beab7b4af243896b03e6379ba336b993cbbf2f7f [file] [log] [blame]
#include <string.h>
#define MINIZ_HEADER_FILE_ONLY
#include "miniz.c"
#include "miniz-extensions.h"
// Like mz_zip_reader_locate_file, but uses a matching predicate
// instead of a constant name.
static int find_file_match(
mz_zip_archive *zip_archive,
name_matcher_t matcher,
void* userdata)
{
unsigned int num_files = mz_zip_reader_get_num_files(zip_archive);
for (unsigned int idx = 0; idx < num_files; idx++) {
mz_zip_archive_file_stat file_stat;
if (!mz_zip_reader_file_stat(zip_archive, idx, &file_stat)) {
return -1;
}
if (matcher(userdata, file_stat.m_filename)) {
return idx;
}
}
return -1;
}
void *mzx_extract_match_to_heap(
const char *pZip_filename,
name_matcher_t matcher,
void* userdata,
size_t *pSize,
mz_uint flags)
{
int file_index;
mz_zip_archive zip_archive;
void *p = NULL;
if (pSize)
*pSize = 0;
if ((!pZip_filename) || (!matcher))
return NULL;
// Inlined MZ_CLEAR_OBJ(zip_archive);
memset(&zip_archive, 0, sizeof(zip_archive));
if (!mz_zip_reader_init_file(
&zip_archive,
pZip_filename,
flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))
return NULL;
if ((file_index = find_file_match(&zip_archive, matcher, userdata)) >= 0)
p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);
mz_zip_reader_end(&zip_archive);
return p;
}