home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / ARCHIVERS / unzip50_src.lzh / UNZIP50 / UNZIP.H < prev    next >
Text File  |  1993-10-16  |  44KB  |  1,242 lines

  1. /*---------------------------------------------------------------------------
  2.  
  3.   unzip.h
  4.  
  5.   This header file is used by all of the unzip source files.  Its contents
  6.   are divided into seven more-or-less separate sections:  predefined macros,
  7.   OS-dependent includes, (mostly) OS-independent defines, typedefs, function 
  8.   prototypes (or "prototypes," in the case of non-ANSI compilers), macros, 
  9.   and global-variable declarations.
  10.  
  11.   ---------------------------------------------------------------------------*/
  12.  
  13.  
  14.  
  15. /*****************************************/
  16. /*  Predefined, Machine-specific Macros  */
  17. /*****************************************/
  18.  
  19. #if (defined(__GO32__) && defined(unix))   /* DOS extender */
  20. #  undef unix
  21. #endif
  22.  
  23. #if (defined(unix) && !defined(UNIX))
  24. #  define UNIX
  25. #endif /* unix && !UNIX */
  26.  
  27. /* Much of the following is swiped from zip's tailor.h: */
  28.  
  29. /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
  30. #ifdef __POWERC
  31. #  define __TURBOC__
  32. #  define MSDOS
  33. #endif /* __POWERC */
  34. #if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS))
  35. #  define MSDOS
  36. #endif
  37.  
  38. /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C,
  39.  * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or
  40.  * or Watcom C, or Macintosh, or Windows NT.
  41.  */
  42. #if (defined(__STDC__) || defined(MSDOS) || defined(sgi) || defined(CONVEX))
  43. #  ifndef PROTO
  44. #    define PROTO
  45. #  endif
  46. #  define MODERN
  47. #endif
  48. #if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__))
  49. #  ifndef PROTO
  50. #    define PROTO
  51. #  endif
  52. #  define MODERN
  53. #endif
  54. #if (defined(THINK_C) || defined(MPW) || defined(WIN32))
  55. #  ifndef PROTO
  56. #    define PROTO
  57. #  endif
  58. #  define MODERN
  59. #endif
  60.  
  61. /* turn off prototypes if requested */
  62. #if (defined(NOPROTO) && defined(PROTO))
  63. #  undef PROTO
  64. #endif
  65.  
  66. /* used to remove arguments in function prototypes for non-ANSI C */
  67. #ifdef PROTO
  68. #  define OF(a) a
  69. #else /* !PROTO */
  70. #  define OF(a) ()
  71. #endif /* ?PROTO */
  72.  
  73. #if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr))
  74. #  if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV))
  75. #    define BSD
  76. #  endif /* !BSD && !__SYSTEM_FIVE && !SYSV */
  77. #endif /* ultrix || bsd4_2 || sun || pyr */
  78.  
  79. #if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE))
  80. #  ifndef TERMIO
  81. #    define TERMIO
  82. #  endif /* !TERMIO */
  83. #endif /* CONVEX || CRAY || __SYSTEM_FIVE */
  84.  
  85. #ifdef pyr  /* Pyramid */
  86. #  ifndef ZMEM
  87. #    define ZMEM
  88. #  endif /* !ZMEM */
  89. #endif /* pyr */
  90.  
  91. #ifdef CRAY
  92. #  ifdef ZMEM
  93. #    undef ZMEM
  94. #  endif /* ZMEM */
  95. #endif /* CRAY */
  96.  
  97. /* the i386 test below is to catch SCO Unix (which has redefinition
  98.  * warnings if param.h is included), but it probably doesn't hurt if
  99.  * other 386 Unixes get nailed, too...except now that 386BSD and BSDI
  100.  * exist.  Sigh.  <sys/param.h> is mostly included for "BSD", I think.
  101.  * [An alternate fix for SCO Unix is below.]
  102.  */
  103. #if (defined(MINIX) || (defined(i386) && defined(unix)))
  104. #  define NO_PARAM_H
  105. #endif /* MINIX || (i386 && unix) */
  106.  
  107.  
  108.  
  109.  
  110.  
  111. /***************************/
  112. /*  OS-Dependent Includes  */
  113. /***************************/
  114.  
  115. #ifndef MINIX            /* Minix needs it after all the other includes (?) */
  116. #  include <stdio.h>
  117. #endif
  118. #include <ctype.h>       /* skip for VMS, to use tolower() function? */
  119. #include <errno.h>       /* used in mapname() */
  120. #ifndef NO_ERRNO
  121. #  define DECLARE_ERRNO  /* everybody except MSC 6.0, SCO cc, Watcom C/386 */
  122. #endif /* !NO_ERRNO */
  123. #ifdef VMS
  124. #  include <types.h>     /* (placed up here instead of in VMS section below */
  125. #  include <stat.h>      /* because types.h is used in some other headers) */
  126. #else /* !VMS */
  127. #  if !defined(THINK_C) && !defined(MPW)
  128. #    include <sys/types.h>                 /* off_t, time_t, dev_t, ... */
  129. #    include <sys/stat.h>
  130. #  endif /* !THINK_C && !MPW */
  131. #endif /* ?VMS */
  132.  
  133. #ifdef MODERN
  134. #  if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun)))
  135. #    include <stdlib.h>
  136. #  endif
  137. #  if (!defined(__GNUC__) && !defined(apollo))   /* both define __STDC__ */
  138. #    include <stdlib.h>    /* standard library prototypes, malloc(), etc. */
  139. #  else
  140. #    ifdef __EMX__
  141. #      include <stdlib.h>  /* emx IS gcc but has stdlib.h */
  142. #    endif
  143. #  endif
  144. #  include <string.h>      /* defines strcpy, strcmp, memcpy, etc. */
  145.    typedef size_t extent;
  146.    typedef void voidp;
  147. #else /* !MODERN */
  148.    char *malloc();
  149.    char *strchr(), *strrchr();
  150.    long lseek();
  151.    typedef unsigned int extent;
  152. #  define void int
  153.    typedef char voidp;
  154. #endif /* ?MODERN */
  155.  
  156. /* this include must be down here for SysV.4, for some reason... */
  157. #include <signal.h>      /* used in unzip.c, file_io.c */
  158.  
  159.  
  160.  
  161. /*---------------------------------------------------------------------------
  162.     Next, a word from our Unix (mostly) sponsors:
  163.   ---------------------------------------------------------------------------*/
  164.  
  165. #if (defined(UNIX) || defined(OSK))
  166. #  ifdef AMIGA
  167. #    include <libraries/dos.h>
  168. #  else /* !AMIGA */
  169. #    ifndef NO_PARAM_H
  170. #if 0  /* [GRR: this is an alternate fix for SCO's redefinition bug] */
  171. #      ifdef NGROUPS_MAX
  172. #        undef NGROUPS_MAX     /* SCO bug:  defined again in <param.h> */
  173. #      endif /* NGROUPS_MAX */
  174. #endif /* 0 */
  175. #      include <sys/param.h>   /* conflict with <sys/types.h>, some systems? */
  176. #    endif /* !NO_PARAM_H */
  177. #  endif /* ?AMIGA */
  178.  
  179. #  ifndef BSIZE
  180. #    ifdef MINIX
  181. #      define BSIZE   1024
  182. #    else /* !MINIX */
  183. #      define BSIZE   512  /* assume common for all Unix systems */
  184. #    endif /* ?MINIX */
  185. #  endif
  186.  
  187. #  if (!defined(BSD) || !defined(OSK))
  188. #    if (!defined(AMIGA) && !defined(MINIX))
  189. #      define NO_MKDIR           /* for mapname() */
  190. #    endif /* !AMIGA && !MINIX */
  191. #    include <time.h>
  192.      struct tm *gmtime(), *localtime();
  193. #  else   /* BSD */
  194. #    include <sys/time.h>
  195. #    include <sys/timeb.h>
  196. #    ifdef _AIX
  197. #      include <time.h>
  198. #    endif
  199. #  endif
  200.  
  201. #else   /* !UNIX */
  202. #  define BSIZE   512               /* disk block size */
  203. #endif /* ?UNIX */
  204.  
  205. #if (defined(V7) || defined(BSD))
  206. #  define strchr    index
  207. #  define strrchr   rindex
  208. #endif
  209.  
  210. /*---------------------------------------------------------------------------
  211.     And now, our MS-DOS and OS/2 corner:
  212.   ---------------------------------------------------------------------------*/
  213.  
  214. #ifdef __TURBOC__
  215. #  define DOS_OS2
  216. #  include <sys/timeb.h>      /* for structure ftime                        */
  217. #  ifndef __BORLANDC__        /* there appears to be a bug (?) in Borland's */
  218. #    include <mem.h>          /*   MEM.H related to __STDC__ and far poin-  */
  219. #  endif                      /*   ters. (dpk)  [mem.h included for memcpy] */
  220. #  include <dos.h>            /* for REGS macro (at least for Turbo C 2.0)  */
  221. #else                         /* NOT Turbo C (or Power C)...                */
  222. #  ifdef MSDOS                /*   but still MS-DOS, so we'll assume it's   */
  223. #    ifndef MSC               /*   Microsoft's compiler and fake the ID, if */
  224. #      define MSC             /*   necessary (it is in 5.0; apparently not  */
  225. #    endif                    /*   in 5.1 and 6.0)                          */
  226. #    include <dos.h>          /* for _dos_setftime()                        */
  227. #  endif
  228. #endif
  229.  
  230. #if (defined(__IBMC__) && defined(__OS2__))
  231. #  define DOS_OS2
  232. #  define S_IFMT 0xF000
  233. #  define timezone _timezone
  234. #endif
  235.  
  236. #ifdef __WATCOMC__
  237. #  define DOS_OS2
  238. #  define __32BIT__
  239. #  ifdef DECLARE_ERRNO
  240. #    undef DECLARE_ERRNO
  241. #  endif
  242. #  undef far
  243. #  define far
  244. #endif
  245.  
  246. #ifdef __EMX__
  247. #  define DOS_OS2
  248. #  define __32BIT__
  249. #  define far
  250. #endif /* __EMX__ */
  251.  
  252. #ifdef MSC                    /* defined for all versions of MSC now         */
  253. #  define DOS_OS2             /* Turbo C under DOS, MSC under DOS or OS/2    */
  254. #  if (defined(_MSC_VER) && (_MSC_VER >= 600))    /* new with 5.1 or 6.0 ... */
  255. #    undef DECLARE_ERRNO      /* errno is now a function in a dynamic link   */
  256. #  endif                      /*   library (or something)--incompatible with */
  257. #endif                        /*   the usual "extern int errno" declaration  */
  258.  
  259. #ifdef DOS_OS2                /* defined for all MS-DOS and OS/2 compilers   */
  260. #  include <io.h>             /* lseek(), open(), setftime(), dup(), creat() */
  261. #  include <time.h>           /* localtime() */
  262. #endif
  263.  
  264. #ifdef OS2                    /* defined for all OS/2 compilers */
  265. #  ifdef isupper
  266. #    undef isupper
  267. #  endif
  268. #  ifdef tolower
  269. #    undef tolower
  270. #  endif
  271. #  define isupper(x)   IsUpperNLS((unsigned char)(x))
  272. #  define tolower(x)   ToLowerNLS((unsigned char)(x))
  273. #endif
  274.  
  275. #ifdef WIN32
  276. #  include <io.h>             /* read(), open(), etc. */
  277. #  include <time.h>
  278. #  include <memory.h>
  279. #  include <direct.h>         /* mkdir() */
  280. #  ifdef FILE_IO_C
  281. #    include <fcntl.h>
  282. #    include <conio.h>
  283. #    include <sys\types.h>
  284. #    include <sys\utime.h>
  285. #    include <windows.h>
  286. #    define DOS_OS2
  287. #    define getch() getchar()
  288. #  endif
  289. #endif
  290.  
  291. /*---------------------------------------------------------------------------
  292.     Followed by some VMS (mostly) stuff:
  293.   ---------------------------------------------------------------------------*/
  294.  
  295. #ifdef VMS
  296. #  include <time.h>               /* the usual non-BSD time functions */
  297. #  include <file.h>               /* same things as fcntl.h has */
  298. #  include <rms.h>
  299. #  define _MAX_PATH NAM$C_MAXRSS  /* to define FILNAMSIZ below */
  300. #  define UNIX                    /* can share most of same code from now on */
  301. #  define RETURN    return_VMS    /* VMS interprets return codes incorrectly */
  302. #else /* !VMS */
  303. #  ifndef THINK_C
  304. #    define RETURN  return        /* only used in main() */
  305. #  else
  306. #    define RETURN(v) { int n;\
  307.                         n = (v);\
  308.                         fprintf(stderr, "\npress <return> to continue ");\
  309.                         while (getc(stdin) != '\n');\
  310.                         putc('\n', stderr);\
  311.                         InitCursor();\
  312.                         goto start;\
  313.                       }
  314. #  endif
  315. #  ifdef V7
  316. #    define O_RDONLY  0
  317. #    define O_WRONLY  1
  318. #    define O_RDWR    2
  319. #  else /* !V7 */
  320. #    ifdef MTS
  321. #      include <sys/file.h>     /* MTS uses this instead of fcntl.h */
  322. #      include <timeb.h>
  323. #      include <time.h>
  324. #    else /* !MTS */
  325. #      ifdef COHERENT           /* Coherent 3.10/Mark Williams C */
  326. #        include <sys/fcntl.h>
  327. #        define SHORT_NAMES
  328. #        define tzset  settz
  329. #      else /* !COHERENT */
  330. #        ifdef OSK
  331. #          include <sys/file.h>
  332. #        else
  333. #          include <fcntl.h>      /* O_BINARY for open() w/o CR/LF translation */
  334. #        endif /* ?OSK */
  335. #      endif /* ?COHERENT */
  336. #    endif /* ?MTS */
  337. #  endif /* ?V7 */
  338. #endif /* ?VMS */
  339.  
  340. #if (defined(MSDOS) || defined(VMS))
  341. #  define DOS_VMS
  342. #endif
  343.  
  344. /*---------------------------------------------------------------------------
  345.     And some Mac stuff for good measure:
  346.   ---------------------------------------------------------------------------*/
  347.  
  348. #ifdef THINK_C
  349. #  define MACOS
  350. #  ifndef __STDC__            /* if Think C hasn't defined __STDC__ ... */
  351. #    define __STDC__ 1        /*   make sure it's defined: it needs it */
  352. #  else /* __STDC__ defined */
  353. #    if !__STDC__             /* sometimes __STDC__ is defined as 0; */
  354. #      undef __STDC__         /*   it needs to be 1 or required header */
  355. #      define __STDC__ 1      /*   files are not properly included. */
  356. #    endif /* !__STDC__ */
  357. #  endif /* ?defined(__STDC__) */
  358. #endif /* THINK_C */
  359.  
  360. #ifdef MPW
  361. #  define MACOS
  362. #  include <Errors.h>
  363. #  include <Files.h>
  364. #  include <Memory.h>
  365. #  include <Quickdraw.h>
  366. #  include <ToolUtils.h>
  367. #  define CtoPstr c2pstr
  368. #  define PtoCstr p2cstr
  369. #  ifdef CR
  370. #    undef  CR
  371. #  endif
  372. #endif /* MPW */
  373.  
  374. #ifdef MACOS
  375. #  define open(x,y) macopen(x,y, gnVRefNum, glDirID)
  376. #  define close macclose
  377. #  define read macread
  378. #  define write macwrite
  379. #  define lseek maclseek
  380. #  define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType)
  381. #  define stat(x,y) macstat(x,y,gnVRefNum, glDirID)
  382.  
  383. #  ifndef isascii
  384. #    define isascii(c) ((unsigned char)(c) <= 0x3F)
  385. #  endif
  386.  
  387. #  include "macstat.h"
  388.  
  389. typedef struct _ZipExtraHdr {
  390.     unsigned short header;    /*    2 bytes */
  391.     unsigned short data;      /*    2 bytes */
  392. } ZIP_EXTRA_HEADER;
  393.  
  394. typedef struct _MacInfoMin {
  395.     unsigned short header;    /*    2 bytes */
  396.     unsigned short data;      /*    2 bytes */
  397.     unsigned long signature;  /*    4 bytes */
  398.     FInfo finfo;              /*   16 bytes */
  399.     unsigned long lCrDat;     /*    4 bytes */
  400.     unsigned long lMdDat;     /*    4 bytes */
  401.     unsigned long flags ;     /*    4 bytes */
  402.     unsigned long lDirID;     /*    4 bytes */
  403.                               /*------------*/
  404. } MACINFOMIN;                 /* = 40 bytes for size of data */
  405.  
  406. typedef struct _MacInfo {
  407.     unsigned short header;    /*    2 bytes */
  408.     unsigned short data;      /*    2 bytes */
  409.     unsigned long signature;  /*    4 bytes */
  410.     FInfo finfo;              /*   16 bytes */
  411.     unsigned long lCrDat;     /*    4 bytes */
  412.     unsigned long lMdDat;     /*    4 bytes */
  413.     unsigned long flags ;     /*    4 bytes */
  414.     unsigned long lDirID;     /*    4 bytes */
  415.     char rguchVolName[28];    /*   28 bytes */
  416.                               /*------------*/
  417. } MACINFO;                    /* = 68 bytes for size of data */
  418. #endif /* MACOS */
  419.  
  420. /*---------------------------------------------------------------------------
  421.     And finally, some random extra stuff:
  422.   ---------------------------------------------------------------------------*/
  423.  
  424. #ifdef MINIX
  425. #  include <stdio.h>
  426. #endif
  427.  
  428. #ifdef SHORT_NAMES         /* Mark Williams C, ...? */
  429. #  define extract_or_test_files    xtr_or_tst_files
  430. #  define extract_or_test_member   xtr_or_tst_member
  431. #endif
  432.  
  433. #ifdef MTS
  434. #  include <unix.h>          /* Some important non-ANSI routines */
  435. #  define mkdir(s,n) (-1)    /* No "make directory" capability */
  436. #  define EBCDIC             /* Set EBCDIC conversion on */
  437. #endif
  438.  
  439.  
  440.  
  441.  
  442.  
  443. /*************/
  444. /*  Defines  */
  445. /*************/
  446.  
  447. #ifndef WSIZE
  448. #  define WSIZE 0x8000       /* window size--must be a power of two, and */
  449. #endif /* !WSIZE */          /*  at least 32K for zip's deflate method */
  450.  
  451. #define DIR_BLKSIZ    64     /* number of directory entries per block
  452.                               *  (should fit in 4096 bytes, usually) */
  453. #ifndef INBUFSIZ
  454. #  define INBUFSIZ    2048   /* works for MS-DOS small model */
  455. #endif /* !INBUFSIZ */
  456.  
  457. /*
  458.  * If <limits.h> exists on most systems, should include that, since it may
  459.  * define some or all of the following:  NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
  460.  * _POSIX_PATH_MAX.
  461.  */
  462. #if (defined(DOS_OS2) || defined(OSK))
  463. #  include <limits.h>
  464. #endif /* DOS_OS2 */
  465.  
  466. #ifdef _MAX_PATH
  467. #  define FILNAMSIZ       (_MAX_PATH)
  468. #else /* !_MAX_PATH */
  469. #  define FILNAMSIZ       1025
  470. #endif /* ?_MAX_PATH */
  471.  
  472. #ifndef PATH_MAX
  473. #  ifdef MAXPATHLEN                /* defined in <sys/param.h> some systems */
  474. #    define PATH_MAX      MAXPATHLEN
  475. #  else
  476. #    ifndef OSK
  477. #      if FILENAME_MAX > 255         /* used like PATH_MAX on some systems */
  478. #        define PATH_MAX    FILENAME_MAX
  479. #      else
  480. #        define PATH_MAX    (FILNAMSIZ - 1)
  481. #      endif /* FILENAME_MAX */
  482. #    else
  483. #      define PATH_MAX (FILNAMSIZ - 1)
  484. #    endif /* ?OSK */
  485. #  endif /* ?MAXPATHLEN */
  486. #endif /* !PATH_MAX */
  487.  
  488. #define OUTBUFSIZ         INBUFSIZ
  489.  
  490. #define ZSUFX             ".zip"
  491. #define CENTRAL_HDR_SIG   "\113\001\002"   /* the infamous "PK" signature */
  492. #define LOCAL_HDR_SIG     "\113\003\004"   /*  bytes, sans "P" (so unzip */
  493. #define END_CENTRAL_SIG   "\113\005\006"   /*  executable not mistaken for */
  494. #define EXTD_LOCAL_SIG    "\113\007\010"   /*  zipfile itself) */
  495.  
  496. #define SKIP              0    /* choice of activities for do_string() */
  497. #define DISPLAY           1
  498. #define FILENAME          2
  499. #define EXTRA_FIELD       3
  500.  
  501. #define DOES_NOT_EXIST    -1   /* return values for check_for_newer() */
  502. #define EXISTS_AND_OLDER  0
  503. #define EXISTS_AND_NEWER  1
  504.  
  505. #define DOS_OS2_FAT_      0    /* version_made_by codes (central dir) */
  506. #define AMIGA_            1
  507. #define VMS_              2    /* make sure these are not defined on */
  508. #define UNIX_             3    /*  the respective systems!!  (like, for */
  509. #define VM_CMS_           4    /*  instance, "VMS", or "UNIX":  CFLAGS = */
  510. #define ATARI_            5    /*  -O -DUNIX) */
  511. #define OS2_HPFS_         6
  512. #define MAC_              7
  513. #define Z_SYSTEM_         8
  514. #define CPM_              9
  515. /* #define TOPS20_   10?  (TOPS20_ is to be defined in PKZIP 2.0...)  */
  516. #define NUM_HOSTS         10   /* index of last system + 1 */
  517.  
  518. #define STORED            0    /* compression methods */
  519. #define SHRUNK            1
  520. #define REDUCED1          2
  521. #define REDUCED2          3
  522. #define REDUCED3          4
  523. #define REDUCED4          5
  524. #define IMPLODED          6
  525. #define TOKENIZED         7
  526. #define DEFLATED          8
  527. #define NUM_METHODS       9    /* index of last method + 1 */
  528. /* don't forget to update list_files() appropriately if NUM_METHODS changes */
  529.  
  530. #define DF_MDY            0    /* date format 10/26/91 (USA only) */
  531. #define DF_DMY            1    /* date format 26/10/91 (most of the world) */
  532. #define DF_YMD            2    /* date format 91/10/26 (a few countries) */
  533.  
  534. #define UNZIP_VERSION     20   /* compatible with PKUNZIP 2.0 */
  535. #define VMS_VERSION       42   /* if OS-needed-to-extract is VMS:  can do */
  536.  
  537. /*---------------------------------------------------------------------------
  538.     True sizes of the various headers, as defined by PKWare--so it is not
  539.     likely that these will ever change.  But if they do, make sure both these
  540.     defines AND the typedefs below get updated accordingly.
  541.   ---------------------------------------------------------------------------*/
  542. #define LREC_SIZE     26    /* lengths of local file headers, central */
  543. #define CREC_SIZE     42    /*  directory headers, and the end-of-    */
  544. #define ECREC_SIZE    18    /*  central-dir record, respectively      */
  545.  
  546. #define MAX_BITS      13                 /* used in unShrink() */
  547. #define HSIZE         (1 << MAX_BITS)    /* size of global work area */
  548.  
  549. #define LF      10    /* '\n' on ASCII machines.  Must be 10 due to EBCDIC */
  550. #define CR      13    /* '\r' on ASCII machines.  Must be 13 due to EBCDIC */
  551. #define CTRLZ   26    /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
  552.  
  553. #ifdef EBCDIC
  554. #  define ascii_to_native(c)   ebcdic[(c)]
  555. #  define NATIVE    "EBCDIC"
  556. #endif
  557.  
  558. #ifdef MPW
  559. #  define FFLUSH    putc('\n',stderr);
  560. #else /* !MPW */
  561. #  define FFLUSH    fflush(stderr);
  562. #endif /* ?MPW */
  563.  
  564. #ifdef VMS
  565. #  define ENV_UNZIP     "UNZIP_OPTS"      /* name of environment variable */
  566. #  define ENV_ZIPINFO   "ZIPINFO_OPTS"
  567. #else /* !VMS */
  568. #  define ENV_UNZIP     "UNZIP"
  569. #  define ENV_ZIPINFO   "ZIPINFO"
  570. #endif /* ?VMS */
  571.  
  572. #ifdef CRYPT
  573. #  define PWLEN         80
  574. #  define DECRYPT(b)    (update_keys(t=((b)&0xff)^decrypt_byte()),t)
  575. #endif /* CRYPT */
  576.  
  577. #ifdef QQ  /* Newtware version */
  578. #  define QCOND   (!quietflg)   /* for no file comments with -vq or -vqq */
  579. #else      /* (original) Bill Davidsen version  */
  580. #  define QCOND   (which_hdr)   /* no way to kill file comments with -v, -l */
  581. #endif
  582.  
  583. #ifndef TRUE
  584. #  define TRUE      1   /* sort of obvious */
  585. #endif
  586. #ifndef FALSE
  587. #  define FALSE     0
  588. #endif
  589.  
  590. #ifndef SEEK_SET        /* These should all be declared in stdio.h!  But   */
  591. #  define SEEK_SET  0   /*  since they're not (in many cases), do so here. */
  592. #  define SEEK_CUR  1
  593. #  define SEEK_END  2
  594. #endif
  595.  
  596. #ifndef S_IRUSR
  597. #  define S_IRWXU       00700       /* read, write, execute: owner */
  598. #  define S_IRUSR       00400       /* read permission: owner */
  599. #  define S_IWUSR       00200       /* write permission: owner */
  600. #  define S_IXUSR       00100       /* execute permission: owner */
  601. #  define S_IRWXG       00070       /* read, write, execute: group */
  602. #  define S_IRGRP       00040       /* read permission: group */
  603. #  define S_IWGRP       00020       /* write permission: group */
  604. #  define S_IXGRP       00010       /* execute permission: group */
  605. #  define S_IRWXO       00007       /* read, write, execute: other */
  606. #  define S_IROTH       00004       /* read permission: other */
  607. #  define S_IWOTH       00002       /* write permission: other */
  608. #  define S_IXOTH       00001       /* execute permission: other */
  609. #endif /* !S_IRUSR */
  610.  
  611. #ifdef ZIPINFO      /* these are individually checked because SysV doesn't */
  612. #  ifndef S_IFBLK   /*  have some of them, Microsoft C others, etc. */
  613. #    define   S_IFBLK     0060000     /* block special */
  614. #  endif
  615. #  ifndef S_IFIFO  /* in Borland C, not MSC */
  616. #    define   S_IFIFO     0010000     /* fifo */
  617. #  endif
  618. #  ifndef S_IFLNK  /* in BSD, not SysV */
  619. #    define   S_IFLNK     0120000     /* symbolic link */
  620. #  endif
  621. #  ifndef S_IFSOCK  /* in BSD, not SysV */
  622. #    define   S_IFSOCK    0140000     /* socket */
  623. #  endif
  624. #  ifndef S_ISUID
  625. #    define S_ISUID       04000       /* set user id on execution */
  626. #  endif
  627. #  ifndef S_ISGID
  628. #    define S_ISGID       02000       /* set group id on execution */
  629. #  endif
  630. #  ifndef S_ISVTX
  631. #    define S_ISVTX       01000       /* directory permissions control */
  632. #  endif
  633. #  ifndef S_ENFMT
  634. #    define S_ENFMT       S_ISGID     /* record locking enforcement flag */
  635. #  endif
  636. #endif /* ZIPINFO */
  637.  
  638.  
  639.  
  640.  
  641.  
  642. /**************/
  643. /*  Typedefs  */
  644. /**************/
  645.  
  646. #ifndef _BULL_SOURCE                /* Bull has it defined somewhere already */
  647.    typedef unsigned char  byte;     /* code assumes UNSIGNED bytes */
  648. #endif /* !_BULL_SOURCE */
  649.  
  650. typedef char              boolean;
  651. typedef long              longint;
  652. typedef unsigned short    UWORD;
  653. typedef unsigned long     ULONG;
  654.  
  655. typedef struct min_info {
  656.     unsigned unix_attr;
  657.     unsigned dos_attr;
  658.     int hostnum;
  659.     longint offset;
  660.     ULONG compr_size;        /* compressed size (needed if extended header) */
  661.     ULONG crc;               /* crc (needed if extended header) */
  662.     unsigned encrypted : 1;  /* file encrypted: decrypt before uncompressing */
  663.     unsigned ExtLocHdr : 1;  /* use time instead of CRC for decrypt check */
  664.     unsigned text : 1;       /* file is text or binary */
  665.     unsigned lcflag : 1;     /* convert filename to lowercase */
  666. } min_info;
  667.  
  668. typedef struct VMStimbuf {
  669.     char *revdate;           /* (both correspond to Unix modtime/st_mtime) */
  670.     char *credate;
  671. } VMStimbuf;
  672.  
  673. /*---------------------------------------------------------------------------
  674.     Zipfile layout declarations.  If these headers ever change, make sure the
  675.     xxREC_SIZE defines (above) change with them!
  676.   ---------------------------------------------------------------------------*/
  677.  
  678.    typedef byte   local_byte_hdr[ LREC_SIZE ];
  679. #      define L_VERSION_NEEDED_TO_EXTRACT_0     0
  680. #      define L_VERSION_NEEDED_TO_EXTRACT_1     1
  681. #      define L_GENERAL_PURPOSE_BIT_FLAG        2
  682. #      define L_COMPRESSION_METHOD              4
  683. #      define L_LAST_MOD_FILE_TIME              6
  684. #      define L_LAST_MOD_FILE_DATE              8
  685. #      define L_CRC32                           10
  686. #      define L_COMPRESSED_SIZE                 14
  687. #      define L_UNCOMPRESSED_SIZE               18
  688. #      define L_FILENAME_LENGTH                 22
  689. #      define L_EXTRA_FIELD_LENGTH              24
  690.  
  691.    typedef byte   cdir_byte_hdr[ CREC_SIZE ];
  692. #      define C_VERSION_MADE_BY_0               0
  693. #      define C_VERSION_MADE_BY_1               1
  694. #      define C_VERSION_NEEDED_TO_EXTRACT_0     2
  695. #      define C_VERSION_NEEDED_TO_EXTRACT_1     3
  696. #      define C_GENERAL_PURPOSE_BIT_FLAG        4
  697. #      define C_COMPRESSION_METHOD              6
  698. #      define C_LAST_MOD_FILE_TIME              8
  699. #      define C_LAST_MOD_FILE_DATE              10
  700. #      define C_CRC32                           12
  701. #      define C_COMPRESSED_SIZE                 16
  702. #      define C_UNCOMPRESSED_SIZE               20
  703. #      define C_FILENAME_LENGTH                 24
  704. #      define C_EXTRA_FIELD_LENGTH              26
  705. #      define C_FILE_COMMENT_LENGTH             28
  706. #      define C_DISK_NUMBER_START               30
  707. #      define C_INTERNAL_FILE_ATTRIBUTES        32
  708. #      define C_EXTERNAL_FILE_ATTRIBUTES        34
  709. #      define C_RELATIVE_OFFSET_LOCAL_HEADER    38
  710.  
  711.    typedef byte   ec_byte_rec[ ECREC_SIZE+4 ];
  712. /*     define SIGNATURE                         0   space-holder only */
  713. #      define NUMBER_THIS_DISK                  4
  714. #      define NUM_DISK_WITH_START_CENTRAL_DIR   6
  715. #      define NUM_ENTRIES_CENTRL_DIR_THS_DISK   8
  716. #      define TOTAL_ENTRIES_CENTRAL_DIR         10
  717. #      define SIZE_CENTRAL_DIRECTORY            12
  718. #      define OFFSET_START_CENTRAL_DIRECTORY    16
  719. #      define ZIPFILE_COMMENT_LENGTH            20
  720.  
  721.  
  722.    typedef struct local_file_header {                 /* LOCAL */
  723.        byte version_needed_to_extract[2];
  724.        UWORD general_purpose_bit_flag;
  725.        UWORD compression_method;
  726.        UWORD last_mod_file_time;
  727.        UWORD last_mod_file_date;
  728.        ULONG crc32;
  729.        ULONG compressed_size;
  730.        ULONG uncompressed_size;
  731.        UWORD filename_length;
  732.        UWORD extra_field_length;
  733.    } local_file_hdr;
  734.  
  735.    typedef struct central_directory_file_header {     /* CENTRAL */
  736.        byte version_made_by[2];
  737.        byte version_needed_to_extract[2];
  738.        UWORD general_purpose_bit_flag;
  739.        UWORD compression_method;
  740.        UWORD last_mod_file_time;
  741.        UWORD last_mod_file_date;
  742.        ULONG crc32;
  743.        ULONG compressed_size;
  744.        ULONG uncompressed_size;
  745.        UWORD filename_length;
  746.        UWORD extra_field_length;
  747.        UWORD file_comment_length;
  748.        UWORD disk_number_start;
  749.        UWORD internal_file_attributes;
  750.        ULONG external_file_attributes;
  751.        ULONG relative_offset_local_header;
  752.    } cdir_file_hdr;
  753.  
  754.    typedef struct end_central_dir_record {            /* END CENTRAL */
  755.        UWORD number_this_disk;
  756.        UWORD num_disk_with_start_central_dir;
  757.        UWORD num_entries_centrl_dir_ths_disk;
  758.        UWORD total_entries_central_dir;
  759.        ULONG size_central_directory;
  760.        ULONG offset_start_central_directory;
  761.        UWORD zipfile_comment_length;
  762.    } ecdir_rec;
  763.  
  764.  
  765.  
  766.  
  767.  
  768. /*************************/
  769. /*  Function Prototypes  */
  770. /*************************/
  771.  
  772. #ifndef __
  773. #  define __   OF
  774. #endif
  775.  
  776. /*---------------------------------------------------------------------------
  777.     Functions in unzip.c and/or zipinfo.c:
  778.   ---------------------------------------------------------------------------*/
  779. #ifndef NOPROTO
  780. int    usage                     __((int error));
  781. int    process_zipfile           __((void));
  782. int    find_end_central_dir      __((void));
  783. int    process_end_central_dir   __((void));
  784. int    list_files                __((void));                      /* unzip.c */
  785. int    process_cdir_file_hdr     __((void));                      /* unzip.c */
  786. int    process_local_file_hdr    __((void));                      /* unzip.c */
  787. int    process_central_dir       __((void));
  788. int    long_info                 __((void));                    /* zipinfo.c */
  789. int    short_info                __((void));                    /* zipinfo.c */
  790. char   *zipinfo_time             __((UWORD *datez, UWORD *timez));
  791.  
  792. /*---------------------------------------------------------------------------
  793.     Functions in extract.c:
  794.   ---------------------------------------------------------------------------*/
  795.  
  796. int    extract_or_test_files     __((void));
  797. /* static int   store_info               __((void)); */
  798. /* static int   extract_or_test_member   __((void)); */
  799. int    memextract                __((byte *, ULONG, byte *, ULONG));
  800. int    FlushMemory               __((void));
  801. int    ReadMemoryByte            __((UWORD *x));
  802.  
  803. /*---------------------------------------------------------------------------
  804.     Decompression functions:
  805.   ---------------------------------------------------------------------------*/
  806.  
  807. int    explode                   __((void));                    /* explode.c */
  808.  
  809. void   inflate                   __((void));                    /* inflate.c */
  810.  
  811. void   unReduce                  __((void));                   /* unreduce.c */
  812. /* static void  LoadFollowers    __((void));                    * unreduce.c */
  813.  
  814. void   unShrink                  __((void));                   /* unshrink.c */
  815. /* static void  partial_clear    __((void));                    * unshrink.c */
  816.  
  817. /*---------------------------------------------------------------------------
  818.     Functions in file_io.c and crypt.c:
  819.   ---------------------------------------------------------------------------*/
  820.  
  821. int    open_input_file           __((void));                    /* file_io.c */
  822. int    readbuf                   __((char *buf, register unsigned len));
  823. int    create_output_file        __((void));             /* file_io.c, vms.c */
  824. int    FillBitBuffer             __((void));                    /* file_io.c */
  825. int    ReadByte                  __((UWORD *x));                /* file_io.c */
  826. int    FlushOutput               __((void));             /* file_io.c, vms.c */
  827. /* static int   dos2unix         __((unsigned char *, int));     * file_io.c */
  828. void   set_file_time_and_close   __((void));                    /* file_io.c */
  829. void   handler                   __((int signal));              /* file_io.c */
  830. int    echo                      __((int opt));                 /* file_io.c */
  831. void   echoff                    __((int f));                   /* file_io.c */
  832. void   echon                     __((void));                    /* file_io.c */
  833. char   *getp                     __((char *, char *, int));     /* file_io.c */
  834.  
  835. int    decrypt_byte              __((void));                      /* crypt.c */
  836. void   update_keys               __((int));                       /* crypt.c */
  837. void   init_keys                 __((char *));                    /* crypt.c */
  838.  
  839. /*---------------------------------------------------------------------------
  840.     Macintosh file_io functions:
  841.   ---------------------------------------------------------------------------*/
  842.  
  843. #ifdef MACOS
  844. /* static int   IsHFSDisk        __((int)); */
  845.    void     macfstest            __((int));
  846.    int      macmkdir             __((char *, short, long));
  847.    void     ResolveMacVol        __((short, short *, long *, StringPtr));
  848.    short    macopen              __((char *, short, short, long));
  849.    short    maccreat             __((char *, short, long, OSType, OSType));
  850.    short    macread              __((short, char *, unsigned));
  851.    short    macwrite             __((short, char *, unsigned));
  852.    short    macclose             __((short));
  853.    long     maclseek             __((short, long, short));
  854. #endif
  855.  
  856. /*---------------------------------------------------------------------------
  857.     OS/2 file_io functions:
  858.   ---------------------------------------------------------------------------*/
  859.  
  860. void     ChangeNameForFAT  __((char *name));                   /* os2unzip.c */
  861. int      IsFileNameValid   __((char *name));                   /* os2unzip.c */
  862. int      GetCountryInfo    __((void));                         /* os2unzip.c */
  863. long     GetFileTime       __((char *name));                   /* os2unzip.c */
  864. void     SetPathInfo __((char *path, UWORD moddate, UWORD modtime, int flags));
  865. int      SetLongNameEA     __((char *name, char *longname));   /* os2unzip.c */
  866. int      IsEA              __((void *extra_field));            /* os2unzip.c */
  867. ULONG    SizeOfEAs         __((void *extra_field));            /* os2unzip.c */
  868. void     SetEAs            __((char *path, void *eablock));    /* os2unzip.c */
  869. int      IsUpperNLS        __((int nChr));                     /* os2unzip.c */
  870. int      ToLowerNLS        __((int nChr));                     /* os2unzip.c */
  871.  
  872. /*---------------------------------------------------------------------------
  873.     VMS file_io functions:
  874.   ---------------------------------------------------------------------------*/
  875.  
  876. int      check_format      __((void));                              /* vms.c */
  877. int      find_vms_attrs    __((void));                              /* vms.c */
  878. int      CloseOutputFile   __((void));                              /* vms.c */
  879. /* static byte *extract_block __((struct extra_block *, int *, byte *, int));*/
  880. /* static int  _flush_blocks  __((int final_flag));                  * vms.c */
  881. /* static int  _flush_records __((int final_flag));                  * vms.c */
  882. /* static int  WriteBuffer    __((unsigned char *buf, int len));     * vms.c */
  883. /* static int  WriteRecord    __((unsigned char *rec, int len));     * vms.c */
  884. /* static void message        __((int string, char *status));        * vms.c */
  885.  
  886. int      VMSmunch          __((char *, int, char *));          /* VMSmunch.c */
  887.  
  888. /*---------------------------------------------------------------------------
  889.     Functions in match.c, mapname.c, misc.c, etc.:
  890.   ---------------------------------------------------------------------------*/
  891.  
  892. int      match             __((char *string, char *pattern));     /* match.c */
  893.  
  894. int      mapname           __((int create_dirs));               /* mapname.c */
  895.  
  896. void     UpdateCRC         __((register unsigned char *s, register int len));
  897. int      do_string         __((unsigned int len, int option));     /* misc.c */
  898. time_t   dos_to_unix_time  __((unsigned ddate, unsigned dtime));   /* misc.c */
  899. int      check_for_newer   __((char *filename));                   /* misc.c */
  900. int      dateformat        __((void));                             /* misc.c */
  901. UWORD    makeword          __((byte *b));                          /* misc.c */
  902. ULONG    makelong          __((byte *sig));                        /* misc.c */
  903. void     return_VMS        __((int zip_error));                    /* misc.c */
  904.  
  905. void     envargs           __((int *, char ***, char *));       /* envargs.c */
  906.  
  907. #ifdef AMIGA
  908.    int   utime             __((char *file, time_t timep[]));      /* utime.c */
  909. #endif /* AMIGA */
  910.  
  911. #ifdef ZMEM   /* these MUST be ifdef'd because of conflicts with the std def */
  912.    char  *memset           __((register char *buf, register char init,
  913.                                register unsigned int len));        /* misc.c */
  914.    char  *memcpy           __((register char *dst, register char *src,
  915.                                register unsigned int len));        /* misc.c */
  916. #endif /* ZMEM */
  917.  
  918. #endif /* NOPROTO */
  919.  
  920.  
  921.  
  922. /************/
  923. /*  Macros  */
  924. /************/
  925.  
  926. #ifndef MAX
  927. #  define MAX(a,b)   ((a) > (b) ? (a) : (b))
  928. #endif
  929.  
  930. #ifndef MIN
  931. #  define MIN(a,b)   ((a) < (b) ? (a) : (b))
  932. #endif
  933.  
  934.  
  935. #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\
  936.    inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
  937.    if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\
  938.    else if(bufstart!=cur_zipfile_bufstart)\
  939.    {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
  940.    if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
  941.    inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\
  942.    {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}}
  943.  
  944. /*
  945.  *  Seek to the block boundary of the block which includes abs_offset,
  946.  *  then read block into input buffer and set pointers appropriately.
  947.  *  If block is already in the buffer, just set the pointers.  This macro
  948.  *  is used by process_end_central_dir (unzip.c) and do_string (misc.c).
  949.  *  A slightly modified version is embedded within extract_or_test_files
  950.  *  (unzip.c).  ReadByte and readbuf (file_io.c) are compatible.
  951.  *
  952.  *  macro LSEEK(abs_offset)
  953.  *      ULONG   abs_offset;
  954.  *  {
  955.  *      longint   request = abs_offset + extra_bytes;
  956.  *      longint   inbuf_offset = request % INBUFSIZ;
  957.  *      longint   bufstart = request - inbuf_offset;
  958.  *
  959.  *      if (request < 0) {
  960.  *          fprintf(stderr, SeekMsg, ReportMsg);
  961.  *          return(3);             /-* 3:  severe error in zipfile *-/
  962.  *      } else if (bufstart != cur_zipfile_bufstart) {
  963.  *          cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
  964.  *          if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
  965.  *              return(51);        /-* 51:  unexpected EOF *-/
  966.  *          inptr = inbuf + (int)inbuf_offset;
  967.  *          incnt -= (int)inbuf_offset;
  968.  *      } else {
  969.  *          incnt += (inptr-inbuf) - (int)inbuf_offset;
  970.  *          inptr = inbuf + (int)inbuf_offset;
  971.  *      }
  972.  *  }
  973.  *
  974.  */
  975.  
  976.  
  977. #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
  978.   {error_in_archive=error; if(error>1) return error;}
  979.  
  980. /*
  981.  *  Skip a variable-length field, and report any errors.  Used in zipinfo.c
  982.  *  and unzip.c in several functions.
  983.  *
  984.  *  macro SKIP_(length)
  985.  *      UWORD   length;
  986.  *  {
  987.  *      if (length && ((error = do_string(length, SKIP)) != 0)) {
  988.  *          error_in_archive = error;   /-* might be warning *-/
  989.  *          if (error > 1)              /-* fatal *-/
  990.  *              return (error);
  991.  *      }
  992.  *  }
  993.  *
  994.  */
  995.  
  996.  
  997. #define OUTB(intc) {*outptr++=(byte)(intc); if (++outcnt==OUTBUFSIZ)\
  998.   FlushOutput();}
  999.  
  1000. /*
  1001.  *  macro OUTB(intc)
  1002.  *  {
  1003.  *      *outptr++ = (byte)(intc);
  1004.  *      if (++outcnt == OUTBUFSIZ)
  1005.  *          FlushOutput();
  1006.  *  }
  1007.  *
  1008.  */
  1009.  
  1010.  
  1011. #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\
  1012.   zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;}
  1013.  
  1014. /*
  1015.  * macro READBIT(nbits,zdest)
  1016.  *  {
  1017.  *      if (nbits > bits_left)
  1018.  *          FillBitBuffer();
  1019.  *      zdest = (int)((UWORD)bitbuf & mask_bits[nbits]);
  1020.  *      bitbuf >>= nbits;
  1021.  *      bits_left -= nbits;
  1022.  *  }
  1023.  *
  1024.  */
  1025.  
  1026.  
  1027. #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
  1028.   (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits])
  1029.  
  1030.  
  1031. #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j<len;\
  1032.   (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
  1033.  
  1034. /*
  1035.  *  Remove all the ASCII carriage returns from buffer buf (length len),
  1036.  *  shortening as necessary (note that len gets modified in the process,
  1037.  *  so it CANNOT be an expression).  This macro is intended to be used
  1038.  *  BEFORE A_TO_N(); hence the check for CR instead of '\r'.  NOTE:  The
  1039.  *  if-test gets performed one time too many, but it doesn't matter.
  1040.  *
  1041.  *  macro NUKE_CRs(buf,len)
  1042.  *  {
  1043.  *      register int   i, j;
  1044.  *
  1045.  *      for (i = j = 0;  j < len;  (buf)[i++] = (buf)[j++])
  1046.  *          if ((buf)[j] == CR)
  1047.  *              ++j;
  1048.  *      len = i;
  1049.  *  }
  1050.  *
  1051.  */
  1052.  
  1053.  
  1054. #define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
  1055.   while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
  1056.   *ps2='\0';}
  1057.  
  1058. /*
  1059.  *  Copy the zero-terminated string in str1 into str2, converting any
  1060.  *  uppercase letters to lowercase as we go.  str2 gets zero-terminated
  1061.  *  as well, of course.  str1 and str2 may be the same character array.
  1062.  *
  1063.  *  macro TOLOWER( str1, str2 )
  1064.  *  {
  1065.  *      char  *ps1, *ps2;
  1066.  *
  1067.  *      ps1 = (str1) - 1;
  1068.  *      ps2 = (str2);
  1069.  *      while (*++ps1)
  1070.  *          *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
  1071.  *      *ps2='\0';
  1072.  *  }
  1073.  *
  1074.  *  NOTES:  This macro makes no assumptions about the characteristics of
  1075.  *    the tolower() function or macro (beyond its existence), nor does it
  1076.  *    make assumptions about the structure of the character set (i.e., it
  1077.  *    should work on EBCDIC machines, too).  The fact that either or both
  1078.  *    of isupper() and tolower() may be macros has been taken into account;
  1079.  *    watch out for "side effects" (in the C sense) when modifying this
  1080.  *    macro.
  1081.  */
  1082.  
  1083. #ifndef ascii_to_native
  1084. #  define ascii_to_native(c)   (c)
  1085. #  define A_TO_N(str1)
  1086. #else
  1087. #  ifndef NATIVE
  1088. #    define NATIVE     "native chars"
  1089. #  endif
  1090. #  define A_TO_N(str1) {register unsigned char *ps1;\
  1091.      for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
  1092. #endif
  1093.  
  1094. /*
  1095.  *  Translate the zero-terminated string in str1 from ASCII to the native
  1096.  *  character set. The translation is performed in-place and uses the
  1097.  *  ascii_to_native macro to translate each character.
  1098.  *
  1099.  *  macro A_TO_N( str1 )
  1100.  *  {
  1101.  *      register unsigned char *ps1;
  1102.  *
  1103.  *      for (ps1 = str1;  *ps1;  ++ps1)
  1104.  *          *ps1 = ascii_to_native(*ps1);
  1105.  *  }
  1106.  *
  1107.  *  NOTE:  Using the ascii_to_native macro means that is it the only part of
  1108.  *    unzip which knows which translation table (if any) is actually in use
  1109.  *    to produce the native character set.  This makes adding new character
  1110.  *    set translation tables easy, insofar as all that is needed is an
  1111.  *    appropriate ascii_to_native macro definition and the translation
  1112.  *    table itself.  Currently, the only non-ASCII native character set
  1113.  *    implemented is EBCDIC, but this may not always be so.
  1114.  */
  1115.  
  1116. /*************/
  1117. /*  Globals  */
  1118. /*************/
  1119.  
  1120.    extern int       aflag;
  1121. /* extern int       bflag;   reserved */
  1122.    extern int       cflag;
  1123.    extern int       fflag;
  1124.    extern int       jflag;
  1125.    extern int       overwrite_none;
  1126.    extern int       overwrite_all;
  1127.    extern int       force_flag;
  1128.    extern int       quietflg;
  1129. #ifdef DOS_OS2
  1130.    extern int       sflag;
  1131. #endif
  1132.    extern int       tflag;
  1133.    extern int       uflag;
  1134.    extern int       V_flag;
  1135. #ifdef VMS
  1136.    extern int       secinf;
  1137. #endif
  1138. #ifdef MACOS
  1139.    extern int       hfsflag;
  1140. #endif
  1141.    extern int       process_all_files;
  1142.    extern longint   csize;
  1143.    extern longint   ucsize;
  1144.    extern char      *fnames[];
  1145.    extern char      **fnv;
  1146.    extern char      sig[];
  1147.    extern char      answerbuf[];
  1148.    extern min_info  *pInfo;
  1149.    extern char      *key;
  1150.    extern ULONG     keys[];
  1151.  
  1152. #ifdef MACOS
  1153.    union work {
  1154.      struct {
  1155.        short *Prefix_of;        /* (8193 * sizeof(short)) */
  1156.        byte *Suffix_of;
  1157.        byte *Stack;
  1158.      } shrink;
  1159.      byte *Slide;
  1160.    };
  1161. #else
  1162.    union work {
  1163.      struct {
  1164.        short Prefix_of[HSIZE + 2];      /* (8194 * sizeof(short)) */
  1165.        byte Suffix_of[HSIZE + 2];       /* also s-f length_nodes (smaller) */
  1166.        byte Stack[HSIZE + 2];           /* also s-f distance_nodes (smaller) */
  1167.      } shrink;
  1168.      byte Slide[WSIZE];
  1169.    };
  1170. #endif
  1171.    extern union work area;
  1172.  
  1173. #  define prefix_of area.shrink.Prefix_of
  1174. #  define suffix_of area.shrink.Suffix_of
  1175. #  define stack area.shrink.Stack
  1176. #  define slide area.Slide
  1177.  
  1178.    extern ULONG     crc32val;
  1179.    extern UWORD     mask_bits[];
  1180.  
  1181.    extern byte      *inbuf;
  1182.    extern byte      *inptr;
  1183.    extern int       incnt;
  1184.    extern ULONG     bitbuf;
  1185.    extern int       bits_left;
  1186.    extern boolean   zipeof;
  1187.    extern int       zipfd;
  1188. #ifdef MSWIN
  1189.    extern char      *zipfn;
  1190. #else
  1191.    extern char      zipfn[];
  1192. #endif
  1193.    extern longint   extra_bytes;
  1194.    extern longint   cur_zipfile_bufstart;
  1195.    extern byte      *extra_field;
  1196.    extern char      local_hdr_sig[];
  1197.    extern char      central_hdr_sig[];
  1198.    extern char      end_central_sig[];
  1199.    extern local_file_hdr  lrec;
  1200.    extern cdir_file_hdr   crec;
  1201.    extern ecdir_rec       ecrec;
  1202.    extern struct stat     statbuf;
  1203.  
  1204.    extern byte      *outbuf;
  1205.    extern byte      *outptr;
  1206. #ifdef MSWIN
  1207.    extern byte __far *outout;
  1208.    extern char     *filename;
  1209. #else
  1210.    extern byte      *outout;
  1211.    extern char      filename[];
  1212. #endif
  1213.    extern longint   outpos;
  1214.    extern int       outcnt;
  1215.    extern int       outfd;
  1216.    extern int       mem_mode;
  1217.    extern int       disk_full;
  1218.  
  1219.    extern char      *EndSigMsg;
  1220.    extern char      *CentSigMsg;
  1221.    extern char      *SeekMsg;
  1222.    extern char      *ReportMsg;
  1223.  
  1224. #ifdef DECLARE_ERRNO
  1225.    extern int       errno;
  1226. #endif
  1227.  
  1228. #ifdef EBCDIC
  1229.    extern byte      ebcdic[];
  1230. #endif
  1231.  
  1232. #ifdef MACOS
  1233.    extern short     gnVRefNum;
  1234.    extern long      glDirID;
  1235.    extern OSType    gostCreator;
  1236.    extern OSType    gostType;
  1237.    extern boolean   fMacZipped;
  1238.    extern boolean   macflag;
  1239.    extern short     giCursor;
  1240.    extern CursHandle rghCursor[];
  1241. #endif
  1242.