1
- /* ioapi.c -- IO base function header for compress/uncompress .zip
2
- files using zlib + zip or unzip API
1
+ /* ioapi.h -- IO base function header for compress/uncompress .zip
2
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
3
3
4
- Version 1.01e, February 12th, 2005
5
-
6
- Copyright (C) 1998-2005 Gilles Vollant
7
- */
8
-
9
- #include <stdio.h>
10
- #include <stdlib.h>
11
- #include <string.h>
12
-
13
- #include "zlib.h"
14
- #include "ioapi.h"
4
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
15
5
6
+ Modifications for Zip64 support
7
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
16
8
9
+ For more info read MiniZip_info.txt
17
10
18
- /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
11
+ */
19
12
20
- #ifndef SEEK_CUR
21
- #define SEEK_CUR 1
13
+ #if defined( _WIN32 ) && (!(defined( _CRT_SECURE_NO_WARNINGS )))
14
+ #define _CRT_SECURE_NO_WARNINGS
22
15
#endif
23
16
24
- #ifndef SEEK_END
25
- #define SEEK_END 2
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)
22
+ #else
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)
26
26
#endif
27
27
28
- #ifndef SEEK_SET
29
- #define SEEK_SET 0
30
- #endif
31
28
32
- voidpf ZCALLBACK fopen_file_func OF ( (
33
- voidpf opaque ,
34
- const char * filename ,
35
- int mode ));
29
+ #include "ioapi.h"
36
30
37
- uLong ZCALLBACK fread_file_func OF ( (
38
- voidpf opaque ,
39
- voidpf stream ,
40
- void * buf ,
41
- uLong size ));
31
+ voidpf call_zopen64 (const zlib_filefunc64_32_def * pfilefunc ,const void * filename ,int mode )
32
+ {
33
+ if (pfilefunc -> zfile_func64 .zopen64_file != NULL )
34
+ return (* (pfilefunc -> zfile_func64 .zopen64_file )) (pfilefunc -> zfile_func64 .opaque ,filename ,mode );
35
+ else
36
+ {
37
+ return (* (pfilefunc -> zopen32_file ))(pfilefunc -> zfile_func64 .opaque ,(const char * )filename ,mode );
38
+ }
39
+ }
42
40
43
- uLong ZCALLBACK fwrite_file_func OF ( (
44
- voidpf opaque ,
45
- voidpf stream ,
46
- const void * buf ,
47
- uLong size ));
41
+ long call_zseek64 (const zlib_filefunc64_32_def * pfilefunc ,voidpf filestream , ZPOS64_T offset , int origin )
42
+ {
43
+ if (pfilefunc -> zfile_func64 .zseek64_file != NULL )
44
+ return (* (pfilefunc -> zfile_func64 .zseek64_file )) (pfilefunc -> zfile_func64 .opaque ,filestream ,offset ,origin );
45
+ else
46
+ {
47
+ uLong offsetTruncated = (uLong )offset ;
48
+ if (offsetTruncated != offset )
49
+ return -1 ;
50
+ else
51
+ return (* (pfilefunc -> zseek32_file ))(pfilefunc -> zfile_func64 .opaque ,filestream ,offsetTruncated ,origin );
52
+ }
53
+ }
48
54
49
- long ZCALLBACK ftell_file_func OF ((
50
- voidpf opaque ,
51
- voidpf stream ));
55
+ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def * pfilefunc ,voidpf filestream )
56
+ {
57
+ if (pfilefunc -> zfile_func64 .zseek64_file != NULL )
58
+ return (* (pfilefunc -> zfile_func64 .ztell64_file )) (pfilefunc -> zfile_func64 .opaque ,filestream );
59
+ else
60
+ {
61
+ uLong tell_uLong = (uLong )(* (pfilefunc -> ztell32_file ))(pfilefunc -> zfile_func64 .opaque ,filestream );
62
+ if ((tell_uLong ) == MAXU32 )
63
+ return (ZPOS64_T )- 1 ;
64
+ else
65
+ return tell_uLong ;
66
+ }
67
+ }
52
68
53
- long ZCALLBACK fseek_file_func OF ((
54
- voidpf opaque ,
55
- voidpf stream ,
56
- uLong offset ,
57
- int origin ));
69
+ void fill_zlib_filefunc64_32_def_from_filefunc32 (zlib_filefunc64_32_def * p_filefunc64_32 ,const zlib_filefunc_def * p_filefunc32 )
70
+ {
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 ;
83
+ }
58
84
59
- int ZCALLBACK fclose_file_func OF ( (
60
- voidpf opaque ,
61
- voidpf stream ));
62
85
63
- int ZCALLBACK ferror_file_func OF ( (
64
- voidpf opaque ,
65
- voidpf stream ));
66
86
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 ));
67
94
68
- voidpf ZCALLBACK fopen_file_func (opaque , filename , mode )
69
- voidpf opaque ;
70
- const char * filename ;
71
- int mode ;
95
+ static voidpf ZCALLBACK fopen_file_func (voidpf opaque , const char * filename , int mode )
72
96
{
73
97
FILE * file = NULL ;
74
98
const char * mode_fopen = NULL ;
99
+ (void )opaque ;
75
100
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER )== ZLIB_FILEFUNC_MODE_READ )
76
101
mode_fopen = "rb" ;
77
102
else
@@ -86,47 +111,64 @@ voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
86
111
return file ;
87
112
}
88
113
114
+ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque , const void * filename , int mode )
115
+ {
116
+ FILE * file = NULL ;
117
+ const char * mode_fopen = NULL ;
118
+ (void )opaque ;
119
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER )== ZLIB_FILEFUNC_MODE_READ )
120
+ mode_fopen = "rb" ;
121
+ else
122
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING )
123
+ mode_fopen = "r+b" ;
124
+ else
125
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE )
126
+ mode_fopen = "wb" ;
127
+
128
+ if ((filename != NULL ) && (mode_fopen != NULL ))
129
+ file = FOPEN_FUNC ((const char * )filename , mode_fopen );
130
+ return file ;
131
+ }
132
+
89
133
90
- uLong ZCALLBACK fread_file_func (opaque , stream , buf , size )
91
- voidpf opaque ;
92
- voidpf stream ;
93
- void * buf ;
94
- uLong size ;
134
+ static uLong ZCALLBACK fread_file_func (voidpf opaque , voidpf stream , void * buf , uLong size )
95
135
{
96
136
uLong ret ;
137
+ (void )opaque ;
97
138
ret = (uLong )fread (buf , 1 , (size_t )size , (FILE * )stream );
98
139
return ret ;
99
140
}
100
141
101
-
102
- uLong ZCALLBACK fwrite_file_func (opaque , stream , buf , size )
103
- voidpf opaque ;
104
- voidpf stream ;
105
- const void * buf ;
106
- uLong size ;
142
+ static uLong ZCALLBACK fwrite_file_func (voidpf opaque , voidpf stream , const void * buf , uLong size )
107
143
{
108
144
uLong ret ;
145
+ (void )opaque ;
109
146
ret = (uLong )fwrite (buf , 1 , (size_t )size , (FILE * )stream );
110
147
return ret ;
111
148
}
112
149
113
- long ZCALLBACK ftell_file_func (opaque , stream )
114
- voidpf opaque ;
115
- voidpf stream ;
150
+ static long ZCALLBACK ftell_file_func (voidpf opaque , voidpf stream )
116
151
{
117
152
long ret ;
153
+ (void )opaque ;
118
154
ret = ftell ((FILE * )stream );
119
155
return ret ;
120
156
}
121
157
122
- long ZCALLBACK fseek_file_func (opaque , stream , offset , origin )
123
- voidpf opaque ;
124
- voidpf stream ;
125
- uLong offset ;
126
- int origin ;
158
+
159
+ static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque , voidpf stream )
160
+ {
161
+ ZPOS64_T ret ;
162
+ (void )opaque ;
163
+ ret = (ZPOS64_T )FTELLO_FUNC ((FILE * )stream );
164
+ return ret ;
165
+ }
166
+
167
+ static long ZCALLBACK fseek_file_func (voidpf opaque , voidpf stream , uLong offset , int origin )
127
168
{
128
169
int fseek_origin = 0 ;
129
170
long ret ;
171
+ (void )opaque ;
130
172
switch (origin )
131
173
{
132
174
case ZLIB_FILEFUNC_SEEK_CUR :
@@ -141,24 +183,50 @@ long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
141
183
default : return -1 ;
142
184
}
143
185
ret = 0 ;
144
- fseek ((FILE * )stream , offset , fseek_origin );
186
+ if (fseek ((FILE * )stream , (long )offset , fseek_origin ) != 0 )
187
+ ret = -1 ;
145
188
return ret ;
146
189
}
147
190
148
- int ZCALLBACK fclose_file_func (opaque , stream )
149
- voidpf opaque ;
150
- voidpf stream ;
191
+ static long ZCALLBACK fseek64_file_func (voidpf opaque , voidpf stream , ZPOS64_T offset , int origin )
192
+ {
193
+ int fseek_origin = 0 ;
194
+ long ret ;
195
+ (void )opaque ;
196
+ switch (origin )
197
+ {
198
+ case ZLIB_FILEFUNC_SEEK_CUR :
199
+ fseek_origin = SEEK_CUR ;
200
+ break ;
201
+ case ZLIB_FILEFUNC_SEEK_END :
202
+ fseek_origin = SEEK_END ;
203
+ break ;
204
+ case ZLIB_FILEFUNC_SEEK_SET :
205
+ fseek_origin = SEEK_SET ;
206
+ break ;
207
+ default : return -1 ;
208
+ }
209
+ ret = 0 ;
210
+
211
+ if (FSEEKO_FUNC ((FILE * )stream , (z_off_t )offset , fseek_origin ) != 0 )
212
+ ret = -1 ;
213
+
214
+ return ret ;
215
+ }
216
+
217
+
218
+ static int ZCALLBACK fclose_file_func (voidpf opaque , voidpf stream )
151
219
{
152
220
int ret ;
221
+ (void )opaque ;
153
222
ret = fclose ((FILE * )stream );
154
223
return ret ;
155
224
}
156
225
157
- int ZCALLBACK ferror_file_func (opaque , stream )
158
- voidpf opaque ;
159
- voidpf stream ;
226
+ static int ZCALLBACK ferror_file_func (voidpf opaque , voidpf stream )
160
227
{
161
228
int ret ;
229
+ (void )opaque ;
162
230
ret = ferror ((FILE * )stream );
163
231
return ret ;
164
232
}
@@ -175,3 +243,15 @@ void fill_fopen_filefunc (pzlib_filefunc_def)
175
243
pzlib_filefunc_def -> zerror_file = ferror_file_func ;
176
244
pzlib_filefunc_def -> opaque = NULL ;
177
245
}
246
+
247
+ void fill_fopen64_filefunc (zlib_filefunc64_def * pzlib_filefunc_def )
248
+ {
249
+ pzlib_filefunc_def -> zopen64_file = fopen64_file_func ;
250
+ pzlib_filefunc_def -> zread_file = fread_file_func ;
251
+ pzlib_filefunc_def -> zwrite_file = fwrite_file_func ;
252
+ pzlib_filefunc_def -> ztell64_file = ftell64_file_func ;
253
+ pzlib_filefunc_def -> zseek64_file = fseek64_file_func ;
254
+ pzlib_filefunc_def -> zclose_file = fclose_file_func ;
255
+ pzlib_filefunc_def -> zerror_file = ferror_file_func ;
256
+ pzlib_filefunc_def -> opaque = NULL ;
257
+ }
0 commit comments