| 4809 | } |
| 4810 | |
| 4811 | mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, |
| 4812 | mz_zip_archive_file_stat *pStat) { |
| 4813 | mz_uint n; |
| 4814 | const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); |
| 4815 | if ((!p) || (!pStat)) |
| 4816 | return MZ_FALSE; |
| 4817 | |
| 4818 | // Unpack the central directory record. |
| 4819 | pStat->m_file_index = file_index; |
| 4820 | pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT( |
| 4821 | &pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); |
| 4822 | pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); |
| 4823 | pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); |
| 4824 | pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); |
| 4825 | pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); |
| 4826 | #ifndef MINIZ_NO_TIME |
| 4827 | pStat->m_time = |
| 4828 | mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), |
| 4829 | MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); |
| 4830 | #endif |
| 4831 | pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); |
| 4832 | pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); |
| 4833 | pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); |
| 4834 | pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); |
| 4835 | pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); |
| 4836 | pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); |
| 4837 | |
| 4838 | // Copy as much of the filename and comment as possible. |
| 4839 | n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); |
| 4840 | n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); |
| 4841 | memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); |
| 4842 | pStat->m_filename[n] = '\0'; |
| 4843 | |
| 4844 | n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); |
| 4845 | n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); |
| 4846 | pStat->m_comment_size = n; |
| 4847 | memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + |
| 4848 | MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + |
| 4849 | MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), |
| 4850 | n); |
| 4851 | pStat->m_comment[n] = '\0'; |
| 4852 | |
| 4853 | return MZ_TRUE; |
| 4854 | } |
| 4855 | |
| 4856 | mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, |
| 4857 | char *pFilename, mz_uint filename_buf_size) { |
no test coverage detected