unzip.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:59k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.   unzip.c
  3.   UnZip - a zipfile extraction utility.  See below for make instructions, or
  4.   read the comments in Makefile and the various Contents files for more de-
  5.   tailed explanations.  To report a bug, send a *complete* description to
  6.   Zip-Bugs@lists.wku.edu; include machine type, operating system and ver-
  7.   sion, compiler and version, and reasonably detailed error messages or prob-
  8.   lem report.  To join Info-ZIP, see the instructions in README.
  9.   UnZip 5.x is a greatly expanded and partially rewritten successor to 4.x,
  10.   which in turn was almost a complete rewrite of version 3.x.  For a detailed
  11.   revision history, see UnzpHist.zip at quest.jpl.nasa.gov.  For a list of
  12.   the many (near infinite) contributors, see "CONTRIBS" in the UnZip source
  13.   distribution.
  14.   ---------------------------------------------------------------------------
  15.   [from original zipinfo.c]
  16.   This program reads great gobs of totally nifty information, including the
  17.   central directory stuff, from ZIP archives ("zipfiles" for short).  It
  18.   started as just a testbed for fooling with zipfiles, but at this point it
  19.   is actually a useful utility.  It also became the basis for the rewrite of
  20.   UnZip (3.16 -> 4.0), using the central directory for processing rather than
  21.   the individual (local) file headers.
  22.   As of ZipInfo v2.0 and UnZip v5.1, the two programs are combined into one.
  23.   If the executable is named "unzip" (or "unzip.exe", depending), it behaves
  24.   like UnZip by default; if it is named "zipinfo" or "ii", it behaves like
  25.   ZipInfo.  The ZipInfo behavior may also be triggered by use of unzip's -Z
  26.   option; for example, "unzip -Z [zipinfo_options] archive.zip".
  27.   Another dandy product from your buddies at Newtware!
  28.   Author:  Greg Roelofs, newt@pobox.com, http://pobox.com/~newt/
  29.            23 August 1990 -> April 1997
  30.   ---------------------------------------------------------------------------
  31.   Version:  unzip5??.{tar.Z | tar.gz | zip} for Unix, VMS, OS/2, MS-DOS, Amiga,
  32.               Atari, Windows 3.x/95/NT/CE, Macintosh, Human68K, Acorn RISC OS,
  33.               BeOS, SMS/QDOS, VM/CMS, MVS, AOS/VS and TOPS-20.  Decryption
  34.               requires sources in zcrypt28.zip.  See the accompanying "WHERE"
  35.               file in the main source distribution for ftp, uucp, BBS and mail-
  36.               server sites, or see http://www.cdrom.com/pub/infozip/UnZip.html .
  37.   Copyrights:  see accompanying file "COPYING" in UnZip source distribution.
  38.                (This software is free but NOT IN THE PUBLIC DOMAIN.  There
  39.                are some restrictions on commercial use.)
  40.   ---------------------------------------------------------------------------*/
  41. #define UNZIP_C
  42. #define UNZIP_INTERNAL
  43. #include "unzip.h"        /* includes, typedefs, macros, prototypes, etc. */
  44. #include "crypt.h"
  45. #include "version.h"
  46. #ifndef WINDLL            /* The WINDLL port uses windll/windll.c instead... */
  47. /*******************/
  48. /* Local Functions */
  49. /*******************/
  50. #ifndef SFX
  51. static void  show_version_info  OF((__GPRO));
  52. #endif
  53. /*************/
  54. /* Constants */
  55. /*************/
  56. #include "consts.h"  /* all constant global variables are in here */
  57.                      /* (non-constant globals were moved to globals.c) */
  58. /* constant local variables: */
  59. #ifndef SFX
  60.    static ZCONST char Far EnvUnZip[] = ENV_UNZIP;
  61.    static ZCONST char Far EnvUnZip2[] = ENV_UNZIP2;
  62.    static ZCONST char Far EnvZipInfo[] = ENV_ZIPINFO;
  63.    static ZCONST char Far EnvZipInfo2[] = ENV_ZIPINFO2;
  64. #ifdef RISCOS
  65.    static ZCONST char Far EnvUnZipExts[] = ENV_UNZIPEXTS;
  66. #endif /* RISCOS */
  67. #endif
  68. #if (!defined(SFX) || defined(SFX_EXDIR))
  69.    static ZCONST char Far NotExtracting[] =
  70.      "caution:  not extracting; -d ignoredn";
  71.    static ZCONST char Far MustGiveExdir[] =
  72.      "error:  must specify directory to which to extract with -d optionn";
  73.    static ZCONST char Far OnlyOneExdir[] =
  74.      "error:  -d option used more than once (only one exdir allowed)n";
  75. #endif
  76. #if CRYPT
  77.    static ZCONST char Far MustGivePasswd[] =
  78.      "error:  must give decryption password with -P optionn";
  79. #endif
  80. #ifndef SFX
  81.    static ZCONST char Far Zfirst[] =
  82.    "error:  -Z must be first option for ZipInfo mode (check UNZIP variable?)n";
  83. #endif
  84. static ZCONST char Far InvalidOptionsMsg[] = "error:
  85.   -fn or any combination of -c, -l, -p, -t, -u and -v options invalidn";
  86. static ZCONST char Far IgnoreOOptionMsg[] =
  87.   "caution:  both -n and -o specified; ignoring -on";
  88. /* usage() strings */
  89. #ifndef SFX
  90. #ifdef VMS
  91.    static ZCONST char Far Example3[] = "vms.c";
  92.    static ZCONST char Far Example2[] = "  unzip
  93.  "-V" foo "Bar" => must quote uppercase options and filenames in VMSn";
  94. #else /* !VMS */
  95.    static ZCONST char Far Example3[] = "ReadMe";
  96. #ifdef RISCOS
  97.    static ZCONST char Far Example2[] =
  98. "  unzip foo -d RAM:$   => extract all files from foo into RAMDiscn";
  99. #else /* !RISCOS */
  100. #if (defined(OS2) || (defined(DOS_FLX_OS2_W32) && defined(MORE)))
  101.    static ZCONST char Far Example2[] =
  102.      "";                /* no room:  too many local3[] items */
  103. #else /* !OS2 */
  104. #ifdef MACOS
  105.    static ZCONST char Far Example2[] = ""; /* not needed */
  106. #else /* !MACOS */
  107.    static ZCONST char Far Example2[] = " 
  108.  unzip -p foo | more  => send contents of foo.zip via pipe into program moren";
  109. #endif /* ?MACOS */
  110. #endif /* ?OS2 */
  111. #endif /* ?RISCOS */
  112. #endif /* ?VMS */
  113. /* local1[]:  command options */
  114. #if (defined(DLL) && defined(API_DOC))
  115.    static ZCONST char Far local1[] =
  116.      "  -A  print extended help for API functions";
  117. #else /* !(DLL && API_DOC) */
  118.    static ZCONST char Far local1[] = "";
  119. #endif /* ?(DLL && API_DOC) */
  120. /* local2[] and local3[]:  modifier options */
  121. #ifdef DOS_FLX_OS2_W32
  122. #ifdef FLEXOS
  123.    static ZCONST char Far local2[] = "";
  124. #else
  125.    static ZCONST char Far local2[] =
  126.      " -$  label removables (-$$ => fixed disks)";
  127. #endif
  128. #ifdef OS2
  129. #ifdef MORE
  130.    static ZCONST char Far local3[] = "
  131.   -X  restore ACLs if supported              -s  spaces in filenames => '_'n
  132.                                              -M  pipe through "more" pagern";
  133. #else
  134.    static ZCONST char Far local3[] = " 
  135.  -X  restore ACLs if supported              -s  spaces in filenames => '_'nn";
  136. #endif /* ?MORE */
  137. #else /* !OS2 */
  138. #ifdef WIN32
  139. #ifdef MORE
  140.    static ZCONST char Far local3[] = "
  141.   -X  restore ACLs (-XX => use privileges)   -s  spaces in filenames => '_'n
  142.                                              -M  pipe through "more" pagern";
  143. #else
  144.    static ZCONST char Far local3[] = " 
  145.  -X  restore ACLs (-XX => use privileges)   -s  spaces in filenames => '_'nn";
  146. #endif /* ?MORE */
  147. #else /* !WIN32 */
  148. #ifdef MORE
  149.    static ZCONST char Far local3[] = "  -
  150. M  pipe through "more" pager              -s  spaces in filenames => '_'nn";
  151. #else
  152.    static ZCONST char Far local3[] = "
  153.                                              -s  spaces in filenames => '_'n";
  154. #endif
  155. #endif /* ?WIN32 */
  156. #endif /* ?OS2 || ?WIN32 */
  157. #else /* !DOS_FLX_OS2_W32 */
  158. #ifdef VMS
  159.    static ZCONST char Far local2[] = ""-X" restore owner/protection info";
  160. #ifdef MORE
  161.    static ZCONST char Far local3[] = "  
  162.                                           "-M" pipe through "more" pagern";
  163. #else
  164.    static ZCONST char Far local3[] = "n";
  165. #endif
  166. #else /* !VMS */
  167. #if (defined(__BEOS__) || defined(TANDEM) || defined(UNIX))
  168.    static ZCONST char Far local2[] = " -X  restore UID/GID info";
  169. #ifdef MORE
  170.    static ZCONST char Far local3[] = "
  171.                                              -M  pipe through "more" pagern";
  172. #else
  173.    static ZCONST char Far local3[] = "n";
  174. #endif
  175. #else /* !(__BEOS__ || TANDEM || UNIX) */
  176. #ifdef AMIGA
  177.    static ZCONST char Far local2[] = " -N  restore comments as filenotes";
  178. #ifdef MORE
  179.    static ZCONST char Far local3[] = "
  180.                                              -M  pipe through "more" pagern";
  181. #else
  182.    static ZCONST char Far local3[] = "n";
  183. #endif
  184. #else /* !AMIGA */
  185. #ifdef MACOS
  186.    static ZCONST char Far local2[] = " -E  show Mac info during extraction";
  187.    static ZCONST char Far local3[] = " 
  188.  -i  ignore filenames in mac extra info     -J  junk (ignore) Mac extra infonn";
  189. #else /* !MACOS */
  190. #ifdef MORE
  191.    static ZCONST char Far local2[] = " -M  pipe through "more" pager";
  192.    static ZCONST char Far local3[] = "n";
  193. #else
  194.    static ZCONST char Far local2[] = "";   /* Atari, Mac, CMS/MVS etc. */
  195.    static ZCONST char Far local3[] = "";
  196. #endif
  197. #endif /* ?MACOS */
  198. #endif /* ?AMIGA */
  199. #endif /* ?(__BEOS__ || TANDEM || UNIX) */
  200. #endif /* ?VMS */
  201. #endif /* ?DOS_FLX_OS2_W32 */
  202. #endif /* !SFX */
  203. #ifndef NO_ZIPINFO
  204. #ifdef VMS
  205.    static ZCONST char Far ZipInfoExample[] = "* or % (e.g., "*font-%.zip")";
  206. #else
  207.    static ZCONST char Far ZipInfoExample[] = "*, ?, [] (e.g., "[a-j]*.zip")";
  208. #endif
  209. static ZCONST char Far ZipInfoUsageLine1[] = "
  210. ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the Info-ZIP group.n
  211. n
  212. List name, date/time, attribute, size, compression method, etc., about filesn
  213. in list (excluding those in xlist) contained in the specified .zip archive(s).
  214. n"file[.zip]" may be a wildcard name containing %s.nn
  215.    usage:  zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]n
  216.       or:  unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]n";
  217. static ZCONST char Far ZipInfoUsageLine2[] = "nmain
  218.  listing-format options:             -s  short Unix "ls -l" format (def.)n
  219.   -1  filenames ONLY, one per line       -m  medium Unix "ls -l" formatn
  220.   -2  just filenames but allow -h/-t/-z  -l  long Unix "ls -l" formatn
  221.                                          -v  verbose, multi-page formatn";
  222. static ZCONST char Far ZipInfoUsageLine3[] = "miscellaneous options:n
  223.   -h  print header line       -t  print totals for listed files or for alln
  224.   -z  print zipfile comment  %c-T%c print file times in sortable decimal format
  225. n %c-C%c be case-insensitive   %s
  226.   -x  exclude filenames that follow from listingn";
  227. #ifdef MORE
  228. #ifdef VMS
  229.    static ZCONST char Far ZipInfoUsageLine4[] =
  230.      " "-M" page output through built-in "more"n";
  231. #else
  232.    static ZCONST char Far ZipInfoUsageLine4[] =
  233.      "  -M  page output through built-in "more"n";
  234. #endif
  235. #else /* !MORE */
  236.    static ZCONST char Far ZipInfoUsageLine4[] = "";
  237. #endif /* ?MORE */
  238. #endif /* !NO_ZIPINFO */
  239. #ifdef BETA
  240. #  ifdef VMSCLI
  241.    /* BetaVersion[] is also used in vms/cmdline.c:  do not make it static */
  242.      ZCONST char Far BetaVersion[] = "%s
  243.         THIS IS STILL A BETA VERSION OF UNZIP%s -- DO NOT DISTRIBUTE.nn";
  244. #  else
  245.      static ZCONST char Far BetaVersion[] = "%s
  246.         THIS IS STILL A BETA VERSION OF UNZIP%s -- DO NOT DISTRIBUTE.nn";
  247. #  endif
  248. #endif
  249. #ifdef SFX
  250. #  ifdef VMSCLI
  251.    /* UnzipSFXBanner[] is also used in vms/cmdline.c:  do not make it static */
  252.      ZCONST char Far UnzipSFXBanner[] =
  253. #  else
  254.      static ZCONST char Far UnzipSFXBanner[] =
  255. #  endif
  256.      "UnZipSFX %d.%d%d%s of %s, by Info-ZIP (Zip-Bugs@lists.wku.edu).n";
  257. #  ifdef SFX_EXDIR
  258.      static ZCONST char Far UnzipSFXOpts[] =
  259.     "Valid options are -tfupcz and -d <exdir>; modifiers are -abjnoqCL%sV%s.n";
  260. #  else
  261.      static ZCONST char Far UnzipSFXOpts[] =
  262.        "Valid options are -tfupcz; modifiers are -abjnoqCL%sV%s.n";
  263. #  endif
  264. #else /* !SFX */
  265.    static ZCONST char Far CompileOptions[] =
  266.      "UnZip special compilation options:n";
  267.    static ZCONST char Far CompileOptFormat[] = "t%sn";
  268.    static ZCONST char Far EnvOptions[] =
  269.      "nUnZip and ZipInfo environment options:n";
  270.    static ZCONST char Far EnvOptFormat[] = "%16s:  %sn";
  271.    static ZCONST char Far None[] = "[none]";
  272. #  ifdef ACORN_FTYPE_NFS
  273.      static ZCONST char Far AcornFtypeNFS[] = "ACORN_FTYPE_NFS";
  274. #  endif
  275. #  ifdef ASM_CRC
  276.      static ZCONST char Far AsmCRC[] = "ASM_CRC";
  277. #  endif
  278. #  ifdef ASM_INFLATECODES
  279.      static ZCONST char Far AsmInflateCodes[] = "ASM_INFLATECODES";
  280. #  endif
  281. #  ifdef CHECK_VERSIONS
  282.      static ZCONST char Far Check_Versions[] = "CHECK_VERSIONS";
  283. #  endif
  284. #  ifdef COPYRIGHT_CLEAN
  285.      static ZCONST char Far Copyright_Clean[] =
  286.      "COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)";
  287. #  endif
  288. #  ifdef DEBUG
  289.      static ZCONST char Far UDebug[] = "DEBUG";
  290. #  endif
  291. #  ifdef DEBUG_TIME
  292.      static ZCONST char Far DebugTime[] = "DEBUG_TIME";
  293. #  endif
  294. #  ifdef DLL
  295.      static ZCONST char Far Dll[] = "DLL";
  296. #  endif
  297. #  ifdef DOSWILD
  298.      static ZCONST char Far DosWild[] = "DOSWILD";
  299. #  endif
  300. #  ifdef LZW_CLEAN
  301.      static ZCONST char Far LZW_Clean[] =
  302.      "LZW_CLEAN (PKZIP/Zip 1.x unshrinking method not supported)";
  303. #  endif
  304. #  ifndef MORE
  305.      static ZCONST char Far No_More[] = "NO_MORE";
  306. #  endif
  307. #  ifdef NO_ZIPINFO
  308.      static ZCONST char Far No_ZipInfo[] = "NO_ZIPINFO";
  309. #  endif
  310. #  ifdef NTSD_EAS
  311.      static ZCONST char Far NTSDExtAttrib[] = "NTSD_EAS";
  312. #  endif
  313. #  ifdef OS2_EAS
  314.      static ZCONST char Far OS2ExtAttrib[] = "OS2_EAS";
  315. #  endif
  316. #  ifdef QLZIP
  317.      static ZCONST char Far SMSExFldOnUnix[] = "QLZIP";
  318. #  endif
  319. #  ifdef REENTRANT
  320.      static ZCONST char Far Reentrant[] = "REENTRANT";
  321. #  endif
  322. #  ifdef REGARGS
  323.      static ZCONST char Far RegArgs[] = "REGARGS";
  324. #  endif
  325. #  ifdef RETURN_CODES
  326.      static ZCONST char Far Return_Codes[] = "RETURN_CODES";
  327. #  endif
  328. #  ifdef SET_DIR_ATTRIB
  329.      static ZCONST char Far SetDirAttrib[] = "SET_DIR_ATTRIB";
  330. #  endif
  331. #  ifdef TIMESTAMP
  332.      static ZCONST char Far TimeStamp[] = "TIMESTAMP";
  333. #  endif
  334. #  ifdef UNIXBACKUP
  335.      static ZCONST char Far UnixBackup[] = "UNIXBACKUP";
  336. #  endif
  337. #  ifdef USE_EF_UT_TIME
  338.      static ZCONST char Far Use_EF_UT_time[] = "USE_EF_UT_TIME";
  339. #  endif
  340. #  ifndef LZW_CLEAN
  341.      static ZCONST char Far Use_Unshrink[] =
  342.      "USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)";
  343. #  endif
  344. #  ifndef COPYRIGHT_CLEAN
  345.      static ZCONST char Far Use_Smith_Code[] =
  346.      "USE_SMITH_CODE (PKZIP 0.9x unreducing method supported)";
  347. #  endif
  348. #  ifdef USE_VFAT
  349.      static ZCONST char Far Use_VFAT_support[] = "USE_VFAT";
  350. #  endif
  351. #  ifdef USE_ZLIB
  352.      static ZCONST char Far UseZlib[] =
  353.      "USE_ZLIB (compiled with version %s; using version %s)";
  354. #  endif
  355. #  ifdef VMS_TEXT_CONV
  356.      static ZCONST char Far VmsTextConv[] = "VMS_TEXT_CONV";
  357. #  endif
  358. #  ifdef VMSCLI
  359.      static ZCONST char Far VmsCLI[] = "VMSCLI";
  360. #  endif
  361. #  ifdef VMSWILD
  362.      static ZCONST char Far VmsWild[] = "VMSWILD";
  363. #  endif
  364. #  if CRYPT
  365. #    ifdef PASSWD_FROM_STDIN
  366.        static ZCONST char Far PasswdStdin[] = "PASSWD_FROM_STDIN";
  367. #    endif
  368.      static ZCONST char Far Decryption[] =
  369.        "t[decryption, version %d.%d%s of %s]n";
  370.      static ZCONST char Far CryptDate[] = CR_VERSION_DATE;
  371. #  endif
  372. #  ifndef __RSXNT__
  373. #    ifdef __EMX__
  374.        static ZCONST char Far EnvEMX[] = "EMX";
  375.        static ZCONST char Far EnvEMXOPT[] = "EMXOPT";
  376. #    endif
  377. #    if (defined(__GO32__) && (!defined(__DJGPP__) || (__DJGPP__ < 2)))
  378.        static ZCONST char Far EnvGO32[] = "GO32";
  379.        static ZCONST char Far EnvGO32TMP[] = "GO32TMP";
  380. #    endif
  381. #  endif /* !__RSXNT__ */
  382. #ifdef VMS
  383. /* UnzipUsageLine1[] is also used in vms/cmdline.c:  do not make it static */
  384.    ZCONST char Far UnzipUsageLine1[] = "
  385. UnZip %d.%d%d%s of %s, by Info-ZIP.  For more details see: unzip -v.nn";
  386. #ifdef COPYRIGHT_CLEAN
  387.    static ZCONST char Far UnzipUsageLine1v[] = "
  388. UnZip %d.%d%d%s of %s, by Info-ZIP.  Maintained by C. Spieler.  Sendn
  389. bug reports to the authors at Zip-Bugs@lists.wku.edu; see README for details.
  390. nn";
  391. #else
  392.    static ZCONST char Far UnzipUsageLine1v[] = "
  393. UnZip %d.%d%d%s of %s, by Info-ZIP.  UnReduce (c) 1989 by S. H. Smith.n
  394. Send bug reports to authors at Zip-Bugs@lists.wku.edu; see README for details.
  395. nn";
  396. #endif /* ?COPYRIGHT_CLEAN */
  397. #else /* !VMS */
  398. #ifdef COPYRIGHT_CLEAN
  399.    static ZCONST char Far UnzipUsageLine1[] = "
  400. UnZip %d.%d%d%s of %s, by Info-ZIP.  Maintained by C. Spieler.  Sendn
  401. bug reports to the authors at Zip-Bugs@lists.wku.edu; see README for details.
  402. nn";
  403. #else
  404.    static ZCONST char Far UnzipUsageLine1[] = "
  405. UnZip %d.%d%d%s of %s, by Info-ZIP.  UnReduce (c) 1989 by S. H. Smith.n
  406. Send bug reports to authors at Zip-Bugs@lists.wku.edu; see README for details.
  407. nn";
  408. #endif /* ?COPYRIGHT_CLEAN */
  409. #define UnzipUsageLine1v        UnzipUsageLine1
  410. #endif /* ?VMS */
  411. static ZCONST char Far UnzipUsageLine2v[] = "
  412. Latest sources and executables are at ftp://ftp.cdrom.com/pub/infozip/ , as of
  413. nabove date; see http://www.cdrom.com/pub/infozip/UnZip.html for other sites.
  414. nn";
  415. #ifdef MACOS
  416. static ZCONST char Far UnzipUsageLine2[] = "
  417. Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-d exdir]n 
  418.  Default action is to extract files in list, to exdir;n
  419.   file[.zip] may be a wildcard.  %sn";
  420. #else /* !MACOS */
  421. #ifdef VM_CMS
  422. static ZCONST char Far UnzipUsageLine2[] = "
  423. Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d fm]n 
  424.  Default action is to extract files in list, except those in xlist, to disk fm;n
  425.   file[.zip] may be a wildcard.  %sn";
  426. #else /* !VM_CMS */
  427. static ZCONST char Far UnzipUsageLine2[] = "
  428. Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]n 
  429.  Default action is to extract files in list, except those in xlist, to exdir;n
  430.   file[.zip] may be a wildcard.  %sn";
  431. #endif /* ?VM_CMS */
  432. #endif /* ?MACOS */
  433. #ifdef NO_ZIPINFO
  434. #  define ZIPINFO_MODE_OPTION  ""
  435.    static ZCONST char Far ZipInfoMode[] =
  436.      "(ZipInfo mode is disabled in this version.)";
  437. #else
  438. #  define ZIPINFO_MODE_OPTION  "[-Z] "
  439. #  ifdef VMS
  440.      static ZCONST char Far ZipInfoMode[] =
  441.        ""-Z" => ZipInfo mode (`unzip "-Z"' for usage).";
  442. #  else
  443.      static ZCONST char Far ZipInfoMode[] =
  444.        "-Z => ZipInfo mode ("unzip -Z" for usage).";
  445. #  endif
  446. #endif /* ?NO_ZIPINFO */
  447. #ifdef VMS
  448.    static ZCONST char Far VMSusageLine2b[] = "
  449. => define foreign command symbol in LOGIN.COM:  $ unzip :== $dev:[dir]unzip.exe
  450. n";
  451. #endif
  452. #ifdef MACOS
  453. static ZCONST char Far UnzipUsageLine3[] = "n
  454.   -d  extract files into exdir               -l  list files (short format)n
  455.   -f  freshen existing files, create none    -t  test compressed archive datan
  456.   -u  update files, create if necessary      -z  display archive commentn
  457. %sn";
  458. #else /* !MACOS */
  459. #ifdef VM_CMS
  460. static ZCONST char Far UnzipUsageLine3[] = "n
  461.   -p  extract files to pipe, no messages     -l  list files (short format)n
  462.   -f  freshen existing files, create none    -t  test compressed archive datan
  463.   -u  update files, create if necessary      -z  display archive commentn
  464.   -x  exclude files that follow (in xlist)   -d  extract files onto disk fmn
  465. %sn";
  466. #else /* !VM_CMS */
  467. static ZCONST char Far UnzipUsageLine3[] = "n
  468.   -p  extract files to pipe, no messages     -l  list files (short format)n
  469.   -f  freshen existing files, create none    -t  test compressed archive datan
  470.   -u  update files, create if necessary      -z  display archive commentn
  471.   -x  exclude files that follow (in xlist)   -d  extract files into exdirn
  472. %sn";
  473. #endif /* ?VM_CMS */
  474. #endif /* ?MACOS */
  475. static ZCONST char Far UnzipUsageLine4[] = "
  476. modifiers:                                   -q  quiet mode (-qq => quieter)n
  477.   -n  never overwrite existing files         -a  auto-convert any text filesn
  478.   -o  overwrite files WITHOUT prompting      -aa treat ALL files as textn 
  479.  -j  junk paths (do not make directories)   -v  be verbose/print version infon
  480.  %c-C%c match filenames case-insensitively    %c-L%c make (some) names 
  481. lowercasen %-42s %c-V%c retain VMS version numbersn%s";
  482. static ZCONST char Far UnzipUsageLine5[] = "
  483. Examples (see unzip.doc for more info):n
  484.   unzip data1 -x joe   => extract all files except joe from zipfile data1.zipn
  485. %s
  486.   unzip -fo foo %-6s => quietly replace existing %s if archive file newern";
  487. #endif /* ?SFX */
  488. /*****************************/
  489. /*  main() / UzpMain() stub  */
  490. /*****************************/
  491. int MAIN(argc, argv)   /* return PK-type error code (except under VMS) */
  492.     int argc;
  493.     char *argv[];
  494. {
  495.     int r;
  496.     CONSTRUCTGLOBALS();
  497.     r = unzip(__G__ argc, argv);
  498.     DESTROYGLOBALS()
  499.     RETURN(r);
  500. }
  501. /*******************************/
  502. /*  Primary UnZip entry point  */
  503. /*******************************/
  504. int unzip(__G__ argc, argv)
  505.     __GDEF
  506.     int argc;
  507.     char *argv[];
  508. {
  509. #ifndef NO_ZIPINFO
  510.     char *p;
  511. #endif
  512. #ifdef DOS_FLX_H68_OS2_W32
  513.     int i;
  514. #endif
  515.     int retcode, error=FALSE;
  516. #if (defined(__IBMC__) && defined(__DEBUG_ALLOC__))
  517.     extern void DebugMalloc(void);
  518.     atexit(DebugMalloc);
  519. #endif
  520. #ifdef MALLOC_WORK
  521.     G.area.Slide =(uch *)calloc(8193, sizeof(shrint)+sizeof(uch)+sizeof(uch));
  522.     G.area.shrink.Parent = (shrint *)G.area.Slide;
  523.     G.area.shrink.value = G.area.Slide + (sizeof(shrint)*(HSIZE+1));
  524.     G.area.shrink.Stack = G.area.Slide +
  525.                            (sizeof(shrint) + sizeof(uch))*(HSIZE+1);
  526. #endif
  527. /*---------------------------------------------------------------------------
  528.     Macintosh initialization code.
  529.   ---------------------------------------------------------------------------*/
  530. #ifdef MACOS
  531.     {
  532.         int a;
  533.         for (a = 0;  a < 4;  ++a)
  534.             G.rghCursor[a] = GetCursor(a+128);
  535.         G.giCursor = 0;
  536.     }
  537. #endif
  538. /*---------------------------------------------------------------------------
  539.     Human68K initialization code.
  540.   ---------------------------------------------------------------------------*/
  541. #ifdef __human68k__
  542.     InitTwentyOne();
  543. #endif
  544. /*---------------------------------------------------------------------------
  545.     Acorn RISC OS initialization code.
  546.   ---------------------------------------------------------------------------*/
  547. #ifdef RISCOS
  548.     set_prefix();
  549. #endif
  550. /*---------------------------------------------------------------------------
  551.     Set signal handler for restoring echo, warn of zipfile corruption, etc.
  552.   ---------------------------------------------------------------------------*/
  553. #ifdef SIGINT
  554.     signal(SIGINT, handler);
  555. #endif
  556. #ifdef SIGTERM                 /* some systems really have no SIGTERM */
  557.     signal(SIGTERM, handler);
  558. #endif
  559. #ifdef SIGBUS
  560.     signal(SIGBUS, handler);
  561. #endif
  562. #ifdef SIGSEGV
  563.     signal(SIGSEGV, handler);
  564. #endif
  565. #if (defined(WIN32) && defined(__RSXNT__))
  566.     for (i = 0 ; i < argc; i++) {
  567.        _ISO_INTERN(argv[i]);
  568.     }
  569. #endif
  570. /*---------------------------------------------------------------------------
  571.     First figure out if we're running in UnZip mode or ZipInfo mode, and put
  572.     the appropriate environment-variable options into the queue.  Then rip
  573.     through any command-line options lurking about...
  574.   ---------------------------------------------------------------------------*/
  575. #ifdef SFX
  576.     G.argv0 = argv[0];
  577. #if (defined(OS2) || defined(WIN32))
  578.     G.zipfn = GetLoadPath(__G);/* non-MSC NT puts path into G.filename[] */
  579. #else
  580.     G.zipfn = G.argv0;
  581. #endif
  582. #ifdef VMSCLI
  583.     {
  584.         ulg status = vms_unzip_cmdline(&argc, &argv);
  585.         if (!(status & 1))
  586.             return status;
  587.     }
  588. #endif /* VMSCLI */
  589.     uO.zipinfo_mode = FALSE;
  590.     error = uz_opts(__G__ &argc, &argv);   /* UnZipSFX call only */
  591. #else /* !SFX */
  592. #ifdef RISCOS
  593.     /* get the extensions to swap from environment */
  594.     getRISCOSexts(ENV_UNZIPEXTS);
  595. #endif
  596. #ifdef MSDOS
  597.     /* extract MKS extended argument list from environment (before envargs!) */
  598.     mksargs(&argc, &argv);
  599. #endif
  600. #ifdef VMSCLI
  601.     {
  602.         ulg status = vms_unzip_cmdline(&argc, &argv);
  603.         if (!(status & 1))
  604.             return status;
  605.     }
  606. #endif /* VMSCLI */
  607.     G.noargs = (argc == 1);   /* no options, no zipfile, no anything */
  608. #ifndef NO_ZIPINFO
  609.     for (p = argv[0] + strlen(argv[0]); p >= argv[0]; --p) {
  610.         if (*p == DIR_END
  611. #ifdef DIR_END2
  612.             || *p == DIR_END2
  613. #endif
  614.            )
  615.             break;
  616.     }
  617.     ++p;
  618.     if (STRNICMP(p, LoadFarStringSmall(Zipnfo), 7) == 0 ||
  619.         STRNICMP(p, "ii", 2) == 0 ||
  620.         (argc > 1 && strncmp(argv[1], "-Z", 2) == 0))
  621.     {
  622.         uO.zipinfo_mode = TRUE;
  623.         envargs(__G__ &argc, &argv, LoadFarStringSmall(EnvZipInfo),
  624.           LoadFarStringSmall2(EnvZipInfo2));
  625.         error = zi_opts(__G__ &argc, &argv);
  626.     } else
  627. #endif /* NO_ZIPINFO */
  628.     {
  629.         uO.zipinfo_mode = FALSE;
  630.         envargs(__G__ &argc, &argv, LoadFarStringSmall(EnvUnZip),
  631.           LoadFarStringSmall2(EnvUnZip2));
  632.         error = uz_opts(__G__ &argc, &argv);
  633.     }
  634. #endif /* ?SFX */
  635.     if ((argc < 0) || error)
  636.         return error;
  637. /*---------------------------------------------------------------------------
  638.     Now get the zipfile name from the command line and then process any re-
  639.     maining options and file specifications.
  640.   ---------------------------------------------------------------------------*/
  641. #ifdef DOS_FLX_H68_OS2_W32
  642.     /* convert MSDOS-style directory separators to Unix-style ones for
  643.      * user's convenience (include zipfile name itself)
  644.      */
  645. #ifdef SFX
  646.     for (G.pfnames = argv, i = argc;  i > 0;  --i) {
  647. #else
  648.     /* argc does not include the zipfile specification */
  649.     for (G.pfnames = argv, i = argc+1;  i > 0;  --i) {
  650. #endif
  651.         char *q;
  652.         for (q = *G.pfnames;  *q;  ++q)
  653.             if (*q == '\')
  654.                 *q = '/';
  655.         ++G.pfnames;
  656.     }
  657. #endif /* DOS_FLX_H68_OS2_W32 */
  658. #ifndef SFX
  659.     G.wildzipfn = *argv++;
  660. #endif
  661. #if (defined(SFX) && !defined(SFX_EXDIR)) /* only check for -x */
  662.     G.filespecs = argc;
  663.     G.xfilespecs = 0;
  664.     if (argc > 0) {
  665.         char **pp = argv-1;
  666.         G.pfnames = argv;
  667.         while (*++pp)
  668.             if (strcmp(*pp, "-x") == 0) {
  669.                 if (pp > argv) {
  670.                     *pp = 0;              /* terminate G.pfnames */
  671.                     G.filespecs = pp - G.pfnames;
  672.                 } else {
  673.                     G.pfnames = (char **)fnames;  /* defaults */
  674.                     G.filespecs = 0;
  675.                 }
  676.                 G.pxnames = pp + 1;      /* excluded-names ptr: _after_ -x */
  677.                 G.xfilespecs = argc - G.filespecs - 1;
  678.                 break;                    /* skip rest of args */
  679.             }
  680.         G.process_all_files = FALSE;
  681.     } else
  682.         G.process_all_files = TRUE;      /* for speed */
  683. #else /* !SFX || SFX_EXDIR */             /* check for -x or -d */
  684.     G.filespecs = argc;
  685.     G.xfilespecs = 0;
  686.     if (argc > 0) {
  687.         int in_files=FALSE, in_xfiles=FALSE;
  688.         char **pp = argv-1;
  689.         G.process_all_files = FALSE;
  690.         G.pfnames = argv;
  691.         while (*++pp) {
  692.             Trace((stderr, "pp - argv = %dn", pp-argv));
  693. #ifdef CMS_MVS
  694.             if (!uO.exdir && STRNICMP(*pp, "-d", 2) == 0) {
  695. #else
  696.             if (!uO.exdir && strncmp(*pp, "-d", 2) == 0) {
  697. #endif
  698.                 int firstarg = (pp == argv);
  699.                 uO.exdir = (*pp) + 2;
  700.                 if (in_files) {      /* ... zipfile ... -d exdir ... */
  701.                     *pp = (char *)NULL;         /* terminate G.pfnames */
  702.                     G.filespecs = pp - G.pfnames;
  703.                     in_files = FALSE;
  704.                 } else if (in_xfiles) {
  705.                     *pp = (char *)NULL;         /* terminate G.pxnames */
  706.                     G.xfilespecs = pp - G.pxnames;
  707.                     /* "... -x xlist -d exdir":  nothing left */
  708.                 }
  709.                 /* first check for "-dexdir", then for "-d exdir" */
  710.                 if (*uO.exdir == '') {
  711.                     if (*++pp)
  712.                         uO.exdir = *pp;
  713.                     else {
  714.                         Info(slide, 0x401, ((char *)slide,
  715.                           LoadFarString(MustGiveExdir)));
  716.                         return(PK_PARAM);  /* don't extract here by accident */
  717.                     }
  718.                 }
  719.                 if (firstarg) { /* ... zipfile -d exdir ... */
  720.                     if (pp[1]) {
  721.                         G.pfnames = pp + 1;  /* argv+2 */
  722.                         G.filespecs = argc - (G.pfnames-argv);  /* for now... */
  723.                     } else {
  724.                         G.process_all_files = TRUE;
  725.                         G.pfnames = (char **)fnames;  /* GRR: necessary? */
  726.                         G.filespecs = 0;     /* GRR: necessary? */
  727.                         break;
  728.                     }
  729.                 }
  730.             } else if (!in_xfiles) {
  731.                 if (strcmp(*pp, "-x") == 0) {
  732.                     in_xfiles = TRUE;
  733.                     if (pp == G.pfnames) {
  734.                         G.pfnames = (char **)fnames;  /* defaults */
  735.                         G.filespecs = 0;
  736.                     } else if (in_files) {
  737.                         *pp = 0;                   /* terminate G.pfnames */
  738.                         G.filespecs = pp - G.pfnames;  /* adjust count */
  739.                         in_files = FALSE;
  740.                     }
  741.                     G.pxnames = pp + 1; /* excluded-names ptr starts after -x */
  742.                     G.xfilespecs = argc - (G.pxnames-argv);  /* anything left */
  743.                 } else
  744.                     in_files = TRUE;
  745.             }
  746.         }
  747.     } else
  748.         G.process_all_files = TRUE;      /* for speed */
  749.     if (uO.exdir != (char *)NULL && !G.extract_flag)    /* -d ignored */
  750.         Info(slide, 0x401, ((char *)slide, LoadFarString(NotExtracting)));
  751. #endif /* ?(SFX && !SFX_EXDIR) */
  752. /*---------------------------------------------------------------------------
  753.     Okey dokey, we have everything we need to get started.  Let's roll.
  754.   ---------------------------------------------------------------------------*/
  755.     retcode = process_zipfiles(__G);
  756.     return(retcode);
  757. } /* end main()/unzip() */
  758. /**********************/
  759. /* Function uz_opts() */
  760. /**********************/
  761. int uz_opts(__G__ pargc, pargv)
  762.     __GDEF
  763.     int *pargc;
  764.     char ***pargv;
  765. {
  766.     char **argv, *s;
  767.     int argc, c, error=FALSE, negative=0;
  768.     argc = *pargc;
  769.     argv = *pargv;
  770.     while (++argv, (--argc > 0 && *argv != NULL && **argv == '-')) {
  771.         s = *argv + 1;
  772.         while ((c = *s++) != 0) {    /* "!= 0":  prevent Turbo C warning */
  773. #ifdef CMS_MVS
  774.             switch (tolower(c))
  775. #else
  776.             switch (c)
  777. #endif
  778.             {
  779.                 case ('-'):
  780.                     ++negative;
  781.                     break;
  782.                 case ('a'):
  783.                     if (negative) {
  784.                         uO.aflag = MAX(uO.aflag-negative,0);
  785.                         negative = 0;
  786.                     } else
  787.                         ++uO.aflag;
  788.                     break;
  789. #if (defined(DLL) && defined(API_DOC))
  790.                 case ('A'):    /* extended help for API */
  791.                     APIhelp(__G__ argc, argv);
  792.                     *pargc = -1;  /* signal to exit successfully */
  793.                     return 0;
  794. #endif
  795.                 case ('b'):
  796.                     if (negative) {
  797. #ifdef VMS
  798.                         uO.bflag = MAX(uO.bflag-negative,0);
  799. #endif
  800.                         negative = 0;   /* do nothing:  "-b" is default */
  801.                     } else {
  802. #ifdef VMS
  803.                         if (uO.aflag == 0)
  804.                            ++uO.bflag;
  805. #endif
  806.                         uO.aflag = 0;
  807.                     }
  808.                     break;
  809. #ifdef UNIXBACKUP
  810.                 case ('B'): /* -B: back up existing files */
  811.                     if (negative)
  812.                         uO.B_flag = FALSE, negative = 0;
  813.                     else
  814.                         uO.B_flag = TRUE;
  815.                     break;
  816. #endif
  817.                 case ('c'):
  818.                     if (negative) {
  819.                         uO.cflag = FALSE, negative = 0;
  820. #ifdef NATIVE
  821.                         uO.aflag = 0;
  822. #endif
  823.                     } else {
  824.                         uO.cflag = TRUE;
  825. #ifdef NATIVE
  826.                         uO.aflag = 2;   /* so you can read it on the screen */
  827. #endif
  828. #ifdef DLL
  829.                         if (G.redirect_text)
  830.                             G.redirect_data = 2;
  831. #endif
  832.                     }
  833.                     break;
  834. #ifndef CMS_MVS
  835.                 case ('C'):    /* -C:  match filenames case-insensitively */
  836.                     if (negative)
  837.                         uO.C_flag = FALSE, negative = 0;
  838.                     else
  839.                         uO.C_flag = TRUE;
  840.                     break;
  841. #endif /* !CMS_MVS */
  842. #if (!defined(SFX) || defined(SFX_EXDIR))
  843.                 case ('d'):
  844.                     if (negative) {   /* negative not allowed with -d exdir */
  845.                         Info(slide, 0x401, ((char *)slide,
  846.                           LoadFarString(MustGiveExdir)));
  847.                         return(PK_PARAM);  /* don't extract here by accident */
  848.                     }
  849.                     if (uO.exdir != (char *)NULL) {
  850.                         Info(slide, 0x401, ((char *)slide,
  851.                           LoadFarString(OnlyOneExdir)));
  852.                         return(PK_PARAM);    /* GRR:  stupid restriction? */
  853.                     } else {
  854.                         /* first check for "-dexdir", then for "-d exdir" */
  855.                         uO.exdir = s;
  856.                         if (*uO.exdir == '') {
  857.                             if (argc > 1) {
  858.                                 --argc;
  859.                                 uO.exdir = *++argv;
  860.                                 if (*uO.exdir == '-') {
  861.                                     Info(slide, 0x401, ((char *)slide,
  862.                                       LoadFarString(MustGiveExdir)));
  863.                                     return(PK_PARAM);
  864.                                 }
  865.                                 /* else uO.exdir points at extraction dir */
  866.                             } else {
  867.                                 Info(slide, 0x401, ((char *)slide,
  868.                                   LoadFarString(MustGiveExdir)));
  869.                                 return(PK_PARAM);
  870.                             }
  871.                         }
  872.                         /* uO.exdir now points at extraction dir (-dexdir or
  873.                          *  -d exdir); point s at end of exdir to avoid mis-
  874.                          *  interpretation of exdir characters as more options
  875.                          */
  876.                         if (*s != 0)
  877.                             while (*++s != 0)
  878.                                 ;
  879.                     }
  880.                     break;
  881. #endif /* !SFX || SFX_EXDIR */
  882.                 case ('e'):    /* just ignore -e, -x options (extract) */
  883.                     break;
  884. #ifdef MACOS
  885.                 case ('E'): /* -E [MacOS] display Mac e.f. when restoring */
  886.                     if( negative ) {
  887.                         uO.E_flag = FALSE, negative = 0;
  888.                     } else {
  889.                         uO.E_flag = TRUE;
  890.                     }
  891.                     break;
  892. #endif /* MACOS */
  893.                 case ('f'):    /* "freshen" (extract only newer files) */
  894.                     if (negative)
  895.                         uO.fflag = uO.uflag = FALSE, negative = 0;
  896.                     else
  897.                         uO.fflag = uO.uflag = TRUE;
  898.                     break;
  899. #if (defined(RISCOS) || defined(ACORN_FTYPE_NFS))
  900.                 case ('F'):    /* Acorn filetype & NFS extension handling */
  901.                     if (negative)
  902.                         uO.acorn_nfs_ext = FALSE, negative = 0;
  903.                     else
  904.                         uO.acorn_nfs_ext = TRUE;
  905.                     break;
  906. #endif /* RISCOS || ACORN_FTYPE_NFS */
  907.                 case ('h'):    /* just print help message and quit */
  908.                     *pargc = -1;
  909.                     return USAGE(PK_OK);
  910. #ifdef MACOS
  911.                 case ('i'): /* -i [MacOS] ignore filenames stored in Mac ef */
  912.                     if( negative ) {
  913.                         uO.i_flag = FALSE, negative = 0;
  914.                     } else {
  915.                         uO.i_flag = TRUE;
  916.                     }
  917.                     break;
  918. #endif  /* MACOS */
  919.                 case ('j'):    /* junk pathnames/directory structure */
  920.                     if (negative)
  921.                         uO.jflag = FALSE, negative = 0;
  922.                     else
  923.                         uO.jflag = TRUE;
  924.                     break;
  925. #if (defined(__BEOS__) || defined(MACOS))
  926.                 case ('J'):    /* Junk BeOS or MacOS file attributes */
  927.                     if( negative ) {
  928.                         uO.J_flag = FALSE, negative = 0;
  929.                     } else {
  930.                         uO.J_flag = TRUE;
  931.                     }
  932.                     break;
  933. #endif /* __BEOS__ || MACOS */
  934. #ifndef SFX
  935.                 case ('l'):
  936.                     if (negative) {
  937.                         uO.vflag = MAX(uO.vflag-negative,0);
  938.                         negative = 0;
  939.                     } else
  940.                         ++uO.vflag;
  941.                     break;
  942. #endif /* !SFX */
  943. #ifndef CMS_MVS
  944.                 case ('L'):    /* convert (some) filenames to lowercase */
  945.                     if (negative)
  946.                         uO.L_flag = FALSE, negative = 0;
  947.                     else
  948.                         uO.L_flag = TRUE;
  949.                     break;
  950. #endif /* !CMS_MVS */
  951. #ifdef MORE
  952. #ifdef CMS_MVS
  953.                 case ('m'):
  954. #endif
  955.                 case ('M'):    /* send all screen output through "more" fn. */
  956. /* GRR:  eventually check for numerical argument => height */
  957.                     if (negative)
  958.                         G.M_flag = FALSE, negative = 0;
  959.                     else
  960.                         G.M_flag = TRUE;
  961.                     break;
  962. #endif /* MORE */
  963.                 case ('n'):    /* don't overwrite any files */
  964.                     if (negative)
  965.                         uO.overwrite_none = FALSE, negative = 0;
  966.                     else
  967.                         uO.overwrite_none = TRUE;
  968.                     break;
  969. #ifdef AMIGA
  970.                 case ('N'):    /* restore comments as filenotes */
  971.                     if (negative)
  972.                         uO.N_flag = FALSE, negative = 0;
  973.                     else
  974.                         uO.N_flag = TRUE;
  975.                     break;
  976. #endif /* AMIGA */
  977.                 case ('o'):    /* OK to overwrite files without prompting */
  978.                     if (negative) {
  979.                         uO.overwrite_all = MAX(uO.overwrite_all-negative,0);
  980.                         negative = 0;
  981.                     } else
  982.                         ++uO.overwrite_all;
  983.                     break;
  984.                 case ('p'):    /* pipes:  extract to stdout, no messages */
  985.                     if (negative) {
  986.                         uO.cflag = FALSE;
  987.                         uO.qflag = MAX(uO.qflag-999,0);
  988.                         negative = 0;
  989.                     } else {
  990.                         uO.cflag = TRUE;
  991.                         uO.qflag += 999;
  992.                     }
  993.                     break;
  994. #if CRYPT
  995.                 /* GRR:  yes, this is highly insecure, but dozens of people
  996.                  * have pestered us for this, so here we go... */
  997.                 case ('P'):
  998.                     if (negative) {   /* negative not allowed with -P passwd */
  999.                         Info(slide, 0x401, ((char *)slide,
  1000.                           LoadFarString(MustGivePasswd)));
  1001.                         return(PK_PARAM);  /* don't extract here by accident */
  1002.                     }
  1003.                     if (uO.pwdarg != (char *)NULL) {
  1004. /*
  1005.                         GRR:  eventually support multiple passwords?
  1006.                         Info(slide, 0x401, ((char *)slide,
  1007.                           LoadFarString(OnlyOnePasswd)));
  1008.                         return(PK_PARAM);
  1009.  */
  1010.                     } else {
  1011.                         /* first check for "-Ppasswd", then for "-P passwd" */
  1012.                         uO.pwdarg = s;
  1013.                         if (*uO.pwdarg == '') {
  1014.                             if (argc > 1) {
  1015.                                 --argc;
  1016.                                 uO.pwdarg = *++argv;
  1017.                                 if (*uO.pwdarg == '-') {
  1018.                                     Info(slide, 0x401, ((char *)slide,
  1019.                                       LoadFarString(MustGivePasswd)));
  1020.                                     return(PK_PARAM);
  1021.                                 }
  1022.                                 /* else pwdarg points at decryption password */
  1023.                             } else {
  1024.                                 Info(slide, 0x401, ((char *)slide,
  1025.                                   LoadFarString(MustGivePasswd)));
  1026.                                 return(PK_PARAM);
  1027.                             }
  1028.                         }
  1029.                         /* pwdarg now points at decryption password (-Ppasswd or
  1030.                          *  -P passwd); point s at end of passwd to avoid mis-
  1031.                          *  interpretation of passwd characters as more options
  1032.                          */
  1033.                         if (*s != 0)
  1034.                             while (*++s != 0)
  1035.                                 ;
  1036.                     }
  1037.                     break;
  1038. #endif /* CRYPT */
  1039.                 case ('q'):    /* quiet:  fewer comments/messages */
  1040.                     if (negative) {
  1041.                         uO.qflag = MAX(uO.qflag-negative,0);
  1042.                         negative = 0;
  1043.                     } else
  1044.                         ++uO.qflag;
  1045.                     break;
  1046. #ifdef QDOS
  1047.                 case ('Q'):   /* QDOS flags */
  1048.                     qlflag ^= strtol(s, &s, 10);
  1049.                     break;    /* we XOR this as we can config qlflags */
  1050. #endif
  1051. #ifdef DOS_FLX_OS2_W32
  1052.                 case ('s'):    /* spaces in filenames:  allow by default */
  1053.                     if (negative)
  1054.                         uO.sflag = FALSE, negative = 0;
  1055.                     else
  1056.                         uO.sflag = TRUE;
  1057.                     break;
  1058. #endif /* DOS_FLX_OS2_W32 */
  1059.                 case ('t'):
  1060.                     if (negative)
  1061.                         uO.tflag = FALSE, negative = 0;
  1062.                     else
  1063.                         uO.tflag = TRUE;
  1064.                     break;
  1065. #ifdef TIMESTAMP
  1066.                 case ('T'):
  1067.                     if (negative)
  1068.                         uO.T_flag = FALSE, negative = 0;
  1069.                     else
  1070.                         uO.T_flag = TRUE;
  1071.                     break;
  1072. #endif
  1073.                 case ('u'):    /* update (extract only new and newer files) */
  1074.                     if (negative)
  1075.                         uO.uflag = FALSE, negative = 0;
  1076.                     else
  1077.                         uO.uflag = TRUE;
  1078.                     break;
  1079. #ifndef CMS_MVS
  1080.                 case ('U'):    /* obsolete; to be removed in version 6.0 */
  1081.                     if (negative)
  1082.                         uO.L_flag = TRUE, negative = 0;
  1083.                     else
  1084.                         uO.L_flag = FALSE;
  1085.                     break;
  1086. #endif /* !CMS_MVS */
  1087. #ifndef SFX
  1088.                 case ('v'):    /* verbose */
  1089.                     if (negative) {
  1090.                         uO.vflag = MAX(uO.vflag-negative,0);
  1091.                         negative = 0;
  1092.                     } else if (uO.vflag)
  1093.                         ++uO.vflag;
  1094.                     else
  1095.                         uO.vflag = 2;
  1096.                     break;
  1097. #endif /* !SFX */
  1098. #ifndef CMS_MVS
  1099.                 case ('V'):    /* Version (retain VMS/DEC-20 file versions) */
  1100.                     if (negative)
  1101.                         uO.V_flag = FALSE, negative = 0;
  1102.                     else
  1103.                         uO.V_flag = TRUE;
  1104.                     break;
  1105. #endif /* !CMS_MVS */
  1106.                 case ('x'):    /* extract:  default */
  1107. #ifdef SFX
  1108.                     /* when 'x' is the only option in this argument, and the
  1109.                      * next arg is not an option, assume this initiates an
  1110.                      * exclusion list (-x xlist):  terminate option-scanning
  1111.                      * and leave uz_opts with argv still pointing to "-x";
  1112.                      * the xlist is processed later
  1113.                      */
  1114.                     if (s - argv[0] == 2 && *s == '' &&
  1115.                         argc > 1 && argv[1][0] != '-') {
  1116.                         /* break out of nested loops without "++argv;--argc" */
  1117.                         goto opts_done;
  1118.                     }
  1119. #endif /* SFX */
  1120.                     break;
  1121. #if (defined(RESTORE_UIDGID) || defined(OS2_W32))
  1122.                 case ('X'):   /* restore owner/protection info (need privs?) */
  1123.                     if (negative) {
  1124.                         uO.X_flag = MAX(uO.X_flag-negative,0);
  1125.                         negative = 0;
  1126.                     } else
  1127.                         ++uO.X_flag;
  1128.                     break;
  1129. #endif /* RESTORE_UIDGID || OS2_W32 */
  1130.                 case ('z'):    /* display only the archive comment */
  1131.                     if (negative) {
  1132.                         uO.zflag = MAX(uO.zflag-negative,0);
  1133.                         negative = 0;
  1134.                     } else
  1135.                         ++uO.zflag;
  1136.                     break;
  1137. #ifndef SFX
  1138.                 case ('Z'):    /* should have been first option (ZipInfo) */
  1139.                     Info(slide, 0x401, ((char *)slide, LoadFarString(Zfirst)));
  1140.                     error = TRUE;
  1141.                     break;
  1142. #endif /* !SFX */
  1143. #ifdef DOS_OS2_W32
  1144.                 case ('$'):
  1145.                     if (negative) {
  1146.                         uO.volflag = MAX(uO.volflag-negative,0);
  1147.                         negative = 0;
  1148.                     } else
  1149.                         ++uO.volflag;
  1150.                     break;
  1151. #endif /* DOS_OS2_W32 */
  1152.                 default:
  1153.                     error = TRUE;
  1154.                     break;
  1155.             } /* end switch */
  1156.         } /* end while (not end of argument string) */
  1157.     } /* end while (not done with switches) */
  1158. /*---------------------------------------------------------------------------
  1159.     Check for nonsensical combinations of options.
  1160.   ---------------------------------------------------------------------------*/
  1161. #ifdef SFX
  1162. opts_done:  /* yes, very ugly...but only used by UnZipSFX with -x xlist */
  1163. #endif
  1164.     if ((uO.cflag && uO.tflag) || (uO.cflag && uO.uflag) ||
  1165.         (uO.tflag && uO.uflag) || (uO.fflag && uO.overwrite_none))
  1166.     {
  1167.         Info(slide, 0x401, ((char *)slide, LoadFarString(InvalidOptionsMsg)));
  1168.         error = TRUE;
  1169.     }
  1170.     if (uO.aflag > 2)
  1171.         uO.aflag = 2;
  1172. #ifdef VMS
  1173.     if (uO.bflag > 2)
  1174.         uO.bflag = 2;
  1175. #endif
  1176.     if (uO.overwrite_all && uO.overwrite_none) {
  1177.         Info(slide, 0x401, ((char *)slide, LoadFarString(IgnoreOOptionMsg)));
  1178.         uO.overwrite_all = FALSE;
  1179.     }
  1180. #ifdef MORE
  1181.     if (G.M_flag && !isatty(1))  /* stdout redirected: "more" func. useless */
  1182.         G.M_flag = 0;
  1183. #endif
  1184. #ifdef SFX
  1185.     if (error)
  1186. #else
  1187.     if ((argc-- == 0) || error)
  1188. #endif
  1189.     {
  1190.         *pargc = argc;
  1191.         *pargv = argv;
  1192. #ifndef SFX
  1193.         if (uO.vflag >= 2 && argc == -1) {              /* "unzip -v" */
  1194.             show_version_info(__G);
  1195.             return PK_OK;
  1196.         }
  1197.         if (!G.noargs && !error)
  1198.             error = PK_PARAM;   /* had options (not -h or -v) but no zipfile */
  1199. #endif /* !SFX */
  1200.         return USAGE(error);
  1201.     }
  1202. #ifdef SFX
  1203.     /* print our banner unless we're being fairly quiet */
  1204.     if (uO.qflag < 2)
  1205.         Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner),
  1206.           UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
  1207.           LoadFarStringSmall(VersionDate)));
  1208. #ifdef BETA
  1209.     /* always print the beta warning:  no unauthorized distribution!! */
  1210.     Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "n",
  1211.       "SFX"));
  1212. #endif
  1213. #endif /* SFX */
  1214.     if (uO.cflag || uO.tflag || uO.vflag || uO.zflag
  1215. #ifdef TIMESTAMP
  1216.                                                      || uO.T_flag
  1217. #endif
  1218.                                                                  )
  1219.         G.extract_flag = FALSE;
  1220.     else
  1221.         G.extract_flag = TRUE;
  1222.     *pargc = argc;
  1223.     *pargv = argv;
  1224.     return PK_OK;
  1225. } /* end function uz_opts() */
  1226. /********************/
  1227. /* Function usage() */
  1228. /********************/
  1229. #ifdef SFX
  1230. #  ifdef VMS
  1231. #    define LOCAL "X.  Quote uppercase options"
  1232. #  endif
  1233. #  ifdef UNIX
  1234. #    define LOCAL "X"
  1235. #  endif
  1236. #  ifdef DOS_OS2_W32
  1237. #    define LOCAL "s$"
  1238. #  endif
  1239. #  ifdef FLEXOS
  1240. #    define LOCAL "s"
  1241. #  endif
  1242. #  ifdef AMIGA
  1243. #    define LOCAL "N"
  1244. #  endif
  1245.    /* Default for all other systems: */
  1246. #  ifndef LOCAL
  1247. #    define LOCAL ""
  1248. #  endif
  1249. #  ifdef MORE
  1250. #    define SFXOPT1 "M"
  1251. #  else
  1252. #    define SFXOPT1 ""
  1253. #  endif
  1254. int usage(__G__ error)   /* return PK-type error code */
  1255.     __GDEF
  1256.     int error;
  1257. {
  1258.     Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner),
  1259.       UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
  1260.       LoadFarStringSmall(VersionDate)));
  1261.     Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXOpts),
  1262.       SFXOPT1, LOCAL));
  1263. #ifdef BETA
  1264.     Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "n",
  1265.       "SFX"));
  1266. #endif
  1267.     if (error)
  1268.         return PK_PARAM;
  1269.     else
  1270.         return PK_COOL;     /* just wanted usage screen: no error */
  1271. } /* end function usage() */
  1272. #else /* !SFX */
  1273. #  ifdef VMS
  1274. #    define QUOT '"'
  1275. #    define QUOTS """
  1276. #  else
  1277. #    define QUOT ' '
  1278. #    define QUOTS ""
  1279. #  endif
  1280. int usage(__G__ error)   /* return PK-type error code */
  1281.     __GDEF
  1282.     int error;
  1283. {
  1284.     int flag = (error? 1 : 0);
  1285. /*---------------------------------------------------------------------------
  1286.     Print either ZipInfo usage or UnZip usage, depending on incantation.
  1287.     (Strings must be no longer than 512 bytes for Turbo C, apparently.)
  1288.   ---------------------------------------------------------------------------*/
  1289.     if (uO.zipinfo_mode) {
  1290. #ifndef NO_ZIPINFO
  1291.         Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine1),
  1292.           ZI_MAJORVER, ZI_MINORVER, PATCHLEVEL, BETALEVEL,
  1293.           LoadFarStringSmall(VersionDate),
  1294.           LoadFarStringSmall2(ZipInfoExample), QUOTS,QUOTS));
  1295.         Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine2)));
  1296.         Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine3),
  1297.           QUOT,QUOT, QUOT,QUOT, LoadFarStringSmall(ZipInfoUsageLine4)));
  1298. #ifdef VMS
  1299.         Info(slide, flag, ((char *)slide, "nRemember that non-lowercase
  1300.  filespecs must be quoted in VMS (e.g., "Makefile").n"));
  1301. #endif
  1302. #endif /* !NO_ZIPINFO */
  1303.     } else {   /* UnZip mode */
  1304.         Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine1),
  1305.           UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
  1306.           LoadFarStringSmall(VersionDate)));
  1307. #ifdef BETA
  1308.         Info(slide, flag, ((char *)slide, LoadFarString(BetaVersion), "", ""));
  1309. #endif
  1310.         Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine2),
  1311.           ZIPINFO_MODE_OPTION, LoadFarStringSmall(ZipInfoMode)));
  1312. #ifdef VMS
  1313.         if (!error)  /* maybe no command-line tail found; show extra help */
  1314.             Info(slide, flag, ((char *)slide, LoadFarString(VMSusageLine2b)));
  1315. #endif
  1316.         Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine3),
  1317.           LoadFarStringSmall(local1)));
  1318.         Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine4),
  1319.           QUOT,QUOT, QUOT,QUOT, LoadFarStringSmall(local2), QUOT,QUOT,
  1320.           LoadFarStringSmall2(local3)));
  1321.         /* This is extra work for SMALL_MEM, but it will work since
  1322.          * LoadFarStringSmall2 uses the same buffer.  Remember, this
  1323.          * is a hack. */
  1324.         Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine5),
  1325.           LoadFarStringSmall(Example2), LoadFarStringSmall2(Example3),
  1326.           LoadFarStringSmall2(Example3)));
  1327.     } /* end if (uO.zipinfo_mode) */
  1328.     if (error)
  1329.         return PK_PARAM;
  1330.     else
  1331.         return PK_COOL;     /* just wanted usage screen: no error */
  1332. } /* end function usage() */
  1333. #endif /* ?SFX */
  1334. #ifndef SFX
  1335. /********************************/
  1336. /* Function show_version_info() */
  1337. /********************************/
  1338. static void show_version_info(__G)
  1339.     __GDEF
  1340. {
  1341.     if (uO.qflag > 3)                           /* "unzip -vqqqq" */
  1342.         Info(slide, 0, ((char *)slide, "%dn",
  1343.           (UZ_MAJORVER*100 + UZ_MINORVER*10 + PATCHLEVEL)));
  1344.     else {
  1345.         char *envptr, *getenv();
  1346.         int numopts = 0;
  1347.         Info(slide, 0, ((char *)slide, LoadFarString(UnzipUsageLine1v),
  1348.           UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
  1349.           LoadFarStringSmall(VersionDate)));
  1350.         Info(slide, 0, ((char *)slide,
  1351.           LoadFarString(UnzipUsageLine2v)));
  1352.         version(__G);
  1353.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptions)));
  1354. #ifdef ACORN_FTYPE_NFS
  1355.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1356.           LoadFarStringSmall(AcornFtypeNFS)));
  1357.         ++numopts;
  1358. #endif
  1359. #ifdef ASM_CRC
  1360.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1361.           LoadFarStringSmall(AsmCRC)));
  1362.         ++numopts;
  1363. #endif
  1364. #ifdef ASM_INFLATECODES
  1365.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1366.           LoadFarStringSmall(AsmInflateCodes)));
  1367.         ++numopts;
  1368. #endif
  1369. #ifdef CHECK_VERSIONS
  1370.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1371.           LoadFarStringSmall(Check_Versions)));
  1372.         ++numopts;
  1373. #endif
  1374. #ifdef COPYRIGHT_CLEAN
  1375.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1376.           LoadFarStringSmall(Copyright_Clean)));
  1377.         ++numopts;
  1378. #endif
  1379. #ifdef DEBUG
  1380.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1381.           LoadFarStringSmall(UDebug)));
  1382.         ++numopts;
  1383. #endif
  1384. #ifdef DEBUG_TIME
  1385.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1386.           LoadFarStringSmall(DebugTime)));
  1387.         ++numopts;
  1388. #endif
  1389. #ifdef DLL
  1390.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1391.           LoadFarStringSmall(Dll)));
  1392.         ++numopts;
  1393. #endif
  1394. #ifdef DOSWILD
  1395.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1396.           LoadFarStringSmall(DosWild)));
  1397.         ++numopts;
  1398. #endif
  1399. #ifdef LZW_CLEAN
  1400.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1401.           LoadFarStringSmall(LZW_Clean)));
  1402.         ++numopts;
  1403. #endif
  1404. #ifndef MORE
  1405.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1406.           LoadFarStringSmall(No_More)));
  1407.         ++numopts;
  1408. #endif
  1409. #ifdef NO_ZIPINFO
  1410.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1411.           LoadFarStringSmall(No_ZipInfo)));
  1412.         ++numopts;
  1413. #endif
  1414. #ifdef NTSD_EAS
  1415.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1416.           LoadFarStringSmall(NTSDExtAttrib)));
  1417.         ++numopts;
  1418. #endif
  1419. #ifdef OS2_EAS
  1420.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1421.           LoadFarStringSmall(OS2ExtAttrib)));
  1422.         ++numopts;
  1423. #endif
  1424. #ifdef QLZIP
  1425.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1426.           LoadFarStringSmall(SMSExFldOnUnix)));
  1427.         ++numopts;
  1428. #endif
  1429. #ifdef REENTRANT
  1430.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1431.           LoadFarStringSmall(Reentrant)));
  1432.         ++numopts;
  1433. #endif
  1434. #ifdef REGARGS
  1435.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1436.           LoadFarStringSmall(RegArgs)));
  1437.         ++numopts;
  1438. #endif
  1439. #ifdef RETURN_CODES
  1440.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1441.           LoadFarStringSmall(Return_Codes)));
  1442.         ++numopts;
  1443. #endif
  1444. #ifdef SET_DIR_ATTRIB
  1445.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1446.           LoadFarStringSmall(SetDirAttrib)));
  1447.         ++numopts;
  1448. #endif
  1449. #ifdef TIMESTAMP
  1450.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1451.           LoadFarStringSmall(TimeStamp)));
  1452.         ++numopts;
  1453. #endif
  1454. #ifdef UNIXBACKUP
  1455.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1456.           LoadFarStringSmall(UnixBackup)));
  1457.         ++numopts;
  1458. #endif
  1459. #ifdef USE_EF_UT_TIME
  1460.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1461.           LoadFarStringSmall(Use_EF_UT_time)));
  1462.         ++numopts;
  1463. #endif
  1464. #ifndef COPYRIGHT_CLEAN
  1465.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1466.           LoadFarStringSmall(Use_Smith_Code)));
  1467.         ++numopts;
  1468. #endif
  1469. #ifndef LZW_CLEAN
  1470.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1471.           LoadFarStringSmall(Use_Unshrink)));
  1472.         ++numopts;
  1473. #endif
  1474. #ifdef USE_VFAT
  1475.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1476.           LoadFarStringSmall(Use_VFAT_support)));
  1477.         ++numopts;
  1478. #endif
  1479. #ifdef USE_ZLIB
  1480.         sprintf((char *)(slide+256), LoadFarStringSmall(UseZlib),
  1481.           ZLIB_VERSION, zlib_version);
  1482.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1483.           (char *)(slide+256)));
  1484.         ++numopts;
  1485. #endif
  1486. #ifdef VMS_TEXT_CONV
  1487.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1488.           LoadFarStringSmall(VmsTextConv)));
  1489.         ++numopts;
  1490. #endif
  1491. #ifdef VMSCLI
  1492.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1493.           LoadFarStringSmall(VmsCLI)));
  1494.         ++numopts;
  1495. #endif
  1496. #ifdef VMSWILD
  1497.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1498.           LoadFarStringSmall(VmsWild)));
  1499.         ++numopts;
  1500. #endif
  1501. #if CRYPT
  1502. # ifdef PASSWD_FROM_STDIN
  1503.         Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
  1504.           LoadFarStringSmall(PasswdStdin)));
  1505. # endif
  1506.         Info(slide, 0, ((char *)slide, LoadFarString(Decryption),
  1507.           CR_MAJORVER, CR_MINORVER, CR_BETA_VER,
  1508.           LoadFarStringSmall(CryptDate)));
  1509.         ++numopts;
  1510. #endif /* CRYPT */
  1511.         if (numopts == 0)
  1512.             Info(slide, 0, ((char *)slide,
  1513.               LoadFarString(CompileOptFormat),
  1514.               LoadFarStringSmall(None)));
  1515.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptions)));
  1516.         envptr = getenv(LoadFarStringSmall(EnvUnZip));
  1517.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1518.           LoadFarStringSmall(EnvUnZip),
  1519.           (envptr == (char *)NULL || *envptr == 0)?
  1520.           LoadFarStringSmall2(None) : envptr));
  1521.         envptr = getenv(LoadFarStringSmall(EnvUnZip2));
  1522.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1523.           LoadFarStringSmall(EnvUnZip2),
  1524.           (envptr == (char *)NULL || *envptr == 0)?
  1525.           LoadFarStringSmall2(None) : envptr));
  1526.         envptr = getenv(LoadFarStringSmall(EnvZipInfo));
  1527.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1528.           LoadFarStringSmall(EnvZipInfo),
  1529.           (envptr == (char *)NULL || *envptr == 0)?
  1530.           LoadFarStringSmall2(None) : envptr));
  1531.         envptr = getenv(LoadFarStringSmall(EnvZipInfo2));
  1532.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1533.           LoadFarStringSmall(EnvZipInfo2),
  1534.           (envptr == (char *)NULL || *envptr == 0)?
  1535.           LoadFarStringSmall2(None) : envptr));
  1536. #ifndef __RSXNT__
  1537. #ifdef __EMX__
  1538.         envptr = getenv(LoadFarStringSmall(EnvEMX));
  1539.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1540.           LoadFarStringSmall(EnvEMX),
  1541.           (envptr == (char *)NULL || *envptr == 0)?
  1542.           LoadFarStringSmall2(None) : envptr));
  1543.         envptr = getenv(LoadFarStringSmall(EnvEMXOPT));
  1544.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1545.           LoadFarStringSmall(EnvEMXOPT),
  1546.           (envptr == (char *)NULL || *envptr == 0)?
  1547.           LoadFarStringSmall2(None) : envptr));
  1548. #endif /* __EMX__ */
  1549. #if (defined(__GO32__) && (!defined(__DJGPP__) || (__DJGPP__ < 2)))
  1550.         envptr = getenv(LoadFarStringSmall(EnvGO32));
  1551.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1552.           LoadFarStringSmall(EnvGO32),
  1553.           (envptr == (char *)NULL || *envptr == 0)?
  1554.           LoadFarStringSmall2(None) : envptr));
  1555.         envptr = getenv(LoadFarStringSmall(EnvGO32TMP));
  1556.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1557.           LoadFarStringSmall(EnvGO32TMP),
  1558.           (envptr == (char *)NULL || *envptr == 0)?
  1559.           LoadFarStringSmall2(None) : envptr));
  1560. #endif /* __GO32__ && !(__DJGPP__ >= 2) */
  1561. #endif /* !__RSXNT__ */
  1562. #ifdef RISCOS
  1563.         envptr = getenv(LoadFarStringSmall(EnvUnZipExts));
  1564.         Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
  1565.           LoadFarStringSmall(EnvUnZipExts),
  1566.           (envptr == (char *)NULL || *envptr == 0)?
  1567.           LoadFarStringSmall2(None) : envptr));
  1568. #endif /* RISCOS */
  1569.     }
  1570. } /* end function show_version() */
  1571. #endif /* !SFX */
  1572. #endif /* !WINDLL */