1 /* ioapi.h -- IO base function header for compress/uncompress .zip
2 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
4 Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
6 Modifications for Zip64 support
7 Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
9 For more info read MiniZip_info.txt
13 #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
14 #define _CRT_SECURE_NO_WARNINGS
17 #if defined(__APPLE__) || defined(IOAPI_NO_64)
18 // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
19 #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
20 #define FTELLO_FUNC(stream) ftello(stream)
21 #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
23 #define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
24 #define FTELLO_FUNC(stream) ftello64(stream)
25 #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
31 voidpf
call_zopen64 (const zlib_filefunc64_32_def
* pfilefunc
,const void*filename
,int mode
)
33 if (pfilefunc
->zfile_func64
.zopen64_file
!= NULL
)
34 return (*(pfilefunc
->zfile_func64
.zopen64_file
)) (pfilefunc
->zfile_func64
.opaque
,filename
,mode
);
37 return (*(pfilefunc
->zopen32_file
))(pfilefunc
->zfile_func64
.opaque
,(const char*)filename
,mode
);
41 long call_zseek64 (const zlib_filefunc64_32_def
* pfilefunc
,voidpf filestream
, ZPOS64_T offset
, int origin
)
43 if (pfilefunc
->zfile_func64
.zseek64_file
!= NULL
)
44 return (*(pfilefunc
->zfile_func64
.zseek64_file
)) (pfilefunc
->zfile_func64
.opaque
,filestream
,offset
,origin
);
47 uLong offsetTruncated
= (uLong
)offset
;
48 if (offsetTruncated
!= offset
)
51 return (*(pfilefunc
->zseek32_file
))(pfilefunc
->zfile_func64
.opaque
,filestream
,offsetTruncated
,origin
);
55 ZPOS64_T
call_ztell64 (const zlib_filefunc64_32_def
* pfilefunc
,voidpf filestream
)
57 if (pfilefunc
->zfile_func64
.zseek64_file
!= NULL
)
58 return (*(pfilefunc
->zfile_func64
.ztell64_file
)) (pfilefunc
->zfile_func64
.opaque
,filestream
);
61 uLong tell_uLong
= (*(pfilefunc
->ztell32_file
))(pfilefunc
->zfile_func64
.opaque
,filestream
);
62 if ((tell_uLong
) == MAXU32
)
69 void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def
* p_filefunc64_32
,const zlib_filefunc_def
* p_filefunc32
)
71 p_filefunc64_32
->zfile_func64
.zopen64_file
= NULL
;
72 p_filefunc64_32
->zopen32_file
= p_filefunc32
->zopen_file
;
73 p_filefunc64_32
->zfile_func64
.zerror_file
= p_filefunc32
->zerror_file
;
74 p_filefunc64_32
->zfile_func64
.zread_file
= p_filefunc32
->zread_file
;
75 p_filefunc64_32
->zfile_func64
.zwrite_file
= p_filefunc32
->zwrite_file
;
76 p_filefunc64_32
->zfile_func64
.ztell64_file
= NULL
;
77 p_filefunc64_32
->zfile_func64
.zseek64_file
= NULL
;
78 p_filefunc64_32
->zfile_func64
.zclose_file
= p_filefunc32
->zclose_file
;
79 p_filefunc64_32
->zfile_func64
.zerror_file
= p_filefunc32
->zerror_file
;
80 p_filefunc64_32
->zfile_func64
.opaque
= p_filefunc32
->opaque
;
81 p_filefunc64_32
->zseek32_file
= p_filefunc32
->zseek_file
;
82 p_filefunc64_32
->ztell32_file
= p_filefunc32
->ztell_file
;
87 static voidpf ZCALLBACK fopen_file_func
OF((voidpf opaque
, const char* filename
, int mode
));
88 static uLong ZCALLBACK fread_file_func
OF((voidpf opaque
, voidpf stream
, void* buf
, uLong size
));
89 static uLong ZCALLBACK fwrite_file_func
OF((voidpf opaque
, voidpf stream
, const void* buf
,uLong size
));
90 static ZPOS64_T ZCALLBACK ftell64_file_func
OF((voidpf opaque
, voidpf stream
));
91 static long ZCALLBACK fseek64_file_func
OF((voidpf opaque
, voidpf stream
, ZPOS64_T offset
, int origin
));
92 static int ZCALLBACK fclose_file_func
OF((voidpf opaque
, voidpf stream
));
93 static int ZCALLBACK ferror_file_func
OF((voidpf opaque
, voidpf stream
));
95 static voidpf ZCALLBACK
fopen_file_func (voidpf opaque
, const char* filename
, int mode
)
98 const char* mode_fopen
= NULL
;
99 if ((mode
& ZLIB_FILEFUNC_MODE_READWRITEFILTER
)==ZLIB_FILEFUNC_MODE_READ
)
102 if (mode
& ZLIB_FILEFUNC_MODE_EXISTING
)
105 if (mode
& ZLIB_FILEFUNC_MODE_CREATE
)
108 if ((filename
!=NULL
) && (mode_fopen
!= NULL
))
109 file
= fopen(filename
, mode_fopen
);
113 static voidpf ZCALLBACK
fopen64_file_func (voidpf opaque
, const void* filename
, int mode
)
116 const char* mode_fopen
= NULL
;
117 if ((mode
& ZLIB_FILEFUNC_MODE_READWRITEFILTER
)==ZLIB_FILEFUNC_MODE_READ
)
120 if (mode
& ZLIB_FILEFUNC_MODE_EXISTING
)
123 if (mode
& ZLIB_FILEFUNC_MODE_CREATE
)
126 if ((filename
!=NULL
) && (mode_fopen
!= NULL
))
127 file
= FOPEN_FUNC((const char*)filename
, mode_fopen
);
132 static uLong ZCALLBACK
fread_file_func (voidpf opaque
, voidpf stream
, void* buf
, uLong size
)
135 ret
= (uLong
)fread(buf
, 1, (size_t)size
, (FILE *)stream
);
139 static uLong ZCALLBACK
fwrite_file_func (voidpf opaque
, voidpf stream
, const void* buf
, uLong size
)
142 ret
= (uLong
)fwrite(buf
, 1, (size_t)size
, (FILE *)stream
);
146 static long ZCALLBACK
ftell_file_func (voidpf opaque
, voidpf stream
)
149 ret
= ftell((FILE *)stream
);
154 static ZPOS64_T ZCALLBACK
ftell64_file_func (voidpf opaque
, voidpf stream
)
157 ret
= FTELLO_FUNC((FILE *)stream
);
161 static long ZCALLBACK
fseek_file_func (voidpf opaque
, voidpf stream
, uLong offset
, int origin
)
167 case ZLIB_FILEFUNC_SEEK_CUR
:
168 fseek_origin
= SEEK_CUR
;
170 case ZLIB_FILEFUNC_SEEK_END
:
171 fseek_origin
= SEEK_END
;
173 case ZLIB_FILEFUNC_SEEK_SET
:
174 fseek_origin
= SEEK_SET
;
179 if (fseek((FILE *)stream
, offset
, fseek_origin
) != 0)
184 static long ZCALLBACK
fseek64_file_func (voidpf opaque
, voidpf stream
, ZPOS64_T offset
, int origin
)
190 case ZLIB_FILEFUNC_SEEK_CUR
:
191 fseek_origin
= SEEK_CUR
;
193 case ZLIB_FILEFUNC_SEEK_END
:
194 fseek_origin
= SEEK_END
;
196 case ZLIB_FILEFUNC_SEEK_SET
:
197 fseek_origin
= SEEK_SET
;
203 if(FSEEKO_FUNC((FILE *)stream
, offset
, fseek_origin
) != 0)
210 static int ZCALLBACK
fclose_file_func (voidpf opaque
, voidpf stream
)
213 ret
= fclose((FILE *)stream
);
217 static int ZCALLBACK
ferror_file_func (voidpf opaque
, voidpf stream
)
220 ret
= ferror((FILE *)stream
);
224 void fill_fopen_filefunc (pzlib_filefunc_def
)
225 zlib_filefunc_def
* pzlib_filefunc_def
;
227 pzlib_filefunc_def
->zopen_file
= fopen_file_func
;
228 pzlib_filefunc_def
->zread_file
= fread_file_func
;
229 pzlib_filefunc_def
->zwrite_file
= fwrite_file_func
;
230 pzlib_filefunc_def
->ztell_file
= ftell_file_func
;
231 pzlib_filefunc_def
->zseek_file
= fseek_file_func
;
232 pzlib_filefunc_def
->zclose_file
= fclose_file_func
;
233 pzlib_filefunc_def
->zerror_file
= ferror_file_func
;
234 pzlib_filefunc_def
->opaque
= NULL
;
237 void fill_fopen64_filefunc (zlib_filefunc64_def
* pzlib_filefunc_def
)
239 pzlib_filefunc_def
->zopen64_file
= fopen64_file_func
;
240 pzlib_filefunc_def
->zread_file
= fread_file_func
;
241 pzlib_filefunc_def
->zwrite_file
= fwrite_file_func
;
242 pzlib_filefunc_def
->ztell64_file
= ftell64_file_func
;
243 pzlib_filefunc_def
->zseek64_file
= fseek64_file_func
;
244 pzlib_filefunc_def
->zclose_file
= fclose_file_func
;
245 pzlib_filefunc_def
->zerror_file
= ferror_file_func
;
246 pzlib_filefunc_def
->opaque
= NULL
;