/*--------------------------------------------------------------------------- unzip.h This header file is used by all of the unzip source files. Its contents are divided into seven more-or-less separate sections: predefined macros, OS-dependent includes, (mostly) OS-independent defines, typedefs, function prototypes (or "prototypes," in the case of non-ANSI compilers), macros, and global-variable declarations. ---------------------------------------------------------------------------*/ #include "zlib.h" /*****************************************/ /* Predefined, Machine-specific Macros */ /*****************************************/ #if (defined(__GO32__) && defined(unix)) /* DOS extender */ # undef unix #endif #if defined(unix) || defined(__convexc__) || defined(M_XENIX) # ifndef UNIX # define UNIX # endif /* !UNIX */ #endif /* unix || __convexc__ || M_XENIX */ /* Much of the following is swiped from zip's tailor.h: */ /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */ #ifdef __POWERC # define __TURBOC__ # define MSDOS #endif /* __POWERC */ #if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS)) # define MSDOS #endif /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C, * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or * or Watcom C, or Macintosh, or Windows NT. */ #if (__STDC__ || defined(MSDOS) || defined(sgi) || defined(CONVEX) || defined(__sun)) # ifndef PROTO # define PROTO # endif # define MODERN #endif #if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__)) # ifndef PROTO # define PROTO # endif # define MODERN #endif #if (defined(THINK_C) || defined(MPW) || defined(WIN32)) # ifndef PROTO # define PROTO # endif # define MODERN #endif /* turn off prototypes if requested */ #if (defined(NOPROTO) && defined(PROTO)) # undef PROTO #endif #if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr)) # if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV)) # define BSD # endif /* !BSD && !__SYSTEM_FIVE && !SYSV */ #endif /* ultrix || bsd4_2 || sun || pyr */ #if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE)) # ifndef TERMIO # define TERMIO # endif /* !TERMIO */ #endif /* CONVEX || CRAY || __SYSTEM_FIVE */ #ifdef pyr /* Pyramid */ # ifndef ZMEM # define ZMEM # endif /* !ZMEM */ #endif /* pyr */ #ifdef CRAY # ifdef ZMEM # undef ZMEM # endif /* ZMEM */ #endif /* CRAY */ /* the i386 test below is to catch SCO Unix (which has redefinition * warnings if param.h is included), but it probably doesn't hurt if * other 386 Unixes get nailed, too...except now that 386BSD and BSDI * exist. Sigh. is mostly included for "BSD", I think. * [An alternate fix for SCO Unix is below.] */ #if (defined(MINIX) || (defined(i386) && defined(unix))) # define NO_PARAM_H #endif /* MINIX || (i386 && unix) */ /***************************/ /* OS-Dependent Includes */ /***************************/ #ifndef MINIX /* Minix needs it after all the other includes (?) */ # include #endif #include /* skip for VMS, to use tolower() function? */ #include /* used in mapname() */ #ifndef NO_ERRNO # define DECLARE_ERRNO /* everybody except MSC 6.0, SCO cc, Watcom C/386 */ #endif /* !NO_ERRNO */ #ifdef VMS # include /* (placed up here instead of in VMS section below */ # include /* because types.h is used in some other headers) */ #else /* !VMS */ # if !defined(THINK_C) && !defined(MPW) # include /* off_t, time_t, dev_t, ... */ # include # endif /* !THINK_C && !MPW */ #endif /* ?VMS */ #ifdef MODERN # if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun))) # include # endif # if (!defined(__GNUC__) && !defined(apollo)) /* both define __STDC__ */ # include /* standard library prototypes, malloc(), etc. */ # else # ifdef __EMX__ # include /* emx IS gcc but has stdlib.h */ # endif # endif # include /* defines strcpy, strcmp, memcpy, etc. */ typedef size_t extent; #else /* !MODERN */ char *malloc(); char *strchr(), *strrchr(); long lseek(); typedef unsigned int extent; # define void int #endif /* ?MODERN */ /* this include must be down here for SysV.4, for some reason... */ #include /* used in unzip.c, file_io.c */ /*--------------------------------------------------------------------------- Next, a word from our Unix (mostly) sponsors: ---------------------------------------------------------------------------*/ #ifdef UNIX # ifdef AMIGA # include # else /* !AMIGA */ # ifndef NO_PARAM_H #if 0 /* [GRR: this is an alternate fix for SCO's redefinition bug] */ # ifdef NGROUPS_MAX # undef NGROUPS_MAX /* SCO bug: defined again in */ # endif /* NGROUPS_MAX */ #endif /* 0 */ # include /* conflict with , some systems? */ # endif /* !NO_PARAM_H */ # endif /* ?AMIGA */ # ifndef BSIZE # ifdef MINIX # define BSIZE 1024 # else /* !MINIX */ # define BSIZE DEV_BSIZE /* assume common for all Unix systems */ # endif /* ?MINIX */ # endif # ifndef BSD # if (!defined(AMIGA) && !defined(MINIX)) # define NO_MKDIR /* for mapname() */ # endif /* !AMIGA && !MINIX */ # include struct tm *gmtime(), *localtime(); # else /* BSD */ # include # include # ifdef _AIX # include # endif # endif #else /* !UNIX */ # define BSIZE 512 /* disk block size */ #endif /* ?UNIX */ #if (defined(V7) || defined(BSD)) # define strchr index # define strrchr rindex #endif /*--------------------------------------------------------------------------- And now, our MS-DOS and OS/2 corner: ---------------------------------------------------------------------------*/ #ifdef __TURBOC__ # define DOS_OS2 # include /* for structure ftime */ # ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */ # include /* MEM.H related to __STDC__ and far poin- */ # endif /* ters. (dpk) [mem.h included for memcpy] */ # include /* for REGS macro (at least for Turbo C 2.0) */ #else /* NOT Turbo C (or Power C)... */ # ifdef MSDOS /* but still MS-DOS, so we'll assume it's */ # ifndef MSC /* Microsoft's compiler and fake the ID, if */ # define MSC /* necessary (it is in 5.0; apparently not */ # endif /* in 5.1 and 6.0) */ # include /* for _dos_setftime() */ # endif #endif #if (defined(__IBMC__) && defined(__OS2__)) # define DOS_OS2 # define S_IFMT 0xF000 # define timezone _timezone #endif #ifdef __WATCOMC__ # define DOS_OS2 # define __32BIT__ # ifdef DECLARE_ERRNO # undef DECLARE_ERRNO # endif # undef far # define far #endif #ifdef __EMX__ # define DOS_OS2 # define __32BIT__ # define far #endif /* __EMX__ */ #ifdef MSC /* defined for all versions of MSC now */ # define DOS_OS2 /* Turbo C under DOS, MSC under DOS or OS/2 */ # if (defined(_MSC_VER) && (_MSC_VER >= 600)) /* new with 5.1 or 6.0 ... */ # undef DECLARE_ERRNO /* errno is now a function in a dynamic link */ # endif /* library (or something)--incompatible with */ #endif /* the usual "extern int errno" declaration */ #ifdef DOS_OS2 /* defined for all MS-DOS and OS/2 compilers */ # include /* lseek(), open(), setftime(), dup(), creat() */ # include /* localtime() */ #endif #ifdef OS2 /* defined for all OS/2 compilers */ # ifdef isupper # undef isupper # endif # ifdef tolower # undef tolower # endif # define isupper(x) IsUpperNLS((unsigned char)(x)) # define tolower(x) ToLowerNLS((unsigned char)(x)) #endif #ifdef WIN32 # include /* read(), open(), etc. */ # include # include # include /* mkdir() */ # ifdef FILE_IO_C # include # include # include # include # include # define DOS_OS2 # define getch() getchar() # endif #endif /*--------------------------------------------------------------------------- Followed by some VMS (mostly) stuff: ---------------------------------------------------------------------------*/ #ifdef VMS # include /* the usual non-BSD time functions */ # include /* same things as fcntl.h has */ # include # define _MAX_PATH NAM$C_MAXRSS /* to define FILNAMSIZ below */ # define UNIX /* can share most of same code from now on */ # define RETURN return_VMS /* VMS interprets return codes incorrectly */ #else /* !VMS */ # ifndef THINK_C # define RETURN return /* only used in main() */ # else # define RETURN(v) { int n;\ n = (v);\ fprintf(stderr, "\npress to continue ");\ while (getc(stdin) != '\n');\ putc('\n', stderr);\ InitCursor();\ goto start;\ } # endif # ifdef V7 # define O_RDONLY 0 # define O_WRONLY 1 # define O_RDWR 2 # else /* !V7 */ # ifdef MTS # include /* MTS uses this instead of fcntl.h */ # include # include # else /* !MTS */ # ifdef COHERENT /* Coherent 3.10/Mark Williams C */ # include # define SHORT_NAMES # define tzset settz # else /* !COHERENT */ # include /* O_BINARY for open() w/o CR/LF translation */ # endif /* ?COHERENT */ # endif /* ?MTS */ # endif /* ?V7 */ #endif /* ?VMS */ #if (defined(MSDOS) || defined(VMS)) # define DOS_VMS #endif /*--------------------------------------------------------------------------- And some Mac stuff for good measure: ---------------------------------------------------------------------------*/ #ifdef THINK_C # define MACOS # ifndef __STDC__ /* if Think C hasn't defined __STDC__ ... */ # define __STDC__ 1 /* make sure it's defined: it needs it */ # else /* __STDC__ defined */ # if !__STDC__ /* sometimes __STDC__ is defined as 0; */ # undef __STDC__ /* it needs to be 1 or required header */ # define __STDC__ 1 /* files are not properly included. */ # endif /* !__STDC__ */ # endif /* ?defined(__STDC__) */ #endif /* THINK_C */ #ifdef MPW # define MACOS # include # include # include # include # include # define CtoPstr c2pstr # define PtoCstr p2cstr # ifdef CR # undef CR # endif #endif /* MPW */ #ifdef MACOS # define open(x,y) macopen(x,y, gnVRefNum, glDirID) # define close macclose # define read macread # define write macwrite # define lseek maclseek # define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType) # define stat(x,y) macstat(x,y,gnVRefNum, glDirID) # ifndef isascii # define isascii(c) ((unsigned char)(c) <= 0x3F) # endif # include "macstat.h" typedef struct _ZipExtraHdr { unsigned short header; /* 2 bytes */ unsigned short data; /* 2 bytes */ } ZIP_EXTRA_HEADER; typedef struct _MacInfoMin { unsigned short header; /* 2 bytes */ unsigned short data; /* 2 bytes */ unsigned long signature; /* 4 bytes */ FInfo finfo; /* 16 bytes */ unsigned long lCrDat; /* 4 bytes */ unsigned long lMdDat; /* 4 bytes */ unsigned long flags ; /* 4 bytes */ unsigned long lDirID; /* 4 bytes */ /*------------*/ } MACINFOMIN; /* = 40 bytes for size of data */ typedef struct _MacInfo { unsigned short header; /* 2 bytes */ unsigned short data; /* 2 bytes */ unsigned long signature; /* 4 bytes */ FInfo finfo; /* 16 bytes */ unsigned long lCrDat; /* 4 bytes */ unsigned long lMdDat; /* 4 bytes */ unsigned long flags ; /* 4 bytes */ unsigned long lDirID; /* 4 bytes */ char rguchVolName[28]; /* 28 bytes */ /*------------*/ } MACINFO; /* = 68 bytes for size of data */ #endif /* MACOS */ /*--------------------------------------------------------------------------- And finally, some random extra stuff: ---------------------------------------------------------------------------*/ #ifdef MINIX # include #endif #ifdef SHORT_NAMES /* Mark Williams C, ...? */ # define extract_or_test_files xtr_or_tst_files # define extract_or_test_member xtr_or_tst_member #endif #ifdef MTS # include /* Some important non-ANSI routines */ # define mkdir(s,n) (-1) /* No "make directory" capability */ # define EBCDIC /* Set EBCDIC conversion on */ #endif /*************/ /* Defines */ /*************/ #ifndef WSIZE # define WSIZE 0x8000 /* window size--must be a power of two, and */ #endif /* !WSIZE */ /* at least 32K for zip's deflate method */ #define DIR_BLKSIZ 64 /* number of directory entries per block * (should fit in 4096 bytes, usually) */ #ifndef INBUFSIZ # define INBUFSIZ 2048 /* works for MS-DOS small model */ #endif /* !INBUFSIZ */ /* * If exists on most systems, should include that, since it may * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX, * _POSIX_PATH_MAX. */ #ifdef DOS_OS2 # include #endif /* DOS_OS2 */ #ifdef _MAX_PATH # define FILNAMSIZ (_MAX_PATH) #else /* !_MAX_PATH */ # define FILNAMSIZ 1025 #endif /* ?_MAX_PATH */ #ifndef PATH_MAX # ifdef MAXPATHLEN /* defined in some systems */ # define PATH_MAX MAXPATHLEN # else # if FILENAME_MAX > 255 /* used like PATH_MAX on some systems */ # define PATH_MAX FILENAME_MAX # else # define PATH_MAX (FILNAMSIZ - 1) # endif # endif /* ?MAXPATHLEN */ #endif /* !PATH_MAX */ #define OUTBUFSIZ INBUFSIZ #define ZSUFX ".zip" #define CENTRAL_HDR_SIG "\113\001\002" /* the infamous "PK" signature */ #define LOCAL_HDR_SIG "\113\003\004" /* bytes, sans "P" (so unzip */ #define END_CENTRAL_SIG "\113\005\006" /* executable not mistaken for */ #define EXTD_LOCAL_SIG "\113\007\010" /* zipfile itself) */ #define SKIP 0 /* choice of activities for do_string() */ #define DISPLAY 1 #define FILENAME 2 #define EXTRA_FIELD 3 #define DOES_NOT_EXIST -1 /* return values for check_for_newer() */ #define EXISTS_AND_OLDER 0 #define EXISTS_AND_NEWER 1 #define DOS_OS2_FAT_ 0 /* version_made_by codes (central dir) */ #define AMIGA_ 1 #define VMS_ 2 /* make sure these are not defined on */ #define UNIX_ 3 /* the respective systems!! (like, for */ #define VM_CMS_ 4 /* instance, "VMS", or "UNIX": CFLAGS = */ #define ATARI_ 5 /* -O -DUNIX) */ #define OS2_HPFS_ 6 #define MAC_ 7 #define Z_SYSTEM_ 8 #define CPM_ 9 /* #define TOPS20_ 10? (TOPS20_ is to be defined in PKZIP 2.0...) */ #define NUM_HOSTS 10 /* index of last system + 1 */ #define STORED 0 /* compression methods */ #define SHRUNK 1 #define REDUCED1 2 #define REDUCED2 3 #define REDUCED3 4 #define REDUCED4 5 #define IMPLODED 6 #define TOKENIZED 7 #define DEFLATED 8 #define NUM_METHODS 9 /* index of last method + 1 */ /* don't forget to update list_files() appropriately if NUM_METHODS changes */ #define DF_MDY 0 /* date format 10/26/91 (USA only) */ #define DF_DMY 1 /* date format 26/10/91 (most of the world) */ #define DF_YMD 2 /* date format 91/10/26 (a few countries) */ #define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */ #define VMS_VERSION 42 /* if OS-needed-to-extract is VMS: can do */ /*--------------------------------------------------------------------------- True sizes of the various headers, as defined by PKWare--so it is not likely that these will ever change. But if they do, make sure both these defines AND the typedefs below get updated accordingly. ---------------------------------------------------------------------------*/ #define LREC_SIZE 26 /* lengths of local file headers, central */ #define CREC_SIZE 42 /* directory headers, and the end-of- */ #define ECREC_SIZE 18 /* central-dir record, respectively */ #define MAX_BITS 13 /* used in unShrink() */ #define HSIZE (1 << MAX_BITS) /* size of global work area */ #define LF 10 /* '\n' on ASCII machines. Must be 10 due to EBCDIC */ #define CR 13 /* '\r' on ASCII machines. Must be 13 due to EBCDIC */ #define CTRLZ 26 /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */ #ifdef EBCDIC # define ascii_to_native(c) ebcdic[(c)] # define NATIVE "EBCDIC" #endif #if MPW # define FFLUSH putc('\n',stderr); #else /* !MPW */ # define FFLUSH fflush(stderr); #endif /* ?MPW */ #ifdef VMS # define ENV_UNZIP "UNZIP_OPTS" /* name of environment variable */ # define ENV_ZIPINFO "ZIPINFO_OPTS" #else /* !VMS */ # define ENV_UNZIP "UNZIP" # define ENV_ZIPINFO "ZIPINFO" #endif /* ?VMS */ #ifdef CRYPT # define PWLEN 80 # define DECRYPT(b) (update_keys(t=((b)&0xff)^decrypt_byte()),t) #endif /* CRYPT */ #ifdef QQ /* Newtware version */ # define QCOND (!quietflg) /* for no file comments with -vq or -vqq */ #else /* (original) Bill Davidsen version */ # define QCOND (which_hdr) /* no way to kill file comments with -v, -l */ #endif #ifndef TRUE # define TRUE 1 /* sort of obvious */ #endif #ifndef FALSE # define FALSE 0 #endif #ifndef SEEK_SET /* These should all be declared in stdio.h! But */ # define SEEK_SET 0 /* since they're not (in many cases), do so here. */ # define SEEK_CUR 1 # define SEEK_END 2 #endif #ifndef S_IRUSR # define S_IRWXU 00700 /* read, write, execute: owner */ # define S_IRUSR 00400 /* read permission: owner */ # define S_IWUSR 00200 /* write permission: owner */ # define S_IXUSR 00100 /* execute permission: owner */ # define S_IRWXG 00070 /* read, write, execute: group */ # define S_IRGRP 00040 /* read permission: group */ # define S_IWGRP 00020 /* write permission: group */ # define S_IXGRP 00010 /* execute permission: group */ # define S_IRWXO 00007 /* read, write, execute: other */ # define S_IROTH 00004 /* read permission: other */ # define S_IWOTH 00002 /* write permission: other */ # define S_IXOTH 00001 /* execute permission: other */ #endif /* !S_IRUSR */ #ifdef ZIPINFO /* these are individually checked because SysV doesn't */ # ifndef S_IFBLK /* have some of them, Microsoft C others, etc. */ # define S_IFBLK 0060000 /* block special */ # endif # ifndef S_IFIFO /* in Borland C, not MSC */ # define S_IFIFO 0010000 /* fifo */ # endif # ifndef S_IFLNK /* in BSD, not SysV */ # define S_IFLNK 0120000 /* symbolic link */ # endif # ifndef S_IFSOCK /* in BSD, not SysV */ # define S_IFSOCK 0140000 /* socket */ # endif # ifndef S_ISUID # define S_ISUID 04000 /* set user id on execution */ # endif # ifndef S_ISGID # define S_ISGID 02000 /* set group id on execution */ # endif # ifndef S_ISVTX # define S_ISVTX 01000 /* directory permissions control */ # endif # ifndef S_ENFMT # define S_ENFMT S_ISGID /* record locking enforcement flag */ # endif #endif /* ZIPINFO */ /**************/ /* Typedefs */ /**************/ #ifndef _BULL_SOURCE /* Bull has it defined somewhere already */ typedef unsigned char byte; /* code assumes UNSIGNED bytes */ #endif /* !_BULL_SOURCE */ typedef char boolean; typedef long longint; typedef unsigned short UWORD; typedef unsigned long ULONG; typedef unsigned char uch; typedef unsigned short ush; typedef unsigned long ulg; typedef struct min_info { unsigned unix_attr; unsigned dos_attr; int hostnum; longint offset; ULONG compr_size; /* compressed size (needed if extended header) */ ULONG crc; /* crc (needed if extended header) */ unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */ unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */ unsigned text : 1; /* file is text or binary */ unsigned lcflag : 1; /* convert filename to lowercase */ } min_info; typedef struct VMStimbuf { char *revdate; /* (both correspond to Unix modtime/st_mtime) */ char *credate; } VMStimbuf; /*--------------------------------------------------------------------------- Zipfile layout declarations. If these headers ever change, make sure the xxREC_SIZE defines (above) change with them! ---------------------------------------------------------------------------*/ typedef byte local_byte_hdr[ LREC_SIZE ]; # define L_VERSION_NEEDED_TO_EXTRACT_0 0 # define L_VERSION_NEEDED_TO_EXTRACT_1 1 # define L_GENERAL_PURPOSE_BIT_FLAG 2 # define L_COMPRESSION_METHOD 4 # define L_LAST_MOD_FILE_TIME 6 # define L_LAST_MOD_FILE_DATE 8 # define L_CRC32 10 # define L_COMPRESSED_SIZE 14 # define L_UNCOMPRESSED_SIZE 18 # define L_FILENAME_LENGTH 22 # define L_EXTRA_FIELD_LENGTH 24 typedef byte cdir_byte_hdr[ CREC_SIZE ]; # define C_VERSION_MADE_BY_0 0 # define C_VERSION_MADE_BY_1 1 # define C_VERSION_NEEDED_TO_EXTRACT_0 2 # define C_VERSION_NEEDED_TO_EXTRACT_1 3 # define C_GENERAL_PURPOSE_BIT_FLAG 4 # define C_COMPRESSION_METHOD 6 # define C_LAST_MOD_FILE_TIME 8 # define C_LAST_MOD_FILE_DATE 10 # define C_CRC32 12 # define C_COMPRESSED_SIZE 16 # define C_UNCOMPRESSED_SIZE 20 # define C_FILENAME_LENGTH 24 # define C_EXTRA_FIELD_LENGTH 26 # define C_FILE_COMMENT_LENGTH 28 # define C_DISK_NUMBER_START 30 # define C_INTERNAL_FILE_ATTRIBUTES 32 # define C_EXTERNAL_FILE_ATTRIBUTES 34 # define C_RELATIVE_OFFSET_LOCAL_HEADER 38 typedef byte ec_byte_rec[ ECREC_SIZE+4 ]; /* define SIGNATURE 0 space-holder only */ # define NUMBER_THIS_DISK 4 # define NUM_DISK_WITH_START_CENTRAL_DIR 6 # define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8 # define TOTAL_ENTRIES_CENTRAL_DIR 10 # define SIZE_CENTRAL_DIRECTORY 12 # define OFFSET_START_CENTRAL_DIRECTORY 16 # define ZIPFILE_COMMENT_LENGTH 20 typedef struct local_file_header { /* LOCAL */ byte version_needed_to_extract[2]; UWORD general_purpose_bit_flag; UWORD compression_method; UWORD last_mod_file_time; UWORD last_mod_file_date; ULONG crc32; ULONG compressed_size; ULONG uncompressed_size; UWORD filename_length; UWORD extra_field_length; } local_file_hdr; typedef struct central_directory_file_header { /* CENTRAL */ byte version_made_by[2]; byte version_needed_to_extract[2]; UWORD general_purpose_bit_flag; UWORD compression_method; UWORD last_mod_file_time; UWORD last_mod_file_date; ULONG crc32; ULONG compressed_size; ULONG uncompressed_size; UWORD filename_length; UWORD extra_field_length; UWORD file_comment_length; UWORD disk_number_start; UWORD internal_file_attributes; ULONG external_file_attributes; ULONG relative_offset_local_header; } cdir_file_hdr; typedef struct end_central_dir_record { /* END CENTRAL */ UWORD number_this_disk; UWORD num_disk_with_start_central_dir; UWORD num_entries_centrl_dir_ths_disk; UWORD total_entries_central_dir; ULONG size_central_directory; ULONG offset_start_central_directory; UWORD zipfile_comment_length; } ecdir_rec; /*************************/ /* Function Prototypes */ /*************************/ #ifndef __ # define __ OF #endif /*--------------------------------------------------------------------------- Decompression functions: ---------------------------------------------------------------------------*/ int explode (); void unReduce (); void unShrink (); /*--------------------------------------------------------------------------- Functions in file_io.c and crypt.c: ---------------------------------------------------------------------------*/ int FillBitBuffer (); int ReadByte __((UWORD *x)); /* file_io.c */ /************/ /* Macros */ /************/ #ifndef MAX # define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\ inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\ if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\ else if(bufstart!=cur_zipfile_bufstart)\ {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\ if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\ inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\ {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}} /* * Seek to the block boundary of the block which includes abs_offset, * then read block into input buffer and set pointers appropriately. * If block is already in the buffer, just set the pointers. This macro * is used by process_end_central_dir (unzip.c) and do_string (misc.c). * A slightly modified version is embedded within extract_or_test_files * (unzip.c). ReadByte and readbuf (file_io.c) are compatible. * * macro LSEEK(abs_offset) * ULONG abs_offset; * { * longint request = abs_offset + extra_bytes; * longint inbuf_offset = request % INBUFSIZ; * longint bufstart = request - inbuf_offset; * * if (request < 0) { * fprintf(stderr, SeekMsg, ReportMsg); * return(3); /-* 3: severe error in zipfile *-/ * } else if (bufstart != cur_zipfile_bufstart) { * cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET); * if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0) * return(51); /-* 51: unexpected EOF *-/ * inptr = inbuf + (int)inbuf_offset; * incnt -= (int)inbuf_offset; * } else { * incnt += (inptr-inbuf) - (int)inbuf_offset; * inptr = inbuf + (int)inbuf_offset; * } * } * */ #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\ {error_in_archive=error; if(error>1) return error;} /* * Skip a variable-length field, and report any errors. Used in zipinfo.c * and unzip.c in several functions. * * macro SKIP_(length) * UWORD length; * { * if (length && ((error = do_string(length, SKIP)) != 0)) { * error_in_archive = error; /-* might be warning *-/ * if (error > 1) /-* fatal *-/ * return (error); * } * } * */ #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\ zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;} /* * macro READBIT(nbits,zdest) * { * if (nbits > bits_left) * FillBitBuffer(); * zdest = (int)((UWORD)bitbuf & mask_bits[nbits]); * bitbuf >>= nbits; * bits_left -= nbits; * } * */ #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\ (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits]) #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j