📄 unzip.c
字号:
return UNZ_BADZIPFILE;
}
pfile_in_zip_read_info = (file_in_zip_read_info_s*)ALLOC(sizeof(file_in_zip_read_info_s));
if (pfile_in_zip_read_info == NULL)
{
return UNZ_INTERNALERROR;
}
pfile_in_zip_read_info->read_buffer = (char*)ALLOC(UNZ_BUFSIZE);
pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
pfile_in_zip_read_info->pos_local_extrafield = 0;
pfile_in_zip_read_info->raw = raw;
if (pfile_in_zip_read_info->read_buffer == NULL)
{
TRYFREE(pfile_in_zip_read_info);
return UNZ_INTERNALERROR;
}
pfile_in_zip_read_info->stream_initialised = 0;
if (method != NULL)
{
*method = (int)s->cur_file_info.compression_method;
}
if (level != NULL)
{
*level = 6;
switch (s->cur_file_info.flag &0x06)
{
case 6:
*level = 1;
break;
case 4:
*level = 2;
break;
case 2:
*level = 9;
break;
}
}
if ((s->cur_file_info.compression_method != 0) && (s->cur_file_info.compression_method != Z_DEFLATED))
{
err = UNZ_BADZIPFILE;
}
pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;
pfile_in_zip_read_info->crc32 = 0;
pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
pfile_in_zip_read_info->filestream = s->filestream;
pfile_in_zip_read_info->z_filefunc = s->z_filefunc;
pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;
pfile_in_zip_read_info->stream.total_out = 0;
if ((s->cur_file_info.compression_method == Z_DEFLATED) && (!raw))
{
pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
pfile_in_zip_read_info->stream.zfree = (free_func)0;
pfile_in_zip_read_info->stream.opaque = (void*)0;
pfile_in_zip_read_info->stream.next_in = (void*)0;
pfile_in_zip_read_info->stream.avail_in = 0;
err = inflateInit2(&pfile_in_zip_read_info->stream, - MAX_WBITS);
if (err == Z_OK)
{
pfile_in_zip_read_info->stream_initialised = 1;
}
else
{
return err;
}
/* windowBits is passed < 0 to tell that there is no zlib header.
* Note that in this case inflate *requires* an extra "dummy" byte
* after the compressed stream in order to complete decompression and
* return Z_STREAM_END.
* In unzip, i don't wait absolutely Z_STREAM_END because I known the
* size of both compressed and uncompressed data
*/
}
pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;
pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;
pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
pfile_in_zip_read_info->stream.avail_in = (DWORD)0;
s->pfile_in_zip_read = pfile_in_zip_read_info;
#ifndef NOUNCRYPT
if (password != NULL)
{
int i;
s->pcrc_32_tab = get_crc_table();
init_keys(password, s->keys, s->pcrc_32_tab);
if (ZSEEK(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET) != 0)
{
return UNZ_INTERNALERROR;
}
if (ZREAD(s->z_filefunc, s->filestream, source, 12) < 12)
{
return UNZ_INTERNALERROR;
}
for (i = 0; i < 12; i++)
{
zdecode(s->keys, s->pcrc_32_tab, source[i]);
}
s->pfile_in_zip_read->pos_in_zipfile += 12;
s->encrypted = 1;
}
#endif
return UNZ_OK;
}
//-------------------------------------------------------------------------
extern int ZEXPORT unzOpenCurrentFile(unzFile file)
{
return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
}
//-------------------------------------------------------------------------
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password)
{
return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
}
//-------------------------------------------------------------------------
/*
Read bytes from the current file.
buf contain buffer where data must be copied
len the size of buf.
return the number of byte copied if somes bytes are copied
return 0 if the end of file was reached
return <0 with error code if there is an error
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
*/
extern int ZEXPORT unzReadCurrentFile(unzFile file, void *buf, DWORD len)
{
int err = UNZ_OK;
DWORD iRead = 0;
unz_s *s;
file_in_zip_read_info_s *pfile_in_zip_read_info;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
pfile_in_zip_read_info = s->pfile_in_zip_read;
if (pfile_in_zip_read_info == NULL)
{
return UNZ_PARAMERROR;
}
if ((pfile_in_zip_read_info->read_buffer == NULL))
{
return UNZ_END_OF_LIST_OF_FILE;
}
if (len == 0)
{
return 0;
}
pfile_in_zip_read_info->stream.next_out = (BYTE*)buf;
pfile_in_zip_read_info->stream.avail_out = (DWORD)len;
if (len > pfile_in_zip_read_info->rest_read_uncompressed)
{
pfile_in_zip_read_info->stream.avail_out = (DWORD)pfile_in_zip_read_info->rest_read_uncompressed;
}
while (pfile_in_zip_read_info->stream.avail_out > 0)
{
if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed > 0))
{
DWORD uReadThis = UNZ_BUFSIZE;
if (pfile_in_zip_read_info->rest_read_compressed < uReadThis)
{
uReadThis = (DWORD)pfile_in_zip_read_info->rest_read_compressed;
}
if (uReadThis == 0)
{
return UNZ_EOF;
}
if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, SEEK_SET) != 0)
{
return UNZ_ERRNO;
}
if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis) != uReadThis)
{
return UNZ_ERRNO;
}
#ifndef NOUNCRYPT
if (s->encrypted)
{
DWORD i;
for (i = 0; i < uReadThis; i++)
{
pfile_in_zip_read_info->read_buffer[i] = zdecode(s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);
}
}
#endif
pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
pfile_in_zip_read_info->rest_read_compressed -= uReadThis;
pfile_in_zip_read_info->stream.next_in = (BYTE*)pfile_in_zip_read_info->read_buffer;
pfile_in_zip_read_info->stream.avail_in = (DWORD)uReadThis;
}
if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw))
{
DWORD uDoCopy, i;
if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0))
{
return (iRead == 0) ? UNZ_EOF : iRead;
}
if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)
{
uDoCopy = pfile_in_zip_read_info->stream.avail_out;
}
else
{
uDoCopy = pfile_in_zip_read_info->stream.avail_in;
}
for (i = 0; i < uDoCopy; i++)
{
*(pfile_in_zip_read_info->stream.next_out + i) = *(pfile_in_zip_read_info->stream.next_in + i);
}
pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy);
pfile_in_zip_read_info->rest_read_uncompressed -= uDoCopy;
pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
pfile_in_zip_read_info->stream.next_out += uDoCopy;
pfile_in_zip_read_info->stream.next_in += uDoCopy;
pfile_in_zip_read_info->stream.total_out += uDoCopy;
iRead += uDoCopy;
}
else
{
DWORD uTotalOutBefore, uTotalOutAfter;
const BYTE *bufBefore;
DWORD uOutThis;
int flush = Z_SYNC_FLUSH;
uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
bufBefore = pfile_in_zip_read_info->stream.next_out;
err = inflate(&pfile_in_zip_read_info->stream, flush);
uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
uOutThis = uTotalOutAfter - uTotalOutBefore;
pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, bufBefore, (DWORD)(uOutThis));
pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
iRead += (DWORD)(uTotalOutAfter - uTotalOutBefore);
if (err == Z_STREAM_END)
{
return (iRead == 0) ? UNZ_EOF : iRead;
}
if (err != Z_OK)
{
break;
}
}
}
if (err == Z_OK)
{
return iRead;
}
return err;
}
/*
Give the current position in uncompressed data
*/
/*
extern z_off_t ZEXPORT unztell(unzFile file)
{
unz_s *s;
file_in_zip_read_info_s *pfile_in_zip_read_info;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
pfile_in_zip_read_info = s->pfile_in_zip_read;
if (pfile_in_zip_read_info == NULL)
{
return UNZ_PARAMERROR;
}
return (z_off_t)pfile_in_zip_read_info->stream.total_out;
}
*/
/*
return 1 if the end of file was reached, 0 elsewhere
*/
/*
extern int ZEXPORT unzeof(unzFile file)
{
unz_s *s;
file_in_zip_read_info_s *pfile_in_zip_read_info;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
pfile_in_zip_read_info = s->pfile_in_zip_read;
if (pfile_in_zip_read_info == NULL)
{
return UNZ_PARAMERROR;
}
if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
{
return 1;
}
else
{
return 0;
}
}
*/
/*
Read extra field from the current file (opened by unzOpenCurrentFile)
This is the local-header version of the extra field (sometimes, there is
more info in the local-header version than in the central-header)
if buf==NULL, it return the size of the local extra field that can be read
if buf!=NULL, len is the size of the buffer, the extra header is copied in
buf.
the return value is the number of bytes copied in buf, or (if <0)
the error code
*/
/*
extern int ZEXPORT unzGetLocalExtrafield(unzFile file, void *buf, DWORD len)
{
unz_s *s;
file_in_zip_read_info_s *pfile_in_zip_read_info;
DWORD read_now;
DWORD size_to_read;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
pfile_in_zip_read_info = s->pfile_in_zip_read;
if (pfile_in_zip_read_info == NULL)
{
return UNZ_PARAMERROR;
}
size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield);
if (buf == NULL)
{
return (int)size_to_read;
}
if (len > size_to_read)
{
read_now = (DWORD)size_to_read;
}
else
{
read_now = (DWORD)len;
}
if (read_now == 0)
{
return 0;
}
if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, SEEK_SET) != 0)
{
return UNZ_ERRNO;
}
if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)
{
return UNZ_ERRNO;
}
return (int)read_now;
}
*/
/*
Close the file in zip opened with unzipOpenCurrentFile
Return UNZ_CRCERROR if all the file was read but the CRC is not good
*/
extern int ZEXPORT unzCloseCurrentFile(unzFile file)
{
int err = UNZ_OK;
unz_s *s;
file_in_zip_read_info_s *pfile_in_zip_read_info;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
pfile_in_zip_read_info = s->pfile_in_zip_read;
if (pfile_in_zip_read_info == NULL)
{
return UNZ_PARAMERROR;
}
if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw))
{
if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
{
err = UNZ_CRCERROR;
}
}
TRYFREE(pfile_in_zip_read_info->read_buffer);
pfile_in_zip_read_info->read_buffer = NULL;
if (pfile_in_zip_read_info->stream_initialised)
{
inflateEnd(&pfile_in_zip_read_info->stream);
}
pfile_in_zip_read_info->stream_initialised = 0;
TRYFREE(pfile_in_zip_read_info);
s->pfile_in_zip_read = NULL;
return err;
}
/*
Get the global comment string of the ZipFile, in the szComment buffer.
uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0
*/
/*
extern int ZEXPORT unzGetGlobalComment(unzFile file, char *szComment, DWORD uSizeBuf)
{
//int err = UNZ_OK;
unz_s *s;
DWORD uReadThis;
if (file == NULL)
{
return UNZ_PARAMERROR;
}
s = (unz_s*)file;
uReadThis = uSizeBuf;
if (uReadThis > s->gi.size_comment)
{
uReadThis = s->gi.size_comment;
}
if (ZSEEK(s->z_filefunc, s->filestream, s->central_pos + 22, SEEK_SET) != 0)
{
return UNZ_ERRNO;
}
if (uReadThis > 0)
{
*szComment = '\0';
if (ZREAD(s->z_filefunc, s->filestream, szComment, uReadThis) != uReadThis)
{
return UNZ_ERRNO;
}
}
if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
{
*(szComment + s->gi.size_comment) = '\0';
}
return (int)uReadThis;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -