aboutsummaryrefslogtreecommitdiff
path: root/source/unzip/unz.h
diff options
context:
space:
mode:
authorKitty Draper2011-03-05 21:39:25 -0500
committerKitty Draper2011-03-05 21:39:25 -0500
commitd40ae99422e118188a7f48055dc340c6aca022aa (patch)
tree83ab93f49fd9e66e43bcd824091ae1dbcaa0c173 /source/unzip/unz.h
downloadsnes9x2005-d40ae99422e118188a7f48055dc340c6aca022aa.tar.gz
snes9x2005-d40ae99422e118188a7f48055dc340c6aca022aa.tar.bz2
snes9x2005-d40ae99422e118188a7f48055dc340c6aca022aa.zip
first commit
Diffstat (limited to 'source/unzip/unz.h')
-rw-r--r--source/unzip/unz.h994
1 files changed, 994 insertions, 0 deletions
diff --git a/source/unzip/unz.h b/source/unzip/unz.h
new file mode 100644
index 0000000..1ea7478
--- /dev/null
+++ b/source/unzip/unz.h
@@ -0,0 +1,994 @@
+/*---------------------------------------------------------------------------
+
+ 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. <sys/param.h> 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 <stdio.h>
+#endif
+#include <ctype.h> /* skip for VMS, to use tolower() function? */
+#include <errno.h> /* 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 <types.h> /* (placed up here instead of in VMS section below */
+# include <stat.h> /* because types.h is used in some other headers) */
+#else /* !VMS */
+# if !defined(THINK_C) && !defined(MPW)
+# include <sys/types.h> /* off_t, time_t, dev_t, ... */
+# include <sys/stat.h>
+# endif /* !THINK_C && !MPW */
+#endif /* ?VMS */
+
+#ifdef MODERN
+# if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun)))
+# include <stddef.h>
+# endif
+# if (!defined(__GNUC__) && !defined(apollo)) /* both define __STDC__ */
+# include <stdlib.h> /* standard library prototypes, malloc(), etc. */
+# else
+# ifdef __EMX__
+# include <stdlib.h> /* emx IS gcc but has stdlib.h */
+# endif
+# endif
+# include <string.h> /* 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 <signal.h> /* used in unzip.c, file_io.c */
+
+
+
+/*---------------------------------------------------------------------------
+ Next, a word from our Unix (mostly) sponsors:
+ ---------------------------------------------------------------------------*/
+
+#ifdef UNIX
+# ifdef AMIGA
+# include <libraries/dos.h>
+# 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 <param.h> */
+# endif /* NGROUPS_MAX */
+#endif /* 0 */
+# include <sys/param.h> /* conflict with <sys/types.h>, 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 <time.h>
+ struct tm *gmtime(), *localtime();
+# else /* BSD */
+# include <sys/time.h>
+# include <sys/timeb.h>
+# ifdef _AIX
+# include <time.h>
+# 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 <sys/timeb.h> /* for structure ftime */
+# ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */
+# include <mem.h> /* MEM.H related to __STDC__ and far poin- */
+# endif /* ters. (dpk) [mem.h included for memcpy] */
+# include <dos.h> /* 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 <dos.h> /* 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 <io.h> /* lseek(), open(), setftime(), dup(), creat() */
+# include <time.h> /* 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 <io.h> /* read(), open(), etc. */
+# include <time.h>
+# include <memory.h>
+# include <direct.h> /* mkdir() */
+# ifdef FILE_IO_C
+# include <fcntl.h>
+# include <conio.h>
+# include <sys\types.h>
+# include <sys\utime.h>
+# include <windows.h>
+# define DOS_OS2
+# define getch() getchar()
+# endif
+#endif
+
+/*---------------------------------------------------------------------------
+ Followed by some VMS (mostly) stuff:
+ ---------------------------------------------------------------------------*/
+
+#ifdef VMS
+# include <time.h> /* the usual non-BSD time functions */
+# include <file.h> /* same things as fcntl.h has */
+# include <rms.h>
+# 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 <return> 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 <sys/file.h> /* MTS uses this instead of fcntl.h */
+# include <timeb.h>
+# include <time.h>
+# else /* !MTS */
+# ifdef COHERENT /* Coherent 3.10/Mark Williams C */
+# include <sys/fcntl.h>
+# define SHORT_NAMES
+# define tzset settz
+# else /* !COHERENT */
+# include <fcntl.h> /* 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 <Errors.h>
+# include <Files.h>
+# include <Memory.h>
+# include <Quickdraw.h>
+# include <ToolUtils.h>
+# 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 <stdio.h>
+#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 <unix.h> /* 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 <limits.h> 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 <limits.h>
+#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 <sys/param.h> 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<len;\
+ (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
+
+/*
+ * Remove all the ASCII carriage returns from buffer buf (length len),
+ * shortening as necessary (note that len gets modified in the process,
+ * so it CANNOT be an expression). This macro is intended to be used
+ * BEFORE A_TO_N(); hence the check for CR instead of '\r'. NOTE: The
+ * if-test gets performed one time too many, but it doesn't matter.
+ *
+ * macro NUKE_CRs(buf,len)
+ * {
+ * register int i, j;
+ *
+ * for (i = j = 0; j < len; (buf)[i++] = (buf)[j++])
+ * if ((buf)[j] == CR)
+ * ++j;
+ * len = i;
+ * }
+ *
+ */
+
+
+#define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
+ while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
+ *ps2='\0';}
+
+/*
+ * Copy the zero-terminated string in str1 into str2, converting any
+ * uppercase letters to lowercase as we go. str2 gets zero-terminated
+ * as well, of course. str1 and str2 may be the same character array.
+ *
+ * macro TOLOWER( str1, str2 )
+ * {
+ * char *ps1, *ps2;
+ *
+ * ps1 = (str1) - 1;
+ * ps2 = (str2);
+ * while (*++ps1)
+ * *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
+ * *ps2='\0';
+ * }
+ *
+ * NOTES: This macro makes no assumptions about the characteristics of
+ * the tolower() function or macro (beyond its existence), nor does it
+ * make assumptions about the structure of the character set (i.e., it
+ * should work on EBCDIC machines, too). The fact that either or both
+ * of isupper() and tolower() may be macros has been taken into account;
+ * watch out for "side effects" (in the C sense) when modifying this
+ * macro.
+ */
+
+
+#ifndef ascii_to_native
+# define ascii_to_native(c) (c)
+# define A_TO_N(str1)
+#else
+# ifndef NATIVE
+# define NATIVE "native chars"
+# endif
+# define A_TO_N(str1) {register unsigned char *ps1;\
+ for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
+#endif
+
+/*
+ * Translate the zero-terminated string in str1 from ASCII to the native
+ * character set. The translation is performed in-place and uses the
+ * ascii_to_native macro to translate each character.
+ *
+ * macro A_TO_N( str1 )
+ * {
+ * register unsigned char *ps1;
+ *
+ * for (ps1 = str1; *ps1; ++ps1)
+ * *ps1 = ascii_to_native(*ps1);
+ * }
+ *
+ * NOTE: Using the ascii_to_native macro means that is it the only part of
+ * unzip which knows which translation table (if any) is actually in use
+ * to produce the native character set. This makes adding new character
+ * set translation tables easy, insofar as all that is needed is an
+ * appropriate ascii_to_native macro definition and the translation
+ * table itself. Currently, the only non-ASCII native character set
+ * implemented is EBCDIC, but this may not always be so.
+ */
+
+/*************/
+/* Globals */
+/*************/
+
+#ifdef MACOS
+ union work {
+ struct {
+ short *Prefix_of; /* (8193 * sizeof(short)) */
+ byte *Suffix_of;
+ byte *Stack;
+ } shrink;
+ byte *Slide;
+ };
+#else
+ union work {
+ struct {
+ short Prefix_of[HSIZE + 2]; /* (8194 * sizeof(short)) */
+ byte Suffix_of[HSIZE + 2]; /* also s-f length_nodes (smaller) */
+ byte Stack[HSIZE + 2]; /* also s-f distance_nodes (smaller) */
+ } shrink;
+ byte Slide[WSIZE];
+ };
+#endif
+ extern union work area;
+
+# define prefix_of area.shrink.Prefix_of
+# define suffix_of area.shrink.Suffix_of
+# define stack area.shrink.Stack
+# define slide area.Slide
+
+ extern ULONG crc32val;
+ extern UWORD mask_bits[];
+ extern int bits_left;
+ extern ULONG bitbuf;
+ extern boolean zipeof;
+