home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / unzip540.zip / unzpriv.h < prev    next >
C/C++ Source or Header  |  1998-11-26  |  85KB  |  2,382 lines

  1. /*---------------------------------------------------------------------------
  2.  
  3.   unzpriv.h
  4.  
  5.   This header file contains private (internal) macros, typedefs, prototypes
  6.   and global-variable declarations used by all of the UnZip source files.
  7.   In a prior life it was part of the main unzip.h header, but now it is only
  8.   included by that header if UNZIP_INTERNAL is defined.
  9.  
  10.   ---------------------------------------------------------------------------*/
  11.  
  12.  
  13.  
  14. #ifndef __unzpriv_h   /* prevent multiple inclusions */
  15. #define __unzpriv_h
  16.  
  17. /* First thing: Signal all following code that we compile UnZip utilities! */
  18. #ifndef UNZIP
  19. #  define UNZIP
  20. #endif
  21.  
  22. /* GRR 960204:  MORE defined here in preparation for removal altogether */
  23. #ifndef MORE
  24. #  define MORE
  25. #endif
  26.  
  27. /* fUnZip should never need to be reentrant */
  28. #ifdef FUNZIP
  29. #  ifdef REENTRANT
  30. #    undef REENTRANT
  31. #  endif
  32. #  ifdef DLL
  33. #    undef DLL
  34. #  endif
  35. #endif
  36.  
  37. #if (defined(DLL) && !defined(REENTRANT))
  38. #  define REENTRANT
  39. #endif
  40.  
  41. #if (!defined(DYNAMIC_CRC_TABLE) && !defined(FUNZIP))
  42. #  define DYNAMIC_CRC_TABLE
  43. #endif
  44.  
  45. #if (defined(DYNAMIC_CRC_TABLE) && !defined(REENTRANT))
  46. #  ifndef DYNALLOC_CRCTAB
  47. #    define DYNALLOC_CRCTAB
  48. #  endif
  49. #endif
  50.  
  51. /*---------------------------------------------------------------------------
  52.     OS-dependent configuration for UnZip internals
  53.   ---------------------------------------------------------------------------*/
  54.  
  55. /* bad or (occasionally?) missing stddef.h: */
  56. #if (defined(M_XENIX) || defined(DNIX))
  57. #  define NO_STDDEF_H
  58. #endif
  59.  
  60. #if (defined(M_XENIX) && !defined(M_UNIX))   /* SCO Xenix only, not SCO Unix */
  61. #  define SCO_XENIX
  62. #  define NO_LIMITS_H        /* no limits.h, but MODERN defined */
  63. #  define NO_UID_GID         /* no uid_t/gid_t */
  64. #  define size_t int
  65. #endif
  66.  
  67. #ifdef realix   /* Modcomp Real/IX, real-time SysV.3 variant */
  68. #  define SYSV
  69. #  define NO_UID_GID         /* no uid_t/gid_t */
  70. #endif
  71.  
  72. #if (defined(_AIX) && !defined(_ALL_SOURCE))
  73. #  define _ALL_SOURCE
  74. #endif
  75.  
  76. #if defined(apollo)          /* defines __STDC__ */
  77. #    define NO_STDLIB_H
  78. #endif
  79.  
  80. #ifdef DNIX
  81. #  define SYSV
  82. #  define SHORT_NAMES         /* 14-char limitation on path components */
  83. /* #  define FILENAME_MAX  14 */
  84. #  define FILENAME_MAX  NAME_MAX    /* GRR:  experiment */
  85. #endif
  86.  
  87. #if (defined(SYSTEM_FIVE) || defined(__SYSTEM_FIVE))
  88. #  ifndef SYSV
  89. #    define SYSV
  90. #  endif
  91. #endif /* SYSTEM_FIVE || __SYSTEM_FIVE */
  92. #if (defined(M_SYSV) || defined(M_SYS5))
  93. #  ifndef SYSV
  94. #    define SYSV
  95. #  endif
  96. #endif /* M_SYSV || M_SYS5 */
  97. /* __SVR4 and __svr4__ catch Solaris on at least some combos of compiler+OS */
  98. #if (defined(__SVR4) || defined(__svr4__) || defined(sgi) || defined(__hpux))
  99. #  ifndef SYSV
  100. #    define SYSV
  101. #  endif
  102. #endif /* __SVR4 || __svr4__ || sgi || __hpux */
  103. #if (defined(LINUX) || defined(__QNX__))
  104. #  ifndef SYSV
  105. #    define SYSV
  106. #  endif
  107. #endif /* LINUX || __QNX__ */
  108.  
  109. #if (defined(ultrix) || defined(__ultrix) || defined(bsd4_2))
  110. #  if (!defined(BSD) && !defined(SYSV))
  111. #    define BSD
  112. #  endif
  113. #endif /* ultrix || __ultrix || bsd4_2 */
  114. #if (defined(sun) || defined(pyr) || defined(CONVEX))
  115. #  if (!defined(BSD) && !defined(SYSV))
  116. #    define BSD
  117. #  endif
  118. #endif /* sun || pyr || CONVEX */
  119.  
  120. #ifdef pyr  /* Pyramid:  has BSD and AT&T "universes" */
  121. #  ifdef BSD
  122. #    define pyr_bsd
  123. #    define USE_STRINGS_H  /* instead of more common string.h */
  124. #    define ZMEM           /* ZMEM now uses bcopy/bzero: not in AT&T universe */
  125. #  endif                   /* (AT&T memcpy claimed to be very slow, though) */
  126. #  define DECLARE_ERRNO
  127. #endif /* pyr */
  128.  
  129. /* stat() bug for Borland, VAX C (also GNU?), and Atari ST MiNT on TOS
  130.  * filesystems:  returns 0 for wildcards!  (returns 0xffffffff on Minix
  131.  * filesystem or `U:' drive under Atari MiNT.)  Watcom C was previously
  132.  * included on this list; it would be good to know what version the problem
  133.  * was fixed at, if it did exist.  Watcom 10.6 has a separate stat() problem:
  134.  * it fails on "." when the current directory is a root.  This is covered by
  135.  * giving it a separate definition of SSTAT in OS-specific header files. */
  136. #if (defined(__TURBOC__) || defined(VMS) || defined(__MINT__))
  137. #  define WILD_STAT_BUG
  138. #endif
  139.  
  140. #ifdef WILD_STAT_BUG
  141. #  define SSTAT(path,pbuf) (iswild(path) || stat(path,pbuf))
  142. #else
  143. #  define SSTAT stat
  144. #endif
  145.  
  146. #ifdef REGULUS  /* returns the inode number on success(!)...argh argh argh */
  147. #  define stat(p,s) zstat((p),(s))
  148. #endif
  149.  
  150. #define STRNICMP zstrnicmp
  151.  
  152. /*---------------------------------------------------------------------------
  153.     OS-dependent includes
  154.   ---------------------------------------------------------------------------*/
  155.  
  156. #ifdef EFT
  157. #  define LONGINT off_t  /* Amdahl UTS nonsense ("extended file types") */
  158. #else
  159. #  define LONGINT long
  160. #endif
  161.  
  162. #ifdef MODERN
  163. #  ifndef NO_STDDEF_H
  164. #    include <stddef.h>
  165. #  endif
  166. #  ifndef NO_STDLIB_H
  167. #    include <stdlib.h>  /* standard library prototypes, malloc(), etc. */
  168. #  endif
  169.    typedef size_t extent;
  170. #else /* !MODERN */
  171. #  ifndef AOS_VS         /* mostly modern? */
  172.      LONGINT lseek();
  173. #    ifdef VAXC          /* not fully modern, but does have stdlib.h and void */
  174. #      include <stdlib.h>
  175. #    else
  176.        char *malloc();
  177. #    endif /* ?VAXC */
  178. #  endif /* !AOS_VS */
  179.    typedef unsigned int extent;
  180. #endif /* ?MODERN */
  181.  
  182.  
  183. #ifndef MINIX            /* Minix needs it after all the other includes (?) */
  184. #  include <stdio.h>
  185. #endif
  186. #include <ctype.h>       /* skip for VMS, to use tolower() function? */
  187. #include <errno.h>       /* used in mapname() */
  188. #ifdef USE_STRINGS_H
  189. #  include <strings.h>   /* strcpy, strcmp, memcpy, index/rindex, etc. */
  190. #else
  191. #  include <string.h>    /* strcpy, strcmp, memcpy, strchr/strrchr, etc. */
  192. #endif
  193. #if (defined(MODERN) && !defined(NO_LIMITS_H))
  194. #  include <limits.h>    /* GRR:  EXPERIMENTAL!  (can be deleted) */
  195. #endif
  196.  
  197. /* this include must be down here for SysV.4, for some reason... */
  198. #include <signal.h>      /* used in unzip.c, fileio.c */
  199.  
  200.  
  201. /*---------------------------------------------------------------------------
  202.     API (DLL) section:
  203.   ---------------------------------------------------------------------------*/
  204.  
  205. #ifdef DLL
  206. #  define MAIN   UZ_EXP UzpMain   /* was UzpUnzip */
  207. #  ifdef OS2DLL
  208. #    undef Info
  209. #    define REDIRECTC(c)             varputchar(__G__ c)
  210. #    define REDIRECTPRINT(buf,size)  varmessage(__G__ buf, size)
  211. #    define FINISH_REDIRECT()        finish_REXX_redirect(__G)
  212. #  else
  213. #    define REDIRECTC(c)
  214. #    define REDIRECTPRINT(buf,size)  0
  215. #    define FINISH_REDIRECT()        close_redirect(__G)
  216. #  endif
  217. #endif
  218.  
  219. /*---------------------------------------------------------------------------
  220.     Acorn RISCOS section:
  221.   ---------------------------------------------------------------------------*/
  222.  
  223. #ifdef RISCOS
  224. #  include "acorn/riscos.h"
  225. #endif
  226.  
  227. /*---------------------------------------------------------------------------
  228.     Amiga section:
  229.   ---------------------------------------------------------------------------*/
  230.  
  231. #ifdef AMIGA
  232. #  include "amiga/amiga.h"
  233. #endif
  234.  
  235. /*---------------------------------------------------------------------------
  236.     AOS/VS section (somewhat similar to Unix, apparently):
  237.   ---------------------------------------------------------------------------*/
  238.  
  239. #ifdef AOS_VS
  240. #  ifdef FILEIO_C
  241. #    include "aosvs/aosvs.h"
  242. #  endif
  243. #endif
  244.  
  245. /*---------------------------------------------------------------------------
  246.     Atari ST section:
  247.   ---------------------------------------------------------------------------*/
  248.  
  249. #ifdef ATARI
  250. #  include <time.h>
  251. #  include <stat.h>
  252. #  include <fcntl.h>
  253. #  include <limits.h>
  254. #  define SYMLINKS
  255. #  define EXE_EXTENSION  ".tos"
  256. #  ifndef DATE_FORMAT
  257. #    define DATE_FORMAT  DF_DMY
  258. #  endif
  259. #  define DIR_END        '/'
  260. #  define INT_SPRINTF
  261. #  define timezone      _timezone
  262. #  define lenEOL        2
  263. #  define PutNativeEOL  {*q++ = native(CR); *q++ = native(LF);}
  264. #  undef SHORT_NAMES
  265. #  if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
  266. #    define TIMESTAMP
  267. #  endif
  268. #endif
  269.  
  270. /*---------------------------------------------------------------------------
  271.     BeOS section:
  272.   ---------------------------------------------------------------------------*/
  273.  
  274. #ifdef __BEOS__
  275. #  include <sys/types.h>          /* [cjh]:  This is pretty much a generic  */
  276. #  include <sys/stat.h>           /* POSIX 1003.1 system; see beos/ for     */
  277. #  include <fcntl.h>              /* extra code to deal with our extra file */
  278. #  include <sys/param.h>          /* attributes. */
  279. #  include <unistd.h>
  280. #  include <utime.h>
  281. #  define DIRENT
  282. #  include <time.h>
  283. #  ifndef DATE_FORMAT
  284. #    define DATE_FORMAT DF_MDY  /* GRR:  customize with locale.h somehow? */
  285. #  endif
  286. #  define lenEOL        1
  287. #  define PutNativeEOL  *q++ = native(LF);
  288. #  define SCREENLINES   screenlines()
  289. #  define USE_EF_UT_TIME
  290. #  define SET_DIR_ATTRIB
  291. #  if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
  292. #    define TIMESTAMP
  293. #  endif
  294. #  define RESTORE_UIDGID
  295. #  define NO_GMTIME               /* maybe DR10 will have timezones... */
  296. #  define INT_SPRINTF
  297. #  define SYMLINKS
  298. #  define MAIN main_stub          /* now that we're using a wrapper... */
  299. #endif
  300.  
  301. /*---------------------------------------------------------------------------
  302.     Human68k/X68000 section:
  303.   ---------------------------------------------------------------------------*/
  304.  
  305. #ifdef __human68k__    /* DO NOT DEFINE DOS_OS2 HERE!  If Human68k is so much */
  306. #  include <time.h>    /*  like MS-DOS and/or OS/2, create DOS_H68_OS2 macro. */
  307. #  include <fcntl.h>
  308. #  include <io.h>
  309. #  include <conio.h>
  310. #  include <jctype.h>
  311. #  include <sys/stat.h>
  312. #  ifndef DATE_FORMAT
  313. #    define DATE_FORMAT DF_YMD   /* Japanese standard */
  314. #  endif
  315.       /* GRR:  these EOL macros are guesses */
  316. #  define lenEOL        2
  317. #  define PutNativeEOL  {*q++ = native(CR); *q++ = native(LF);}
  318. #  define EXE_EXTENSION ".exe"   /* just a guess... */
  319. #endif
  320.  
  321. /*---------------------------------------------------------------------------
  322.     Mac section:
  323.   ---------------------------------------------------------------------------*/
  324.  
  325. #ifdef MACOS
  326. #  include "maccfg.h"
  327. #endif /* MACOS */
  328.  
  329. /*---------------------------------------------------------------------------
  330.     MS-DOS, OS/2, FLEXOS section:
  331.   ---------------------------------------------------------------------------*/
  332.  
  333. #ifdef WINDLL
  334. #  define MSWIN
  335. #  ifdef MORE
  336. #    undef MORE
  337. #  endif
  338. #  ifdef OS2_EAS
  339. #    undef OS2_EAS
  340. #  endif
  341. #endif
  342.  
  343. #if (defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__)))
  344. #  ifndef MSC
  345. #    define MSC               /* This should work for older MSC, too!  */
  346. #  endif
  347. #endif
  348.  
  349. #if (defined(MSDOS) || defined(OS2) || defined(FLEXOS))
  350. #  include <sys/types.h>      /* off_t, time_t, dev_t, ... */
  351. #  include <sys/stat.h>
  352. #  include <io.h>             /* lseek(), open(), setftime(), dup(), creat() */
  353. #  include <time.h>           /* localtime() */
  354. #  include <fcntl.h>          /* O_BINARY for open() w/o CR/LF translation */
  355.  
  356. #  ifdef OS2                  /* defined for all OS/2 compilers */
  357. #    include "os2/os2cfg.h"
  358. #  else
  359. #    ifdef FLEXOS
  360. #      include "flexos/flxcfg.h"
  361. #    else
  362. #      include "msdos/doscfg.h"
  363. #    endif
  364. #  endif
  365.  
  366. #  if (defined(_MSC_VER) && (_MSC_VER == 700) && !defined(GRR))
  367.     /*
  368.      * ARGH.  MSC 7.0 libraries think times are based on 1899 Dec 31 00:00, not
  369.      *  1970 Jan 1 00:00.  So we have to diddle time_t's appropriately:  add or
  370.      *  subtract 70 years' worth of seconds; i.e., number of days times 86400;
  371.      *  i.e., (70*365 regular days + 17 leap days + 1 1899 day) * 86400 ==
  372.      *  (25550 + 17 + 1) * 86400 == 2209075200 seconds.  We know time_t is an
  373.      *  unsigned long (ulg) on the only system with this bug.
  374.      */
  375. #    define TIMET_TO_NATIVE(x)  (x) += (ulg)2209075200L;
  376. #    define NATIVE_TO_TIMET(x)  (x) -= (ulg)2209075200L;
  377. #  endif
  378. #  if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0450))
  379. #    define timezone      _timezone
  380. #  endif
  381. #  if (defined(__GO32__) || defined(FLEXOS))
  382. #    define DIR_END       '/'
  383. #  else
  384. #    define DIR_END       '\\'  /* OS uses '\\' as directory separator */
  385. #    define DIR_END2      '/'   /* also check for '/' (RTL may convert) */
  386. #  endif
  387. #  ifndef WIN32
  388. #    ifdef DATE_FORMAT
  389. #      undef DATE_FORMAT
  390. #    endif
  391. #    define DATE_FORMAT   dateformat()
  392. #  endif
  393. #  define lenEOL          2
  394. #  define PutNativeEOL    {*q++ = native(CR); *q++ = native(LF);}
  395. #  define USE_EF_UT_TIME
  396. #endif /* MSDOS || OS2 || FLEXOS */
  397.  
  398. /*---------------------------------------------------------------------------
  399.     MTS section (piggybacks UNIX, I think):
  400.   ---------------------------------------------------------------------------*/
  401.  
  402. #ifdef MTS
  403. #  include <sys/types.h>      /* off_t, time_t, dev_t, ... */
  404. #  include <sys/stat.h>
  405. #  include <sys/file.h>       /* MTS uses this instead of fcntl.h */
  406. #  include <timeb.h>
  407. #  include <time.h>
  408. #  include <unix.h>           /* some important non-ANSI routines */
  409. #  define mkdir(s,n) (-1)     /* no "make directory" capability */
  410. #  define EBCDIC              /* set EBCDIC conversion on */
  411. #  define NO_STRNICMP         /* unzip's is as good the one in MTS */
  412. #  define USE_FWRITE
  413. #  define close_outfile()  fclose(G.outfile)   /* can't set time on files */
  414. #  define umask(n)            /* don't have umask() on MTS */
  415. #  define FOPWT         "w"   /* open file for writing in TEXT mode */
  416. #  ifndef DATE_FORMAT
  417. #    define DATE_FORMAT DF_MDY
  418. #  endif
  419. #  define lenEOL        1
  420. #  define PutNativeEOL  *q++ = native(LF);
  421. #endif /* MTS */
  422.  
  423.  /*---------------------------------------------------------------------------
  424.     QDOS section
  425.   ---------------------------------------------------------------------------*/
  426.  
  427. #ifdef QDOS
  428. #  define DIRENT
  429. #  include <fcntl.h>
  430. #  include <unistd.h>
  431. #  include <sys/stat.h>
  432. #  include <time.h>
  433. #  include "qdos/izqdos.h"
  434. #  ifndef DATE_FORMAT
  435. #    define DATE_FORMAT DF_MDY
  436. #  endif
  437. #  define lenEOL        1
  438. #  define PutNativeEOL  *q++ = native(LF);
  439. #  define DIR_END       '_'
  440. #  define RETURN        QReturn
  441. #  undef PATH_MAX
  442. #  define PATH_MAX      36
  443. #  if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
  444. #    define TIMESTAMP
  445. #  endif
  446. #endif
  447.  
  448. /*---------------------------------------------------------------------------
  449.     Tandem NSK section:
  450.   ---------------------------------------------------------------------------*/
  451.  
  452. #ifdef TANDEM
  453. #  include "tandem.h"
  454. #  include <fcntl.h>
  455.    /* use a single LF delimiter so that writes to 101 text files work */
  456. #  define PutNativeEOL  *q++ = native(LF);
  457. #  define lenEOL        1
  458. #  ifndef DATE_FORMAT
  459. #    define DATE_FORMAT  DF_DMY
  460. #  endif
  461. #  define USE_EF_UT_TIME
  462. #  define RESTORE_UIDGID
  463. #endif
  464.  
  465. /*---------------------------------------------------------------------------
  466.     TOPS-20 section:
  467.   ---------------------------------------------------------------------------*/
  468.  
  469. #ifdef TOPS20
  470. #  include <sys/types.h>        /* off_t, time_t, dev_t, ... */
  471. #  include <sys/stat.h>
  472. #  include <sys/param.h>
  473. #  include <sys/time.h>
  474. #  include <sys/timeb.h>
  475. #  include <sys/file.h>
  476. #  include <timex.h>
  477. #  include <monsym.h>           /* get amazing monsym() macro */
  478.    extern int open(), close(), read();
  479.    extern int stat(), unlink(), jsys(), fcntl();
  480.    extern long lseek(), dup(), creat();
  481. #  define strchr    index       /* GRR: necessary? */
  482. #  define strrchr   rindex
  483. #  define REALLY_SHORT_SYMS
  484. #  define NO_MKDIR
  485. #  define DIR_BEG       '<'
  486. #  define DIR_END       '>'
  487. #  define DIR_EXT       ".directory"
  488. #  ifndef DATE_FORMAT
  489. #    define DATE_FORMAT DF_MDY
  490. #  endif
  491. #  define EXE_EXTENSION ".exe"  /* just a guess... */
  492. #endif /* TOPS20 */
  493.  
  494. /*---------------------------------------------------------------------------
  495.     Unix section:
  496.   ---------------------------------------------------------------------------*/
  497.  
  498. #ifdef UNIX
  499. #  include <sys/types.h>       /* off_t, time_t, dev_t, ... */
  500. #  include <sys/stat.h>
  501.  
  502. #  ifndef COHERENT
  503. #    include <fcntl.h>         /* O_BINARY for open() w/o CR/LF translation */
  504. #  else /* COHERENT */
  505. #    ifdef _I386
  506. #      include <fcntl.h>       /* Coherent 4.0.x, Mark Williams C */
  507. #    else
  508. #      include <sys/fcntl.h>   /* Coherent 3.10, Mark Williams C */
  509. #    endif
  510. #    define SHORT_SYMS
  511. #    ifndef __COHERENT__       /* Coherent 4.2 has tzset() */
  512. #      define tzset  settz
  513. #    endif
  514. #  endif /* ?COHERENT */
  515.  
  516. #  ifndef NO_PARAM_H
  517. #    ifdef NGROUPS_MAX
  518. #      undef NGROUPS_MAX       /* SCO bug:  defined again in <sys/param.h> */
  519. #    endif
  520. #    ifdef BSD
  521. #      define TEMP_BSD         /* may be defined again in <sys/param.h> */
  522. #      undef BSD
  523. #    endif
  524. #    include <sys/param.h>     /* conflict with <sys/types.h>, some systems? */
  525. #    ifdef TEMP_BSD
  526. #      undef TEMP_BSD
  527. #      ifndef BSD
  528. #        define BSD
  529. #      endif
  530. #    endif
  531. #  endif /* !NO_PARAM_H */
  532.  
  533. #  ifdef __osf__
  534. #    define DIRENT
  535. #    ifdef BSD
  536. #      undef BSD
  537. #    endif
  538. #  endif /* __osf__ */
  539.  
  540. #  ifdef BSD
  541. #    include <sys/time.h>
  542. #    include <sys/timeb.h>
  543. #    ifdef _AIX
  544. #      include <time.h>
  545. #    endif
  546. #  else
  547. #    include <time.h>
  548.      struct tm *gmtime(), *localtime();
  549. #  endif
  550.  
  551. #  if (defined(BSD4_4) || (defined(SYSV) && defined(MODERN)))
  552. #    include <unistd.h>        /* this includes utime.h on SGIs */
  553. #    if (defined(BSD4_4) || defined(linux))
  554. #      include <utime.h>
  555. #      define GOT_UTIMBUF
  556. #    endif
  557. #  endif
  558.  
  559. #  if (defined(V7) || defined(pyr_bsd))
  560. #    define strchr   index
  561. #    define strrchr  rindex
  562. #  endif
  563. #  ifdef V7
  564. #    define O_RDONLY 0
  565. #    define O_WRONLY 1
  566. #    define O_RDWR   2
  567. #  endif
  568.  
  569. #  ifdef MINIX
  570. #    include <stdio.h>
  571. #  endif
  572. #  ifndef DATE_FORMAT
  573. #    define DATE_FORMAT DF_MDY    /* GRR:  customize with locale.h somehow? */
  574. #  endif
  575. #  define lenEOL        1
  576. #  ifdef EBCDIC
  577. #    define PutNativeEOL  *q++ = '\n';
  578. #  else
  579. #    define PutNativeEOL  *q++ = native(LF);
  580. #  endif
  581. #  define SCREENLINES   screenlines()
  582. #  define USE_EF_UT_TIME
  583. #  define SET_DIR_ATTRIB
  584. #  if (!defined(TIMESTAMP) && !defined(NOTIMESTAMP))   /* GRR 970513 */
  585. #    define TIMESTAMP
  586. #  endif
  587. #  define RESTORE_UIDGID
  588. #endif /* UNIX */
  589.  
  590. /*---------------------------------------------------------------------------
  591.     VM/CMS and MVS section:
  592.   ---------------------------------------------------------------------------*/
  593.  
  594. #ifdef CMS_MVS
  595. #  include "vmmvs.h"
  596. #  define CLOSE_INFILE()  close_infile(__G)
  597. #endif
  598.  
  599. /*---------------------------------------------------------------------------
  600.     VMS section:
  601.   ---------------------------------------------------------------------------*/
  602.  
  603. #ifdef VMS
  604. #  include <types.h>                    /* GRR:  experimenting... */
  605. #  include <stat.h>
  606. #  include <time.h>                     /* the usual non-BSD time functions */
  607. #  include <file.h>                     /* same things as fcntl.h has */
  608. #  include <unixio.h>
  609. #  include <rms.h>
  610. #  define _MAX_PATH (NAM$C_MAXRSS+1)    /* to define FILNAMSIZ below */
  611. #  ifdef RETURN_CODES  /* VMS interprets standard PK return codes incorrectly */
  612. #    define RETURN(ret) return_VMS(__G__ (ret))   /* verbose version */
  613. #    define EXIT(ret)   return_VMS(__G__ (ret))
  614. #  else
  615. #    define RETURN      return_VMS                /* quiet version */
  616. #    define EXIT        return_VMS
  617. #  endif
  618. #  ifdef VMSCLI
  619. #    define USAGE(ret)  VMSCLI_usage(__G__ (ret))
  620. #  endif
  621. #  define DIR_BEG       '['
  622. #  define DIR_END       ']'
  623. #  define DIR_EXT       ".dir"
  624. #  ifndef DATE_FORMAT
  625. #    define DATE_FORMAT DF_MDY
  626. #  endif
  627. #  define lenEOL        1
  628. #  define PutNativeEOL  *q++ = native(LF);
  629. #  define SCREENLINES   screenlines()
  630. #  if (defined(__VMS_VERSION) && !defined(VMS_VERSION))
  631. #    define VMS_VERSION __VMS_VERSION
  632. #  endif
  633. #  if (defined(__VMS_VER) && !defined(__CRTL_VER))
  634. #    define __CRTL_VER __VMS_VER
  635. #  endif
  636. #  if ((!defined(__CRTL_VER)) || (__CRTL_VER < 70000000))
  637. #    define NO_GMTIME           /* gmtime() of earlier VMS C RTLs is broken */
  638. #  else
  639. #    if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME))
  640. #      define USE_EF_UT_TIME
  641. #    endif
  642. #  endif
  643. #  if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
  644. #    define TIMESTAMP
  645. #  endif
  646. #  define RESTORE_UIDGID
  647. #endif /* VMS */
  648.  
  649. /*---------------------------------------------------------------------------
  650.     Win32 (Windows 95/NT) section:
  651.   ---------------------------------------------------------------------------*/
  652.  
  653. #if (defined(WIN32) && !defined(POCKET_UNZIP))
  654. #  include "win32/w32cfg.h"
  655. #endif
  656.  
  657.  
  658.  
  659.  
  660.  
  661. /*************/
  662. /*  Defines  */
  663. /*************/
  664.  
  665. #define UNZIP_VERSION     20   /* compatible with PKUNZIP 2.0 */
  666. #define VMS_UNZIP_VERSION 42   /* if OS-needed-to-extract is VMS:  can do */
  667.  
  668. #if (defined(MSDOS) || defined(OS2))
  669. #  define DOS_OS2
  670. #endif
  671.  
  672. #if (defined(OS2) || defined(WIN32))
  673. #  define OS2_W32
  674. #endif
  675.  
  676. #if (defined(DOS_OS2) || defined(WIN32))
  677. #  define DOS_OS2_W32
  678. #  define DOS_W32_OS2          /* historical:  don't use */
  679. #endif
  680.  
  681. #if (defined(DOS_OS2_W32) || defined(__human68k__))
  682. #  define DOS_H68_OS2_W32
  683. #endif
  684.  
  685. #if (defined(DOS_OS2) || defined(FLEXOS))
  686. #  define DOS_FLX_OS2
  687. #endif
  688.  
  689. #if (defined(DOS_OS2_W32) || defined(FLEXOS))
  690. #  define DOS_FLX_OS2_W32
  691. #endif
  692.  
  693. #if (defined(DOS_H68_OS2_W32) || defined(FLEXOS))
  694. #  define DOS_FLX_H68_OS2_W32
  695. #endif
  696.  
  697. #if (defined(TOPS20) || defined(VMS))
  698. #  define T20_VMS
  699. #endif
  700.  
  701. #if (defined(MSDOS) || defined(T20_VMS))
  702. #  define DOS_T20_VMS
  703. #endif
  704.  
  705. /* clean up with a few defaults */
  706. #ifndef DIR_END
  707. #  define DIR_END       '/'     /* last char before program name or filename */
  708. #endif
  709. #ifndef DATE_FORMAT
  710. #  define DATE_FORMAT   DF_MDY  /* defaults to US convention */
  711. #endif
  712. #ifndef CLOSE_INFILE
  713. #  define CLOSE_INFILE()  close(G.zipfd)
  714. #endif
  715. #ifndef RETURN
  716. #  define RETURN        return  /* only used in main() */
  717. #endif
  718. #ifndef EXIT
  719. #  define EXIT          exit
  720. #endif
  721. #ifndef USAGE
  722. #  define USAGE(ret)    usage(__G__ (ret))    /* used in unzip.c, zipinfo.c */
  723. #endif
  724. #ifndef TIMET_TO_NATIVE         /* everybody but MSC 7.0 and Macintosh */
  725. #  define TIMET_TO_NATIVE(x)
  726. #  define NATIVE_TO_TIMET(x)
  727. #endif
  728.  
  729. #if (defined(DOS_FLX_OS2_W32) || defined(UNIX) || defined(RISCOS))
  730. #  ifndef HAVE_UNLINK
  731. #    define HAVE_UNLINK
  732. #  endif
  733. #endif
  734. #if (defined(AOS_VS) || defined(ATARI) || defined(__BEOS__)) /* GRR: others? */
  735. #  ifndef HAVE_UNLINK
  736. #    define HAVE_UNLINK
  737. #  endif
  738. #endif
  739.  
  740. /* OS-specific exceptions to the "ANSI <--> INT_SPRINTF" rule */
  741.  
  742. #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF))
  743. #  if (defined(SYSV) || defined(CONVEX) || defined(NeXT) || defined(BSD4_4))
  744. #    define INT_SPRINTF      /* sprintf() returns int:  SysVish/Posix */
  745. #  endif
  746. #  if (defined(DOS_FLX_OS2_W32) || defined(VMS) || defined(AMIGA))
  747. #    define INT_SPRINTF      /* sprintf() returns int:  ANSI */
  748. #  endif
  749. #  if (defined(ultrix) || defined(__ultrix)) /* Ultrix 4.3 and newer */
  750. #    if (defined(POSIX) || defined(__POSIX))
  751. #      define INT_SPRINTF    /* sprintf() returns int:  ANSI/Posix */
  752. #    endif
  753. #    ifdef __GNUC__
  754. #      define PCHAR_SPRINTF  /* undetermined actual return value */
  755. #    endif
  756. #  endif
  757. #  if (defined(__osf__) || defined(_AIX) || defined(CMS_MVS))
  758. #    define INT_SPRINTF      /* sprintf() returns int:  ANSI/Posix */
  759. #  endif
  760. #  if defined(sun)
  761. #    define PCHAR_SPRINTF    /* sprintf() returns char *:  SunOS cc *and* gcc */
  762. #  endif
  763. #endif
  764.  
  765. /* defaults that we hope will take care of most machines in the future */
  766.  
  767. #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF))
  768. #  ifdef __STDC__
  769. #    define INT_SPRINTF      /* sprintf() returns int:  ANSI */
  770. #  endif
  771. #  ifndef INT_SPRINTF
  772. #    define PCHAR_SPRINTF    /* sprintf() returns char *:  BSDish */
  773. #  endif
  774. #endif
  775.  
  776. #define MSG_STDERR(f)  (f & 1)        /* bit 0:  0 = stdout, 1 = stderr */
  777. #define MSG_INFO(f)    ((f & 6) == 0) /* bits 1 and 2:  0 = info */
  778. #define MSG_WARN(f)    ((f & 6) == 2) /* bits 1 and 2:  1 = warning */
  779. #define MSG_ERROR(f)   ((f & 6) == 4) /* bits 1 and 2:  2 = error */
  780. #define MSG_FATAL(f)   ((f & 6) == 6) /* bits 1 and 2:  (3 = fatal error) */
  781. #define MSG_ZFN(f)     (f & 0x0008)   /* bit 3:  1 = print zipfile name */
  782. #define MSG_FN(f)      (f & 0x0010)   /* bit 4:  1 = print filename */
  783. #define MSG_LNEWLN(f)  (f & 0x0020)   /* bit 5:  1 = leading newline if !SOL */
  784. #define MSG_TNEWLN(f)  (f & 0x0040)   /* bit 6:  1 = trailing newline if !SOL */
  785. #define MSG_MNEWLN(f)  (f & 0x0080)   /* bit 7:  1 = trailing NL for prompts */
  786. /* the following are subject to change */
  787. #define MSG_NO_WGUI(f) (f & 0x0100)   /* bit 8:  1 = skip if Windows GUI */
  788. #define MSG_NO_AGUI(f) (f & 0x0200)   /* bit 9:  1 = skip if Acorn GUI */
  789. #define MSG_NO_DLL2(f) (f & 0x0400)   /* bit 10:  1 = skip if OS/2 DLL */
  790. #define MSG_NO_NDLL(f) (f & 0x0800)   /* bit 11:  1 = skip if WIN32 DLL */
  791. #define MSG_NO_WDLL(f) (f & 0x1000)   /* bit 12:  1 = skip if Windows DLL */
  792.  
  793. #if (defined(MORE) && !defined(SCREENLINES))
  794. #  ifdef DOS_FLX_OS2_W32
  795. #    define SCREENLINES 25  /* can be (should be) a function instead */
  796. #  else
  797. #    define SCREENLINES 24  /* VT-100s are assumed to be minimal hardware */
  798. #  endif
  799. #endif
  800.  
  801. #define DIR_BLKSIZ  64      /* number of directory entries per block
  802.                              *  (should fit in 4096 bytes, usually) */
  803. #ifndef WSIZE
  804. #  define WSIZE     0x8000  /* window size--must be a power of two, and */
  805. #endif                      /*  at least 32K for zip's deflate method */
  806.  
  807. #ifndef INBUFSIZ
  808. #  if (defined(MED_MEM) || defined(SMALL_MEM))
  809. #    define INBUFSIZ  2048  /* works for MS-DOS small model */
  810. #  else
  811. #    define INBUFSIZ  8192  /* larger buffers for real OSes */
  812. #  endif
  813. #endif
  814.  
  815. #ifndef __16BIT__
  816. #  define nearmalloc  malloc
  817. #  define nearfree    free
  818. #  if (!defined(__IBMC__) || !defined(OS2))
  819. #    ifndef near
  820. #      define near
  821. #    endif
  822. #    ifndef far
  823. #      define far
  824. #    endif
  825. #  endif
  826. #endif
  827.  
  828. #if (defined(DYNALLOC_CRCTAB) && !defined(DYNAMIC_CRC_TABLE))
  829. #  undef DYNALLOC_CRCTAB
  830. #endif
  831.  
  832. #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT))
  833. #  undef DYNALLOC_CRCTAB   /* not safe with reentrant code */
  834. #endif
  835.  
  836. #if (defined(USE_ZLIB) && !defined(USE_OWN_CRCTAB))
  837. #  ifdef DYNALLOC_CRCTAB
  838. #    undef DYNALLOC_CRCTAB
  839. #  endif
  840. #endif
  841.  
  842. #if (defined(USE_ZLIB) && defined(ASM_CRC))
  843. #  undef ASM_CRC
  844. #endif
  845.  
  846. /* Logic for case of small memory, length of EOL > 1:  if OUTBUFSIZ == 2048,
  847.  * OUTBUFSIZ>>1 == 1024 and OUTBUFSIZ>>7 == 16; therefore rawbuf is 1008 bytes
  848.  * and transbuf 1040 bytes.  Have room for 32 extra EOL chars; 1008/32 == 31.5
  849.  * chars/line, smaller than estimated 35-70 characters per line for C source
  850.  * and normal text.  Hence difference is sufficient for most "average" files.
  851.  * (Argument scales for larger OUTBUFSIZ.)
  852.  */
  853. #ifdef SMALL_MEM          /* i.e., 16-bit OSes:  MS-DOS, OS/2 1.x, etc. */
  854. #  define LoadFarString(x)       fLoadFarString(__G__ (x))
  855. #  define LoadFarStringSmall(x)  fLoadFarStringSmall(__G__ (x))
  856. #  define LoadFarStringSmall2(x) fLoadFarStringSmall2(__G__ (x))
  857. #  if (defined(_MSC_VER) && (_MSC_VER >= 600))
  858. #    define zfstrcpy(dest, src)  _fstrcpy((dest), (src))
  859. #  endif
  860. #  ifndef Far
  861. #    define Far far  /* __far only works for MSC 6.00, not 6.0a or Borland */
  862. #  endif
  863. #  define OUTBUFSIZ INBUFSIZ
  864. #  if (lenEOL == 1)
  865. #    define RAWBUFSIZ (OUTBUFSIZ>>1)
  866. #  else
  867. #    define RAWBUFSIZ ((OUTBUFSIZ>>1) - (OUTBUFSIZ>>7))
  868. #  endif
  869. #  define TRANSBUFSIZ (OUTBUFSIZ-RAWBUFSIZ)
  870.    typedef short  shrint;            /* short/int or "shrink int" (unshrink) */
  871. #else
  872. #  define zfstrcpy(dest, src)       strcpy((dest), (src))
  873. #  ifdef QDOS
  874. #    define LoadFarString(x)        Qstrfix(x)   /* fix up _ for '.' */
  875. #    define LoadFarStringSmall(x)   Qstrfix(x)
  876. #    define LoadFarStringSmall2(x)  Qstrfix(x)
  877. #  else
  878. #    define LoadFarString(x)        x
  879. #    define LoadFarStringSmall(x)   x
  880. #    define LoadFarStringSmall2(x)  x
  881. #  endif
  882. #  ifdef MED_MEM
  883. #    define OUTBUFSIZ 0xFF80         /* can't malloc arrays of 0xFFE8 or more */
  884. #    define TRANSBUFSIZ 0xFF80
  885.      typedef short  shrint;
  886. #  else
  887. #    define OUTBUFSIZ (lenEOL*WSIZE) /* more efficient text conversion */
  888. #    define TRANSBUFSIZ (lenEOL*OUTBUFSIZ)
  889. #    ifdef AMIGA
  890.        typedef short shrint;
  891. #    else
  892.        typedef int  shrint;          /* for efficiency/speed, we hope... */
  893. #    endif
  894. #  endif /* ?MED_MEM */
  895. #  define RAWBUFSIZ OUTBUFSIZ
  896. #endif /* ?SMALL_MEM */
  897.  
  898. #ifndef Far
  899. #  define Far
  900. #endif
  901.  
  902. #ifndef MAIN
  903. #  define MAIN  main
  904. #endif
  905.  
  906. #ifdef SFX      /* disable some unused features for SFX executables */
  907. #  ifndef NO_ZIPINFO
  908. #    define NO_ZIPINFO
  909. #  endif
  910. #  ifdef TIMESTAMP
  911. #    undef TIMESTAMP
  912. #  endif
  913. #endif
  914.  
  915. /* user may have defined both by accident...  NOTIMESTAMP takes precedence */
  916. #if (defined(TIMESTAMP) && defined(NOTIMESTAMP))
  917. #  undef TIMESTAMP
  918. #endif
  919.  
  920. #if (!defined(COPYRIGHT_CLEAN) && !defined(USE_SMITH_CODE))
  921. #  define COPYRIGHT_CLEAN
  922. #endif
  923.  
  924. #if (!defined(LZW_CLEAN) && !defined(USE_UNSHRINK))
  925. #  define LZW_CLEAN
  926. #endif
  927.  
  928. #ifndef O_BINARY
  929. #  define O_BINARY  0
  930. #endif
  931.  
  932. #ifndef PIPE_ERROR
  933. #  define PIPE_ERROR (errno == EPIPE)
  934. #endif
  935.  
  936. /* File operations--use "b" for binary if allowed or fixed length 512 on VMS */
  937. #ifdef VMS
  938. #  define FOPR  "r","ctx=stm"
  939. #  define FOPM  "r+","ctx=stm","rfm=fix","mrs=512"
  940. #  define FOPW  "w","ctx=stm","rfm=fix","mrs=512"
  941. #endif /* VMS */
  942.  
  943. #ifdef CMS_MVS
  944. /* Binary files must be RECFM=F,LRECL=1 for ftell() to get correct pos */
  945. /* ...unless byteseek is used.  Let's try that for a while.            */
  946. #  define FOPR "rb,byteseek"
  947. #  define FOPM "r+b,byteseek"
  948. #  define FOPW "wb,recfm=v,lrecl=32760"
  949. #  ifdef MVS
  950. #    define FOPWT "w,lrecl=133"
  951. #  else
  952. #    define FOPWT "w"
  953. #  endif
  954. #endif /* CMS_MVS */
  955.  
  956. #ifdef TOPS20          /* TOPS-20 MODERN?  You kidding? */
  957. #  define FOPW "w8"
  958. #endif /* TOPS20 */
  959.  
  960. /* Defaults when nothing special has been defined previously. */
  961. #ifdef MODERN
  962. #  ifndef FOPR
  963. #    define FOPR "rb"
  964. #  endif
  965. #  ifndef FOPM
  966. #    define FOPM "r+b"
  967. #  endif
  968. #  ifndef FOPW
  969. #    define FOPW "wb"
  970. #  endif
  971. #  ifndef FOPWT
  972. #    define FOPWT "wt"
  973. #  endif
  974. #else /* !MODERN */
  975. #  ifndef FOPR
  976. #    define FOPR "r"
  977. #  endif
  978. #  ifndef FOPM
  979. #    define FOPM "r+"
  980. #  endif
  981. #  ifndef FOPW
  982. #    define FOPW "w"
  983. #  endif
  984. #  ifndef FOPWT
  985. #    define FOPWT "w"
  986. #  endif
  987. #endif /* ?MODERN */
  988.  
  989. /*
  990.  * If <limits.h> exists on most systems, should include that, since it may
  991.  * define some or all of the following:  NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
  992.  * _POSIX_PATH_MAX.
  993.  */
  994. #ifdef DOS_FLX_OS2
  995. #  include <limits.h>
  996. #endif
  997.  
  998. #ifndef PATH_MAX
  999. #  ifdef MAXPATHLEN
  1000. #    define PATH_MAX      MAXPATHLEN    /* in <sys/param.h> on some systems */
  1001. #  else
  1002. #    ifdef _MAX_PATH
  1003. #      define PATH_MAX    _MAX_PATH
  1004. #    else
  1005. #      if FILENAME_MAX > 255
  1006. #        define PATH_MAX  FILENAME_MAX  /* used like PATH_MAX on some systems */
  1007. #      else
  1008. #        define PATH_MAX  1024
  1009. #      endif
  1010. #    endif /* ?_MAX_PATH */
  1011. #  endif /* ?MAXPATHLEN */
  1012. #endif /* !PATH_MAX */
  1013.  
  1014. #define FILNAMSIZ  PATH_MAX
  1015.  
  1016. #ifdef SHORT_SYMS                   /* Mark Williams C, ...? */
  1017. #  define extract_or_test_files     xtr_or_tst_files
  1018. #  define extract_or_test_member    xtr_or_tst_member
  1019. #endif
  1020.  
  1021. #ifdef REALLY_SHORT_SYMS            /* TOPS-20 linker:  first 6 chars */
  1022. #  define process_cdir_file_hdr     XXpcdfh
  1023. #  define process_local_file_hdr    XXplfh
  1024. #  define extract_or_test_files     XXxotf  /* necessary? */
  1025. #  define extract_or_test_member    XXxotm  /* necessary? */
  1026. #  define check_for_newer           XXcfn
  1027. #  define overwrite_all             XXoa
  1028. #  define process_all_files         XXpaf
  1029. #  define extra_field               XXef
  1030. #  define explode_lit8              XXel8
  1031. #  define explode_lit4              XXel4
  1032. #  define explode_nolit8            XXnl8
  1033. #  define explode_nolit4            XXnl4
  1034. #  define cpdist8                   XXcpdist8
  1035. #  define inflate_codes             XXic
  1036. #  define inflate_stored            XXis
  1037. #  define inflate_fixed             XXif
  1038. #  define inflate_dynamic           XXid
  1039. #  define inflate_block             XXib
  1040. #  define maxcodemax                XXmax
  1041. #endif
  1042.  
  1043. #ifndef S_TIME_T_MAX            /* max value of signed (>= 32-bit) time_t */
  1044. #  define S_TIME_T_MAX  ((time_t)(ulg)0x7fffffffL)
  1045. #endif
  1046. #ifndef U_TIME_T_MAX            /* max value of unsigned (>= 32-bit) time_t */
  1047. #  define U_TIME_T_MAX  ((time_t)(ulg)0xffffffffL)
  1048. #endif
  1049. #ifdef DOSTIME_MINIMUM          /* min DOSTIME value (1980-01-01) */
  1050. #  undef DOSTIME_MINIMUM
  1051. #endif
  1052. #define DOSTIME_MINIMUM ((ulg)0x00210000L)
  1053. #ifdef DOSTIME_2038_01_18       /* approximate DOSTIME equivalent of */
  1054. #  undef DOSTIME_2038_01_18     /*  the signed-32-bit time_t limit */
  1055. #endif
  1056. #define DOSTIME_2038_01_18 ((ulg)0x74320000L)
  1057.  
  1058. #ifdef QDOS
  1059. #  define ZSUFX         "_zip"
  1060. #  define ALT_ZSUFX     ".zip"
  1061. #else
  1062. #  ifdef RISCOS
  1063. #    define ZSUFX       "/zip"
  1064. #  else
  1065. #    define ZSUFX       ".zip"
  1066. #  endif
  1067. #  define ALT_ZSUFX     ".ZIP"   /* Unix-only so far (only case-sensitive fs) */
  1068. #endif
  1069.  
  1070. #define CENTRAL_HDR_SIG   "\001\002"   /* the infamous "PK" signature bytes, */
  1071. #define LOCAL_HDR_SIG     "\003\004"   /*  sans "PK" (so unzip executable not */
  1072. #define END_CENTRAL_SIG   "\005\006"   /*  mistaken for zipfile itself) */
  1073. #define EXTD_LOCAL_SIG    "\007\010"   /* [ASCII "\113" == EBCDIC "\080" ??] */
  1074.  
  1075. /* choice of activities for do_string() */
  1076. #define SKIP              0             /* skip header block */
  1077. #define DISPLAY           1             /* display archive comment (ASCII) */
  1078. #define DISPL_8           5             /* display file comment (ext. ASCII) */
  1079. #define DS_FN             2             /* read filename (ext. ASCII) */
  1080. #define EXTRA_FIELD       3             /* copy extra field into buffer */
  1081. #define DS_EF             3
  1082. #ifdef AMIGA
  1083. #  define FILENOTE        4
  1084. #endif
  1085.  
  1086. #define DOES_NOT_EXIST    -1   /* return values for check_for_newer() */
  1087. #define EXISTS_AND_OLDER  0
  1088. #define EXISTS_AND_NEWER  1
  1089.  
  1090. #define ROOT              0    /* checkdir() extract-to path:  called once */
  1091. #define INIT              1    /* allocate buildpath:  called once per member */
  1092. #define APPEND_DIR        2    /* append a dir comp.:  many times per member */
  1093. #define APPEND_NAME       3    /* append actual filename:  once per member */
  1094. #define GETPATH           4    /* retrieve the complete path and free it */
  1095. #define END               5    /* free root path prior to exiting program */
  1096.  
  1097. /* version_made_by codes (central dir):  make sure these */
  1098. /*  are not defined on their respective systems!! */
  1099. #define FS_FAT_           0    /* filesystem used by MS-DOS, OS/2, Win32 */
  1100. #define AMIGA_            1
  1101. #define VMS_              2
  1102. #define UNIX_             3
  1103. #define VM_CMS_           4
  1104. #define ATARI_            5    /* what if it's a minix filesystem? [cjh] */
  1105. #define FS_HPFS_          6    /* filesystem used by OS/2 (and NT 3.x) */
  1106. #define MAC_              7    /* HFS filesystem used by MacOS */
  1107. #define Z_SYSTEM_         8
  1108. #define CPM_              9
  1109. #define TOPS20_           10
  1110. #define FS_NTFS_          11   /* filesystem used by Windows NT */
  1111. #define QDOS_             12
  1112. #define ACORN_            13   /* Archimedes Acorn RISC OS */
  1113. #define FS_VFAT_          14   /* filesystem used by Windows 95, NT */
  1114. #define MVS_              15
  1115. #define BEOS_             16   /* hybrid POSIX/database filesystem */
  1116. #define TANDEM_           17   /* Tandem/NSK */
  1117. #define NUM_HOSTS         18   /* index of last system + 1 */
  1118.  
  1119. #define STORED            0    /* compression methods */
  1120. #define SHRUNK            1
  1121. #define REDUCED1          2
  1122. #define REDUCED2          3
  1123. #define REDUCED3          4
  1124. #define REDUCED4          5
  1125. #define IMPLODED          6
  1126. #define TOKENIZED         7
  1127. #define DEFLATED          8
  1128. #define ENHDEFLATED       9
  1129. #define DCLIMPLODED      10
  1130. #define NUM_METHODS      11    /* index of last method + 1 */
  1131. /* don't forget to update list_files(), extract.c and zipinfo.c appropriately
  1132.  * if NUM_METHODS changes */
  1133.  
  1134. /* (the PK-class error codes are public and have been moved into unzip.h) */
  1135.  
  1136. #define DF_MDY            0    /* date format 10/26/91 (USA only) */
  1137. #define DF_DMY            1    /* date format 26/10/91 (most of the world) */
  1138. #define DF_YMD            2    /* date format 91/10/26 (a few countries) */
  1139.  
  1140. /*---------------------------------------------------------------------------
  1141.     Extra-field block ID values and offset info.
  1142.   ---------------------------------------------------------------------------*/
  1143. /* extra-field ID values, all little-endian: */
  1144. #define EF_AV        0x0007    /* PKWARE's authenticity verification */
  1145. #define EF_OS2       0x0009    /* OS/2 extended attributes */
  1146. #define EF_PKW32     0x000a    /* PKWARE's Win95/98/WinNT filetimes */
  1147. #define EF_PKVMS     0x000c    /* PKWARE's VMS */
  1148. #define EF_PKUNIX    0x000d    /* PKWARE's Unix */
  1149. #define EF_IZVMS     0x4d49    /* Info-ZIP's VMS ("IM") */
  1150. #define EF_IZUNIX    0x5855    /* Info-ZIP's old Unix[1] ("UX") */
  1151. #define EF_IZUNIX2   0x7855    /* Info-ZIP's new Unix[2] ("Ux") */
  1152. #define EF_TIME      0x5455    /* universal timestamp ("UT") */
  1153. #define EF_MAC3      0x334d    /* Info-ZIP's new Macintosh (= "M3") */
  1154. #define EF_JLMAC     0x07c8    /* Johnny Lee's old Macintosh (= 1992) */
  1155. #define EF_ZIPIT     0x2605    /* Thomas Brown's Macintosh (ZipIt) */
  1156. #define EF_ZIPIT2    0x2705    /* T. Brown's Mac (ZipIt) v 1.3.8 and newer ? */
  1157. #define EF_VMCMS     0x4704    /* Info-ZIP's VM/CMS ("\004G") */
  1158. #define EF_MVS       0x470f    /* Info-ZIP's MVS ("\017G") */
  1159. #define EF_ACL       0x4c41    /* (OS/2) access control list ("AL") */
  1160. #define EF_NTSD      0x4453    /* NT security descriptor ("SD") */
  1161. #define EF_BEOS      0x6542    /* BeOS ("Be") */
  1162. #define EF_QDOS      0xfb4a    /* SMS/QDOS ("J\373") */
  1163. #define EF_AOSVS     0x5356    /* AOS/VS ("VS") */
  1164. #define EF_SPARK     0x4341    /* David Pilling's Acorn/SparkFS ("AC") */
  1165. #define EF_MD5       0x4b46    /* Fred Kantor's MD5 ("FK") */
  1166. #define EF_ASIUNIX   0x756e    /* ASi's Unix ("nu") */
  1167.  
  1168. #define EB_HEADSIZE       4    /* length of extra field block header */
  1169. #define EB_ID             0    /* offset of block ID in header */
  1170. #define EB_LEN            2    /* offset of data length field in header */
  1171. #define EB_UCSIZE_P       0    /* offset of ucsize field in compr. data */
  1172. #define EB_CMPRHEADLEN    6    /* lenght of compression header */
  1173.  
  1174. #define EB_UX_MINLEN      8    /* minimal "UX" field contains atime, mtime */
  1175. #define EB_UX_FULLSIZE    12   /* full "UX" field (atime, mtime, uid, gid) */
  1176. #define EB_UX_ATIME       0    /* offset of atime in "UX" extra field data */
  1177. #define EB_UX_MTIME       4    /* offset of mtime in "UX" extra field data */
  1178. #define EB_UX_UID         8    /* byte offset of UID in "UX" field data */
  1179. #define EB_UX_GID         10   /* byte offset of GID in "UX" field data */
  1180.  
  1181. #define EB_UX2_MINLEN     4    /* minimal "Ux" field contains UID/GID */
  1182. #define EB_UX2_UID        0    /* byte offset of UID in "Ux" field data */
  1183. #define EB_UX2_GID        2    /* byte offset of GID in "Ux" field data */
  1184. #define EB_UX2_VALID      (1 << 8)      /* UID/GID present */
  1185.  
  1186. #define EB_UT_MINLEN      1    /* minimal UT field contains Flags byte */
  1187. #define EB_UT_FLAGS       0    /* byte offset of Flags field */
  1188. #define EB_UT_TIME1       1    /* byte offset of 1st time value */
  1189. #define EB_UT_FL_MTIME    (1 << 0)      /* mtime present */
  1190. #define EB_UT_FL_ATIME    (1 << 1)      /* atime present */
  1191. #define EB_UT_FL_CTIME    (1 << 2)      /* ctime present */
  1192.  
  1193. #define EB_FLGS_OFFS      4    /* offset of flags area in generic compressed
  1194.                                   extra field blocks (OS2, NT, and others) */
  1195. #define EB_OS2_HLEN       4    /* size of OS2/ACL compressed data header */
  1196. #define EB_BEOS_HLEN      5    /* length of BeOS e.f attribute header */
  1197. #define EB_BE_FL_UNCMPR   0x01 /* "BeOS attributes uncompressed" bit flag */
  1198. #define EB_MAC3_HLEN      14   /* length of Mac3 attribute block header */
  1199. #define EB_M3_FL_DATFRK   0x01 /* "this entry is data fork" flag */
  1200. #define EB_M3_FL_UNCMPR   0x04 /* "Mac3 attributes uncompressed" bit flag */
  1201. #define EB_M3_FL_TIME64   0x08 /* "Mac3 time fields are 64 bit wide" flag */
  1202. #define EB_M3_FL_NOUTC    0x10 /* "Mac3 timezone offset fields missing" flag */
  1203.  
  1204. #define EB_NTSD_C_LEN     4    /* length of central NT security data */
  1205. #define EB_NTSD_L_LEN     5    /* length of minimal local NT security data */
  1206. #define EB_NTSD_VERSION   4    /* offset of NTSD version byte */
  1207. #define EB_NTSD_MAX_VER   (0)  /* maximum version # we know how to handle */
  1208.  
  1209. #define EB_ASI_CRC32      0    /* offset of ASI Unix field's crc32 checksum */
  1210. #define EB_ASI_MODE       4    /* offset of ASI Unix permission mode field */
  1211.  
  1212. /*---------------------------------------------------------------------------
  1213.     True sizes of the various headers, as defined by PKWARE--so it is not
  1214.     likely that these will ever change.  But if they do, make sure both these
  1215.     defines AND the typedefs below get updated accordingly.
  1216.   ---------------------------------------------------------------------------*/
  1217. #define LREC_SIZE   26   /* lengths of local file headers, central */
  1218. #define CREC_SIZE   42   /*  directory headers, and the end-of-    */
  1219. #define ECREC_SIZE  18   /*  central-dir record, respectively      */
  1220.  
  1221. #define MAX_BITS    13                 /* used in unshrink() */
  1222. #define HSIZE       (1 << MAX_BITS)    /* size of global work area */
  1223.  
  1224. #define LF     10        /* '\n' on ASCII machines; must be 10 due to EBCDIC */
  1225. #define CR     13        /* '\r' on ASCII machines; must be 13 due to EBCDIC */
  1226. #define CTRLZ  26        /* DOS & OS/2 EOF marker (used in fileio.c, vms.c) */
  1227.  
  1228. #ifdef EBCDIC
  1229. #  define foreign(c)    ascii[(uch)(c)]
  1230. #  define native(c)     ebcdic[(uch)(c)]
  1231. #  define NATIVE        "EBCDIC"
  1232. #  define NOANSIFILT
  1233. #endif
  1234.  
  1235. #if (defined(CRAY) && defined(ZMEM))
  1236. #  undef ZMEM
  1237. #endif
  1238.  
  1239. #ifdef ZMEM
  1240. #  undef ZMEM
  1241. #  define memcmp(b1,b2,len)      bcmp(b2,b1,len)
  1242. #  define memcpy(dest,src,len)   bcopy(src,dest,len)
  1243. #  define memzero                bzero
  1244. #else
  1245. #  define memzero(dest,len)      memset(dest,0,len)
  1246. #endif
  1247.  
  1248. #ifdef VMS
  1249. #  define ENV_UNZIP       "UNZIP_OPTS"     /* names of environment variables */
  1250. #  define ENV_ZIPINFO     "ZIPINFO_OPTS"
  1251. #endif /* VMS */
  1252. #ifdef RISCOS
  1253. #  define ENV_UNZIP       "Unzip$Options"
  1254. #  define ENV_ZIPINFO     "Zipinfo$Options"
  1255. #  define ENV_UNZIPEXTS   "Unzip$Exts"
  1256. #endif /* RISCOS */
  1257. #ifndef ENV_UNZIP
  1258. #  define ENV_UNZIP       "UNZIP"          /* the standard names */
  1259. #  define ENV_ZIPINFO     "ZIPINFO"
  1260. #endif
  1261. #define ENV_UNZIP2        "UNZIPOPT"     /* alternate names, for zip compat. */
  1262. #define ENV_ZIPINFO2      "ZIPINFOOPT"
  1263.  
  1264. #if (!defined(QQ) && !defined(NOQQ))
  1265. #  define QQ
  1266. #endif
  1267.  
  1268. #ifdef QQ                         /* Newtware version:  no file */
  1269. #  define QCOND     (!uO.qflag)   /*  comments with -vq or -vqq */
  1270. #else                             /* Bill Davidsen version:  no way to */
  1271. #  define QCOND     (longhdr)     /*  kill file comments when listing */
  1272. #endif
  1273.  
  1274. #ifdef OLD_QQ
  1275. #  define QCOND2    (uO.qflag < 2)
  1276. #else
  1277. #  define QCOND2    (!uO.qflag)
  1278. #endif
  1279.  
  1280. #ifndef TRUE
  1281. #  define TRUE      1   /* sort of obvious */
  1282. #endif
  1283. #ifndef FALSE
  1284. #  define FALSE     0
  1285. #endif
  1286.  
  1287. #ifndef SEEK_SET
  1288. #  define SEEK_SET  0
  1289. #  define SEEK_CUR  1
  1290. #  define SEEK_END  2
  1291. #endif
  1292.  
  1293. #if (defined(UNIX) && defined(S_IFLNK) && !defined(MTS))
  1294. #  define SYMLINKS
  1295. #  ifndef S_ISLNK
  1296. #    define S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK)
  1297. #  endif
  1298. #endif /* UNIX && S_IFLNK && !MTS */
  1299.  
  1300. #ifndef S_ISDIR
  1301. #  ifdef CMS_MVS
  1302. #    define S_ISDIR(m)  (FALSE)
  1303. #  else
  1304. #    define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)
  1305. # endif
  1306. #endif
  1307.  
  1308. #ifndef IS_VOLID
  1309. #  define IS_VOLID(m)  ((m) & 0x08)
  1310. #endif
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316. /**************/
  1317. /*  Typedefs  */
  1318. /**************/
  1319.  
  1320. #ifdef NO_UID_GID
  1321. #  ifdef UID_USHORT
  1322.      typedef unsigned short  uid_t;    /* TI SysV.3 */
  1323.      typedef unsigned short  gid_t;
  1324. #  else
  1325.      typedef unsigned int    uid_t;    /* SCO Xenix */
  1326.      typedef unsigned int    gid_t;
  1327. #  endif
  1328. #endif
  1329.  
  1330. #if (defined(WIN32) || defined(sgi) || defined(GOT_UTIMBUF) || defined(ATARI))
  1331.    typedef struct utimbuf ztimbuf;
  1332. #else
  1333.    typedef struct ztimbuf {
  1334.        time_t actime;        /* new access time */
  1335.        time_t modtime;       /* new modification time */
  1336.    } ztimbuf;
  1337. #endif
  1338.  
  1339. typedef struct iztimes {
  1340.    time_t atime;             /* new access time */
  1341.    time_t mtime;             /* new modification time */
  1342.    time_t ctime;             /* used for creation time; NOT same as st_ctime */
  1343. } iztimes;
  1344.  
  1345. #ifdef SET_DIR_ATTRIB
  1346.    typedef struct dirtime {  /* temporary struct for holding directory info */
  1347.        struct dirtime *next; /*  until can be sorted and set at end */
  1348.        char *fn;             /* filename of directory */
  1349.        union {
  1350.            iztimes t3;       /* mtime, atime, ctime */
  1351.            ztimbuf t2;       /* modtime, actime */
  1352.        } u;
  1353.        unsigned perms;       /* same as min_info.file_attr */
  1354.        int have_uidgid;      /* flag */
  1355.        ush uidgid[2];
  1356.    } dirtime;
  1357. #endif /* SET_DIR_ATTRIB */
  1358.  
  1359. typedef struct min_info {
  1360.     long offset;
  1361.     ulg crc;                 /* crc (needed if extended header) */
  1362.     ulg compr_size;          /* compressed size (needed if extended header) */
  1363.     ulg uncompr_size;        /* uncompressed size (needed if extended header) */
  1364.     int hostnum;
  1365.     unsigned file_attr;      /* local flavor, as used by creat(), chmod()... */
  1366.     unsigned encrypted : 1;  /* file encrypted: decrypt before uncompressing */
  1367.     unsigned ExtLocHdr : 1;  /* use time instead of CRC for decrypt check */
  1368.     unsigned textfile : 1;   /* file is text (according to zip) */
  1369.     unsigned textmode : 1;   /* file is to be extracted as text */
  1370.     unsigned lcflag : 1;     /* convert filename to lowercase */
  1371.     unsigned vollabel : 1;   /* "file" is an MS-DOS volume (disk) label */
  1372. } min_info;
  1373.  
  1374. typedef struct VMStimbuf {
  1375.     char *revdate;    /* (both roughly correspond to Unix modtime/st_mtime) */
  1376.     char *credate;
  1377. } VMStimbuf;
  1378.  
  1379. /*---------------------------------------------------------------------------
  1380.     Zipfile work area declarations.
  1381.   ---------------------------------------------------------------------------*/
  1382.  
  1383. #ifdef MALLOC_WORK
  1384.    union work {
  1385.      struct {                 /* unshrink(): */
  1386.        shrint *Parent;          /* (8193 * sizeof(shrint)) */
  1387.        uch *value;
  1388.        uch *Stack;
  1389.      } shrink;
  1390.      uch *Slide;              /* explode(), inflate(), unreduce() */
  1391.    };
  1392. #else /* !MALLOC_WORK */
  1393.    union work {
  1394.      struct {                 /* unshrink(): */
  1395.        shrint Parent[HSIZE];    /* (8192 * sizeof(shrint)) == 16KB minimum */
  1396.        uch value[HSIZE];        /* 8KB */
  1397.        uch Stack[HSIZE];        /* 8KB */
  1398.      } shrink;                  /* total = 32KB minimum; 80KB on Cray/Alpha */
  1399.      uch Slide[WSIZE];        /* explode(), inflate(), unreduce() */
  1400.    };
  1401. #endif /* ?MALLOC_WORK */
  1402.  
  1403. #define slide  G.area.Slide
  1404.  
  1405. #if (defined(DLL) && !defined(NO_SLIDE_REDIR))
  1406. #  define redirSlide G.redirect_sldptr
  1407. #else
  1408. #  define redirSlide G.area.Slide
  1409. #endif
  1410.  
  1411. /*---------------------------------------------------------------------------
  1412.     Zipfile layout declarations.  If these headers ever change, make sure the
  1413.     xxREC_SIZE defines (above) change with them!
  1414.   ---------------------------------------------------------------------------*/
  1415.  
  1416.    typedef uch   local_byte_hdr[ LREC_SIZE ];
  1417. #      define L_VERSION_NEEDED_TO_EXTRACT_0     0
  1418. #      define L_VERSION_NEEDED_TO_EXTRACT_1     1
  1419. #      define L_GENERAL_PURPOSE_BIT_FLAG        2
  1420. #      define L_COMPRESSION_METHOD              4
  1421. #      define L_LAST_MOD_DOS_DATETIME           6
  1422. #      define L_CRC32                           10
  1423. #      define L_COMPRESSED_SIZE                 14
  1424. #      define L_UNCOMPRESSED_SIZE               18
  1425. #      define L_FILENAME_LENGTH                 22
  1426. #      define L_EXTRA_FIELD_LENGTH              24
  1427.  
  1428.    typedef uch   cdir_byte_hdr[ CREC_SIZE ];
  1429. #      define C_VERSION_MADE_BY_0               0
  1430. #      define C_VERSION_MADE_BY_1               1
  1431. #      define C_VERSION_NEEDED_TO_EXTRACT_0     2
  1432. #      define C_VERSION_NEEDED_TO_EXTRACT_1     3
  1433. #      define C_GENERAL_PURPOSE_BIT_FLAG        4
  1434. #      define C_COMPRESSION_METHOD              6
  1435. #      define C_LAST_MOD_DOS_DATETIME           8
  1436. #      define C_CRC32                           12
  1437. #      define C_COMPRESSED_SIZE                 16
  1438. #      define C_UNCOMPRESSED_SIZE               20
  1439. #      define C_FILENAME_LENGTH                 24
  1440. #      define C_EXTRA_FIELD_LENGTH              26
  1441. #      define C_FILE_COMMENT_LENGTH             28
  1442. #      define C_DISK_NUMBER_START               30
  1443. #      define C_INTERNAL_FILE_ATTRIBUTES        32
  1444. #      define C_EXTERNAL_FILE_ATTRIBUTES        34
  1445. #      define C_RELATIVE_OFFSET_LOCAL_HEADER    38
  1446.  
  1447.    typedef uch   ec_byte_rec[ ECREC_SIZE+4 ];
  1448. /*     define SIGNATURE                         0   space-holder only */
  1449. #      define NUMBER_THIS_DISK                  4
  1450. #      define NUM_DISK_WITH_START_CENTRAL_DIR   6
  1451. #      define NUM_ENTRIES_CENTRL_DIR_THS_DISK   8
  1452. #      define TOTAL_ENTRIES_CENTRAL_DIR         10
  1453. #      define SIZE_CENTRAL_DIRECTORY            12
  1454. #      define OFFSET_START_CENTRAL_DIRECTORY    16
  1455. #      define ZIPFILE_COMMENT_LENGTH            20
  1456.  
  1457.  
  1458.    typedef struct local_file_header {                 /* LOCAL */
  1459.        uch version_needed_to_extract[2];
  1460.        ush general_purpose_bit_flag;
  1461.        ush compression_method;
  1462.        ulg last_mod_dos_datetime;
  1463.        ulg crc32;
  1464.        ulg csize;
  1465.        ulg ucsize;
  1466.        ush filename_length;
  1467.        ush extra_field_length;
  1468.    } local_file_hdr;
  1469.  
  1470. #if 0
  1471.    typedef struct central_directory_file_header {     /* CENTRAL */
  1472.        uch version_made_by[2];
  1473.        uch version_needed_to_extract[2];
  1474.        ush general_purpose_bit_flag;
  1475.        ush compression_method;
  1476.        ulg last_mod_dos_datetime;
  1477.        ulg crc32;
  1478.        ulg csize;
  1479.        ulg ucsize;
  1480.        ush filename_length;
  1481.        ush extra_field_length;
  1482.        ush file_comment_length;
  1483.        ush disk_number_start;
  1484.        ush internal_file_attributes;
  1485.        ulg external_file_attributes;
  1486.        ulg relative_offset_local_header;
  1487.    } cdir_file_hdr;
  1488. #endif /* 0 */
  1489.  
  1490.    typedef struct end_central_dir_record {            /* END CENTRAL */
  1491.        ush number_this_disk;
  1492.        ush num_disk_start_cdir;
  1493.        ush num_entries_centrl_dir_ths_disk;
  1494.        ush total_entries_central_dir;
  1495.        ulg size_central_directory;
  1496.        ulg offset_start_central_directory;
  1497.        ush zipfile_comment_length;
  1498.    } ecdir_rec;
  1499.  
  1500.  
  1501. /* Huffman code lookup table entry--this entry is four bytes for machines
  1502.    that have 16-bit pointers (e.g. PC's in the small or medium model).
  1503.    Valid extra bits are 0..13.  e == 15 is EOB (end of block), e == 16
  1504.    means that v is a literal, 16 < e < 32 means that v is a pointer to
  1505.    the next table, which codes e - 16 bits, and lastly e == 99 indicates
  1506.    an unused code.  If a code with e == 99 is looked up, this implies an
  1507.    error in the data. */
  1508.  
  1509. struct huft {
  1510.     uch e;                /* number of extra bits or operation */
  1511.     uch b;                /* number of bits in this code or subcode */
  1512.     union {
  1513.         ush n;            /* literal, length base, or distance base */
  1514.         struct huft *t;   /* pointer to next level of table */
  1515.     } v;
  1516. };
  1517.  
  1518.  
  1519. typedef struct _APIDocStruct {
  1520.     char *compare;
  1521.     char *function;
  1522.     char *syntax;
  1523.     char *purpose;
  1524. } APIDocStruct;
  1525.  
  1526.  
  1527.  
  1528.  
  1529. /*************/
  1530. /*  Globals  */
  1531. /*************/
  1532.  
  1533. #if (defined(OS2) && !defined(FUNZIP))
  1534. #  include "os2/os2data.h"
  1535. #endif
  1536.  
  1537. #include "globals.h"
  1538.  
  1539.  
  1540.  
  1541. /*************************/
  1542. /*  Function Prototypes  */
  1543. /*************************/
  1544.  
  1545. /*---------------------------------------------------------------------------
  1546.     Functions in unzip.c (initialization routines):
  1547.   ---------------------------------------------------------------------------*/
  1548.  
  1549. #ifndef WINDLL
  1550.    int    MAIN                   OF((int argc, char **argv));
  1551.    int    unzip                  OF((__GPRO__ int argc, char **argv));
  1552.    int    uz_opts                OF((__GPRO__ int *pargc, char ***pargv));
  1553.    int    usage                  OF((__GPRO__ int error));
  1554. #endif /* !WINDLL */
  1555.  
  1556. /*---------------------------------------------------------------------------
  1557.     Functions in process.c (main driver routines):
  1558.   ---------------------------------------------------------------------------*/
  1559.  
  1560. int      process_zipfiles        OF((__GPRO));
  1561. void     free_G_buffers          OF((__GPRO));
  1562. /* static int    do_seekable     OF((__GPRO__ int lastchance)); */
  1563. /* static int    find_ecrec      OF((__GPRO__ long searchlen)); */
  1564. int      uz_end_central          OF((__GPRO));
  1565. int      process_cdir_file_hdr   OF((__GPRO));
  1566. int      get_cdir_ent            OF((__GPRO));
  1567. int      process_local_file_hdr  OF((__GPRO));
  1568. unsigned ef_scan_for_izux        OF((uch *ef_buf, unsigned ef_len, int ef_is_c,
  1569.                                      ulg dos_mdatetime,
  1570.                                      iztimes *z_utim, ush *z_uidgid));
  1571.  
  1572. #ifndef SFX
  1573.  
  1574. /*---------------------------------------------------------------------------
  1575.     Functions in zipinfo.c (`zipinfo-style' listing routines):
  1576.   ---------------------------------------------------------------------------*/
  1577.  
  1578. #ifndef NO_ZIPINFO
  1579. #ifndef WINDLL
  1580.    int   zi_opts                 OF((__GPRO__ int *pargc, char ***pargv));
  1581. #endif
  1582. int      zi_end_central          OF((__GPRO));
  1583. int      zipinfo                 OF((__GPRO));
  1584. /* static int      zi_long       OF((__GPRO__ ulg *pEndprev)); */
  1585. /* static int      zi_short      OF((__GPRO)); */
  1586. /* static char    *zi_time       OF((__GPRO__ ZCONST ulg *datetimez,
  1587.                                      ZCONST time_t *modtimez, char *d_t_str));*/
  1588. #endif /* !NO_ZIPINFO */
  1589.  
  1590. /*---------------------------------------------------------------------------
  1591.     Functions in list.c (generic zipfile-listing routines):
  1592.   ---------------------------------------------------------------------------*/
  1593.  
  1594. int      list_files              OF((__GPRO));
  1595. #ifdef TIMESTAMP
  1596.    int   get_time_stamp          OF((__GPRO__  time_t *last_modtime,
  1597.                                      unsigned *nmember));
  1598. #endif
  1599. int      ratio                   OF((ulg uc, ulg c));
  1600. void     fnprint                 OF((__GPRO));
  1601.  
  1602. #endif /* !SFX */
  1603.  
  1604. /*---------------------------------------------------------------------------
  1605.     Functions in fileio.c:
  1606.   ---------------------------------------------------------------------------*/
  1607.  
  1608. int      open_input_file      OF((__GPRO));
  1609. int      open_outfile         OF((__GPRO));                    /* also vms.c */
  1610. void     undefer_input        OF((__GPRO));
  1611. void     defer_leftover_input OF((__GPRO));
  1612. unsigned readbuf              OF((__GPRO__ char *buf, register unsigned len));
  1613. int      readbyte             OF((__GPRO));
  1614. int      fillinbuf            OF((__GPRO));
  1615. #ifdef FUNZIP
  1616.    int   flush                OF((__GPRO__ ulg size));  /* actually funzip.c */
  1617. #else
  1618.    int   flush                OF((__GPRO__ uch *buf, ulg size, int unshrink));
  1619. #endif
  1620. /* static int  disk_error     OF((__GPRO)); */
  1621. void     handler              OF((int signal));
  1622. time_t   dos_to_unix_time     OF((ulg dos_datetime));
  1623. int      check_for_newer      OF((__GPRO__ char *filename)); /* os2,vmcms,vms */
  1624. int      do_string            OF((__GPRO__ unsigned int len, int option));
  1625. ush      makeword             OF((ZCONST uch *b));
  1626. ulg      makelong             OF((ZCONST uch *sig));
  1627. #if (!defined(STR_TO_ISO) || defined(NEED_STR2ISO))
  1628.    char *str2iso              OF((char *dst, ZCONST char *src));
  1629. #endif
  1630. #if (!defined(STR_TO_OEM) || defined(NEED_STR2OEM))
  1631.    char *str2oem              OF((char *dst, ZCONST char *src));
  1632. #endif
  1633. int      zstrnicmp            OF((register ZCONST char *s1,
  1634.                                   register ZCONST char *s2,
  1635.                                   register unsigned n));
  1636. #ifdef REGULUS
  1637.    int zstat                  OF((char *p, struct stat *s));
  1638. #endif
  1639. #ifdef ZMEM   /* MUST be ifdef'd because of conflicts with the standard def. */
  1640.    zvoid *memset OF((register zvoid *, register int, register unsigned int));
  1641.    int    memcmp OF((register ZCONST zvoid*, register ZCONST zvoid *,
  1642.                      register unsigned int));
  1643.    zvoid *memcpy OF((register zvoid *, register ZCONST zvoid *,
  1644.                      register unsigned int));
  1645. #endif
  1646. #ifdef SMALL_MEM
  1647.    char *fLoadFarString       OF((__GPRO__ const char Far *sz));
  1648.    char *fLoadFarStringSmall  OF((__GPRO__ const char Far *sz));
  1649.    char *fLoadFarStringSmall2 OF((__GPRO__ const char Far *sz));
  1650.    #ifndef zfstrcpy
  1651.      char Far * Far zfstrcpy  OF((char Far *s1, const char Far *s2));
  1652.    #endif
  1653. #endif
  1654.  
  1655.  
  1656. /*---------------------------------------------------------------------------
  1657.     Functions in extract.c:
  1658.   ---------------------------------------------------------------------------*/
  1659.  
  1660. int    extract_or_test_files     OF((__GPRO));
  1661. /* static int   store_info          OF((void)); */
  1662. /* static int   extract_or_test_member   OF((__GPRO)); */
  1663. /* static int   TestExtraField   OF((__GPRO__ uch *ef, unsigned ef_len)); */
  1664. /* static int   test_OS2         OF((__GPRO__ uch *eb, unsigned eb_size)); */
  1665. /* static int   test_NT          OF((__GPRO__ uch *eb, unsigned eb_size)); */
  1666. int    memextract                OF((__GPRO__ uch *tgt, ulg tgtsize,
  1667.                                      uch *src, ulg srcsize));
  1668. int    memflush                  OF((__GPRO__ uch *rawbuf, ulg size));
  1669. char  *fnfilter                  OF((ZCONST char *raw, uch *space));
  1670.  
  1671. /*---------------------------------------------------------------------------
  1672.     Decompression functions:
  1673.   ---------------------------------------------------------------------------*/
  1674.  
  1675. #if (!defined(SFX) && !defined(FUNZIP))
  1676. int    explode                   OF((__GPRO));                  /* explode.c */
  1677. #endif
  1678. int    huft_free                 OF((struct huft *t));          /* inflate.c */
  1679. int    huft_build                OF((__GPRO__ ZCONST unsigned *b, unsigned n,
  1680.                                      unsigned s, ZCONST ush *d, ZCONST ush *e,
  1681.                                      struct huft **t, int *m));
  1682. #ifdef USE_ZLIB
  1683.    int    UZinflate              OF((__GPRO));                  /* inflate.c */
  1684. #  define inflate_free(x)        inflateEnd(&((Uz_Globs *)(&G))->dstrm)
  1685. #else
  1686.    int    inflate                OF((__GPRO));                  /* inflate.c */
  1687.    int    inflate_free           OF((__GPRO));                  /* inflate.c */
  1688. #endif /* ?USE_ZLIB */
  1689. #if (!defined(SFX) && !defined(FUNZIP))
  1690. void   unreduce                  OF((__GPRO));                 /* unreduce.c */
  1691. /* static void  LoadFollowers    OF((__GPRO__ f_array *follower, uch *Slen));
  1692.                                                                 * unreduce.c */
  1693. int    unshrink                  OF((__GPRO));                 /* unshrink.c */
  1694. /* static void  partial_clear    OF((__GPRO));                  * unshrink.c */
  1695. #endif /* !SFX && !FUNZIP */
  1696.  
  1697. /*---------------------------------------------------------------------------
  1698.     Internal API functions (only included in DLL versions):
  1699.   ---------------------------------------------------------------------------*/
  1700.  
  1701. #ifdef DLL
  1702.    void     setFileNotFound       OF((__GPRO));                     /* api.c */
  1703.    int      unzipToMemory         OF((__GPRO__ char *zip, char *file,
  1704.                                       UzpBuffer *retstr));          /* api.c */
  1705.    int      redirect_outfile      OF((__GPRO));                     /* api.c */
  1706.    int      writeToMemory         OF((__GPRO__ uch *rawbuf, ulg size));
  1707.    int      close_redirect        OF((__GPRO));                     /* api.c */
  1708.    /* this obsolescent entry point kept for compatibility: */
  1709.    int      UzpUnzip              OF((int argc, char **argv));/* use UzpMain */
  1710. #ifdef OS2DLL
  1711.    int      varmessage            OF((__GPRO__ uch *buf, ulg size));
  1712.    int      varputchar            OF((__GPRO__ int c));         /* rexxapi.c */
  1713.    int      finish_REXX_redirect  OF((__GPRO));                 /* rexxapi.c */
  1714. #endif
  1715. #ifdef API_DOC
  1716.    void     APIhelp               OF((__GPRO__ int argc, char **argv));
  1717. #endif                                                          /* apihelp.c */
  1718. #endif /* DLL */
  1719.  
  1720. /*---------------------------------------------------------------------------
  1721.     Acorn RISC OS-only functions:
  1722.   ---------------------------------------------------------------------------*/
  1723.  
  1724. #ifdef RISCOS
  1725.    int   isRISCOSexfield     OF((void *extra_field));             /* acorn.c */
  1726.    void  setRISCOSexfield    OF((char *path, void *extra_field)); /* acorn.c */
  1727.    void  printRISCOSexfield  OF((int isdir, void *extra_field));  /* acorn.c */
  1728. #endif
  1729.  
  1730. /*---------------------------------------------------------------------------
  1731.     Human68K-only functions:
  1732.   ---------------------------------------------------------------------------*/
  1733.  
  1734. #ifdef __human68k__
  1735.    void  InitTwentyOne       OF((void));
  1736. #endif
  1737.  
  1738. /*---------------------------------------------------------------------------
  1739.     Macintosh-only functions:
  1740.   ---------------------------------------------------------------------------*/
  1741.  
  1742. #ifdef MACOS
  1743.    void    screenOpen        OF((char *));                    /* macscreen.c */
  1744.    void    screenControl     OF((char *, int));               /* macscreen.c */
  1745.    void    screenDump        OF((char *, long));              /* macscreen.c */
  1746.    void    screenUpdate      OF((WindowPtr));                 /* macscreen.c */
  1747.    void    screenClose       OF((void));                      /* macscreen.c */
  1748.    int     macgetch          OF((void));                      /* macscreen.c */
  1749.  
  1750.    int     macmkdir     OF((char *));                               /* mac.c */
  1751.    short   macopen      OF((char *, short));                        /* mac.c */
  1752.    short   maccreat     OF((char *));                               /* mac.c */
  1753.    short   macread      OF((short, char *, unsigned));              /* mac.c */
  1754.    long    macwrite     OF((short, char *, unsigned));              /* mac.c */
  1755.    short   macclose     OF((short));                                /* mac.c */
  1756.    long    maclseek     OF((short, long, short));                   /* mac.c */
  1757.    char   *macfgets     OF((char *, int, FILE *));                  /* mac.c */
  1758.    int     macfprintf   OF((FILE *, char *, ...));                  /* mac.c */
  1759.    int     macprintf    OF((char *, ...));                          /* mac.c */
  1760. #endif
  1761.  
  1762. /*---------------------------------------------------------------------------
  1763.     MSDOS-only functions:
  1764.   ---------------------------------------------------------------------------*/
  1765.  
  1766. #if (defined(MSDOS) && (defined(__GO32__) || defined(__EMX__)))
  1767.    unsigned _dos_getcountryinfo(void *);                          /* msdos.c */
  1768. #if (!defined(__DJGPP__) || (__DJGPP__ < 2))
  1769.    unsigned _dos_setftime(int, unsigned short, unsigned short);   /* msdos.c */
  1770.    unsigned _dos_setfileattr(char *, unsigned);                   /* msdos.c */
  1771.    unsigned _dos_creat(char *, unsigned, int *);                  /* msdos.c */
  1772.    void _dos_getdrive(unsigned *);                                /* msdos.c */
  1773.    unsigned _dos_close(int);                                      /* msdos.c */
  1774. #endif /* !__DJGPP__ || (__DJGPP__ < 2) */
  1775. #endif
  1776.  
  1777. /*---------------------------------------------------------------------------
  1778.     OS/2-only functions:
  1779.   ---------------------------------------------------------------------------*/
  1780.  
  1781. #ifdef OS2   /* GetFileTime conflicts with something in Win32 header files */
  1782. #if (defined(REENTRANT) && defined(USETHREADID))
  1783.    ulg   GetThreadId          OF((void));
  1784. #endif
  1785.    int   GetCountryInfo       OF((void));                           /* os2.c */
  1786.    long  GetFileTime          OF((ZCONST char *name));              /* os2.c */
  1787. /* static void  SetPathAttrTimes OF((__GPRO__ int flags, int dir));    os2.c */
  1788. /* static int   SetEAs        OF((__GPRO__ const char *path,
  1789.                                   void *eablock));                     os2.c */
  1790. /* static int   SetACL        OF((__GPRO__ const char *path,
  1791.                                   void *eablock));                     os2.c */
  1792. /* static int   IsFileNameValid OF((const char *name));                os2.c */
  1793. /* static void  map2fat       OF((char *pathcomp, char **pEndFAT));    os2.c */
  1794. /* static int   SetLongNameEA OF((char *name, char *longname));        os2.c */
  1795. /* static void  InitNLS       OF((void));                              os2.c */
  1796.    int   IsUpperNLS           OF((int nChr));                       /* os2.c */
  1797.    int   ToLowerNLS           OF((int nChr));                       /* os2.c */
  1798.    void  DebugMalloc          OF((void));                           /* os2.c */
  1799. #endif
  1800.  
  1801. /*---------------------------------------------------------------------------
  1802.     QDOS-only functions:
  1803.   ---------------------------------------------------------------------------*/
  1804.  
  1805. #ifdef QDOS
  1806.    int    QMatch              (uch, uch);
  1807.    void   QFilename           (__GPRO__ char *);
  1808.    char  *Qstrfix             (char *);
  1809.    int    QReturn             (int zip_error);
  1810. #endif
  1811.  
  1812. /*---------------------------------------------------------------------------
  1813.     TOPS20-only functions:
  1814.   ---------------------------------------------------------------------------*/
  1815.  
  1816. #ifdef TOPS20
  1817.    int    upper               OF((char *s));                     /* tops20.c */
  1818.    int    enquote             OF((char *s));                     /* tops20.c */
  1819.    int    dequote             OF((char *s));                     /* tops20.c */
  1820.    int    fnlegal             OF(()); /* error if prototyped? */ /* tops20.c */
  1821. #endif
  1822.  
  1823. /*---------------------------------------------------------------------------
  1824.     VM/CMS- and MVS-only functions:
  1825.   ---------------------------------------------------------------------------*/
  1826.  
  1827. #ifdef CMS_MVS
  1828.    extent getVMMVSexfield     OF((char *type, uch *ef_block, unsigned datalen));
  1829.    FILE  *vmmvs_open_infile   OF((__GPRO));                       /* vmmvs.c */
  1830.    void   close_infile        OF((__GPRO));                       /* vmmvs.c */
  1831. #endif
  1832.  
  1833. /*---------------------------------------------------------------------------
  1834.     VMS-only functions:
  1835.   ---------------------------------------------------------------------------*/
  1836.  
  1837. #ifdef VMS
  1838.    int    check_format        OF((__GPRO));                         /* vms.c */
  1839. /* int    open_outfile        OF((__GPRO));           * (see fileio.c) vms.c */
  1840. /* int    flush               OF((__GPRO__ uch *rawbuf, unsigned size,
  1841.                                   int final_flag));   * (see fileio.c) vms.c */
  1842. #ifdef RETURN_CODES
  1843.    void   return_VMS          OF((__GPRO__ int zip_error));         /* vms.c */
  1844. #else
  1845.    void   return_VMS          OF((int zip_error));                  /* vms.c */
  1846. #endif
  1847. #ifdef VMSCLI
  1848.    ulg    vms_unzip_cmdline   OF((int *, char ***));            /* cmdline.c */
  1849.    int    VMSCLI_usage        OF((__GPRO__ int error));         /* cmdline.c */
  1850. #endif
  1851. #endif
  1852.  
  1853. /*---------------------------------------------------------------------------
  1854.     WIN32-only functions:
  1855.   ---------------------------------------------------------------------------*/
  1856.  
  1857. #ifdef WIN32
  1858.    int   IsWinNT        OF((void));                               /* win32.c */
  1859. #ifdef NTSD_EAS
  1860.    void  process_defer_NT     OF((__GPRO));                       /* win32.c */
  1861.    int   test_NTSD      OF((__GPRO__ uch *eb, unsigned eb_size,
  1862.                             uch *eb_ucptr, ulg eb_ucsize));       /* win32.c */
  1863. #  define TEST_NTSD     test_NTSD
  1864. #endif
  1865. #ifdef W32_STAT_BANDAID
  1866.    int   zstat_win32    OF((__W32STAT_GLOBALS__
  1867.                             const char *path, struct stat *buf)); /* win32.c */
  1868. #endif
  1869. #endif
  1870.  
  1871. /*---------------------------------------------------------------------------
  1872.     Miscellaneous/shared functions:
  1873.   ---------------------------------------------------------------------------*/
  1874.  
  1875. Uz_Globs *globalsCtor    OF((void));                            /* globals.c */
  1876.  
  1877. void     envargs         OF((__GPRO__ int *Pargc, char ***Pargv,
  1878.                              ZCONST char *envstr, ZCONST char *envstr2));
  1879.                                                                 /* envargs.c */
  1880. void     mksargs         OF((int *argcp, char ***argvp));       /* envargs.c */
  1881.  
  1882. int      match           OF((ZCONST char *s, ZCONST char *p,
  1883.                              int ic));                            /* match.c */
  1884. int      iswild          OF((ZCONST char *p));                    /* match.c */
  1885.  
  1886. #ifdef DYNALLOC_CRCTAB
  1887.    void     free_crc_table  OF((void));                          /* crctab.c */
  1888. #endif
  1889. #ifndef USE_ZLIB
  1890.    ZCONST ulg near *get_crc_table  OF((void));         /* funzip.c, crctab.c */
  1891.    ulg      crc32           OF((ulg crc, ZCONST uch *buf, extent len));
  1892. #endif /* !USE_ZLIB */                        /* assembler source or crc32.c */
  1893.  
  1894. int      dateformat      OF((void));              /* currently, only msdos.c */
  1895. #ifndef WINDLL
  1896.    void  version         OF((__GPRO));                              /* local */
  1897. #endif
  1898. int      mapattr         OF((__GPRO));                              /* local */
  1899. int      mapname         OF((__GPRO__ int renamed));                /* local */
  1900. int      checkdir        OF((__GPRO__ char *pathcomp, int flag));   /* local */
  1901. char    *do_wild         OF((__GPRO__ char *wildzipfn));            /* local */
  1902. char    *GetLoadPath     OF((__GPRO));                              /* local */
  1903. #if (defined(MORE) && (defined(UNIX) || defined(VMS) || defined(__BEOS__)))
  1904.    int screenlines       OF((void));                                /* local */
  1905. #endif
  1906. #ifndef MTS /* macro in MTS */
  1907.    void  close_outfile   OF((__GPRO));                              /* local */
  1908. #endif
  1909. #ifdef SET_DIR_ATTRIB
  1910.    int   set_direc_attribs  OF((__GPRO__ dirtime *d));              /* local */
  1911. #endif
  1912. #ifdef TIMESTAMP
  1913. # ifdef WIN32
  1914.    int   stamp_file      OF((__GPRO__
  1915.                              ZCONST char *fname, time_t modtime));  /* local */
  1916. # else
  1917.    int   stamp_file      OF((ZCONST char *fname, time_t modtime));  /* local */
  1918. # endif
  1919. #endif
  1920. #ifdef SYSTEM_SPECIFIC_CTOR
  1921.    void  SYSTEM_SPECIFIC_CTOR   OF((__GPRO));                       /* local */
  1922. #endif
  1923.  
  1924.  
  1925.  
  1926.  
  1927.  
  1928. /************/
  1929. /*  Macros  */
  1930. /************/
  1931.  
  1932. #ifndef MAX
  1933. #  define MAX(a,b)   ((a) > (b) ? (a) : (b))
  1934. #endif
  1935. #ifndef MIN
  1936. #  define MIN(a,b)   ((a) < (b) ? (a) : (b))
  1937. #endif
  1938.  
  1939. #ifdef DEBUG
  1940. #  define Trace(x)   fprintf x
  1941. #else
  1942. #  define Trace(x)
  1943. #endif
  1944.  
  1945. #ifdef DEBUG_TIME
  1946. #  define TTrace(x)  fprintf x
  1947. #else
  1948. #  define TTrace(x)
  1949. #endif
  1950.  
  1951. #ifdef NO_DEBUG_IN_MACROS
  1952. #  define MTrace(x)
  1953. #else
  1954. #  define MTrace(x)  Trace(x)
  1955. #endif
  1956.  
  1957. #if (defined(UNIX) || defined(T20_VMS)) /* generally old systems */
  1958. #  define ToLower(x)   ((char)(isupper((int)x)? tolower((int)x) : x))
  1959. #else
  1960. #  define ToLower      tolower          /* assumed "smart"; used in match() */
  1961. #endif
  1962.  
  1963. #ifdef USE_STRM_INPUT
  1964.    /* ``Replace'' the unbuffered UNIX style I/O function with similar
  1965.     * standard C functions from <stdio.h>.
  1966.     */
  1967. #  define read(fd,buf,n) fread((buf),1,(n),(FILE *)(fd))
  1968. #  define lseek(fd,o,w) fseek((FILE *)(fd),(o),(w))
  1969. #  define close(fd) fclose((FILE *)(fd))
  1970. #endif /* USE_STRM_INPUT */
  1971.  
  1972. /* The return value of the Info() "macro function" is never checked in
  1973.  * UnZip. Otherwise, to get the same behaviour as for (*G.message)(), the
  1974.  * Info() definition for "FUNZIP" would have to be corrected:
  1975.  * #define Info(buf,flag,sprf_arg) \
  1976.  *      (fprintf((flag)&1? stderr : stdout, \
  1977.  *               (char *)(sprintf sprf_arg, (buf))) == EOF)
  1978.  */
  1979. #ifndef Info   /* may already have been defined for redirection */
  1980. #  ifdef FUNZIP
  1981. #    define Info(buf,flag,sprf_arg) \
  1982.      fprintf((flag)&1? stderr : stdout, (char *)(sprintf sprf_arg, (buf)))
  1983. #  else
  1984. #    ifdef INT_SPRINTF  /* optimized version for "int sprintf()" flavour */
  1985. #      define Info(buf,flag,sprf_arg) \
  1986.        (*G.message)((zvoid *)&G, (uch *)(buf), (ulg)sprintf sprf_arg, (flag))
  1987. #    else          /* generic version, does not use sprintf() return value */
  1988. #      define Info(buf,flag,sprf_arg) \
  1989.        (*G.message)((zvoid *)&G, (uch *)(buf), \
  1990.                      (ulg)(sprintf sprf_arg, strlen((char *)(buf))), (flag))
  1991. #    endif
  1992. #  endif
  1993. #endif /* !Info */
  1994.  
  1995. /*  The following macros wrappers around the fnfilter function are used many
  1996.  *  times to prepare archive entry names or name components for displaying
  1997.  *  listings and (warning/error) messages. They use sections in the upper half
  1998.  *  of 'slide' as buffer, since their output is normally fed through the
  1999.  *  Info() macro with 'slide' (the start of this area) as message buffer.
  2000.  */
  2001. #define FnFilter1(fname)  fnfilter((fname), slide + (WSIZE>>1))
  2002. #define FnFilter2(fname)  fnfilter((fname), slide + ((WSIZE>>1) + (WSIZE>>2)))
  2003.  
  2004. #ifndef FUNZIP   /* used only in inflate.c */
  2005. #  define MESSAGE(str,len,flag)  (*G.message)((zvoid *)&G,(str),(len),(flag))
  2006. #endif
  2007.  
  2008. #if 0            /* Optimization: use the (const) result of crc32(0L,NULL,0) */
  2009. #  define CRCVAL_INITIAL  crc32(0L, NULL, 0)
  2010. #else
  2011. #  define CRCVAL_INITIAL  0L
  2012. #endif
  2013.  
  2014. #ifndef TEST_NTSD               /* "NTSD valid?" checking function */
  2015. #  define TEST_NTSD     NULL    /*   ... is not available */
  2016. #endif
  2017.  
  2018. /*
  2019.  *  Seek to the block boundary of the block which includes abs_offset,
  2020.  *  then read block into input buffer and set pointers appropriately.
  2021.  *  If block is already in the buffer, just set the pointers.  This macro
  2022.  *  is used by uz_end_central (process.c), zi_end_central (zipinfo.c) and
  2023.  *  do_string (fileio.c).  A slightly modified version is embedded within
  2024.  *  extract_or_test_files (extract.c).  readbyte() and readbuf() (fileio.c)
  2025.  *  are compatible.  NOTE THAT abs_offset is intended to be the "proper off-
  2026.  *  set" (i.e., if there were no extra bytes prepended); cur_zipfile_bufstart
  2027.  *  contains the corrected offset.
  2028.  *
  2029.  *  Since ZLSEEK is never used during decompression, it is safe to use the
  2030.  *  slide[] buffer for the error message.
  2031.  *
  2032.  *  The awkward "%cbs_offset" construct is provided for the obnoxious Solaris
  2033.  *  compiler, which wants to do macro substitution inside strings.
  2034.  */
  2035.  
  2036. #ifndef ZLSEEK
  2037. #  ifdef USE_STRM_INPUT
  2038. #    define _ZLS_RELOAD(abs_offset) {\
  2039.          MTrace((stderr, "ZLSEEK: %cbs_offset = %ld, G.extra_bytes = %ld\n",\
  2040.            'a', (abs_offset), G.extra_bytes));\
  2041.          fseek(G.zipfd,(LONGINT)bufstart,SEEK_SET);\
  2042.          G.cur_zipfile_bufstart = ftell(G.zipfd);\
  2043.          MTrace((stderr,\
  2044.            "       request = %ld, (abs+extra) = %ld, inbuf_offset = %ld\n",\
  2045.            request, ((abs_offset)+G.extra_bytes), inbuf_offset));\
  2046.          MTrace((stderr, "       bufstart = %ld, cur_zipfile_bufstart = %ld\n",\
  2047.            bufstart, G.cur_zipfile_bufstart));\
  2048.          if ((G.incnt = fread((char *)G.inbuf,1,INBUFSIZ,G.zipfd)) <= 0)\
  2049.              return(PK_EOF);\
  2050.          G.inptr = G.inbuf + (int)inbuf_offset;\
  2051.          G.incnt -= (int)inbuf_offset;\
  2052.      }
  2053. #  else /* !USE_STRM_INPUT */
  2054. #    define _ZLS_RELOAD(abs_offset) {\
  2055.          MTrace((stderr, "ZLSEEK: %cbs_offset = %ld, G.extra_bytes = %ld\n",\
  2056.            'a', (abs_offset), G.extra_bytes));\
  2057.          G.cur_zipfile_bufstart = lseek(G.zipfd,(LONGINT)bufstart,SEEK_SET);\
  2058.          MTrace((stderr,\
  2059.            "       request = %ld, (abs+extra) = %ld, inbuf_offset = %ld\n",\
  2060.            request, ((abs_offset)+G.extra_bytes), inbuf_offset));\
  2061.          MTrace((stderr, "       bufstart = %ld, cur_zipfile_bufstart = %ld\n",\
  2062.            bufstart, G.cur_zipfile_bufstart));\
  2063.          if ((G.incnt = read(G.zipfd,(char *)G.inbuf,INBUFSIZ)) <= 0)\
  2064.              return(PK_EOF);\
  2065.          G.inptr = G.inbuf + (int)inbuf_offset;\
  2066.          G.incnt -= (int)inbuf_offset;\
  2067.      }
  2068. #  endif /* ?USE_STRM_INPUT */
  2069.  
  2070. #  define ZLSEEK(abs_offset) {\
  2071.        LONGINT request = (abs_offset) + G.extra_bytes;\
  2072.        LONGINT inbuf_offset = request % INBUFSIZ;\
  2073.        LONGINT bufstart = request - inbuf_offset;\
  2074. \
  2075.        if (request < 0) {\
  2076.            Info(slide, 1, ((char *)slide, LoadFarStringSmall(SeekMsg),\
  2077.              G.zipfn, LoadFarString(ReportMsg)));\
  2078.            return(PK_BADERR);\
  2079.        } else if (bufstart != G.cur_zipfile_bufstart)\
  2080.            _ZLS_RELOAD(abs_offset)\
  2081.        else {\
  2082.            G.incnt += (G.inptr-G.inbuf) - (int)inbuf_offset;\
  2083.            G.inptr = G.inbuf + (int)inbuf_offset;\
  2084.        }\
  2085.    }
  2086. #endif /* !ZLSEEK */
  2087.  
  2088. #define SKIP_(length) if(length&&((error=do_string(__G__ length,SKIP))!=0))\
  2089.   {error_in_archive=error; if(error>1) return error;}
  2090.  
  2091. /*
  2092.  *  Skip a variable-length field, and report any errors.  Used in zipinfo.c
  2093.  *  and unzip.c in several functions.
  2094.  *
  2095.  *  macro SKIP_(length)
  2096.  *      ush length;
  2097.  *  {
  2098.  *      if (length && ((error = do_string(length, SKIP)) != 0)) {
  2099.  *          error_in_archive = error;   /-* might be warning *-/
  2100.  *          if (error > 1)              /-* fatal *-/
  2101.  *              return (error);
  2102.  *      }
  2103.  *  }
  2104.  *
  2105.  */
  2106.  
  2107.  
  2108. #ifdef FUNZIP
  2109. #  define FLUSH(w)  flush(__G__ (ulg)(w))
  2110. #  define NEXTBYTE  getc(G.in)   /* redefined in crypt.h if full version */
  2111. #else
  2112. #  define FLUSH(w)  if (G.mem_mode) memflush(__G__ redirSlide,(ulg)(w)); \
  2113.      else flush(__G__ redirSlide,(ulg)(w),0)
  2114. #  define NEXTBYTE  (--G.incnt >= 0 ? (int)(*G.inptr++) : readbyte(__G))
  2115. #endif
  2116.  
  2117.  
  2118. #define READBITS(nbits,zdest) {if(nbits>G.bits_left) {int temp; G.zipeof=1;\
  2119.   while (G.bits_left<=8*(int)(sizeof(G.bitbuf)-1) && (temp=NEXTBYTE)!=EOF) {\
  2120.   G.bitbuf|=(ulg)temp<<G.bits_left; G.bits_left+=8; G.zipeof=0;}}\
  2121.   zdest=(shrint)((ush)G.bitbuf&mask_bits[nbits]);G.bitbuf>>=nbits;\
  2122.   G.bits_left-=nbits;}
  2123.  
  2124. /*
  2125.  * macro READBITS(nbits,zdest)    * only used by unreduce and unshrink *
  2126.  *  {
  2127.  *      if (nbits > G.bits_left) {  * fill G.bitbuf, 8*sizeof(ulg) bits *
  2128.  *          int temp;
  2129.  *
  2130.  *          G.zipeof = 1;
  2131.  *          while (G.bits_left <= 8*(int)(sizeof(G.bitbuf)-1) &&
  2132.  *                 (temp = NEXTBYTE) != EOF) {
  2133.  *              G.bitbuf |= (ulg)temp << G.bits_left;
  2134.  *              G.bits_left += 8;
  2135.  *              G.zipeof = 0;
  2136.  *          }
  2137.  *      }
  2138.  *      zdest = (shrint)((ush)G.bitbuf & mask_bits[nbits]);
  2139.  *      G.bitbuf >>= nbits;
  2140.  *      G.bits_left -= nbits;
  2141.  *  }
  2142.  *
  2143.  */
  2144.  
  2145.  
  2146. /* GRR:  should change name to STRLOWER and use StringLower if possible */
  2147.  
  2148. /*
  2149.  *  Copy the zero-terminated string in str1 into str2, converting any
  2150.  *  uppercase letters to lowercase as we go.  str2 gets zero-terminated
  2151.  *  as well, of course.  str1 and str2 may be the same character array.
  2152.  */
  2153. #ifdef __human68k__
  2154. #  define TOLOWER(str1, str2) \
  2155.    { \
  2156.        char *p=(str1), *q=(str2); \
  2157.        uch c; \
  2158.        while ((c = *p++) != '\0') { \
  2159.            if (iskanji(c)) { \
  2160.                if (*p == '\0') \
  2161.                    break; \
  2162.                *q++ = c; \
  2163.                *q++ = *p++; \
  2164.            } else \
  2165.                *q++ = isupper(c) ? tolower(c) : c; \
  2166.        } \
  2167.        *q = '\0'; \
  2168.    }
  2169. #else
  2170. #  define TOLOWER(str1, str2) \
  2171.    { \
  2172.        char  *p, *q; \
  2173.        p = (str1) - 1; \
  2174.        q = (str2); \
  2175.        while (*++p) \
  2176.            *q++ = (char)(isupper((int)(*p))? tolower((int)(*p)) : *p); \
  2177.        *q = '\0'; \
  2178.    }
  2179. #endif
  2180. /*
  2181.  *  NOTES:  This macro makes no assumptions about the characteristics of
  2182.  *    the tolower() function or macro (beyond its existence), nor does it
  2183.  *    make assumptions about the structure of the character set (i.e., it
  2184.  *    should work on EBCDIC machines, too).  The fact that either or both
  2185.  *    of isupper() and tolower() may be macros has been taken into account;
  2186.  *    watch out for "side effects" (in the C sense) when modifying this
  2187.  *    macro.
  2188.  */
  2189.  
  2190. #ifndef foreign
  2191. #  define foreign(c)  (c)
  2192. #endif
  2193.  
  2194. #ifndef native
  2195. #  define native(c)   (c)
  2196. #  define A_TO_N(str1)
  2197. #else
  2198. #  ifndef NATIVE
  2199. #    define NATIVE     "native chars"
  2200. #  endif
  2201. #  define A_TO_N(str1) {register uch *p;\
  2202.      for (p=(uch *)(str1); *p; p++) *p=native(*p);}
  2203. #endif
  2204. /*
  2205.  *  Translate the zero-terminated string in str1 from ASCII to the native
  2206.  *  character set. The translation is performed in-place and uses the
  2207.  *  "native" macro to translate each character.
  2208.  *
  2209.  *  NOTE:  Using the "native" macro means that is it the only part of unzip
  2210.  *    which knows which translation table (if any) is actually in use to
  2211.  *    produce the native character set.  This makes adding new character set
  2212.  *    translation tables easy, insofar as all that is needed is an appropriate
  2213.  *    "native" macro definition and the translation table itself.  Currently,
  2214.  *    the only non-ASCII native character set implemented is EBCDIC, but this
  2215.  *    may not always be so.
  2216.  */
  2217.  
  2218.  
  2219. /* default setup for internal codepage: assume ISO 8859-1 compatibility!! */
  2220. #if (!defined(NATIVE) && !defined(CRTL_CP_IS_ISO) && !defined(CRTL_CP_IS_OEM))
  2221. #  define CRTL_CP_IS_ISO
  2222. #endif
  2223.  
  2224.  
  2225. /*  Translate "extended ASCII" chars (OEM coding for DOS and OS/2; else
  2226.  *  ISO-8859-1 [ISO Latin 1, Win Ansi,...]) into the internal "native"
  2227.  *  code page.  As with A_TO_N(), conversion is done in place.
  2228.  */
  2229. #ifndef _ISO_INTERN
  2230. #  ifdef CRTL_CP_IS_OEM
  2231. #    ifndef IZ_ISO2OEM_ARRAY
  2232. #      define IZ_ISO2OEM_ARRAY
  2233. #    endif
  2234. #    define _ISO_INTERN(str1) {register uch *p;\
  2235.        for (p=(uch *)(str1); *p; p++)\
  2236.          *p = native((*p & 0x80) ? iso2oem[*p & 0x7f] : *p);}
  2237. #  else
  2238. #    define _ISO_INTERN(str1)   A_TO_N(str1)
  2239. #  endif
  2240. #endif
  2241.  
  2242. #ifndef _OEM_INTERN
  2243. #  ifdef CRTL_CP_IS_OEM
  2244. #    define _OEM_INTERN(str1)   A_TO_N(str1)
  2245. #  else
  2246. #    ifndef IZ_OEM2ISO_ARRAY
  2247. #      define IZ_OEM2ISO_ARRAY
  2248. #    endif
  2249. #    define _OEM_INTERN(str1) {register uch *p;\
  2250.        for (p=(uch *)(str1); *p; p++)\
  2251.          *p = native((*p & 0x80) ? oem2iso[*p & 0x7f] : *p);}
  2252. #  endif
  2253. #endif
  2254.  
  2255. #ifndef STR_TO_ISO
  2256. #  ifdef CRTL_CP_IS_ISO
  2257. #    define STR_TO_ISO          strcpy
  2258. #  else
  2259. #    define STR_TO_ISO          str2iso
  2260. #    define NEED_STR2ISO
  2261. #  endif
  2262. #endif
  2263.  
  2264. #ifndef STR_TO_OEM
  2265. #  ifdef CRTL_CP_IS_OEM
  2266. #    define STR_TO_OEM          strcpy
  2267. #  else
  2268. #    define STR_TO_OEM          str2oem
  2269. #    define NEED_STR2OEM
  2270. #  endif
  2271. #endif
  2272.  
  2273. #if (!defined(INTERN_TO_ISO) && !defined(ASCII2ISO))
  2274. #  ifdef CRTL_CP_IS_OEM
  2275.      /* know: "ASCII" is "OEM" */
  2276. #    define ASCII2ISO(c) (((c) & 0x80) ? oem2iso[(c) & 0x7f] : (c))
  2277. #    if (defined(NEED_STR2ISO) && !defined(CRYP_USES_OEM2ISO))
  2278. #      define CRYP_USES_OEM2ISO
  2279. #    endif
  2280. #  else
  2281.      /* assume: "ASCII" is "ISO-ANSI" */
  2282. #    define ASCII2ISO(c) (c)
  2283. #  endif
  2284. #endif
  2285.  
  2286. #if (!defined(INTERN_TO_OEM) && !defined(ASCII2OEM))
  2287. #  ifdef CRTL_CP_IS_OEM
  2288.      /* know: "ASCII" is "OEM" */
  2289. #    define ASCII2OEM(c) (c)
  2290. #  else
  2291.      /* assume: "ASCII" is "ISO-ANSI" */
  2292. #    define ASCII2OEM(c) (((c) & 0x80) ? iso2oem[(c) & 0x7f] : (c))
  2293. #    if (defined(NEED_STR2OEM) && !defined(CRYP_USES_ISO2OEM))
  2294. #      define CRYP_USES_ISO2OEM
  2295. #    endif
  2296. #  endif
  2297. #endif
  2298.  
  2299. /* codepage conversion setup for testp() in crypt.c */
  2300. #ifdef CRTL_CP_IS_ISO
  2301. #  ifndef STR_TO_CP2
  2302. #    define STR_TO_CP2  STR_TO_OEM
  2303. #  endif
  2304. #else
  2305. #  ifdef CRTL_CP_IS_OEM
  2306. #    ifndef STR_TO_CP2
  2307. #      define STR_TO_CP2  STR_TO_ISO
  2308. #    endif
  2309. #  else /* native internal CP is neither ISO nor OEM */
  2310. #    ifndef STR_TO_CP1
  2311. #      define STR_TO_CP1  STR_TO_ISO
  2312. #    endif
  2313. #    ifndef STR_TO_CP2
  2314. #      define STR_TO_CP2  STR_TO_OEM
  2315. #    endif
  2316. #  endif
  2317. #endif
  2318.  
  2319.  
  2320. /* Convert filename (and file comment string) into "internal" charset.
  2321.  * This macro assumes that Zip entry filenames are coded in OEM (IBM DOS)
  2322.  * codepage when made on
  2323.  *  -> DOS (this includes 16-bit Windows 3.1)  (FS_FAT_)
  2324.  *  -> OS/2                                    (FS_HPFS_)
  2325.  *  -> Win95/WinNT with Nico Mak's WinZip      (FS_NTFS_ && hostver == "5.0")
  2326.  *
  2327.  * All other ports are assumed to code zip entry filenames in ISO 8859-1.
  2328.  */
  2329. #ifndef Ext_ASCII_TO_Native
  2330. #  define Ext_ASCII_TO_Native(string, hostnum, hostver) \
  2331.     if ((hostnum) == FS_FAT_ || (hostnum) == FS_HPFS_ || \
  2332.         ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \
  2333.         _OEM_INTERN((string)); \
  2334.     } else { \
  2335.         _ISO_INTERN((string)); \
  2336.     }
  2337. #endif
  2338.  
  2339.  
  2340.  
  2341. /**********************/
  2342. /*  Global constants  */
  2343. /**********************/
  2344.  
  2345.    extern ZCONST ush near  mask_bits[];
  2346.    extern ZCONST char *fnames[2];
  2347.  
  2348. #ifdef EBCDIC
  2349.    extern ZCONST uch ebcdic[];
  2350. #endif
  2351. #ifdef IZ_ISO2OEM_ARRAY
  2352.    extern ZCONST uch Far iso2oem[];
  2353. #endif
  2354. #ifdef IZ_OEM2ISO_ARRAY
  2355.    extern ZCONST uch Far oem2iso[];
  2356. #endif
  2357.  
  2358.    extern ZCONST char Far  VersionDate[];
  2359.    extern ZCONST char Far  CentSigMsg[];
  2360.    extern ZCONST char Far  EndSigMsg[];
  2361.    extern ZCONST char Far  SeekMsg[];
  2362.    extern ZCONST char Far  FilenameNotMatched[];
  2363.    extern ZCONST char Far  ExclFilenameNotMatched[];
  2364.    extern ZCONST char Far  ReportMsg[];
  2365.  
  2366. #ifndef SFX
  2367.    extern ZCONST char Far  CompiledWith[];
  2368. #endif /* !SFX */
  2369.  
  2370.  
  2371.  
  2372. /***********************************/
  2373. /*  Global (shared?) RTL variables */
  2374. /***********************************/
  2375.  
  2376. #ifdef DECLARE_ERRNO
  2377.    extern int             errno;
  2378. #endif
  2379.  
  2380.  
  2381. #endif /* !__unzpriv_h */
  2382.