fast_excel 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -2
  3. data/Makefile +14 -0
  4. data/README.md +7 -2
  5. data/Rakefile +10 -0
  6. data/extconf.rb +0 -0
  7. data/fast_excel.gemspec +3 -1
  8. data/lib/fast_excel/binding.rb +3 -7
  9. data/lib/rubygems_plugin.rb +3 -0
  10. data/libxlsxwriter/.gitignore +49 -0
  11. data/libxlsxwriter/.indent.pro +125 -0
  12. data/libxlsxwriter/.travis.yml +25 -0
  13. data/libxlsxwriter/CONTRIBUTING.md +226 -0
  14. data/libxlsxwriter/Changes.txt +557 -0
  15. data/libxlsxwriter/LICENSE.txt +89 -0
  16. data/libxlsxwriter/Makefile +156 -0
  17. data/libxlsxwriter/Readme.md +78 -0
  18. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +30 -0
  19. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +7 -0
  20. data/libxlsxwriter/include/xlsxwriter/app.h +79 -0
  21. data/libxlsxwriter/include/xlsxwriter/chart.h +3476 -0
  22. data/libxlsxwriter/include/xlsxwriter/common.h +372 -0
  23. data/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
  24. data/libxlsxwriter/include/xlsxwriter/core.h +51 -0
  25. data/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
  26. data/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
  27. data/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
  28. data/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
  29. data/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
  30. data/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
  31. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
  32. data/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
  33. data/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
  34. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +214 -0
  35. data/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
  36. data/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
  37. data/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
  38. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
  39. data/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
  40. data/libxlsxwriter/include/xlsxwriter/workbook.h +757 -0
  41. data/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
  42. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
  43. data/libxlsxwriter/include/xlsxwriter.h +23 -0
  44. data/libxlsxwriter/lib/.gitignore +0 -0
  45. data/libxlsxwriter/libxlsxwriter.podspec +47 -0
  46. data/libxlsxwriter/src/Makefile +130 -0
  47. data/libxlsxwriter/src/app.c +443 -0
  48. data/libxlsxwriter/src/chart.c +6346 -0
  49. data/libxlsxwriter/src/content_types.c +345 -0
  50. data/libxlsxwriter/src/core.c +293 -0
  51. data/libxlsxwriter/src/custom.c +224 -0
  52. data/libxlsxwriter/src/drawing.c +746 -0
  53. data/libxlsxwriter/src/format.c +729 -0
  54. data/libxlsxwriter/src/hash_table.c +223 -0
  55. data/libxlsxwriter/src/packager.c +948 -0
  56. data/libxlsxwriter/src/relationships.c +245 -0
  57. data/libxlsxwriter/src/shared_strings.c +266 -0
  58. data/libxlsxwriter/src/styles.c +1088 -0
  59. data/libxlsxwriter/src/theme.c +348 -0
  60. data/libxlsxwriter/src/utility.c +515 -0
  61. data/libxlsxwriter/src/workbook.c +1930 -0
  62. data/libxlsxwriter/src/worksheet.c +5022 -0
  63. data/libxlsxwriter/src/xmlwriter.c +355 -0
  64. data/libxlsxwriter/third_party/minizip/Makefile +44 -0
  65. data/libxlsxwriter/third_party/minizip/Makefile.am +45 -0
  66. data/libxlsxwriter/third_party/minizip/Makefile.orig +25 -0
  67. data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +6 -0
  68. data/libxlsxwriter/third_party/minizip/MiniZip64_info.txt +74 -0
  69. data/libxlsxwriter/third_party/minizip/README.txt +5 -0
  70. data/libxlsxwriter/third_party/minizip/configure.ac +32 -0
  71. data/libxlsxwriter/third_party/minizip/crypt.h +131 -0
  72. data/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
  73. data/libxlsxwriter/third_party/minizip/ioapi.h +208 -0
  74. data/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
  75. data/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
  76. data/libxlsxwriter/third_party/minizip/make_vms.com +25 -0
  77. data/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
  78. data/libxlsxwriter/third_party/minizip/miniunzip.1 +63 -0
  79. data/libxlsxwriter/third_party/minizip/minizip.1 +46 -0
  80. data/libxlsxwriter/third_party/minizip/minizip.c +520 -0
  81. data/libxlsxwriter/third_party/minizip/minizip.pc.in +12 -0
  82. data/libxlsxwriter/third_party/minizip/mztools.c +291 -0
  83. data/libxlsxwriter/third_party/minizip/mztools.h +37 -0
  84. data/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
  85. data/libxlsxwriter/third_party/minizip/unzip.h +437 -0
  86. data/libxlsxwriter/third_party/minizip/zip.c +2007 -0
  87. data/libxlsxwriter/third_party/minizip/zip.h +367 -0
  88. data/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
  89. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
  90. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
  91. data/libxlsxwriter/version.txt +1 -0
  92. metadata +89 -6
  93. data/binaries/libxlsxwriter-alpine.so +0 -0
  94. data/binaries/libxlsxwriter-darwin.dylib +0 -0
  95. data/binaries/libxlsxwriter-glibc.so +0 -0
@@ -0,0 +1,2125 @@
1
+ /* unzip.c -- IO for uncompress .zip files using zlib
2
+ Version 1.1, February 14h, 2010
3
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
4
+
5
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
6
+
7
+ Modifications of Unzip for Zip64
8
+ Copyright (C) 2007-2008 Even Rouault
9
+
10
+ Modifications for Zip64 support on both zip and unzip
11
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
12
+
13
+ For more info read MiniZip_info.txt
14
+
15
+
16
+ ------------------------------------------------------------------------------------
17
+ Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
18
+ compatibility with older software. The following is from the original crypt.c.
19
+ Code woven in by Terry Thorsen 1/2003.
20
+
21
+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
22
+
23
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
24
+ (the contents of which are also included in zip.h) for terms of use.
25
+ If, for some reason, all these files are missing, the Info-ZIP license
26
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
27
+
28
+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
29
+
30
+ The encryption/decryption parts of this source code (as opposed to the
31
+ non-echoing password parts) were originally written in Europe. The
32
+ whole source package can be freely distributed, including from the USA.
33
+ (Prior to January 2000, re-export from the US was a violation of US law.)
34
+
35
+ This encryption code is a direct transcription of the algorithm from
36
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
37
+ file (appnote.txt) is distributed with the PKZIP program (even in the
38
+ version without encryption capabilities).
39
+
40
+ ------------------------------------------------------------------------------------
41
+
42
+ Changes in unzip.c
43
+
44
+ 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
45
+ 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
46
+ 2007-2008 - Even Rouault - Remove old C style function prototypes
47
+ 2007-2008 - Even Rouault - Add unzip support for ZIP64
48
+
49
+ Copyright (C) 2007-2008 Even Rouault
50
+
51
+
52
+ Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
53
+ Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
54
+ should only read the compressed/uncompressed size from the Zip64 format if
55
+ the size from normal header was 0xFFFFFFFF
56
+ Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
57
+ Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
58
+ Patch created by Daniel Borca
59
+
60
+ Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
61
+
62
+ Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
63
+
64
+ */
65
+
66
+
67
+ #include <stdio.h>
68
+ #include <stdlib.h>
69
+ #include <string.h>
70
+
71
+ #ifndef NOUNCRYPT
72
+ #define NOUNCRYPT
73
+ #endif
74
+
75
+ #include "zlib.h"
76
+ #include "unzip.h"
77
+
78
+ #ifdef STDC
79
+ # include <stddef.h>
80
+ # include <string.h>
81
+ # include <stdlib.h>
82
+ #endif
83
+ #ifdef NO_ERRNO_H
84
+ extern int errno;
85
+ #else
86
+ # include <errno.h>
87
+ #endif
88
+
89
+
90
+ #ifndef local
91
+ # define local static
92
+ #endif
93
+ /* compile with -Dlocal if your debugger can't find static symbols */
94
+
95
+
96
+ #ifndef CASESENSITIVITYDEFAULT_NO
97
+ # if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
98
+ # define CASESENSITIVITYDEFAULT_NO
99
+ # endif
100
+ #endif
101
+
102
+
103
+ #ifndef UNZ_BUFSIZE
104
+ #define UNZ_BUFSIZE (16384)
105
+ #endif
106
+
107
+ #ifndef UNZ_MAXFILENAMEINZIP
108
+ #define UNZ_MAXFILENAMEINZIP (256)
109
+ #endif
110
+
111
+ #ifndef ALLOC
112
+ # define ALLOC(size) (malloc(size))
113
+ #endif
114
+ #ifndef TRYFREE
115
+ # define TRYFREE(p) {if (p) free(p);}
116
+ #endif
117
+
118
+ #define SIZECENTRALDIRITEM (0x2e)
119
+ #define SIZEZIPLOCALHEADER (0x1e)
120
+
121
+
122
+ const char unz_copyright[] =
123
+ " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
124
+
125
+ /* unz_file_info_interntal contain internal info about a file in zipfile*/
126
+ typedef struct unz_file_info64_internal_s
127
+ {
128
+ ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
129
+ } unz_file_info64_internal;
130
+
131
+
132
+ /* file_in_zip_read_info_s contain internal information about a file in zipfile,
133
+ when reading and decompress it */
134
+ typedef struct
135
+ {
136
+ char *read_buffer; /* internal buffer for compressed data */
137
+ z_stream stream; /* zLib stream structure for inflate */
138
+
139
+ #ifdef HAVE_BZIP2
140
+ bz_stream bstream; /* bzLib stream structure for bziped */
141
+ #endif
142
+
143
+ ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
144
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
145
+
146
+ ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
147
+ uInt size_local_extrafield;/* size of the local extra field */
148
+ ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/
149
+ ZPOS64_T total_out_64;
150
+
151
+ uLong crc32; /* crc32 of all data uncompressed */
152
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
153
+ ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
154
+ ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
155
+ zlib_filefunc64_32_def z_filefunc;
156
+ voidpf filestream; /* io structore of the zipfile */
157
+ uLong compression_method; /* compression method (0==store) */
158
+ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
159
+ int raw;
160
+ } file_in_zip64_read_info_s;
161
+
162
+
163
+ /* unz64_s contain internal information about the zipfile
164
+ */
165
+ typedef struct
166
+ {
167
+ zlib_filefunc64_32_def z_filefunc;
168
+ int is64bitOpenFunction;
169
+ voidpf filestream; /* io structore of the zipfile */
170
+ unz_global_info64 gi; /* public global information */
171
+ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
172
+ ZPOS64_T num_file; /* number of the current file in the zipfile*/
173
+ ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/
174
+ ZPOS64_T current_file_ok; /* flag about the usability of the current file*/
175
+ ZPOS64_T central_pos; /* position of the beginning of the central dir*/
176
+
177
+ ZPOS64_T size_central_dir; /* size of the central directory */
178
+ ZPOS64_T offset_central_dir; /* offset of start of central directory with
179
+ respect to the starting disk number */
180
+
181
+ unz_file_info64 cur_file_info; /* public info about the current file in zip*/
182
+ unz_file_info64_internal cur_file_info_internal; /* private info about it*/
183
+ file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
184
+ file if we are decompressing it */
185
+ int encrypted;
186
+
187
+ int isZip64;
188
+
189
+ # ifndef NOUNCRYPT
190
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
191
+ const z_crc_t* pcrc_32_tab;
192
+ # endif
193
+ } unz64_s;
194
+
195
+
196
+ #ifndef NOUNCRYPT
197
+ #include "crypt.h"
198
+ #endif
199
+
200
+ /* ===========================================================================
201
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
202
+ for end of file.
203
+ IN assertion: the stream s has been sucessfully opened for reading.
204
+ */
205
+
206
+
207
+ local int unz64local_getByte OF((
208
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
209
+ voidpf filestream,
210
+ int *pi));
211
+
212
+ local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
213
+ {
214
+ unsigned char c;
215
+ int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
216
+ if (err==1)
217
+ {
218
+ *pi = (int)c;
219
+ return UNZ_OK;
220
+ }
221
+ else
222
+ {
223
+ if (ZERROR64(*pzlib_filefunc_def,filestream))
224
+ return UNZ_ERRNO;
225
+ else
226
+ return UNZ_EOF;
227
+ }
228
+ }
229
+
230
+
231
+ /* ===========================================================================
232
+ Reads a long in LSB order from the given gz_stream. Sets
233
+ */
234
+ local int unz64local_getShort OF((
235
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
236
+ voidpf filestream,
237
+ uLong *pX));
238
+
239
+ local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
240
+ voidpf filestream,
241
+ uLong *pX)
242
+ {
243
+ uLong x ;
244
+ int i = 0;
245
+ int err;
246
+
247
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
248
+ x = (uLong)i;
249
+
250
+ if (err==UNZ_OK)
251
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
252
+ x |= ((uLong)i)<<8;
253
+
254
+ if (err==UNZ_OK)
255
+ *pX = x;
256
+ else
257
+ *pX = 0;
258
+ return err;
259
+ }
260
+
261
+ local int unz64local_getLong OF((
262
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
263
+ voidpf filestream,
264
+ uLong *pX));
265
+
266
+ local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
267
+ voidpf filestream,
268
+ uLong *pX)
269
+ {
270
+ uLong x ;
271
+ int i = 0;
272
+ int err;
273
+
274
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
275
+ x = (uLong)i;
276
+
277
+ if (err==UNZ_OK)
278
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
279
+ x |= ((uLong)i)<<8;
280
+
281
+ if (err==UNZ_OK)
282
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
283
+ x |= ((uLong)i)<<16;
284
+
285
+ if (err==UNZ_OK)
286
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
287
+ x += ((uLong)i)<<24;
288
+
289
+ if (err==UNZ_OK)
290
+ *pX = x;
291
+ else
292
+ *pX = 0;
293
+ return err;
294
+ }
295
+
296
+ local int unz64local_getLong64 OF((
297
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
298
+ voidpf filestream,
299
+ ZPOS64_T *pX));
300
+
301
+
302
+ local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
303
+ voidpf filestream,
304
+ ZPOS64_T *pX)
305
+ {
306
+ ZPOS64_T x ;
307
+ int i = 0;
308
+ int err;
309
+
310
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
311
+ x = (ZPOS64_T)i;
312
+
313
+ if (err==UNZ_OK)
314
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
315
+ x |= ((ZPOS64_T)i)<<8;
316
+
317
+ if (err==UNZ_OK)
318
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
319
+ x |= ((ZPOS64_T)i)<<16;
320
+
321
+ if (err==UNZ_OK)
322
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
323
+ x |= ((ZPOS64_T)i)<<24;
324
+
325
+ if (err==UNZ_OK)
326
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
327
+ x |= ((ZPOS64_T)i)<<32;
328
+
329
+ if (err==UNZ_OK)
330
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
331
+ x |= ((ZPOS64_T)i)<<40;
332
+
333
+ if (err==UNZ_OK)
334
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
335
+ x |= ((ZPOS64_T)i)<<48;
336
+
337
+ if (err==UNZ_OK)
338
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
339
+ x |= ((ZPOS64_T)i)<<56;
340
+
341
+ if (err==UNZ_OK)
342
+ *pX = x;
343
+ else
344
+ *pX = 0;
345
+ return err;
346
+ }
347
+
348
+ /* My own strcmpi / strcasecmp */
349
+ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
350
+ {
351
+ for (;;)
352
+ {
353
+ char c1=*(fileName1++);
354
+ char c2=*(fileName2++);
355
+ if ((c1>='a') && (c1<='z'))
356
+ c1 -= 0x20;
357
+ if ((c2>='a') && (c2<='z'))
358
+ c2 -= 0x20;
359
+ if (c1=='\0')
360
+ return ((c2=='\0') ? 0 : -1);
361
+ if (c2=='\0')
362
+ return 1;
363
+ if (c1<c2)
364
+ return -1;
365
+ if (c1>c2)
366
+ return 1;
367
+ }
368
+ }
369
+
370
+
371
+ #ifdef CASESENSITIVITYDEFAULT_NO
372
+ #define CASESENSITIVITYDEFAULTVALUE 2
373
+ #else
374
+ #define CASESENSITIVITYDEFAULTVALUE 1
375
+ #endif
376
+
377
+ #ifndef STRCMPCASENOSENTIVEFUNCTION
378
+ #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
379
+ #endif
380
+
381
+ /*
382
+ Compare two filename (fileName1,fileName2).
383
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
384
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
385
+ or strcasecmp)
386
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
387
+ (like 1 on Unix, 2 on Windows)
388
+
389
+ */
390
+ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
391
+ const char* fileName2,
392
+ int iCaseSensitivity)
393
+
394
+ {
395
+ if (iCaseSensitivity==0)
396
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
397
+
398
+ if (iCaseSensitivity==1)
399
+ return strcmp(fileName1,fileName2);
400
+
401
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
402
+ }
403
+
404
+ #ifndef BUFREADCOMMENT
405
+ #define BUFREADCOMMENT (0x400)
406
+ #endif
407
+
408
+ /*
409
+ Locate the Central directory of a zipfile (at the end, just before
410
+ the global comment)
411
+ */
412
+ local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
413
+ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
414
+ {
415
+ unsigned char* buf;
416
+ ZPOS64_T uSizeFile;
417
+ ZPOS64_T uBackRead;
418
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
419
+ ZPOS64_T uPosFound=0;
420
+
421
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
422
+ return 0;
423
+
424
+
425
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
426
+
427
+ if (uMaxBack>uSizeFile)
428
+ uMaxBack = uSizeFile;
429
+
430
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
431
+ if (buf==NULL)
432
+ return 0;
433
+
434
+ uBackRead = 4;
435
+ while (uBackRead<uMaxBack)
436
+ {
437
+ uLong uReadSize;
438
+ ZPOS64_T uReadPos ;
439
+ int i;
440
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
441
+ uBackRead = uMaxBack;
442
+ else
443
+ uBackRead+=BUFREADCOMMENT;
444
+ uReadPos = uSizeFile-uBackRead ;
445
+
446
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
447
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
448
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
449
+ break;
450
+
451
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
452
+ break;
453
+
454
+ for (i=(int)uReadSize-3; (i--)>0;)
455
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
456
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
457
+ {
458
+ uPosFound = uReadPos+i;
459
+ break;
460
+ }
461
+
462
+ if (uPosFound!=0)
463
+ break;
464
+ }
465
+ TRYFREE(buf);
466
+ return uPosFound;
467
+ }
468
+
469
+
470
+ /*
471
+ Locate the Central directory 64 of a zipfile (at the end, just before
472
+ the global comment)
473
+ */
474
+ local ZPOS64_T unz64local_SearchCentralDir64 OF((
475
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
476
+ voidpf filestream));
477
+
478
+ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
479
+ voidpf filestream)
480
+ {
481
+ unsigned char* buf;
482
+ ZPOS64_T uSizeFile;
483
+ ZPOS64_T uBackRead;
484
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
485
+ ZPOS64_T uPosFound=0;
486
+ uLong uL;
487
+ ZPOS64_T relativeOffset;
488
+
489
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
490
+ return 0;
491
+
492
+
493
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
494
+
495
+ if (uMaxBack>uSizeFile)
496
+ uMaxBack = uSizeFile;
497
+
498
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
499
+ if (buf==NULL)
500
+ return 0;
501
+
502
+ uBackRead = 4;
503
+ while (uBackRead<uMaxBack)
504
+ {
505
+ uLong uReadSize;
506
+ ZPOS64_T uReadPos;
507
+ int i;
508
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
509
+ uBackRead = uMaxBack;
510
+ else
511
+ uBackRead+=BUFREADCOMMENT;
512
+ uReadPos = uSizeFile-uBackRead ;
513
+
514
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
515
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
516
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
517
+ break;
518
+
519
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
520
+ break;
521
+
522
+ for (i=(int)uReadSize-3; (i--)>0;)
523
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
524
+ ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
525
+ {
526
+ uPosFound = uReadPos+i;
527
+ break;
528
+ }
529
+
530
+ if (uPosFound!=0)
531
+ break;
532
+ }
533
+ TRYFREE(buf);
534
+ if (uPosFound == 0)
535
+ return 0;
536
+
537
+ /* Zip64 end of central directory locator */
538
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
539
+ return 0;
540
+
541
+ /* the signature, already checked */
542
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
543
+ return 0;
544
+
545
+ /* number of the disk with the start of the zip64 end of central directory */
546
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
547
+ return 0;
548
+ if (uL != 0)
549
+ return 0;
550
+
551
+ /* relative offset of the zip64 end of central directory record */
552
+ if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
553
+ return 0;
554
+
555
+ /* total number of disks */
556
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
557
+ return 0;
558
+ if (uL != 1)
559
+ return 0;
560
+
561
+ /* Goto end of central directory record */
562
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
563
+ return 0;
564
+
565
+ /* the signature */
566
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
567
+ return 0;
568
+
569
+ if (uL != 0x06064b50)
570
+ return 0;
571
+
572
+ return relativeOffset;
573
+ }
574
+
575
+ /*
576
+ Open a Zip file. path contain the full pathname (by example,
577
+ on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
578
+ "zlib/zlib114.zip".
579
+ If the zipfile cannot be opened (file doesn't exist or in not valid), the
580
+ return value is NULL.
581
+ Else, the return value is a unzFile Handle, usable with other function
582
+ of this unzip package.
583
+ */
584
+ local unzFile unzOpenInternal (const void *path,
585
+ zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
586
+ int is64bitOpenFunction)
587
+ {
588
+ unz64_s us;
589
+ unz64_s *s;
590
+ ZPOS64_T central_pos;
591
+ uLong uL;
592
+
593
+ uLong number_disk; /* number of the current dist, used for
594
+ spaning ZIP, unsupported, always 0*/
595
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
596
+ for spaning ZIP, unsupported, always 0*/
597
+ ZPOS64_T number_entry_CD; /* total number of entries in
598
+ the central dir
599
+ (same than number_entry on nospan) */
600
+
601
+ int err=UNZ_OK;
602
+
603
+ if (unz_copyright[0]!=' ')
604
+ return NULL;
605
+
606
+ us.z_filefunc.zseek32_file = NULL;
607
+ us.z_filefunc.ztell32_file = NULL;
608
+ if (pzlib_filefunc64_32_def==NULL)
609
+ fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
610
+ else
611
+ us.z_filefunc = *pzlib_filefunc64_32_def;
612
+ us.is64bitOpenFunction = is64bitOpenFunction;
613
+
614
+
615
+
616
+ us.filestream = ZOPEN64(us.z_filefunc,
617
+ path,
618
+ ZLIB_FILEFUNC_MODE_READ |
619
+ ZLIB_FILEFUNC_MODE_EXISTING);
620
+ if (us.filestream==NULL)
621
+ return NULL;
622
+
623
+ central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
624
+ if (central_pos)
625
+ {
626
+ uLong uS;
627
+ ZPOS64_T uL64;
628
+
629
+ us.isZip64 = 1;
630
+
631
+ if (ZSEEK64(us.z_filefunc, us.filestream,
632
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
633
+ err=UNZ_ERRNO;
634
+
635
+ /* the signature, already checked */
636
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
637
+ err=UNZ_ERRNO;
638
+
639
+ /* size of zip64 end of central directory record */
640
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
641
+ err=UNZ_ERRNO;
642
+
643
+ /* version made by */
644
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
645
+ err=UNZ_ERRNO;
646
+
647
+ /* version needed to extract */
648
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
649
+ err=UNZ_ERRNO;
650
+
651
+ /* number of this disk */
652
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
653
+ err=UNZ_ERRNO;
654
+
655
+ /* number of the disk with the start of the central directory */
656
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
657
+ err=UNZ_ERRNO;
658
+
659
+ /* total number of entries in the central directory on this disk */
660
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
661
+ err=UNZ_ERRNO;
662
+
663
+ /* total number of entries in the central directory */
664
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
665
+ err=UNZ_ERRNO;
666
+
667
+ if ((number_entry_CD!=us.gi.number_entry) ||
668
+ (number_disk_with_CD!=0) ||
669
+ (number_disk!=0))
670
+ err=UNZ_BADZIPFILE;
671
+
672
+ /* size of the central directory */
673
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
674
+ err=UNZ_ERRNO;
675
+
676
+ /* offset of start of central directory with respect to the
677
+ starting disk number */
678
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
679
+ err=UNZ_ERRNO;
680
+
681
+ us.gi.size_comment = 0;
682
+ }
683
+ else
684
+ {
685
+ central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
686
+ if (central_pos==0)
687
+ err=UNZ_ERRNO;
688
+
689
+ us.isZip64 = 0;
690
+
691
+ if (ZSEEK64(us.z_filefunc, us.filestream,
692
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
693
+ err=UNZ_ERRNO;
694
+
695
+ /* the signature, already checked */
696
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
697
+ err=UNZ_ERRNO;
698
+
699
+ /* number of this disk */
700
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
701
+ err=UNZ_ERRNO;
702
+
703
+ /* number of the disk with the start of the central directory */
704
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
705
+ err=UNZ_ERRNO;
706
+
707
+ /* total number of entries in the central dir on this disk */
708
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
709
+ err=UNZ_ERRNO;
710
+ us.gi.number_entry = uL;
711
+
712
+ /* total number of entries in the central dir */
713
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
714
+ err=UNZ_ERRNO;
715
+ number_entry_CD = uL;
716
+
717
+ if ((number_entry_CD!=us.gi.number_entry) ||
718
+ (number_disk_with_CD!=0) ||
719
+ (number_disk!=0))
720
+ err=UNZ_BADZIPFILE;
721
+
722
+ /* size of the central directory */
723
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
724
+ err=UNZ_ERRNO;
725
+ us.size_central_dir = uL;
726
+
727
+ /* offset of start of central directory with respect to the
728
+ starting disk number */
729
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
730
+ err=UNZ_ERRNO;
731
+ us.offset_central_dir = uL;
732
+
733
+ /* zipfile comment length */
734
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
735
+ err=UNZ_ERRNO;
736
+ }
737
+
738
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
739
+ (err==UNZ_OK))
740
+ err=UNZ_BADZIPFILE;
741
+
742
+ if (err!=UNZ_OK)
743
+ {
744
+ ZCLOSE64(us.z_filefunc, us.filestream);
745
+ return NULL;
746
+ }
747
+
748
+ us.byte_before_the_zipfile = central_pos -
749
+ (us.offset_central_dir+us.size_central_dir);
750
+ us.central_pos = central_pos;
751
+ us.pfile_in_zip_read = NULL;
752
+ us.encrypted = 0;
753
+
754
+
755
+ s=(unz64_s*)ALLOC(sizeof(unz64_s));
756
+ if( s != NULL)
757
+ {
758
+ *s=us;
759
+ unzGoToFirstFile((unzFile)s);
760
+ }
761
+ return (unzFile)s;
762
+ }
763
+
764
+
765
+ extern unzFile ZEXPORT unzOpen2 (const char *path,
766
+ zlib_filefunc_def* pzlib_filefunc32_def)
767
+ {
768
+ if (pzlib_filefunc32_def != NULL)
769
+ {
770
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
771
+ fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
772
+ return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
773
+ }
774
+ else
775
+ return unzOpenInternal(path, NULL, 0);
776
+ }
777
+
778
+ extern unzFile ZEXPORT unzOpen2_64 (const void *path,
779
+ zlib_filefunc64_def* pzlib_filefunc_def)
780
+ {
781
+ if (pzlib_filefunc_def != NULL)
782
+ {
783
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
784
+ zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
785
+ zlib_filefunc64_32_def_fill.ztell32_file = NULL;
786
+ zlib_filefunc64_32_def_fill.zseek32_file = NULL;
787
+ return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
788
+ }
789
+ else
790
+ return unzOpenInternal(path, NULL, 1);
791
+ }
792
+
793
+ extern unzFile ZEXPORT unzOpen (const char *path)
794
+ {
795
+ return unzOpenInternal(path, NULL, 0);
796
+ }
797
+
798
+ extern unzFile ZEXPORT unzOpen64 (const void *path)
799
+ {
800
+ return unzOpenInternal(path, NULL, 1);
801
+ }
802
+
803
+ /*
804
+ Close a ZipFile opened with unzOpen.
805
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
806
+ these files MUST be closed with unzCloseCurrentFile before call unzClose.
807
+ return UNZ_OK if there is no problem. */
808
+ extern int ZEXPORT unzClose (unzFile file)
809
+ {
810
+ unz64_s* s;
811
+ if (file==NULL)
812
+ return UNZ_PARAMERROR;
813
+ s=(unz64_s*)file;
814
+
815
+ if (s->pfile_in_zip_read!=NULL)
816
+ unzCloseCurrentFile(file);
817
+
818
+ ZCLOSE64(s->z_filefunc, s->filestream);
819
+ TRYFREE(s);
820
+ return UNZ_OK;
821
+ }
822
+
823
+
824
+ /*
825
+ Write info about the ZipFile in the *pglobal_info structure.
826
+ No preparation of the structure is needed
827
+ return UNZ_OK if there is no problem. */
828
+ extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
829
+ {
830
+ unz64_s* s;
831
+ if (file==NULL)
832
+ return UNZ_PARAMERROR;
833
+ s=(unz64_s*)file;
834
+ *pglobal_info=s->gi;
835
+ return UNZ_OK;
836
+ }
837
+
838
+ extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
839
+ {
840
+ unz64_s* s;
841
+ if (file==NULL)
842
+ return UNZ_PARAMERROR;
843
+ s=(unz64_s*)file;
844
+ /* to do : check if number_entry is not truncated */
845
+ pglobal_info32->number_entry = (uLong)s->gi.number_entry;
846
+ pglobal_info32->size_comment = s->gi.size_comment;
847
+ return UNZ_OK;
848
+ }
849
+ /*
850
+ Translate date/time from Dos format to tm_unz (readable more easilty)
851
+ */
852
+ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
853
+ {
854
+ ZPOS64_T uDate;
855
+ uDate = (ZPOS64_T)(ulDosDate>>16);
856
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
857
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
858
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
859
+
860
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
861
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
862
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
863
+ }
864
+
865
+ /*
866
+ Get Info about the current file in the zipfile, with internal only info
867
+ */
868
+ local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
869
+ unz_file_info64 *pfile_info,
870
+ unz_file_info64_internal
871
+ *pfile_info_internal,
872
+ char *szFileName,
873
+ uLong fileNameBufferSize,
874
+ void *extraField,
875
+ uLong extraFieldBufferSize,
876
+ char *szComment,
877
+ uLong commentBufferSize));
878
+
879
+ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
880
+ unz_file_info64 *pfile_info,
881
+ unz_file_info64_internal
882
+ *pfile_info_internal,
883
+ char *szFileName,
884
+ uLong fileNameBufferSize,
885
+ void *extraField,
886
+ uLong extraFieldBufferSize,
887
+ char *szComment,
888
+ uLong commentBufferSize)
889
+ {
890
+ unz64_s* s;
891
+ unz_file_info64 file_info;
892
+ unz_file_info64_internal file_info_internal;
893
+ int err=UNZ_OK;
894
+ uLong uMagic;
895
+ long lSeek=0;
896
+ uLong uL;
897
+
898
+ if (file==NULL)
899
+ return UNZ_PARAMERROR;
900
+ s=(unz64_s*)file;
901
+ if (ZSEEK64(s->z_filefunc, s->filestream,
902
+ s->pos_in_central_dir+s->byte_before_the_zipfile,
903
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
904
+ err=UNZ_ERRNO;
905
+
906
+
907
+ /* we check the magic */
908
+ if (err==UNZ_OK)
909
+ {
910
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
911
+ err=UNZ_ERRNO;
912
+ else if (uMagic!=0x02014b50)
913
+ err=UNZ_BADZIPFILE;
914
+ }
915
+
916
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
917
+ err=UNZ_ERRNO;
918
+
919
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
920
+ err=UNZ_ERRNO;
921
+
922
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
923
+ err=UNZ_ERRNO;
924
+
925
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
926
+ err=UNZ_ERRNO;
927
+
928
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
929
+ err=UNZ_ERRNO;
930
+
931
+ unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
932
+
933
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
934
+ err=UNZ_ERRNO;
935
+
936
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
937
+ err=UNZ_ERRNO;
938
+ file_info.compressed_size = uL;
939
+
940
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
941
+ err=UNZ_ERRNO;
942
+ file_info.uncompressed_size = uL;
943
+
944
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
945
+ err=UNZ_ERRNO;
946
+
947
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
948
+ err=UNZ_ERRNO;
949
+
950
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
951
+ err=UNZ_ERRNO;
952
+
953
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
954
+ err=UNZ_ERRNO;
955
+
956
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
957
+ err=UNZ_ERRNO;
958
+
959
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
960
+ err=UNZ_ERRNO;
961
+
962
+ // relative offset of local header
963
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
964
+ err=UNZ_ERRNO;
965
+ file_info_internal.offset_curfile = uL;
966
+
967
+ lSeek+=file_info.size_filename;
968
+ if ((err==UNZ_OK) && (szFileName!=NULL))
969
+ {
970
+ uLong uSizeRead ;
971
+ if (file_info.size_filename<fileNameBufferSize)
972
+ {
973
+ *(szFileName+file_info.size_filename)='\0';
974
+ uSizeRead = file_info.size_filename;
975
+ }
976
+ else
977
+ uSizeRead = fileNameBufferSize;
978
+
979
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
980
+ if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
981
+ err=UNZ_ERRNO;
982
+ lSeek -= uSizeRead;
983
+ }
984
+
985
+ // Read extrafield
986
+ if ((err==UNZ_OK) && (extraField!=NULL))
987
+ {
988
+ ZPOS64_T uSizeRead ;
989
+ if (file_info.size_file_extra<extraFieldBufferSize)
990
+ uSizeRead = file_info.size_file_extra;
991
+ else
992
+ uSizeRead = extraFieldBufferSize;
993
+
994
+ if (lSeek!=0)
995
+ {
996
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
997
+ lSeek=0;
998
+ else
999
+ err=UNZ_ERRNO;
1000
+ }
1001
+
1002
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
1003
+ if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
1004
+ err=UNZ_ERRNO;
1005
+
1006
+ lSeek += file_info.size_file_extra - (uLong)uSizeRead;
1007
+ }
1008
+ else
1009
+ lSeek += file_info.size_file_extra;
1010
+
1011
+
1012
+ if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
1013
+ {
1014
+ uLong acc = 0;
1015
+
1016
+ // since lSeek now points to after the extra field we need to move back
1017
+ lSeek -= file_info.size_file_extra;
1018
+
1019
+ if (lSeek!=0)
1020
+ {
1021
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
1022
+ lSeek=0;
1023
+ else
1024
+ err=UNZ_ERRNO;
1025
+ }
1026
+
1027
+ while(acc < file_info.size_file_extra)
1028
+ {
1029
+ uLong headerId;
1030
+ uLong dataSize;
1031
+
1032
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
1033
+ err=UNZ_ERRNO;
1034
+
1035
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
1036
+ err=UNZ_ERRNO;
1037
+
1038
+ /* ZIP64 extra fields */
1039
+ if (headerId == 0x0001)
1040
+ {
1041
+ uLong uL;
1042
+
1043
+ if(file_info.uncompressed_size == MAXU32)
1044
+ {
1045
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
1046
+ err=UNZ_ERRNO;
1047
+ }
1048
+
1049
+ if(file_info.compressed_size == MAXU32)
1050
+ {
1051
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
1052
+ err=UNZ_ERRNO;
1053
+ }
1054
+
1055
+ if(file_info_internal.offset_curfile == MAXU32)
1056
+ {
1057
+ /* Relative Header offset */
1058
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
1059
+ err=UNZ_ERRNO;
1060
+ }
1061
+
1062
+ if(file_info.disk_num_start == MAXU32)
1063
+ {
1064
+ /* Disk Start Number */
1065
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
1066
+ err=UNZ_ERRNO;
1067
+ }
1068
+
1069
+ }
1070
+ else
1071
+ {
1072
+ if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
1073
+ err=UNZ_ERRNO;
1074
+ }
1075
+
1076
+ acc += 2 + 2 + dataSize;
1077
+ }
1078
+ }
1079
+
1080
+ if ((err==UNZ_OK) && (szComment!=NULL))
1081
+ {
1082
+ uLong uSizeRead ;
1083
+ if (file_info.size_file_comment<commentBufferSize)
1084
+ {
1085
+ *(szComment+file_info.size_file_comment)='\0';
1086
+ uSizeRead = file_info.size_file_comment;
1087
+ }
1088
+ else
1089
+ uSizeRead = commentBufferSize;
1090
+
1091
+ if (lSeek!=0)
1092
+ {
1093
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
1094
+ lSeek=0;
1095
+ else
1096
+ err=UNZ_ERRNO;
1097
+ }
1098
+
1099
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
1100
+ if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
1101
+ err=UNZ_ERRNO;
1102
+ lSeek+=file_info.size_file_comment - uSizeRead;
1103
+ }
1104
+ else
1105
+ lSeek+=file_info.size_file_comment;
1106
+
1107
+
1108
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
1109
+ *pfile_info=file_info;
1110
+
1111
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
1112
+ *pfile_info_internal=file_info_internal;
1113
+
1114
+ return err;
1115
+ }
1116
+
1117
+
1118
+
1119
+ /*
1120
+ Write info about the ZipFile in the *pglobal_info structure.
1121
+ No preparation of the structure is needed
1122
+ return UNZ_OK if there is no problem.
1123
+ */
1124
+ extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
1125
+ unz_file_info64 * pfile_info,
1126
+ char * szFileName, uLong fileNameBufferSize,
1127
+ void *extraField, uLong extraFieldBufferSize,
1128
+ char* szComment, uLong commentBufferSize)
1129
+ {
1130
+ return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
1131
+ szFileName,fileNameBufferSize,
1132
+ extraField,extraFieldBufferSize,
1133
+ szComment,commentBufferSize);
1134
+ }
1135
+
1136
+ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
1137
+ unz_file_info * pfile_info,
1138
+ char * szFileName, uLong fileNameBufferSize,
1139
+ void *extraField, uLong extraFieldBufferSize,
1140
+ char* szComment, uLong commentBufferSize)
1141
+ {
1142
+ int err;
1143
+ unz_file_info64 file_info64;
1144
+ err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
1145
+ szFileName,fileNameBufferSize,
1146
+ extraField,extraFieldBufferSize,
1147
+ szComment,commentBufferSize);
1148
+ if ((err==UNZ_OK) && (pfile_info != NULL))
1149
+ {
1150
+ pfile_info->version = file_info64.version;
1151
+ pfile_info->version_needed = file_info64.version_needed;
1152
+ pfile_info->flag = file_info64.flag;
1153
+ pfile_info->compression_method = file_info64.compression_method;
1154
+ pfile_info->dosDate = file_info64.dosDate;
1155
+ pfile_info->crc = file_info64.crc;
1156
+
1157
+ pfile_info->size_filename = file_info64.size_filename;
1158
+ pfile_info->size_file_extra = file_info64.size_file_extra;
1159
+ pfile_info->size_file_comment = file_info64.size_file_comment;
1160
+
1161
+ pfile_info->disk_num_start = file_info64.disk_num_start;
1162
+ pfile_info->internal_fa = file_info64.internal_fa;
1163
+ pfile_info->external_fa = file_info64.external_fa;
1164
+
1165
+ pfile_info->tmu_date = file_info64.tmu_date,
1166
+
1167
+
1168
+ pfile_info->compressed_size = (uLong)file_info64.compressed_size;
1169
+ pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
1170
+
1171
+ }
1172
+ return err;
1173
+ }
1174
+ /*
1175
+ Set the current file of the zipfile to the first file.
1176
+ return UNZ_OK if there is no problem
1177
+ */
1178
+ extern int ZEXPORT unzGoToFirstFile (unzFile file)
1179
+ {
1180
+ int err=UNZ_OK;
1181
+ unz64_s* s;
1182
+ if (file==NULL)
1183
+ return UNZ_PARAMERROR;
1184
+ s=(unz64_s*)file;
1185
+ s->pos_in_central_dir=s->offset_central_dir;
1186
+ s->num_file=0;
1187
+ err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1188
+ &s->cur_file_info_internal,
1189
+ NULL,0,NULL,0,NULL,0);
1190
+ s->current_file_ok = (err == UNZ_OK);
1191
+ return err;
1192
+ }
1193
+
1194
+ /*
1195
+ Set the current file of the zipfile to the next file.
1196
+ return UNZ_OK if there is no problem
1197
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
1198
+ */
1199
+ extern int ZEXPORT unzGoToNextFile (unzFile file)
1200
+ {
1201
+ unz64_s* s;
1202
+ int err;
1203
+
1204
+ if (file==NULL)
1205
+ return UNZ_PARAMERROR;
1206
+ s=(unz64_s*)file;
1207
+ if (!s->current_file_ok)
1208
+ return UNZ_END_OF_LIST_OF_FILE;
1209
+ if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
1210
+ if (s->num_file+1==s->gi.number_entry)
1211
+ return UNZ_END_OF_LIST_OF_FILE;
1212
+
1213
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
1214
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
1215
+ s->num_file++;
1216
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1217
+ &s->cur_file_info_internal,
1218
+ NULL,0,NULL,0,NULL,0);
1219
+ s->current_file_ok = (err == UNZ_OK);
1220
+ return err;
1221
+ }
1222
+
1223
+
1224
+ /*
1225
+ Try locate the file szFileName in the zipfile.
1226
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
1227
+
1228
+ return value :
1229
+ UNZ_OK if the file is found. It becomes the current file.
1230
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
1231
+ */
1232
+ extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
1233
+ {
1234
+ unz64_s* s;
1235
+ int err;
1236
+
1237
+ /* We remember the 'current' position in the file so that we can jump
1238
+ * back there if we fail.
1239
+ */
1240
+ unz_file_info64 cur_file_infoSaved;
1241
+ unz_file_info64_internal cur_file_info_internalSaved;
1242
+ ZPOS64_T num_fileSaved;
1243
+ ZPOS64_T pos_in_central_dirSaved;
1244
+
1245
+
1246
+ if (file==NULL)
1247
+ return UNZ_PARAMERROR;
1248
+
1249
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
1250
+ return UNZ_PARAMERROR;
1251
+
1252
+ s=(unz64_s*)file;
1253
+ if (!s->current_file_ok)
1254
+ return UNZ_END_OF_LIST_OF_FILE;
1255
+
1256
+ /* Save the current state */
1257
+ num_fileSaved = s->num_file;
1258
+ pos_in_central_dirSaved = s->pos_in_central_dir;
1259
+ cur_file_infoSaved = s->cur_file_info;
1260
+ cur_file_info_internalSaved = s->cur_file_info_internal;
1261
+
1262
+ err = unzGoToFirstFile(file);
1263
+
1264
+ while (err == UNZ_OK)
1265
+ {
1266
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
1267
+ err = unzGetCurrentFileInfo64(file,NULL,
1268
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
1269
+ NULL,0,NULL,0);
1270
+ if (err == UNZ_OK)
1271
+ {
1272
+ if (unzStringFileNameCompare(szCurrentFileName,
1273
+ szFileName,iCaseSensitivity)==0)
1274
+ return UNZ_OK;
1275
+ err = unzGoToNextFile(file);
1276
+ }
1277
+ }
1278
+
1279
+ /* We failed, so restore the state of the 'current file' to where we
1280
+ * were.
1281
+ */
1282
+ s->num_file = num_fileSaved ;
1283
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
1284
+ s->cur_file_info = cur_file_infoSaved;
1285
+ s->cur_file_info_internal = cur_file_info_internalSaved;
1286
+ return err;
1287
+ }
1288
+
1289
+
1290
+ /*
1291
+ ///////////////////////////////////////////
1292
+ // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
1293
+ // I need random access
1294
+ //
1295
+ // Further optimization could be realized by adding an ability
1296
+ // to cache the directory in memory. The goal being a single
1297
+ // comprehensive file read to put the file I need in a memory.
1298
+ */
1299
+
1300
+ /*
1301
+ typedef struct unz_file_pos_s
1302
+ {
1303
+ ZPOS64_T pos_in_zip_directory; // offset in file
1304
+ ZPOS64_T num_of_file; // # of file
1305
+ } unz_file_pos;
1306
+ */
1307
+
1308
+ extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos)
1309
+ {
1310
+ unz64_s* s;
1311
+
1312
+ if (file==NULL || file_pos==NULL)
1313
+ return UNZ_PARAMERROR;
1314
+ s=(unz64_s*)file;
1315
+ if (!s->current_file_ok)
1316
+ return UNZ_END_OF_LIST_OF_FILE;
1317
+
1318
+ file_pos->pos_in_zip_directory = s->pos_in_central_dir;
1319
+ file_pos->num_of_file = s->num_file;
1320
+
1321
+ return UNZ_OK;
1322
+ }
1323
+
1324
+ extern int ZEXPORT unzGetFilePos(
1325
+ unzFile file,
1326
+ unz_file_pos* file_pos)
1327
+ {
1328
+ unz64_file_pos file_pos64;
1329
+ int err = unzGetFilePos64(file,&file_pos64);
1330
+ if (err==UNZ_OK)
1331
+ {
1332
+ file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
1333
+ file_pos->num_of_file = (uLong)file_pos64.num_of_file;
1334
+ }
1335
+ return err;
1336
+ }
1337
+
1338
+ extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
1339
+ {
1340
+ unz64_s* s;
1341
+ int err;
1342
+
1343
+ if (file==NULL || file_pos==NULL)
1344
+ return UNZ_PARAMERROR;
1345
+ s=(unz64_s*)file;
1346
+
1347
+ /* jump to the right spot */
1348
+ s->pos_in_central_dir = file_pos->pos_in_zip_directory;
1349
+ s->num_file = file_pos->num_of_file;
1350
+
1351
+ /* set the current file */
1352
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
1353
+ &s->cur_file_info_internal,
1354
+ NULL,0,NULL,0,NULL,0);
1355
+ /* return results */
1356
+ s->current_file_ok = (err == UNZ_OK);
1357
+ return err;
1358
+ }
1359
+
1360
+ extern int ZEXPORT unzGoToFilePos(
1361
+ unzFile file,
1362
+ unz_file_pos* file_pos)
1363
+ {
1364
+ unz64_file_pos file_pos64;
1365
+ if (file_pos == NULL)
1366
+ return UNZ_PARAMERROR;
1367
+
1368
+ file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
1369
+ file_pos64.num_of_file = file_pos->num_of_file;
1370
+ return unzGoToFilePos64(file,&file_pos64);
1371
+ }
1372
+
1373
+ /*
1374
+ // Unzip Helper Functions - should be here?
1375
+ ///////////////////////////////////////////
1376
+ */
1377
+
1378
+ /*
1379
+ Read the local header of the current zipfile
1380
+ Check the coherency of the local header and info in the end of central
1381
+ directory about this file
1382
+ store in *piSizeVar the size of extra info in local header
1383
+ (filename and size of extra field data)
1384
+ */
1385
+ local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
1386
+ ZPOS64_T * poffset_local_extrafield,
1387
+ uInt * psize_local_extrafield)
1388
+ {
1389
+ uLong uMagic,uData,uFlags;
1390
+ uLong size_filename;
1391
+ uLong size_extra_field;
1392
+ int err=UNZ_OK;
1393
+
1394
+ *piSizeVar = 0;
1395
+ *poffset_local_extrafield = 0;
1396
+ *psize_local_extrafield = 0;
1397
+
1398
+ if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
1399
+ s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
1400
+ return UNZ_ERRNO;
1401
+
1402
+
1403
+ if (err==UNZ_OK)
1404
+ {
1405
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
1406
+ err=UNZ_ERRNO;
1407
+ else if (uMagic!=0x04034b50)
1408
+ err=UNZ_BADZIPFILE;
1409
+ }
1410
+
1411
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1412
+ err=UNZ_ERRNO;
1413
+ /*
1414
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
1415
+ err=UNZ_BADZIPFILE;
1416
+ */
1417
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
1418
+ err=UNZ_ERRNO;
1419
+
1420
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
1421
+ err=UNZ_ERRNO;
1422
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
1423
+ err=UNZ_BADZIPFILE;
1424
+
1425
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
1426
+ /* #ifdef HAVE_BZIP2 */
1427
+ (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1428
+ /* #endif */
1429
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
1430
+ err=UNZ_BADZIPFILE;
1431
+
1432
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
1433
+ err=UNZ_ERRNO;
1434
+
1435
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
1436
+ err=UNZ_ERRNO;
1437
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
1438
+ err=UNZ_BADZIPFILE;
1439
+
1440
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
1441
+ err=UNZ_ERRNO;
1442
+ else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
1443
+ err=UNZ_BADZIPFILE;
1444
+
1445
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
1446
+ err=UNZ_ERRNO;
1447
+ else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
1448
+ err=UNZ_BADZIPFILE;
1449
+
1450
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
1451
+ err=UNZ_ERRNO;
1452
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
1453
+ err=UNZ_BADZIPFILE;
1454
+
1455
+ *piSizeVar += (uInt)size_filename;
1456
+
1457
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
1458
+ err=UNZ_ERRNO;
1459
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
1460
+ SIZEZIPLOCALHEADER + size_filename;
1461
+ *psize_local_extrafield = (uInt)size_extra_field;
1462
+
1463
+ *piSizeVar += (uInt)size_extra_field;
1464
+
1465
+ return err;
1466
+ }
1467
+
1468
+ /*
1469
+ Open for reading data the current file in the zipfile.
1470
+ If there is no error and the file is opened, the return value is UNZ_OK.
1471
+ */
1472
+ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
1473
+ int* level, int raw, const char* password)
1474
+ {
1475
+ int err=UNZ_OK;
1476
+ uInt iSizeVar;
1477
+ unz64_s* s;
1478
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1479
+ ZPOS64_T offset_local_extrafield; /* offset of the local extra field */
1480
+ uInt size_local_extrafield; /* size of the local extra field */
1481
+ # ifndef NOUNCRYPT
1482
+ char source[12];
1483
+ # else
1484
+ if (password != NULL)
1485
+ return UNZ_PARAMERROR;
1486
+ # endif
1487
+
1488
+ if (file==NULL)
1489
+ return UNZ_PARAMERROR;
1490
+ s=(unz64_s*)file;
1491
+ if (!s->current_file_ok)
1492
+ return UNZ_PARAMERROR;
1493
+
1494
+ if (s->pfile_in_zip_read != NULL)
1495
+ unzCloseCurrentFile(file);
1496
+
1497
+ if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
1498
+ return UNZ_BADZIPFILE;
1499
+
1500
+ pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
1501
+ if (pfile_in_zip_read_info==NULL)
1502
+ return UNZ_INTERNALERROR;
1503
+
1504
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
1505
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
1506
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
1507
+ pfile_in_zip_read_info->pos_local_extrafield=0;
1508
+ pfile_in_zip_read_info->raw=raw;
1509
+
1510
+ if (pfile_in_zip_read_info->read_buffer==NULL)
1511
+ {
1512
+ TRYFREE(pfile_in_zip_read_info);
1513
+ return UNZ_INTERNALERROR;
1514
+ }
1515
+
1516
+ pfile_in_zip_read_info->stream_initialised=0;
1517
+
1518
+ if (method!=NULL)
1519
+ *method = (int)s->cur_file_info.compression_method;
1520
+
1521
+ if (level!=NULL)
1522
+ {
1523
+ *level = 6;
1524
+ switch (s->cur_file_info.flag & 0x06)
1525
+ {
1526
+ case 6 : *level = 1; break;
1527
+ case 4 : *level = 2; break;
1528
+ case 2 : *level = 9; break;
1529
+ }
1530
+ }
1531
+
1532
+ if ((s->cur_file_info.compression_method!=0) &&
1533
+ /* #ifdef HAVE_BZIP2 */
1534
+ (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
1535
+ /* #endif */
1536
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
1537
+
1538
+ err=UNZ_BADZIPFILE;
1539
+
1540
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
1541
+ pfile_in_zip_read_info->crc32=0;
1542
+ pfile_in_zip_read_info->total_out_64=0;
1543
+ pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
1544
+ pfile_in_zip_read_info->filestream=s->filestream;
1545
+ pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
1546
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
1547
+
1548
+ pfile_in_zip_read_info->stream.total_out = 0;
1549
+
1550
+ if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
1551
+ {
1552
+ #ifdef HAVE_BZIP2
1553
+ pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
1554
+ pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
1555
+ pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
1556
+ pfile_in_zip_read_info->bstream.state = (voidpf)0;
1557
+
1558
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1559
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
1560
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1561
+ pfile_in_zip_read_info->stream.next_in = (voidpf)0;
1562
+ pfile_in_zip_read_info->stream.avail_in = 0;
1563
+
1564
+ err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
1565
+ if (err == Z_OK)
1566
+ pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
1567
+ else
1568
+ {
1569
+ TRYFREE(pfile_in_zip_read_info);
1570
+ return err;
1571
+ }
1572
+ #else
1573
+ pfile_in_zip_read_info->raw=1;
1574
+ #endif
1575
+ }
1576
+ else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
1577
+ {
1578
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
1579
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
1580
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
1581
+ pfile_in_zip_read_info->stream.next_in = 0;
1582
+ pfile_in_zip_read_info->stream.avail_in = 0;
1583
+
1584
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
1585
+ if (err == Z_OK)
1586
+ pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
1587
+ else
1588
+ {
1589
+ TRYFREE(pfile_in_zip_read_info);
1590
+ return err;
1591
+ }
1592
+ /* windowBits is passed < 0 to tell that there is no zlib header.
1593
+ * Note that in this case inflate *requires* an extra "dummy" byte
1594
+ * after the compressed stream in order to complete decompression and
1595
+ * return Z_STREAM_END.
1596
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
1597
+ * size of both compressed and uncompressed data
1598
+ */
1599
+ }
1600
+ pfile_in_zip_read_info->rest_read_compressed =
1601
+ s->cur_file_info.compressed_size ;
1602
+ pfile_in_zip_read_info->rest_read_uncompressed =
1603
+ s->cur_file_info.uncompressed_size ;
1604
+
1605
+
1606
+ pfile_in_zip_read_info->pos_in_zipfile =
1607
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
1608
+ iSizeVar;
1609
+
1610
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
1611
+
1612
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
1613
+ s->encrypted = 0;
1614
+
1615
+ # ifndef NOUNCRYPT
1616
+ if (password != NULL)
1617
+ {
1618
+ int i;
1619
+ s->pcrc_32_tab = get_crc_table();
1620
+ init_keys(password,s->keys,s->pcrc_32_tab);
1621
+ if (ZSEEK64(s->z_filefunc, s->filestream,
1622
+ s->pfile_in_zip_read->pos_in_zipfile +
1623
+ s->pfile_in_zip_read->byte_before_the_zipfile,
1624
+ SEEK_SET)!=0)
1625
+ return UNZ_INTERNALERROR;
1626
+ if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
1627
+ return UNZ_INTERNALERROR;
1628
+
1629
+ for (i = 0; i<12; i++)
1630
+ zdecode(s->keys,s->pcrc_32_tab,source[i]);
1631
+
1632
+ s->pfile_in_zip_read->pos_in_zipfile+=12;
1633
+ s->encrypted=1;
1634
+ }
1635
+ # endif
1636
+
1637
+
1638
+ return UNZ_OK;
1639
+ }
1640
+
1641
+ extern int ZEXPORT unzOpenCurrentFile (unzFile file)
1642
+ {
1643
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
1644
+ }
1645
+
1646
+ extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password)
1647
+ {
1648
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
1649
+ }
1650
+
1651
+ extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
1652
+ {
1653
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
1654
+ }
1655
+
1656
+ /** Addition for GDAL : START */
1657
+
1658
+ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
1659
+ {
1660
+ unz64_s* s;
1661
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1662
+ s=(unz64_s*)file;
1663
+ if (file==NULL)
1664
+ return 0; //UNZ_PARAMERROR;
1665
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1666
+ if (pfile_in_zip_read_info==NULL)
1667
+ return 0; //UNZ_PARAMERROR;
1668
+ return pfile_in_zip_read_info->pos_in_zipfile +
1669
+ pfile_in_zip_read_info->byte_before_the_zipfile;
1670
+ }
1671
+
1672
+ /** Addition for GDAL : END */
1673
+
1674
+ /*
1675
+ Read bytes from the current file.
1676
+ buf contain buffer where data must be copied
1677
+ len the size of buf.
1678
+
1679
+ return the number of byte copied if somes bytes are copied
1680
+ return 0 if the end of file was reached
1681
+ return <0 with error code if there is an error
1682
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
1683
+ */
1684
+ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
1685
+ {
1686
+ int err=UNZ_OK;
1687
+ uInt iRead = 0;
1688
+ unz64_s* s;
1689
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1690
+ if (file==NULL)
1691
+ return UNZ_PARAMERROR;
1692
+ s=(unz64_s*)file;
1693
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1694
+
1695
+ if (pfile_in_zip_read_info==NULL)
1696
+ return UNZ_PARAMERROR;
1697
+
1698
+
1699
+ if (pfile_in_zip_read_info->read_buffer == NULL)
1700
+ return UNZ_END_OF_LIST_OF_FILE;
1701
+ if (len==0)
1702
+ return 0;
1703
+
1704
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
1705
+
1706
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
1707
+
1708
+ if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
1709
+ (!(pfile_in_zip_read_info->raw)))
1710
+ pfile_in_zip_read_info->stream.avail_out =
1711
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
1712
+
1713
+ if ((len>pfile_in_zip_read_info->rest_read_compressed+
1714
+ pfile_in_zip_read_info->stream.avail_in) &&
1715
+ (pfile_in_zip_read_info->raw))
1716
+ pfile_in_zip_read_info->stream.avail_out =
1717
+ (uInt)pfile_in_zip_read_info->rest_read_compressed+
1718
+ pfile_in_zip_read_info->stream.avail_in;
1719
+
1720
+ while (pfile_in_zip_read_info->stream.avail_out>0)
1721
+ {
1722
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
1723
+ (pfile_in_zip_read_info->rest_read_compressed>0))
1724
+ {
1725
+ uInt uReadThis = UNZ_BUFSIZE;
1726
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
1727
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
1728
+ if (uReadThis == 0)
1729
+ return UNZ_EOF;
1730
+ if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1731
+ pfile_in_zip_read_info->filestream,
1732
+ pfile_in_zip_read_info->pos_in_zipfile +
1733
+ pfile_in_zip_read_info->byte_before_the_zipfile,
1734
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
1735
+ return UNZ_ERRNO;
1736
+ if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1737
+ pfile_in_zip_read_info->filestream,
1738
+ pfile_in_zip_read_info->read_buffer,
1739
+ uReadThis)!=uReadThis)
1740
+ return UNZ_ERRNO;
1741
+
1742
+
1743
+ # ifndef NOUNCRYPT
1744
+ if(s->encrypted)
1745
+ {
1746
+ uInt i;
1747
+ for(i=0;i<uReadThis;i++)
1748
+ pfile_in_zip_read_info->read_buffer[i] =
1749
+ zdecode(s->keys,s->pcrc_32_tab,
1750
+ pfile_in_zip_read_info->read_buffer[i]);
1751
+ }
1752
+ # endif
1753
+
1754
+
1755
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
1756
+
1757
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
1758
+
1759
+ pfile_in_zip_read_info->stream.next_in =
1760
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
1761
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
1762
+ }
1763
+
1764
+ if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
1765
+ {
1766
+ uInt uDoCopy,i ;
1767
+
1768
+ if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
1769
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
1770
+ return (iRead==0) ? UNZ_EOF : iRead;
1771
+
1772
+ if (pfile_in_zip_read_info->stream.avail_out <
1773
+ pfile_in_zip_read_info->stream.avail_in)
1774
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
1775
+ else
1776
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
1777
+
1778
+ for (i=0;i<uDoCopy;i++)
1779
+ *(pfile_in_zip_read_info->stream.next_out+i) =
1780
+ *(pfile_in_zip_read_info->stream.next_in+i);
1781
+
1782
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
1783
+
1784
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
1785
+ pfile_in_zip_read_info->stream.next_out,
1786
+ uDoCopy);
1787
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
1788
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
1789
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
1790
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
1791
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
1792
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
1793
+ iRead += uDoCopy;
1794
+ }
1795
+ else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
1796
+ {
1797
+ #ifdef HAVE_BZIP2
1798
+ uLong uTotalOutBefore,uTotalOutAfter;
1799
+ const Bytef *bufBefore;
1800
+ uLong uOutThis;
1801
+
1802
+ pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in;
1803
+ pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
1804
+ pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
1805
+ pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
1806
+ pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out;
1807
+ pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
1808
+ pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
1809
+ pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
1810
+
1811
+ uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
1812
+ bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
1813
+
1814
+ err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
1815
+
1816
+ uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
1817
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
1818
+
1819
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1820
+
1821
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
1822
+ pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
1823
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1824
+
1825
+ pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
1826
+ pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
1827
+ pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
1828
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
1829
+ pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
1830
+ pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
1831
+
1832
+ if (err==BZ_STREAM_END)
1833
+ return (iRead==0) ? UNZ_EOF : iRead;
1834
+ if (err!=BZ_OK)
1835
+ break;
1836
+ #endif
1837
+ } // end Z_BZIP2ED
1838
+ else
1839
+ {
1840
+ ZPOS64_T uTotalOutBefore,uTotalOutAfter;
1841
+ const Bytef *bufBefore;
1842
+ ZPOS64_T uOutThis;
1843
+ int flush=Z_SYNC_FLUSH;
1844
+
1845
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
1846
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
1847
+
1848
+ /*
1849
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
1850
+ pfile_in_zip_read_info->stream.avail_out) &&
1851
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
1852
+ flush = Z_FINISH;
1853
+ */
1854
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
1855
+
1856
+ if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
1857
+ err = Z_DATA_ERROR;
1858
+
1859
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
1860
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
1861
+
1862
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
1863
+
1864
+ pfile_in_zip_read_info->crc32 =
1865
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
1866
+ (uInt)(uOutThis));
1867
+
1868
+ pfile_in_zip_read_info->rest_read_uncompressed -=
1869
+ uOutThis;
1870
+
1871
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
1872
+
1873
+ if (err==Z_STREAM_END)
1874
+ return (iRead==0) ? UNZ_EOF : iRead;
1875
+ if (err!=Z_OK)
1876
+ break;
1877
+ }
1878
+ }
1879
+
1880
+ if (err==Z_OK)
1881
+ return iRead;
1882
+ return err;
1883
+ }
1884
+
1885
+
1886
+ /*
1887
+ Give the current position in uncompressed data
1888
+ */
1889
+ extern z_off_t ZEXPORT unztell (unzFile file)
1890
+ {
1891
+ unz64_s* s;
1892
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1893
+ if (file==NULL)
1894
+ return UNZ_PARAMERROR;
1895
+ s=(unz64_s*)file;
1896
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1897
+
1898
+ if (pfile_in_zip_read_info==NULL)
1899
+ return UNZ_PARAMERROR;
1900
+
1901
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
1902
+ }
1903
+
1904
+ extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
1905
+ {
1906
+
1907
+ unz64_s* s;
1908
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1909
+ if (file==NULL)
1910
+ return (ZPOS64_T)-1;
1911
+ s=(unz64_s*)file;
1912
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1913
+
1914
+ if (pfile_in_zip_read_info==NULL)
1915
+ return (ZPOS64_T)-1;
1916
+
1917
+ return pfile_in_zip_read_info->total_out_64;
1918
+ }
1919
+
1920
+
1921
+ /*
1922
+ return 1 if the end of file was reached, 0 elsewhere
1923
+ */
1924
+ extern int ZEXPORT unzeof (unzFile file)
1925
+ {
1926
+ unz64_s* s;
1927
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1928
+ if (file==NULL)
1929
+ return UNZ_PARAMERROR;
1930
+ s=(unz64_s*)file;
1931
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1932
+
1933
+ if (pfile_in_zip_read_info==NULL)
1934
+ return UNZ_PARAMERROR;
1935
+
1936
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
1937
+ return 1;
1938
+ else
1939
+ return 0;
1940
+ }
1941
+
1942
+
1943
+
1944
+ /*
1945
+ Read extra field from the current file (opened by unzOpenCurrentFile)
1946
+ This is the local-header version of the extra field (sometimes, there is
1947
+ more info in the local-header version than in the central-header)
1948
+
1949
+ if buf==NULL, it return the size of the local extra field that can be read
1950
+
1951
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
1952
+ buf.
1953
+ the return value is the number of bytes copied in buf, or (if <0)
1954
+ the error code
1955
+ */
1956
+ extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
1957
+ {
1958
+ unz64_s* s;
1959
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
1960
+ uInt read_now;
1961
+ ZPOS64_T size_to_read;
1962
+
1963
+ if (file==NULL)
1964
+ return UNZ_PARAMERROR;
1965
+ s=(unz64_s*)file;
1966
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
1967
+
1968
+ if (pfile_in_zip_read_info==NULL)
1969
+ return UNZ_PARAMERROR;
1970
+
1971
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
1972
+ pfile_in_zip_read_info->pos_local_extrafield);
1973
+
1974
+ if (buf==NULL)
1975
+ return (int)size_to_read;
1976
+
1977
+ if (len>size_to_read)
1978
+ read_now = (uInt)size_to_read;
1979
+ else
1980
+ read_now = (uInt)len ;
1981
+
1982
+ if (read_now==0)
1983
+ return 0;
1984
+
1985
+ if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
1986
+ pfile_in_zip_read_info->filestream,
1987
+ pfile_in_zip_read_info->offset_local_extrafield +
1988
+ pfile_in_zip_read_info->pos_local_extrafield,
1989
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
1990
+ return UNZ_ERRNO;
1991
+
1992
+ if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
1993
+ pfile_in_zip_read_info->filestream,
1994
+ buf,read_now)!=read_now)
1995
+ return UNZ_ERRNO;
1996
+
1997
+ return (int)read_now;
1998
+ }
1999
+
2000
+ /*
2001
+ Close the file in zip opened with unzOpenCurrentFile
2002
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
2003
+ */
2004
+ extern int ZEXPORT unzCloseCurrentFile (unzFile file)
2005
+ {
2006
+ int err=UNZ_OK;
2007
+
2008
+ unz64_s* s;
2009
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
2010
+ if (file==NULL)
2011
+ return UNZ_PARAMERROR;
2012
+ s=(unz64_s*)file;
2013
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
2014
+
2015
+ if (pfile_in_zip_read_info==NULL)
2016
+ return UNZ_PARAMERROR;
2017
+
2018
+
2019
+ if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
2020
+ (!pfile_in_zip_read_info->raw))
2021
+ {
2022
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
2023
+ err=UNZ_CRCERROR;
2024
+ }
2025
+
2026
+
2027
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
2028
+ pfile_in_zip_read_info->read_buffer = NULL;
2029
+ if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
2030
+ inflateEnd(&pfile_in_zip_read_info->stream);
2031
+ #ifdef HAVE_BZIP2
2032
+ else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
2033
+ BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
2034
+ #endif
2035
+
2036
+
2037
+ pfile_in_zip_read_info->stream_initialised = 0;
2038
+ TRYFREE(pfile_in_zip_read_info);
2039
+
2040
+ s->pfile_in_zip_read=NULL;
2041
+
2042
+ return err;
2043
+ }
2044
+
2045
+
2046
+ /*
2047
+ Get the global comment string of the ZipFile, in the szComment buffer.
2048
+ uSizeBuf is the size of the szComment buffer.
2049
+ return the number of byte copied or an error code <0
2050
+ */
2051
+ extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
2052
+ {
2053
+ unz64_s* s;
2054
+ uLong uReadThis ;
2055
+ if (file==NULL)
2056
+ return (int)UNZ_PARAMERROR;
2057
+ s=(unz64_s*)file;
2058
+
2059
+ uReadThis = uSizeBuf;
2060
+ if (uReadThis>s->gi.size_comment)
2061
+ uReadThis = s->gi.size_comment;
2062
+
2063
+ if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
2064
+ return UNZ_ERRNO;
2065
+
2066
+ if (uReadThis>0)
2067
+ {
2068
+ *szComment='\0';
2069
+ if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
2070
+ return UNZ_ERRNO;
2071
+ }
2072
+
2073
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
2074
+ *(szComment+s->gi.size_comment)='\0';
2075
+ return (int)uReadThis;
2076
+ }
2077
+
2078
+ /* Additions by RX '2004 */
2079
+ extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
2080
+ {
2081
+ unz64_s* s;
2082
+
2083
+ if (file==NULL)
2084
+ return 0; //UNZ_PARAMERROR;
2085
+ s=(unz64_s*)file;
2086
+ if (!s->current_file_ok)
2087
+ return 0;
2088
+ if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
2089
+ if (s->num_file==s->gi.number_entry)
2090
+ return 0;
2091
+ return s->pos_in_central_dir;
2092
+ }
2093
+
2094
+ extern uLong ZEXPORT unzGetOffset (unzFile file)
2095
+ {
2096
+ ZPOS64_T offset64;
2097
+
2098
+ if (file==NULL)
2099
+ return 0; //UNZ_PARAMERROR;
2100
+ offset64 = unzGetOffset64(file);
2101
+ return (uLong)offset64;
2102
+ }
2103
+
2104
+ extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
2105
+ {
2106
+ unz64_s* s;
2107
+ int err;
2108
+
2109
+ if (file==NULL)
2110
+ return UNZ_PARAMERROR;
2111
+ s=(unz64_s*)file;
2112
+
2113
+ s->pos_in_central_dir = pos;
2114
+ s->num_file = s->gi.number_entry; /* hack */
2115
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
2116
+ &s->cur_file_info_internal,
2117
+ NULL,0,NULL,0,NULL,0);
2118
+ s->current_file_ok = (err == UNZ_OK);
2119
+ return err;
2120
+ }
2121
+
2122
+ extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
2123
+ {
2124
+ return unzSetOffset64(file,pos);
2125
+ }