94#ifndef CASESENSITIVITYDEFAULT_NO
95# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
96# define CASESENSITIVITYDEFAULT_NO
102#define UNZ_BUFSIZE (16384)
105#ifndef UNZ_MAXFILENAMEINZIP
106#define UNZ_MAXFILENAMEINZIP (256)
110# define ALLOC(size) (malloc(size))
113#define SIZECENTRALDIRITEM (0x2e)
114#define SIZEZIPLOCALHEADER (0x1e)
117const char unz_copyright[] =
118 " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
123 ZPOS64_T offset_curfile;
124} unz_file_info64_internal;
138 ZPOS64_T pos_in_zipfile;
139 uLong stream_initialised;
141 ZPOS64_T offset_local_extrafield;
142 uInt size_local_extrafield;
143 ZPOS64_T pos_local_extrafield;
144 ZPOS64_T total_out_64;
148 ZPOS64_T rest_read_compressed;
149 ZPOS64_T rest_read_uncompressed;
150 zlib_filefunc64_32_def z_filefunc;
152 uLong compression_method;
153 ZPOS64_T byte_before_the_zipfile;
162 zlib_filefunc64_32_def z_filefunc;
163 int is64bitOpenFunction;
165 unz_global_info64 gi;
166 ZPOS64_T byte_before_the_zipfile;
168 ZPOS64_T pos_in_central_dir;
169 ZPOS64_T current_file_ok;
170 ZPOS64_T central_pos;
172 ZPOS64_T size_central_dir;
173 ZPOS64_T offset_central_dir;
176 unz_file_info64 cur_file_info;
177 unz_file_info64_internal cur_file_info_internal;
185 unsigned long keys[3];
186 const z_crc_t* pcrc_32_tab;
200local
int unz64local_getShort(
const zlib_filefunc64_32_def* pzlib_filefunc_def,
204 int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,2);
207 *pX = c[0] | ((uLong)c[1] << 8);
213 if (ZERROR64(*pzlib_filefunc_def,filestream))
220local
int unz64local_getLong(
const zlib_filefunc64_32_def* pzlib_filefunc_def,
224 int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,4);
227 *pX = c[0] | ((uLong)c[1] << 8) | ((uLong)c[2] << 16) | ((uLong)c[3] << 24);
233 if (ZERROR64(*pzlib_filefunc_def,filestream))
241local
int unz64local_getLong64(
const zlib_filefunc64_32_def* pzlib_filefunc_def,
245 int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,8);
248 *pX = c[0] | ((ZPOS64_T)c[1] << 8) | ((ZPOS64_T)c[2] << 16) | ((ZPOS64_T)c[3] << 24)
249 | ((ZPOS64_T)c[4] << 32) | ((ZPOS64_T)c[5] << 40) | ((ZPOS64_T)c[6] << 48) | ((ZPOS64_T)c[7] << 56);
255 if (ZERROR64(*pzlib_filefunc_def,filestream))
263local
int strcmpcasenosensitive_internal(
const char* fileName1,
const char* fileName2) {
266 char c1=*(fileName1++);
267 char c2=*(fileName2++);
268 if ((c1>=
'a') && (c1<=
'z'))
270 if ((c2>=
'a') && (c2<=
'z'))
273 return ((c2==
'\0') ? 0 : -1);
284#ifdef CASESENSITIVITYDEFAULT_NO
285#define CASESENSITIVITYDEFAULTVALUE 2
287#define CASESENSITIVITYDEFAULTVALUE 1
290#ifndef STRCMPCASENOSENTIVEFUNCTION
291#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
303extern int ZEXPORT unzStringFileNameCompare (
const char* fileName1,
304 const char* fileName2,
305 int iCaseSensitivity) {
306 if (iCaseSensitivity==0)
307 iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
309 if (iCaseSensitivity==1)
310 return strcmp(fileName1,fileName2);
312 return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
315#ifndef BUFREADCOMMENT
316#define BUFREADCOMMENT (0x400)
319#ifndef CENTRALDIRINVALID
320#define CENTRALDIRINVALID ((ZPOS64_T)(-1))
327local ZPOS64_T unz64local_SearchCentralDir(
const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) {
331 ZPOS64_T uMaxBack=0xffff;
332 ZPOS64_T uPosFound=CENTRALDIRINVALID;
334 if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
335 return CENTRALDIRINVALID;
338 uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
340 if (uMaxBack>uSizeFile)
341 uMaxBack = uSizeFile;
343 buf = (
unsigned char*)ALLOC(BUFREADCOMMENT+4);
345 return CENTRALDIRINVALID;
348 while (uBackRead<uMaxBack)
353 if (uBackRead+BUFREADCOMMENT>uMaxBack)
354 uBackRead = uMaxBack;
356 uBackRead+=BUFREADCOMMENT;
357 uReadPos = uSizeFile-uBackRead ;
359 uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
360 (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
361 if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
364 if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
367 for (i=(
int)uReadSize-3; (i--)>0;)
368 if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
369 ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
371 uPosFound = uReadPos+(unsigned)i;
375 if (uPosFound!=CENTRALDIRINVALID)
387local ZPOS64_T unz64local_SearchCentralDir64(
const zlib_filefunc64_32_def* pzlib_filefunc_def,
392 ZPOS64_T uMaxBack=0xffff;
393 ZPOS64_T uPosFound=CENTRALDIRINVALID;
395 ZPOS64_T relativeOffset;
397 if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
398 return CENTRALDIRINVALID;
401 uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
403 if (uMaxBack>uSizeFile)
404 uMaxBack = uSizeFile;
406 buf = (
unsigned char*)ALLOC(BUFREADCOMMENT+4);
408 return CENTRALDIRINVALID;
411 while (uBackRead<uMaxBack)
416 if (uBackRead+BUFREADCOMMENT>uMaxBack)
417 uBackRead = uMaxBack;
419 uBackRead+=BUFREADCOMMENT;
420 uReadPos = uSizeFile-uBackRead ;
422 uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
423 (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
424 if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
427 if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
430 for (i=(
int)uReadSize-3; (i--)>0;)
431 if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
432 ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
434 uPosFound = uReadPos+(unsigned)i;
438 if (uPosFound!=CENTRALDIRINVALID)
442 if (uPosFound == CENTRALDIRINVALID)
443 return CENTRALDIRINVALID;
446 if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
447 return CENTRALDIRINVALID;
450 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
451 return CENTRALDIRINVALID;
454 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
455 return CENTRALDIRINVALID;
457 return CENTRALDIRINVALID;
460 if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
461 return CENTRALDIRINVALID;
464 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
465 return CENTRALDIRINVALID;
467 return CENTRALDIRINVALID;
470 if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
471 return CENTRALDIRINVALID;
474 if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
475 return CENTRALDIRINVALID;
477 if (uL != 0x06064b50)
478 return CENTRALDIRINVALID;
480 return relativeOffset;
492local unzFile unzOpenInternal(
const void *path,
493 zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
494 int is64bitOpenFunction) {
497 ZPOS64_T central_pos;
502 uLong number_disk_with_CD;
504 ZPOS64_T number_entry_CD;
510 if (unz_copyright[0]!=
' ')
513 us.z_filefunc.zseek32_file = NULL;
514 us.z_filefunc.ztell32_file = NULL;
515 if (pzlib_filefunc64_32_def==NULL)
516 fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
518 us.z_filefunc = *pzlib_filefunc64_32_def;
519 us.is64bitOpenFunction = is64bitOpenFunction;
523 us.filestream = ZOPEN64(us.z_filefunc,
525 ZLIB_FILEFUNC_MODE_READ |
526 ZLIB_FILEFUNC_MODE_EXISTING);
527 if (us.filestream==NULL)
530 central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
531 if (central_pos!=CENTRALDIRINVALID)
538 if (ZSEEK64(us.z_filefunc, us.filestream,
539 central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
543 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
547 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
551 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
555 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
559 if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
563 if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
567 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
571 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
574 if ((number_entry_CD!=us.gi.number_entry) ||
575 (number_disk_with_CD!=0) ||
580 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
585 if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
588 us.gi.size_comment = 0;
592 central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
593 if (central_pos==CENTRALDIRINVALID)
598 if (ZSEEK64(us.z_filefunc, us.filestream,
599 central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
603 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
607 if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
611 if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
615 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
617 us.gi.number_entry = uL;
620 if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
622 number_entry_CD = uL;
624 if ((number_entry_CD!=us.gi.number_entry) ||
625 (number_disk_with_CD!=0) ||
630 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
632 us.size_central_dir = uL;
636 if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
638 us.offset_central_dir = uL;
641 if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
645 if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
651 ZCLOSE64(us.z_filefunc, us.filestream);
655 us.byte_before_the_zipfile = central_pos -
656 (us.offset_central_dir+us.size_central_dir);
657 us.central_pos = central_pos;
658 us.pfile_in_zip_read = NULL;
666 unzGoToFirstFile((unzFile)s);
672extern unzFile ZEXPORT unzOpen2(
const char *path,
673 zlib_filefunc_def* pzlib_filefunc32_def) {
674 if (pzlib_filefunc32_def != NULL)
676 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
677 fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
678 return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
681 return unzOpenInternal(path, NULL, 0);
684extern unzFile ZEXPORT unzOpen2_64(
const void *path,
685 zlib_filefunc64_def* pzlib_filefunc_def) {
686 if (pzlib_filefunc_def != NULL)
688 zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
689 zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
690 zlib_filefunc64_32_def_fill.ztell32_file = NULL;
691 zlib_filefunc64_32_def_fill.zseek32_file = NULL;
692 return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
695 return unzOpenInternal(path, NULL, 1);
698extern unzFile ZEXPORT unzOpen(
const char *path) {
699 return unzOpenInternal(path, NULL, 0);
702extern unzFile ZEXPORT unzOpen64(
const void *path) {
703 return unzOpenInternal(path, NULL, 1);
711extern int ZEXPORT unzClose(unzFile file) {
714 return UNZ_PARAMERROR;
717 if (s->pfile_in_zip_read!=NULL)
718 unzCloseCurrentFile(file);
720 ZCLOSE64(s->z_filefunc, s->filestream);
730extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) {
733 return UNZ_PARAMERROR;
739extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) {
742 return UNZ_PARAMERROR;
745 pglobal_info32->number_entry = (uLong)s->gi.number_entry;
746 pglobal_info32->size_comment = s->gi.size_comment;
752local
void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz* ptm) {
754 uDate = (ZPOS64_T)(ulDosDate>>16);
755 ptm->tm_mday = (int)(uDate&0x1f) ;
756 ptm->tm_mon = (int)((((uDate)&0x1E0)/0x20)-1) ;
757 ptm->tm_year = (int)(((uDate&0x0FE00)/0x0200)+1980) ;
759 ptm->tm_hour = (int) ((ulDosDate &0xF800)/0x800);
760 ptm->tm_min = (int) ((ulDosDate&0x7E0)/0x20) ;
761 ptm->tm_sec = (int) (2*(ulDosDate&0x1f)) ;
767local
int unz64local_GetCurrentFileInfoInternal(unzFile file,
768 unz_file_info64 *pfile_info,
769 unz_file_info64_internal
770 *pfile_info_internal,
772 uLong fileNameBufferSize,
774 uLong extraFieldBufferSize,
776 uLong commentBufferSize) {
778 unz_file_info64 file_info;
779 unz_file_info64_internal file_info_internal;
786 return UNZ_PARAMERROR;
788 if (ZSEEK64(s->z_filefunc, s->filestream,
789 s->pos_in_central_dir+s->byte_before_the_zipfile,
790 ZLIB_FILEFUNC_SEEK_SET)!=0)
797 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
799 else if (uMagic!=0x02014b50)
803 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
806 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
809 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
812 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
815 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
818 unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
820 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
823 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
825 file_info.compressed_size = uL;
827 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
829 file_info.uncompressed_size = uL;
831 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
834 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
837 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
840 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
843 if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
846 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
850 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
852 file_info_internal.offset_curfile = uL;
854 lSeek+=file_info.size_filename;
855 if ((err==UNZ_OK) && (szFileName!=NULL))
858 if (file_info.size_filename<fileNameBufferSize)
860 *(szFileName+file_info.size_filename)=
'\0';
861 uSizeRead = file_info.size_filename;
864 uSizeRead = fileNameBufferSize;
866 if ((file_info.size_filename>0) && (fileNameBufferSize>0))
867 if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
873 if ((err==UNZ_OK) && (extraField!=NULL))
876 if (file_info.size_file_extra<extraFieldBufferSize)
877 uSizeRead = file_info.size_file_extra;
879 uSizeRead = extraFieldBufferSize;
883 if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
889 if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
890 if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
893 lSeek += file_info.size_file_extra - (uLong)uSizeRead;
896 lSeek += file_info.size_file_extra;
899 if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
904 lSeek -= file_info.size_file_extra;
908 if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
914 while(acc < file_info.size_file_extra)
919 if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
922 if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
926 if (headerId == 0x0001)
928 if(file_info.uncompressed_size == MAXU32)
930 if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
934 if(file_info.compressed_size == MAXU32)
936 if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
940 if(file_info_internal.offset_curfile == MAXU32)
943 if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
947 if(file_info.disk_num_start == 0xffff)
950 if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
957 if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
961 acc += 2 + 2 + dataSize;
965 if ((err==UNZ_OK) && (szComment!=NULL))
968 if (file_info.size_file_comment<commentBufferSize)
970 *(szComment+file_info.size_file_comment)=
'\0';
971 uSizeRead = file_info.size_file_comment;
974 uSizeRead = commentBufferSize;
978 if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
984 if ((file_info.size_file_comment>0) && (commentBufferSize>0))
985 if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
987 lSeek+=file_info.size_file_comment - uSizeRead;
990 lSeek+=file_info.size_file_comment;
993 if ((err==UNZ_OK) && (pfile_info!=NULL))
994 *pfile_info=file_info;
996 if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
997 *pfile_info_internal=file_info_internal;
1009extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file,
1010 unz_file_info64 * pfile_info,
1011 char * szFileName, uLong fileNameBufferSize,
1012 void *extraField, uLong extraFieldBufferSize,
1013 char* szComment, uLong commentBufferSize) {
1014 return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
1015 szFileName,fileNameBufferSize,
1016 extraField,extraFieldBufferSize,
1017 szComment,commentBufferSize);
1020extern int ZEXPORT unzGetCurrentFileInfo(unzFile file,
1021 unz_file_info * pfile_info,
1022 char * szFileName, uLong fileNameBufferSize,
1023 void *extraField, uLong extraFieldBufferSize,
1024 char* szComment, uLong commentBufferSize) {
1026 unz_file_info64 file_info64;
1027 err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
1028 szFileName,fileNameBufferSize,
1029 extraField,extraFieldBufferSize,
1030 szComment,commentBufferSize);
1031 if ((err==UNZ_OK) && (pfile_info != NULL))
1033 pfile_info->version = file_info64.version;
1034 pfile_info->version_needed = file_info64.version_needed;
1035 pfile_info->flag = file_info64.flag;
1036 pfile_info->compression_method = file_info64.compression_method;
1037 pfile_info->dosDate = file_info64.dosDate;
1038 pfile_info->crc = file_info64.crc;
1040 pfile_info->size_filename = file_info64.size_filename;
1041 pfile_info->size_file_extra = file_info64.size_file_extra;
1042 pfile_info->size_file_comment = file_info64.size_file_comment;
1044 pfile_info->disk_num_start = file_info64.disk_num_start;
1045 pfile_info->internal_fa = file_info64.internal_fa;
1046 pfile_info->external_fa = file_info64.external_fa;
1048 pfile_info->tmu_date = file_info64.tmu_date;
1051 pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1052 pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1061extern int ZEXPORT unzGoToFirstFile(unzFile file) {
1065 return UNZ_PARAMERROR;
1067 s->pos_in_central_dir=s->offset_central_dir;
1069 err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1070 &s->cur_file_info_internal,
1071 NULL,0,NULL,0,NULL,0);
1072 s->current_file_ok = (err == UNZ_OK);
1081extern int ZEXPORT unzGoToNextFile(unzFile file) {
1086 return UNZ_PARAMERROR;
1088 if (!s->current_file_ok)
1089 return UNZ_END_OF_LIST_OF_FILE;
1090 if (s->gi.number_entry != 0xffff)
1091 if (s->num_file+1==s->gi.number_entry)
1092 return UNZ_END_OF_LIST_OF_FILE;
1094 s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
1095 s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
1097 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1098 &s->cur_file_info_internal,
1099 NULL,0,NULL,0,NULL,0);
1100 s->current_file_ok = (err == UNZ_OK);
1113extern int ZEXPORT unzLocateFile(unzFile file,
const char *szFileName,
int iCaseSensitivity) {
1120 unz_file_info64 cur_file_infoSaved;
1121 unz_file_info64_internal cur_file_info_internalSaved;
1122 ZPOS64_T num_fileSaved;
1123 ZPOS64_T pos_in_central_dirSaved;
1127 return UNZ_PARAMERROR;
1129 if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
1130 return UNZ_PARAMERROR;
1133 if (!s->current_file_ok)
1134 return UNZ_END_OF_LIST_OF_FILE;
1137 num_fileSaved = s->num_file;
1138 pos_in_central_dirSaved = s->pos_in_central_dir;
1139 cur_file_infoSaved = s->cur_file_info;
1140 cur_file_info_internalSaved = s->cur_file_info_internal;
1142 err = unzGoToFirstFile(file);
1144 while (err == UNZ_OK)
1146 char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
1147 err = unzGetCurrentFileInfo64(file,NULL,
1148 szCurrentFileName,
sizeof(szCurrentFileName)-1,
1152 if (unzStringFileNameCompare(szCurrentFileName,
1153 szFileName,iCaseSensitivity)==0)
1155 err = unzGoToNextFile(file);
1162 s->num_file = num_fileSaved ;
1163 s->pos_in_central_dir = pos_in_central_dirSaved ;
1164 s->cur_file_info = cur_file_infoSaved;
1165 s->cur_file_info_internal = cur_file_info_internalSaved;
1172// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
1173// I need random access
1175// Further optimization could be realized by adding an ability
1176// to cache the directory in memory. The goal being a single
1177// comprehensive file read to put the file I need in a memory.
1188extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) {
1191 if (file==NULL || file_pos==NULL)
1192 return UNZ_PARAMERROR;
1194 if (!s->current_file_ok)
1195 return UNZ_END_OF_LIST_OF_FILE;
1197 file_pos->pos_in_zip_directory = s->pos_in_central_dir;
1198 file_pos->num_of_file = s->num_file;
1203extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) {
1204 unz64_file_pos file_pos64;
1205 int err = unzGetFilePos64(file,&file_pos64);
1208 file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1209 file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1214extern int ZEXPORT unzGoToFilePos64(unzFile file,
const unz64_file_pos* file_pos) {
1218 if (file==NULL || file_pos==NULL)
1219 return UNZ_PARAMERROR;
1223 s->pos_in_central_dir = file_pos->pos_in_zip_directory;
1224 s->num_file = file_pos->num_of_file;
1227 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1228 &s->cur_file_info_internal,
1229 NULL,0,NULL,0,NULL,0);
1231 s->current_file_ok = (err == UNZ_OK);
1235extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) {
1236 unz64_file_pos file_pos64;
1237 if (file_pos == NULL)
1238 return UNZ_PARAMERROR;
1240 file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1241 file_pos64.num_of_file = file_pos->num_of_file;
1242 return unzGoToFilePos64(file,&file_pos64);
1257local
int unz64local_CheckCurrentFileCoherencyHeader(
unz64_s* s, uInt* piSizeVar,
1258 ZPOS64_T * poffset_local_extrafield,
1259 uInt * psize_local_extrafield) {
1260 uLong uMagic,uData,uFlags;
1261 uLong size_filename;
1262 uLong size_extra_field;
1266 *poffset_local_extrafield = 0;
1267 *psize_local_extrafield = 0;
1269 if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
1270 s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
1276 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
1278 else if (uMagic!=0x04034b50)
1282 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1288 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
1291 if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1293 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
1296 if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
1298 (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1300 (s->cur_file_info.compression_method!=Z_DEFLATED))
1303 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1306 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1308 else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
1311 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1313 else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
1316 if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1318 else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
1321 if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
1323 else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
1326 *piSizeVar += (uInt)size_filename;
1328 if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
1330 *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
1331 SIZEZIPLOCALHEADER + size_filename;
1332 *psize_local_extrafield = (uInt)size_extra_field;
1334 *piSizeVar += (uInt)size_extra_field;
1343extern int ZEXPORT unzOpenCurrentFile3(unzFile file,
int* method,
1344 int* level,
int raw,
const char* password) {
1349 ZPOS64_T offset_local_extrafield;
1350 uInt size_local_extrafield;
1354 if (password != NULL)
1355 return UNZ_PARAMERROR;
1359 return UNZ_PARAMERROR;
1361 if (!s->current_file_ok)
1362 return UNZ_PARAMERROR;
1364 if (s->pfile_in_zip_read != NULL)
1365 unzCloseCurrentFile(file);
1367 if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
1368 return UNZ_BADZIPFILE;
1371 if (pfile_in_zip_read_info==NULL)
1372 return UNZ_INTERNALERROR;
1374 pfile_in_zip_read_info->read_buffer=(
char*)ALLOC(UNZ_BUFSIZE);
1375 pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
1376 pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
1377 pfile_in_zip_read_info->pos_local_extrafield=0;
1378 pfile_in_zip_read_info->raw=raw;
1380 if (pfile_in_zip_read_info->read_buffer==NULL)
1382 free(pfile_in_zip_read_info);
1383 return UNZ_INTERNALERROR;
1386 pfile_in_zip_read_info->stream_initialised=0;
1389 *method = (int)s->cur_file_info.compression_method;
1394 switch (s->cur_file_info.flag & 0x06)
1396 case 6 : *level = 1;
break;
1397 case 4 : *level = 2;
break;
1398 case 2 : *level = 9;
break;
1402 if ((s->cur_file_info.compression_method!=0) &&
1404 (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1406 (s->cur_file_info.compression_method!=Z_DEFLATED))
1410 pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
1411 pfile_in_zip_read_info->crc32=0;
1412 pfile_in_zip_read_info->total_out_64=0;
1413 pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
1414 pfile_in_zip_read_info->filestream=s->filestream;
1415 pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
1416 pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
1418 pfile_in_zip_read_info->stream.total_out = 0;
1420 if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
1423 pfile_in_zip_read_info->bstream.bzalloc = (
void *(*) (
void *,
int,
int))0;
1424 pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
1425 pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
1426 pfile_in_zip_read_info->bstream.state = (voidpf)0;
1428 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1429 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1430 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1431 pfile_in_zip_read_info->stream.next_in = (voidpf)0;
1432 pfile_in_zip_read_info->stream.avail_in = 0;
1434 err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
1436 pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
1439 free(pfile_in_zip_read_info->read_buffer);
1440 free(pfile_in_zip_read_info);
1444 pfile_in_zip_read_info->raw=1;
1447 else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
1449 pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1450 pfile_in_zip_read_info->stream.zfree = (free_func)0;
1451 pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1452 pfile_in_zip_read_info->stream.next_in = 0;
1453 pfile_in_zip_read_info->stream.avail_in = 0;
1455 err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
1457 pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
1460 free(pfile_in_zip_read_info->read_buffer);
1461 free(pfile_in_zip_read_info);
1472 pfile_in_zip_read_info->rest_read_compressed =
1473 s->cur_file_info.compressed_size ;
1474 pfile_in_zip_read_info->rest_read_uncompressed =
1475 s->cur_file_info.uncompressed_size ;
1478 pfile_in_zip_read_info->pos_in_zipfile =
1479 s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
1482 pfile_in_zip_read_info->stream.avail_in = (uInt)0;
1484 s->pfile_in_zip_read = pfile_in_zip_read_info;
1488 if (password != NULL)
1491 s->pcrc_32_tab = get_crc_table();
1492 init_keys(password,s->keys,s->pcrc_32_tab);
1493 if (ZSEEK64(s->z_filefunc, s->filestream,
1494 s->pfile_in_zip_read->pos_in_zipfile +
1495 s->pfile_in_zip_read->byte_before_the_zipfile,
1497 return UNZ_INTERNALERROR;
1498 if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
1499 return UNZ_INTERNALERROR;
1501 for (i = 0; i<12; i++)
1502 zdecode(s->keys,s->pcrc_32_tab,source[i]);
1504 s->pfile_in_zip_read->pos_in_zipfile+=12;
1513extern int ZEXPORT unzOpenCurrentFile(unzFile file) {
1514 return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
1517extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file,
const char* password) {
1518 return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
1521extern int ZEXPORT unzOpenCurrentFile2(unzFile file,
int* method,
int* level,
int raw) {
1522 return unzOpenCurrentFile3(file, method, level, raw, NULL);
1527extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) {
1533 pfile_in_zip_read_info=s->pfile_in_zip_read;
1534 if (pfile_in_zip_read_info==NULL)
1536 return pfile_in_zip_read_info->pos_in_zipfile +
1537 pfile_in_zip_read_info->byte_before_the_zipfile;
1552extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf,
unsigned len) {
1558 return UNZ_PARAMERROR;
1560 pfile_in_zip_read_info=s->pfile_in_zip_read;
1562 if (pfile_in_zip_read_info==NULL)
1563 return UNZ_PARAMERROR;
1566 if (pfile_in_zip_read_info->read_buffer == NULL)
1567 return UNZ_END_OF_LIST_OF_FILE;
1571 pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
1573 pfile_in_zip_read_info->stream.avail_out = (uInt)len;
1575 if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
1576 (!(pfile_in_zip_read_info->raw)))
1577 pfile_in_zip_read_info->stream.avail_out =
1578 (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
1580 if ((len>pfile_in_zip_read_info->rest_read_compressed+
1581 pfile_in_zip_read_info->stream.avail_in) &&
1582 (pfile_in_zip_read_info->raw))
1583 pfile_in_zip_read_info->stream.avail_out =
1584 (uInt)pfile_in_zip_read_info->rest_read_compressed+
1585 pfile_in_zip_read_info->stream.avail_in;
1587 while (pfile_in_zip_read_info->stream.avail_out>0)
1589 if ((pfile_in_zip_read_info->stream.avail_in==0) &&
1590 (pfile_in_zip_read_info->rest_read_compressed>0))
1592 uInt uReadThis = UNZ_BUFSIZE;
1593 if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
1594 uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
1597 if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1598 pfile_in_zip_read_info->filestream,
1599 pfile_in_zip_read_info->pos_in_zipfile +
1600 pfile_in_zip_read_info->byte_before_the_zipfile,
1601 ZLIB_FILEFUNC_SEEK_SET)!=0)
1603 if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1604 pfile_in_zip_read_info->filestream,
1605 pfile_in_zip_read_info->read_buffer,
1606 uReadThis)!=uReadThis)
1614 for(i=0;i<uReadThis;i++)
1615 pfile_in_zip_read_info->read_buffer[i] =
1616 zdecode(s->keys,s->pcrc_32_tab,
1617 pfile_in_zip_read_info->read_buffer[i]);
1622 pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
1624 pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
1626 pfile_in_zip_read_info->stream.next_in =
1627 (Bytef*)pfile_in_zip_read_info->read_buffer;
1628 pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
1631 if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
1635 if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
1636 (pfile_in_zip_read_info->rest_read_compressed == 0))
1637 return (iRead==0) ? UNZ_EOF : (int)iRead;
1639 if (pfile_in_zip_read_info->stream.avail_out <
1640 pfile_in_zip_read_info->stream.avail_in)
1641 uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
1643 uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
1645 for (i=0;i<uDoCopy;i++)
1646 *(pfile_in_zip_read_info->stream.next_out+i) =
1647 *(pfile_in_zip_read_info->stream.next_in+i);
1649 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
1651 pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
1652 pfile_in_zip_read_info->stream.next_out,
1654 pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
1655 pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
1656 pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
1657 pfile_in_zip_read_info->stream.next_out += uDoCopy;
1658 pfile_in_zip_read_info->stream.next_in += uDoCopy;
1659 pfile_in_zip_read_info->stream.total_out += uDoCopy;
1662 else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
1665 uLong uTotalOutBefore,uTotalOutAfter;
1666 const Bytef *bufBefore;
1669 pfile_in_zip_read_info->bstream.next_in = (
char*)pfile_in_zip_read_info->stream.next_in;
1670 pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
1671 pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
1672 pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
1673 pfile_in_zip_read_info->bstream.next_out = (
char*)pfile_in_zip_read_info->stream.next_out;
1674 pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
1675 pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
1676 pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
1678 uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
1679 bufBefore = (
const Bytef *)pfile_in_zip_read_info->bstream.next_out;
1681 err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
1683 uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
1684 uOutThis = uTotalOutAfter-uTotalOutBefore;
1686 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1688 pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
1689 pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1690 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1692 pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
1693 pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
1694 pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
1695 pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
1696 pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
1697 pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
1699 if (err==BZ_STREAM_END)
1700 return (iRead==0) ? UNZ_EOF : iRead;
1707 ZPOS64_T uTotalOutBefore,uTotalOutAfter;
1708 const Bytef *bufBefore;
1710 int flush=Z_SYNC_FLUSH;
1712 uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
1713 bufBefore = pfile_in_zip_read_info->stream.next_out;
1721 err=inflate(&pfile_in_zip_read_info->stream,flush);
1723 if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
1726 uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
1728 if (uTotalOutAfter<uTotalOutBefore)
1729 uTotalOutAfter += 1LL << 32;
1730 uOutThis = uTotalOutAfter-uTotalOutBefore;
1732 pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1734 pfile_in_zip_read_info->crc32 =
1735 crc32(pfile_in_zip_read_info->crc32,bufBefore,
1738 pfile_in_zip_read_info->rest_read_uncompressed -=
1741 iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1743 if (err==Z_STREAM_END)
1744 return (iRead==0) ? UNZ_EOF : (int)iRead;
1759extern z_off_t ZEXPORT unztell(unzFile file) {
1763 return UNZ_PARAMERROR;
1765 pfile_in_zip_read_info=s->pfile_in_zip_read;
1767 if (pfile_in_zip_read_info==NULL)
1768 return UNZ_PARAMERROR;
1770 return (z_off_t)pfile_in_zip_read_info->stream.total_out;
1773extern ZPOS64_T ZEXPORT unztell64(unzFile file) {
1778 return (ZPOS64_T)-1;
1780 pfile_in_zip_read_info=s->pfile_in_zip_read;
1782 if (pfile_in_zip_read_info==NULL)
1783 return (ZPOS64_T)-1;
1785 return pfile_in_zip_read_info->total_out_64;
1792extern int ZEXPORT unzeof(unzFile file) {
1796 return UNZ_PARAMERROR;
1798 pfile_in_zip_read_info=s->pfile_in_zip_read;
1800 if (pfile_in_zip_read_info==NULL)
1801 return UNZ_PARAMERROR;
1803 if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
1823extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf,
unsigned len) {
1827 ZPOS64_T size_to_read;
1830 return UNZ_PARAMERROR;
1832 pfile_in_zip_read_info=s->pfile_in_zip_read;
1834 if (pfile_in_zip_read_info==NULL)
1835 return UNZ_PARAMERROR;
1837 size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
1838 pfile_in_zip_read_info->pos_local_extrafield);
1841 return (
int)size_to_read;
1843 if (len>size_to_read)
1844 read_now = (uInt)size_to_read;
1846 read_now = (uInt)len ;
1851 if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1852 pfile_in_zip_read_info->filestream,
1853 pfile_in_zip_read_info->offset_local_extrafield +
1854 pfile_in_zip_read_info->pos_local_extrafield,
1855 ZLIB_FILEFUNC_SEEK_SET)!=0)
1858 if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1859 pfile_in_zip_read_info->filestream,
1860 buf,read_now)!=read_now)
1863 return (
int)read_now;
1870extern int ZEXPORT unzCloseCurrentFile(unzFile file) {
1876 return UNZ_PARAMERROR;
1878 pfile_in_zip_read_info=s->pfile_in_zip_read;
1880 if (pfile_in_zip_read_info==NULL)
1881 return UNZ_PARAMERROR;
1884 if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
1885 (!pfile_in_zip_read_info->raw))
1887 if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
1892 free(pfile_in_zip_read_info->read_buffer);
1893 pfile_in_zip_read_info->read_buffer = NULL;
1894 if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
1895 inflateEnd(&pfile_in_zip_read_info->stream);
1897 else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
1898 BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
1902 pfile_in_zip_read_info->stream_initialised = 0;
1903 free(pfile_in_zip_read_info);
1905 s->pfile_in_zip_read=NULL;
1916extern int ZEXPORT unzGetGlobalComment(unzFile file,
char * szComment, uLong uSizeBuf) {
1920 return (
int)UNZ_PARAMERROR;
1923 uReadThis = uSizeBuf;
1924 if (uReadThis>s->gi.size_comment)
1925 uReadThis = s->gi.size_comment;
1927 if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
1933 if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
1937 if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
1938 *(szComment+s->gi.size_comment)=
'\0';
1939 return (
int)uReadThis;
1943extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) {
1949 if (!s->current_file_ok)
1951 if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
1952 if (s->num_file==s->gi.number_entry)
1954 return s->pos_in_central_dir;
1957extern uLong ZEXPORT unzGetOffset(unzFile file) {
1962 offset64 = unzGetOffset64(file);
1963 return (uLong)offset64;
1966extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) {
1971 return UNZ_PARAMERROR;
1974 s->pos_in_central_dir = pos;
1975 s->num_file = s->gi.number_entry;
1976 err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1977 &s->cur_file_info_internal,
1978 NULL,0,NULL,0,NULL,0);
1979 s->current_file_ok = (err == UNZ_OK);
1983extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) {
1984 return unzSetOffset64(file,pos);