15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unzip.c -- IO for uncompress .zip files using zlib
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Version 1.1, February 14h, 2010
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Modifications of Unzip for Zip64
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Copyright (C) 2007-2008 Even Rouault
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Modifications for Zip64 support on both zip and unzip
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         For more info read MiniZip_info.txt
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ------------------------------------------------------------------------------------
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compatibility with older software. The following is from the original crypt.c.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Code woven in by Terry Thorsen 1/2003.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  See the accompanying file LICENSE, version 2000-Apr-09 or later
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (the contents of which are also included in zip.h) for terms of use.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  If, for some reason, all these files are missing, the Info-ZIP license
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  The encryption/decryption parts of this source code (as opposed to the
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non-echoing password parts) were originally written in Europe.  The
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  whole source package can be freely distributed, including from the USA.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (Prior to January 2000, re-export from the US was a violation of US law.)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        This encryption code is a direct transcription of the algorithm from
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file (appnote.txt) is distributed with the PKZIP program (even in the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  version without encryption capabilities).
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ------------------------------------------------------------------------------------
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Changes in unzip.c
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  2007-2008 - Even Rouault - Remove old C style function prototypes
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  2007-2008 - Even Rouault - Add unzip support for ZIP64
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Copyright (C) 2007-2008 Even Rouault
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        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).
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                should only read the compressed/uncompressed size from the Zip64 format if
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                the size from normal header was 0xFFFFFFFF
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Patch created by Daniel Borca
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NOUNCRYPT
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        #define NOUNCRYPT
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/zlib/zlib.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unzip.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef STDC
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <stddef.h>
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <string.h>
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <stdlib.h>
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NO_ERRNO_H
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extern int errno;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   include <errno.h>
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef local
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define local static
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* compile with -Dlocal if your debugger can't find static symbols */
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CASESENSITIVITYDEFAULT_NO
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define CASESENSITIVITYDEFAULT_NO
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UNZ_BUFSIZE
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNZ_BUFSIZE (16384)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UNZ_MAXFILENAMEINZIP
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNZ_MAXFILENAMEINZIP (256)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ALLOC
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ALLOC(size) (malloc(size))
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TRYFREE
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRYFREE(p) {if (p) free(p);}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIZECENTRALDIRITEM (0x2e)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SIZEZIPLOCALHEADER (0x1e)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char unz_copyright[] =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unz_file_info_interntal contain internal info about a file in zipfile*/
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct unz_file_info64_internal_s
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz_file_info64_internal;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* file_in_zip_read_info_s contain internal information about a file in zipfile,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    when reading and decompress it */
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char  *read_buffer;         /* internal buffer for compressed data */
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z_stream stream;            /* zLib stream structure for inflate */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bz_stream bstream;          /* bzLib stream structure for bziped */
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong stream_initialised;   /* flag set if stream structure is initialised*/
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uInt  size_local_extrafield;/* size of the local extra field */
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T pos_local_extrafield;   /* position in the local extra field in read*/
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T total_out_64;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong crc32;                /* crc32 of all data uncompressed */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zlib_filefunc64_32_def z_filefunc;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream;        /* io structore of the zipfile */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong compression_method;   /* compression method (0==store) */
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int   raw;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} file_in_zip64_read_info_s;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* unz64_s contain internal information about the zipfile
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zlib_filefunc64_32_def z_filefunc;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int is64bitOpenFunction;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream;        /* io structore of the zipfile */
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_global_info64 gi;       /* public global information */
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T num_file;             /* number of the current file in the zipfile*/
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T pos_in_central_dir;   /* pos of the current file in the central dir*/
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T current_file_ok;      /* flag about the usability of the current file*/
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T central_pos;          /* position of the beginning of the central dir*/
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T size_central_dir;     /* size of the central directory  */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T offset_central_dir;   /* offset of start of central directory with
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   respect to the starting disk number */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64 cur_file_info; /* public info about the current file in zip*/
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64_internal cur_file_info_internal; /* private info about it*/
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        file if we are decompressing it */
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int encrypted;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int isZip64;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    ifndef NOUNCRYPT
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned long* pcrc_32_tab;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz64_s;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NOUNCRYPT
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypt.h"
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for end of file.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IN assertion: the stream s has been sucessfully opened for reading.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getByte OF((
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int *pi));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char c;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==1)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pi = (int)c;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_OK;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZERROR64(*pzlib_filefunc_def,filestream))
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return UNZ_ERRNO;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return UNZ_EOF;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Reads a long in LSB order from the given gz_stream. Sets
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getShort OF((
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong *pX));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             voidpf filestream,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             uLong *pX)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong x ;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x = (uLong)i;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((uLong)i)<<8;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = x;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = 0;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong OF((
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong *pX));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            voidpf filestream,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uLong *pX)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong x ;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x = (uLong)i;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((uLong)i)<<8;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((uLong)i)<<16;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x += ((uLong)i)<<24;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = x;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = 0;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong64 OF((
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const zlib_filefunc64_32_def* pzlib_filefunc_def,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T *pX));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            voidpf filestream,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ZPOS64_T *pX)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T x ;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x = (ZPOS64_T)i;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<8;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<16;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<24;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<32;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<40;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<48;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x |= ((ZPOS64_T)i)<<56;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = x;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pX = 0;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* My own strcmpi / strcasecmp */
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (;;)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char c1=*(fileName1++);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char c2=*(fileName2++);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((c1>='a') && (c1<='z'))
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c1 -= 0x20;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((c2>='a') && (c2<='z'))
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c2 -= 0x20;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c1=='\0')
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ((c2=='\0') ? 0 : -1);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c2=='\0')
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return 1;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c1<c2)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return -1;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (c1>c2)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return 1;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef  CASESENSITIVITYDEFAULT_NO
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CASESENSITIVITYDEFAULTVALUE 2
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CASESENSITIVITYDEFAULTVALUE 1
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef STRCMPCASENOSENTIVEFUNCTION
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Compare two filename (fileName1,fileName2).
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                or strcasecmp)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (like 1 on Unix, 2 on Windows)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzStringFileNameCompare (const char*  fileName1,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const char*  fileName2,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int iCaseSensitivity)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iCaseSensitivity==0)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iCaseSensitivity==1)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return strcmp(fileName1,fileName2);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BUFREADCOMMENT
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BUFREADCOMMENT (0x400)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Locate the Central directory of a zipfile (at the end, just before
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the global comment)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* buf;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uSizeFile;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uBackRead;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uPosFound=0;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uMaxBack>uSizeFile)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uMaxBack = uSizeFile;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf==NULL)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uBackRead = 4;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (uBackRead<uMaxBack)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uLong uReadSize;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ZPOS64_T uReadPos ;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (uBackRead+BUFREADCOMMENT>uMaxBack)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uBackRead = uMaxBack;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uBackRead+=BUFREADCOMMENT;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uReadPos = uSizeFile-uBackRead ;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i=(int)uReadSize-3; (i--)>0;)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uPosFound = uReadPos+i;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (uPosFound!=0)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRYFREE(buf);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return uPosFound;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Locate the Central directory 64 of a zipfile (at the end, just before
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the global comment)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir64 OF((
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const zlib_filefunc64_32_def* pzlib_filefunc_def,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf filestream));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      voidpf filestream)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* buf;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uSizeFile;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uBackRead;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uPosFound=0;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong uL;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ZPOS64_T relativeOffset;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uMaxBack>uSizeFile)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uMaxBack = uSizeFile;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf==NULL)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uBackRead = 4;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (uBackRead<uMaxBack)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uLong uReadSize;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ZPOS64_T uReadPos;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (uBackRead+BUFREADCOMMENT>uMaxBack)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uBackRead = uMaxBack;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uBackRead+=BUFREADCOMMENT;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uReadPos = uSizeFile-uBackRead ;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i=(int)uReadSize-3; (i--)>0;)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uPosFound = uReadPos+i;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (uPosFound!=0)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRYFREE(buf);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uPosFound == 0)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Zip64 end of central directory locator */
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* the signature, already checked */
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* number of the disk with the start of the zip64 end of  central directory */
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uL != 0)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* relative offset of the zip64 end of central directory record */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* total number of disks */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uL != 1)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Goto end of central directory record */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* the signature */
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uL != 0x06064b50)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return relativeOffset;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Open a Zip file. path contain the full pathname (by example,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     "zlib/zlib114.zip".
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     If the zipfile cannot be opened (file doesn't exist or in not valid), the
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return value is NULL.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Else, the return value is a unzFile Handle, usable with other function
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       of this unzip package.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local unzFile unzOpenInternal (const void *path,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int is64bitOpenFunction)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s us;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s *s;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T central_pos;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong   uL;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong number_disk;          /* number of the current dist, used for
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   spaning ZIP, unsupported, always 0*/
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong number_disk_with_CD;  /* number the the disk with central dir, used
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   for spaning ZIP, unsupported, always 0*/
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T number_entry_CD;      /* total number of entries in
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   the central dir
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (same than number_entry on nospan) */
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz_copyright[0]!=' ')
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.z_filefunc.zseek32_file = NULL;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.z_filefunc.ztell32_file = NULL;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pzlib_filefunc64_32_def==NULL)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.z_filefunc = *pzlib_filefunc64_32_def;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.is64bitOpenFunction = is64bitOpenFunction;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.filestream = ZOPEN64(us.z_filefunc,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 path,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 ZLIB_FILEFUNC_MODE_READ |
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 ZLIB_FILEFUNC_MODE_EXISTING);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (us.filestream==NULL)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (central_pos)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uLong uS;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ZPOS64_T uL64;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.isZip64 = 1;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZSEEK64(us.z_filefunc, us.filestream,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* the signature, already checked */
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* size of zip64 end of central directory record */
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* version made by */
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* version needed to extract */
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* number of this disk */
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* number of the disk with the start of the central directory */
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* total number of entries in the central directory on this disk */
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* total number of entries in the central directory */
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((number_entry_CD!=us.gi.number_entry) ||
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (number_disk_with_CD!=0) ||
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (number_disk!=0))
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_BADZIPFILE;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* size of the central directory */
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* offset of start of central directory with respect to the
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          starting disk number */
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.gi.size_comment = 0;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (central_pos==0)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.isZip64 = 0;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZSEEK64(us.z_filefunc, us.filestream,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* the signature, already checked */
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* number of this disk */
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* number of the disk with the start of the central directory */
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* total number of entries in the central dir on this disk */
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.gi.number_entry = uL;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* total number of entries in the central dir */
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        number_entry_CD = uL;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((number_entry_CD!=us.gi.number_entry) ||
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (number_disk_with_CD!=0) ||
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (number_disk!=0))
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_BADZIPFILE;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* size of the central directory */
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.size_central_dir = uL;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* offset of start of central directory with respect to the
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            starting disk number */
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        us.offset_central_dir = uL;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* zipfile comment length */
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (err==UNZ_OK))
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err!=UNZ_OK)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ZCLOSE64(us.z_filefunc, us.filestream);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.byte_before_the_zipfile = central_pos -
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            (us.offset_central_dir+us.size_central_dir);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.central_pos = central_pos;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.pfile_in_zip_read = NULL;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us.encrypted = 0;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)ALLOC(sizeof(unz64_s));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( s != NULL)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *s=us;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unzGoToFirstFile((unzFile)s);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (unzFile)s;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen2 (const char *path,
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        zlib_filefunc_def* pzlib_filefunc32_def)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pzlib_filefunc32_def != NULL)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return unzOpenInternal(path, NULL, 0);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen2_64 (const void *path,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     zlib_filefunc64_def* pzlib_filefunc_def)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pzlib_filefunc_def != NULL)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return unzOpenInternal(path, NULL, 1);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen (const char *path)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzOpenInternal(path, NULL, 0);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern unzFile ZEXPORT unzOpen64 (const void *path)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzOpenInternal(path, NULL, 1);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Close a ZipFile opened with unzipOpen.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_OK if there is no problem. */
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzClose (unzFile file)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (s->pfile_in_zip_read!=NULL)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unzCloseCurrentFile(file);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZCLOSE64(s->z_filefunc, s->filestream);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRYFREE(s);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UNZ_OK;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Write info about the ZipFile in the *pglobal_info structure.
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  No preparation of the structure is needed
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_OK if there is no problem. */
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pglobal_info=s->gi;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UNZ_OK;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* to do : check if number_entry is not truncated */
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pglobal_info32->number_entry = (uLong)s->gi.number_entry;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pglobal_info32->size_comment = s->gi.size_comment;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UNZ_OK;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Translate date/time from Dos format to tm_unz (readable more easilty)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T uDate;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uDate = (ZPOS64_T)(ulDosDate>>16);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_mday = (uInt)(uDate&0x1f) ;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Get Info about the current file in the zipfile, with internal only info
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  unz_file_info64 *pfile_info,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  unz_file_info64_internal
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  *pfile_info_internal,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  char *szFileName,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong fileNameBufferSize,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  void *extraField,
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong extraFieldBufferSize,
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  char *szComment,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong commentBufferSize));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_GetCurrentFileInfoInternal (unzFile file,
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  unz_file_info64 *pfile_info,
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  unz_file_info64_internal
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  *pfile_info_internal,
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  char *szFileName,
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong fileNameBufferSize,
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  void *extraField,
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong extraFieldBufferSize,
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  char *szComment,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uLong commentBufferSize)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64 file_info;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64_internal file_info_internal;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong uMagic;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long lSeek=0;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong uL;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(s->z_filefunc, s->filestream,
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              s->pos_in_central_dir+s->byte_before_the_zipfile,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ZLIB_FILEFUNC_SEEK_SET)!=0)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* we check the magic */
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (uMagic!=0x02014b50)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_BADZIPFILE;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_info.compressed_size = uL;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_info.uncompressed_size = uL;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                // relative offset of local header
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_info_internal.offset_curfile = uL;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lSeek+=file_info.size_filename;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (szFileName!=NULL))
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uLong uSizeRead ;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (file_info.size_filename<fileNameBufferSize)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(szFileName+file_info.size_filename)='\0';
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = file_info.size_filename;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = fileNameBufferSize;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek -= uSizeRead;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Read extrafield
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (extraField!=NULL))
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ZPOS64_T uSizeRead ;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (file_info.size_file_extra<extraFieldBufferSize)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = file_info.size_file_extra;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = extraFieldBufferSize;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (lSeek!=0)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lSeek=0;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek += file_info.size_file_extra - (uLong)uSizeRead;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek += file_info.size_file_extra;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                uLong acc = 0;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // since lSeek now points to after the extra field we need to move back
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek -= file_info.size_file_extra;
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (lSeek!=0)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lSeek=0;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while(acc < file_info.size_file_extra)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uLong headerId;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uLong dataSize;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* ZIP64 extra fields */
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (headerId == 0x0001)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        uLong uL;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                                        err=UNZ_ERRNO;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                if(file_info.compressed_size == (ZPOS64_T)(unsigned long)-1)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                {
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                                  err=UNZ_ERRNO;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                }
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                if(file_info_internal.offset_curfile == (ZPOS64_T)(unsigned long)-1)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        /* Relative Header offset */
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                                err=UNZ_ERRNO;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                if(file_info.disk_num_start == (unsigned long)-1)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        /* Disk Start Number */
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                                err=UNZ_ERRNO;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    err=UNZ_ERRNO;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            acc += 2 + 2 + dataSize;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (szComment!=NULL))
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uLong uSizeRead ;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (file_info.size_file_comment<commentBufferSize)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(szComment+file_info.size_file_comment)='\0';
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = file_info.size_file_comment;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uSizeRead = commentBufferSize;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (lSeek!=0)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lSeek=0;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                err=UNZ_ERRNO;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek+=file_info.size_file_comment - uSizeRead;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lSeek+=file_info.size_file_comment;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (pfile_info!=NULL))
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pfile_info=file_info;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pfile_info_internal=file_info_internal;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Write info about the ZipFile in the *pglobal_info structure.
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  No preparation of the structure is needed
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_OK if there is no problem.
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          unz_file_info64 * pfile_info,
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          char * szFileName, uLong fileNameBufferSize,
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          void *extraField, uLong extraFieldBufferSize,
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          char* szComment,  uLong commentBufferSize)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                szFileName,fileNameBufferSize,
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                extraField,extraFieldBufferSize,
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                szComment,commentBufferSize);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          unz_file_info * pfile_info,
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          char * szFileName, uLong fileNameBufferSize,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          void *extraField, uLong extraFieldBufferSize,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          char* szComment,  uLong commentBufferSize)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64 file_info64;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                szFileName,fileNameBufferSize,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                extraField,extraFieldBufferSize,
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                szComment,commentBufferSize);
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->version = file_info64.version;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->version_needed = file_info64.version_needed;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->flag = file_info64.flag;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->compression_method = file_info64.compression_method;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->dosDate = file_info64.dosDate;
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->crc = file_info64.crc;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->size_filename = file_info64.size_filename;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->size_file_extra = file_info64.size_file_extra;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->size_file_comment = file_info64.size_file_comment;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->disk_num_start = file_info64.disk_num_start;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->internal_fa = file_info64.internal_fa;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->external_fa = file_info64.external_fa;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->tmu_date = file_info64.tmu_date,
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->compressed_size = (uLong)file_info64.compressed_size;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Set the current file of the zipfile to the first file.
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_OK if there is no problem
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFirstFile (unzFile file)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pos_in_central_dir=s->offset_central_dir;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->num_file=0;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             &s->cur_file_info_internal,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             NULL,0,NULL,0,NULL,0);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->current_file_ok = (err == UNZ_OK);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Set the current file of the zipfile to the next file.
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_OK if there is no problem
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToNextFile (unzFile  file)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s->current_file_ok)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_END_OF_LIST_OF_FILE;
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (s->num_file+1==s->gi.number_entry)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_END_OF_LIST_OF_FILE;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->num_file++;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &s->cur_file_info_internal,
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               NULL,0,NULL,0,NULL,0);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->current_file_ok = (err == UNZ_OK);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Try locate the file szFileName in the zipfile.
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  For the iCaseSensitivity signification, see unzipStringFileNameCompare
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value :
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNZ_OK if the file is found. It becomes the current file.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNZ_END_OF_LIST_OF_FILE if the file is not found
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We remember the 'current' position in the file so that we can jump
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * back there if we fail.
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64 cur_file_infoSaved;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_info64_internal cur_file_info_internalSaved;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T num_fileSaved;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T pos_in_central_dirSaved;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s->current_file_ok)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_END_OF_LIST_OF_FILE;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Save the current state */
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_fileSaved = s->num_file;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pos_in_central_dirSaved = s->pos_in_central_dir;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur_file_infoSaved = s->cur_file_info;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur_file_info_internalSaved = s->cur_file_info_internal;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unzGoToFirstFile(file);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (err == UNZ_OK)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err = unzGetCurrentFileInfo64(file,NULL,
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NULL,0,NULL,0);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (err == UNZ_OK)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (unzStringFileNameCompare(szCurrentFileName,
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            szFileName,iCaseSensitivity)==0)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return UNZ_OK;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err = unzGoToNextFile(file);
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We failed, so restore the state of the 'current file' to where we
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * were.
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->num_file = num_fileSaved ;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pos_in_central_dir = pos_in_central_dirSaved ;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->cur_file_info = cur_file_infoSaved;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->cur_file_info_internal = cur_file_info_internalSaved;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// I need random access
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Further optimization could be realized by adding an ability
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to cache the directory in memory. The goal being a single
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comprehensive file read to put the file I need in a memory.
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct unz_file_pos_s
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T pos_in_zip_directory;   // offset in file
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T num_of_file;            // # of file
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} unz_file_pos;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos*  file_pos)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL || file_pos==NULL)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s->current_file_ok)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_END_OF_LIST_OF_FILE;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_pos->num_of_file           = s->num_file;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UNZ_OK;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetFilePos(
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unzFile file,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_pos* file_pos)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_file_pos file_pos64;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err = unzGetFilePos64(file,&file_pos64);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_pos->num_of_file = (uLong)file_pos64.num_of_file;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL || file_pos==NULL)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* jump to the right spot */
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->num_file           = file_pos->num_of_file;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* set the current file */
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &s->cur_file_info_internal,
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               NULL,0,NULL,0,NULL,0);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* return results */
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->current_file_ok = (err == UNZ_OK);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGoToFilePos(
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unzFile file,
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz_file_pos* file_pos)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_file_pos file_pos64;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file_pos == NULL)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_pos64.num_of_file = file_pos->num_of_file;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzGoToFilePos64(file,&file_pos64);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unzip Helper Functions - should be here?
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Read the local header of the current zipfile
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Check the coherency of the local header and info in the end of central
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        directory about this file
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store in *piSizeVar the size of extra info in local header
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (filename and size of extra field data)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    ZPOS64_T * poffset_local_extrafield,
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    uInt  * psize_local_extrafield)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong uMagic,uData,uFlags;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong size_filename;
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong size_extra_field;
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *piSizeVar = 0;
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *poffset_local_extrafield = 0;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *psize_local_extrafield = 0;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_ERRNO;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==UNZ_OK)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_ERRNO;
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (uMagic!=0x04034b50)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_BADZIPFILE;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #ifdef HAVE_BZIP2 */
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #endif */
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (s->cur_file_info.compression_method!=Z_DEFLATED))
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *piSizeVar += (uInt)size_filename;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_ERRNO;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    SIZEZIPLOCALHEADER + size_filename;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *psize_local_extrafield = (uInt)size_extra_field;
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *piSizeVar += (uInt)size_extra_field;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Open for reading data the current file in the zipfile.
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  If there is no error and the file is opened, the return value is UNZ_OK.
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int* level, int raw, const char* password)
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uInt iSizeVar;
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T offset_local_extrafield;  /* offset of the local extra field */
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uInt  size_local_extrafield;    /* size of the local extra field */
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    ifndef NOUNCRYPT
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char source[12];
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    else
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (password != NULL)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s->current_file_ok)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (s->pfile_in_zip_read != NULL)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unzCloseCurrentFile(file);
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_BADZIPFILE;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_INTERNALERROR;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->pos_local_extrafield=0;
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->raw=raw;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info->read_buffer==NULL)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TRYFREE(pfile_in_zip_read_info);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_INTERNALERROR;
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream_initialised=0;
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method!=NULL)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *method = (int)s->cur_file_info.compression_method;
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (level!=NULL)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *level = 6;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (s->cur_file_info.flag & 0x06)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 6 : *level = 1; break;
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 4 : *level = 2; break;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          case 2 : *level = 9; break;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((s->cur_file_info.compression_method!=0) &&
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #ifdef HAVE_BZIP2 */
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #endif */
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (s->cur_file_info.compression_method!=Z_DEFLATED))
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err=UNZ_BADZIPFILE;
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->crc32=0;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->total_out_64=0;
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->filestream=s->filestream;
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream.total_out = 0;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->bstream.state = (voidpf)0;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.zfree = (free_func)0;
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.avail_in = 0;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err == Z_OK)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TRYFREE(pfile_in_zip_read_info);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return err;
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->raw=1;
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.zfree = (free_func)0;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.next_in = 0;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfile_in_zip_read_info->stream.avail_in = 0;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err == Z_OK)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TRYFREE(pfile_in_zip_read_info);
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return err;
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* windowBits is passed < 0 to tell that there is no zlib header.
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Note that in this case inflate *requires* an extra "dummy" byte
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * after the compressed stream in order to complete decompression and
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * return Z_STREAM_END.
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * size of both compressed and uncompressed data
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->rest_read_compressed =
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            s->cur_file_info.compressed_size ;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->rest_read_uncompressed =
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            s->cur_file_info.uncompressed_size ;
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->pos_in_zipfile =
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              iSizeVar;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pfile_in_zip_read = pfile_in_zip_read_info;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                s->encrypted = 0;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    ifndef NOUNCRYPT
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (password != NULL)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s->pcrc_32_tab = get_crc_table();
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        init_keys(password,s->keys,s->pcrc_32_tab);
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ZSEEK64(s->z_filefunc, s->filestream,
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  s->pfile_in_zip_read->pos_in_zipfile +
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     s->pfile_in_zip_read->byte_before_the_zipfile,
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SEEK_SET)!=0)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return UNZ_INTERNALERROR;
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return UNZ_INTERNALERROR;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0; i<12; i++)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            zdecode(s->keys,s->pcrc_32_tab,source[i]);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s->pfile_in_zip_read->pos_in_zipfile+=12;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        s->encrypted=1;
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UNZ_OK;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile (unzFile file)
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char*  password)
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzOpenCurrentFile3(file, method, level, raw, NULL);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Addition for GDAL : START */
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0; //UNZ_PARAMERROR;
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0; //UNZ_PARAMERROR;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pfile_in_zip_read_info->pos_in_zipfile +
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pfile_in_zip_read_info->byte_before_the_zipfile;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Addition for GDAL : END */
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Read bytes from the current file.
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf contain buffer where data must be copied
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len the size of buf.
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return the number of byte copied if somes bytes are copied
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0 if the end of file was reached
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return <0 with error code if there is an error
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzReadCurrentFile  (unzFile file, voidp buf, unsigned len)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uInt iRead = 0;
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pfile_in_zip_read_info->read_buffer == NULL))
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_END_OF_LIST_OF_FILE;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len==0)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((len>pfile_in_zip_read_info->rest_read_compressed+
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           pfile_in_zip_read_info->stream.avail_in) &&
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (pfile_in_zip_read_info->raw))
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pfile_in_zip_read_info->stream.avail_out =
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (uInt)pfile_in_zip_read_info->rest_read_compressed+
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_in;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (pfile_in_zip_read_info->stream.avail_out>0)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (pfile_in_zip_read_info->rest_read_compressed>0))
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uInt uReadThis = UNZ_BUFSIZE;
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (uReadThis == 0)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return UNZ_EOF;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      pfile_in_zip_read_info->filestream,
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      pfile_in_zip_read_info->pos_in_zipfile +
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pfile_in_zip_read_info->byte_before_the_zipfile,
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ZLIB_FILEFUNC_SEEK_SET)!=0)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return UNZ_ERRNO;
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      pfile_in_zip_read_info->filestream,
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      pfile_in_zip_read_info->read_buffer,
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      uReadThis)!=uReadThis)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return UNZ_ERRNO;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#            ifndef NOUNCRYPT
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if(s->encrypted)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uInt i;
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                for(i=0;i<uReadThis;i++)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  pfile_in_zip_read_info->read_buffer[i] =
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      zdecode(s->keys,s->pcrc_32_tab,
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              pfile_in_zip_read_info->read_buffer[i]);
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#            endif
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.next_in =
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (Bytef*)pfile_in_zip_read_info->read_buffer;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uInt uDoCopy,i ;
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (pfile_in_zip_read_info->rest_read_compressed == 0))
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (iRead==0) ? UNZ_EOF : iRead;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (pfile_in_zip_read_info->stream.avail_out <
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            pfile_in_zip_read_info->stream.avail_in)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i=0;i<uDoCopy;i++)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *(pfile_in_zip_read_info->stream.next_out+i) =
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        *(pfile_in_zip_read_info->stream.next_in+i);
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                pfile_in_zip_read_info->stream.next_out,
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                uDoCopy);
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.next_out += uDoCopy;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.next_in += uDoCopy;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.total_out += uDoCopy;
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iRead += uDoCopy;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uLong uTotalOutBefore,uTotalOutAfter;
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Bytef *bufBefore;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uLong uOutThis;
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.next_in        = (char*)pfile_in_zip_read_info->stream.next_in;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.avail_in       = pfile_in_zip_read_info->stream.avail_in;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.total_in_lo32  = pfile_in_zip_read_info->stream.total_in;
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.total_in_hi32  = 0;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.next_out       = (char*)pfile_in_zip_read_info->stream.next_out;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.avail_out      = pfile_in_zip_read_info->stream.avail_out;
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uOutThis = uTotalOutAfter-uTotalOutBefore;
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.next_in   = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_in  = pfile_in_zip_read_info->bstream.avail_in;
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.total_in  = pfile_in_zip_read_info->bstream.total_in_lo32;
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.next_out  = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (err==BZ_STREAM_END)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              return (iRead==0) ? UNZ_EOF : iRead;
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (err!=BZ_OK)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              break;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } // end Z_BZIP2ED
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ZPOS64_T uTotalOutBefore,uTotalOutAfter;
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const Bytef *bufBefore;
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ZPOS64_T uOutThis;
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int flush=Z_SYNC_FLUSH;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bufBefore = pfile_in_zip_read_info->stream.next_out;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     pfile_in_zip_read_info->stream.avail_out) &&
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (pfile_in_zip_read_info->rest_read_compressed == 0))
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                flush = Z_FINISH;
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            */
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=inflate(&pfile_in_zip_read_info->stream,flush);
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              err = Z_DATA_ERROR;
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uOutThis = uTotalOutAfter-uTotalOutBefore;
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->crc32 =
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                crc32(pfile_in_zip_read_info->crc32,bufBefore,
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (uInt)(uOutThis));
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pfile_in_zip_read_info->rest_read_uncompressed -=
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uOutThis;
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (err==Z_STREAM_END)
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (iRead==0) ? UNZ_EOF : iRead;
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (err!=Z_OK)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err==Z_OK)
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return iRead;
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Give the current position in uncompressed data
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern z_off_t ZEXPORT unztell (unzFile file)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (ZPOS64_T)-1;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (ZPOS64_T)-1;
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pfile_in_zip_read_info->total_out_64;
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1 if the end of file was reached, 0 elsewhere
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzeof (unzFile file)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1;
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Read extra field from the current file (opened by unzOpenCurrentFile)
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This is the local-header version of the extra field (sometimes, there is
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)more info in the local-header version than in the central-header)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if buf==NULL, it return the size of the local extra field that can be read
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if buf!=NULL, len is the size of the buffer, the extra header is copied in
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf.
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  the return value is the number of bytes copied in buf, or (if <0)
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the error code
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uInt read_now;
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T size_to_read;
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pfile_in_zip_read_info->pos_local_extrafield);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf==NULL)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (int)size_to_read;
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len>size_to_read)
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        read_now = (uInt)size_to_read;
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        read_now = (uInt)len ;
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_now==0)
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pfile_in_zip_read_info->filestream,
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pfile_in_zip_read_info->offset_local_extrafield +
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pfile_in_zip_read_info->pos_local_extrafield,
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ZLIB_FILEFUNC_SEEK_SET)!=0)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_ERRNO;
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pfile_in_zip_read_info->filestream,
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              buf,read_now)!=read_now)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_ERRNO;
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (int)read_now;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Close the file in zip opened with unzipOpenCurrentFile
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Return UNZ_CRCERROR if all the file was read but the CRC is not good
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzCloseCurrentFile (unzFile file)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err=UNZ_OK;
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_in_zip64_read_info_s* pfile_in_zip_read_info;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info=s->pfile_in_zip_read;
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info==NULL)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (!pfile_in_zip_read_info->raw))
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            err=UNZ_CRCERROR;
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRYFREE(pfile_in_zip_read_info->read_buffer);
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->read_buffer = NULL;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inflateEnd(&pfile_in_zip_read_info->stream);
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_BZIP2
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfile_in_zip_read_info->stream_initialised = 0;
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRYFREE(pfile_in_zip_read_info);
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pfile_in_zip_read=NULL;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Get the global comment string of the ZipFile, in the szComment buffer.
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uSizeBuf is the size of the szComment buffer.
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return the number of byte copied or an error code <0
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong uReadThis ;
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (int)UNZ_PARAMERROR;
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uReadThis = uSizeBuf;
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uReadThis>s->gi.size_comment)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uReadThis = s->gi.size_comment;
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_ERRNO;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uReadThis>0)
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *szComment='\0';
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_ERRNO;
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *(szComment+s->gi.size_comment)='\0';
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (int)uReadThis;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Additions by RX '2004 */
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 0; //UNZ_PARAMERROR;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!s->current_file_ok)
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (s->num_file==s->gi.number_entry)
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return 0;
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return s->pos_in_central_dir;
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern uLong ZEXPORT unzGetOffset (unzFile file)
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T offset64;
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 0; //UNZ_PARAMERROR;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    offset64 = unzGetOffset64(file);
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (uLong)offset64;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unz64_s* s;
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file==NULL)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNZ_PARAMERROR;
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=(unz64_s*)file;
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->pos_in_central_dir = pos;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->num_file = s->gi.number_entry;      /* hack */
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              &s->cur_file_info_internal,
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              NULL,0,NULL,0,NULL,0);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s->current_file_ok = (err == UNZ_OK);
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unzSetOffset64(file,pos);
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2121