which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1612 lines
		
	
	
		
			56 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1612 lines
		
	
	
		
			56 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*---------------------------------------------------------------------------
 | 
						|
 | 
						|
  unzip.c
 | 
						|
 | 
						|
  UnZip - a zipfile extraction utility.  See below for make instructions, or
 | 
						|
  read the comments in Makefile and the various Contents files for more de-
 | 
						|
  tailed explanations.  To report a bug, send a *complete* description to
 | 
						|
  Zip-Bugs@lists.wku.edu; include machine type, operating system and ver-
 | 
						|
  sion, compiler and version, and reasonably detailed error messages or prob-
 | 
						|
  lem report.  To join Info-ZIP, see the instructions in README.
 | 
						|
 | 
						|
  UnZip 5.x is a greatly expanded and partially rewritten successor to 4.x,
 | 
						|
  which in turn was almost a complete rewrite of version 3.x.  For a detailed
 | 
						|
  revision history, see UnzpHist.zip at quest.jpl.nasa.gov.  For a list of
 | 
						|
  the many (near infinite) contributors, see "CONTRIBS" in the UnZip source
 | 
						|
  distribution.
 | 
						|
 | 
						|
  ---------------------------------------------------------------------------
 | 
						|
 | 
						|
  [from original zipinfo.c]
 | 
						|
 | 
						|
  This program reads great gobs of totally nifty information, including the
 | 
						|
  central directory stuff, from ZIP archives ("zipfiles" for short).  It
 | 
						|
  started as just a testbed for fooling with zipfiles, but at this point it
 | 
						|
  is actually a useful utility.  It also became the basis for the rewrite of
 | 
						|
  UnZip (3.16 -> 4.0), using the central directory for processing rather than
 | 
						|
  the individual (local) file headers.
 | 
						|
 | 
						|
  As of ZipInfo v2.0 and UnZip v5.1, the two programs are combined into one.
 | 
						|
  If the executable is named "unzip" (or "unzip.exe", depending), it behaves
 | 
						|
  like UnZip by default; if it is named "zipinfo" or "ii", it behaves like
 | 
						|
  ZipInfo.  The ZipInfo behavior may also be triggered by use of unzip's -Z
 | 
						|
  option; for example, "unzip -Z [zipinfo_options] archive.zip".
 | 
						|
 | 
						|
  Another dandy product from your buddies at Newtware!
 | 
						|
 | 
						|
  Author:  Greg Roelofs, newt@pobox.com, http://pobox.com/~newt/
 | 
						|
           23 August 1990 -> April 1997
 | 
						|
 | 
						|
  ---------------------------------------------------------------------------
 | 
						|
 | 
						|
  Version:  unzip53.{tar.Z | tar.gz | zip} for Unix, VMS, OS/2, MS-DOS, Amiga,
 | 
						|
              Atari, Windows 3.x/95/NT/CE, Macintosh, Human68K, Acorn RISC OS,
 | 
						|
              BeOS, SMS/QDOS, VM/CMS, MVS, AOS/VS and TOPS-20.  Decryption
 | 
						|
              requires sources in zcrypt27.zip.  See the accompanying "Where"
 | 
						|
              file in the main source distribution for ftp, uucp, BBS and mail-
 | 
						|
              server sites, or see http://www.cdrom.com/pub/infozip/UnZip.html .
 | 
						|
 | 
						|
  Copyrights:  see accompanying file "COPYING" in UnZip source distribution.
 | 
						|
               (This software is free but NOT IN THE PUBLIC DOMAIN.  There
 | 
						|
               are some restrictions on commercial use.)
 | 
						|
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#define UNZIP_C
 | 
						|
#define UNZIP_INTERNAL
 | 
						|
#include "unzip.h"        /* includes, typedefs, macros, prototypes, etc. */
 | 
						|
#include "crypt.h"
 | 
						|
#include "version.h"
 | 
						|
#ifdef USE_ZLIB
 | 
						|
#  include "zlib.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef WINDLL            /* The WINDLL port uses windll/windll.c instead... */
 | 
						|
 | 
						|
 | 
						|
/*************/
 | 
						|
/* Constants */
 | 
						|
/*************/
 | 
						|
 | 
						|
#include "consts.h"  /* all constant global variables are in here */
 | 
						|
                     /* (non-constant globals were moved to globals.c) */
 | 
						|
 | 
						|
/* constant local variables: */
 | 
						|
 | 
						|
#ifndef SFX
 | 
						|
   static char Far EnvUnZip[] = ENV_UNZIP;
 | 
						|
   static char Far EnvUnZip2[] = ENV_UNZIP2;
 | 
						|
   static char Far EnvZipInfo[] = ENV_ZIPINFO;
 | 
						|
   static char Far EnvZipInfo2[] = ENV_ZIPINFO2;
 | 
						|
#ifdef RISCOS
 | 
						|
   static char Far EnvUnZipExts[] = ENV_UNZIPEXTS;
 | 
						|
#endif /* RISCOS */
 | 
						|
#endif
 | 
						|
 | 
						|
#if (!defined(SFX) || defined(SFX_EXDIR))
 | 
						|
   static char Far NotExtracting[] = "caution:  not extracting; -d ignored\n";
 | 
						|
   static char Far MustGiveExdir[] =
 | 
						|
     "error:  must specify directory to which to extract with -d option\n";
 | 
						|
   static char Far OnlyOneExdir[] =
 | 
						|
     "error:  -d option used more than once (only one exdir allowed)\n";
 | 
						|
#endif
 | 
						|
 | 
						|
#if CRYPT
 | 
						|
   static char Far MustGivePasswd[] =
 | 
						|
     "error:  must give decryption password with -P option\n";
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef SFX
 | 
						|
   static char Far Zfirst[] = 
 | 
						|
   "error:  -Z must be first option for ZipInfo mode (check UNZIP variable?)\n";
 | 
						|
#endif
 | 
						|
static char Far InvalidOptionsMsg[] = "error:\
 | 
						|
  -fn or any combination of -c, -l, -p, -t, -u and -v options invalid\n";
 | 
						|
static char Far IgnoreOOptionMsg[] =
 | 
						|
  "caution:  both -n and -o specified; ignoring -o\n";
 | 
						|
 | 
						|
/* usage() strings */
 | 
						|
#ifndef SFX
 | 
						|
#ifdef VMS
 | 
						|
   static char Far Example3[] = "vms.c";
 | 
						|
   static char Far Example2[] = "  unzip\
 | 
						|
 \"-V\" foo \"Bar\" => must quote uppercase options and filenames in VMS\n";
 | 
						|
#else /* !VMS */
 | 
						|
   static char Far Example3[] = "ReadMe";
 | 
						|
#ifdef RISCOS
 | 
						|
   static char Far Example2[] =
 | 
						|
"  unzip foo -d RAM:$   => extract all files from foo into RAMDisc\n";
 | 
						|
#else /* !RISCOS */
 | 
						|
#if defined(OS2) || (defined(DOS_OS2_W32) && defined(MORE))
 | 
						|
   static char Far Example2[] = "";   /* no room:  too many local3[] items */
 | 
						|
#else /* !OS2 */
 | 
						|
   static char Far Example2[] = " \
 | 
						|
 unzip -p foo | more  => send contents of foo.zip via pipe into program more\n";
 | 
						|
#endif /* ?OS2 */
 | 
						|
#endif /* ?RISCOS */
 | 
						|
#endif /* ?VMS */
 | 
						|
 | 
						|
/* local1[]:  command options */
 | 
						|
#if (defined(DLL) && defined(API_DOC))
 | 
						|
   static char Far local1[] = "  -A  print extended help for API functions";
 | 
						|
#else /* !(DLL && API_DOC) */
 | 
						|
   static char Far local1[] = "";
 | 
						|
#endif /* ?(DLL && API_DOC) */
 | 
						|
 | 
						|
/* local2[] and local3[]:  modifier options */
 | 
						|
#ifdef DOS_OS2_W32
 | 
						|
   static char Far local2[] = " -$  label removables (-$$ => fixed disks)";
 | 
						|
#ifdef OS2
 | 
						|
#ifdef MORE
 | 
						|
   static char Far local3[] = "\
 | 
						|
  -X  restore ACLs if supported              -s  spaces in filenames => '_'\n\
 | 
						|
                                             -M  pipe through \"more\" pager\n";
 | 
						|
#else
 | 
						|
   static char Far local3[] = " \
 | 
						|
 -X  restore ACLs if supported              -s  spaces in filenames => '_'\n\n";
 | 
						|
#endif /* ?MORE */
 | 
						|
#else /* !OS2 */
 | 
						|
#ifdef WIN32
 | 
						|
#ifdef MORE
 | 
						|
   static char Far local3[] = "\
 | 
						|
  -X  restore ACLs (-XX => use privileges)   -s  spaces in filenames => '_'\n\
 | 
						|
                                             -M  pipe through \"more\" pager\n";
 | 
						|
#else
 | 
						|
   static char Far local3[] = " \
 | 
						|
 -X  restore ACLs (-XX => use privileges)   -s  spaces in filenames => '_'\n\n";
 | 
						|
#endif /* ?MORE */
 | 
						|
#else /* !WIN32 */
 | 
						|
#ifdef MORE
 | 
						|
   static char Far local3[] = "  -\
 | 
						|
M  pipe through \"more\" pager              -s  spaces in filenames => '_'\n\n";
 | 
						|
#else
 | 
						|
   static char Far local3[] = "\
 | 
						|
                                             -s  spaces in filenames => '_'\n";
 | 
						|
#endif
 | 
						|
#endif /* ?WIN32 */
 | 
						|
#endif /* ?OS2 || ?WIN32 */
 | 
						|
#else /* !DOS_OS2_W32 */
 | 
						|
#ifdef VMS
 | 
						|
   static char Far local2[] = "\"-X\" restore owner/protection info";
 | 
						|
#ifdef MORE
 | 
						|
   static char Far local3[] = "  \
 | 
						|
                                          \"-M\" pipe through \"more\" pager\n";
 | 
						|
#else
 | 
						|
   static char Far local3[] = "\n";
 | 
						|
#endif
 | 
						|
#else /* !VMS */
 | 
						|
#ifdef UNIX
 | 
						|
   static char Far local2[] = " -X  restore UID/GID info";
 | 
						|
#ifdef MORE
 | 
						|
   static char Far local3[] = "\
 | 
						|
                                             -M  pipe through \"more\" pager\n";
 | 
						|
#else
 | 
						|
   static char Far local3[] = "\n";
 | 
						|
#endif
 | 
						|
#else /* !UNIX */
 | 
						|
#ifdef AMIGA
 | 
						|
    static char Far local2[] = " -N  restore comments as filenotes";
 | 
						|
#ifdef MORE
 | 
						|
    static char Far local3[] = "\
 | 
						|
                                             -M  pipe through \"more\" pager\n";
 | 
						|
#else
 | 
						|
    static char Far local3[] = "\n";
 | 
						|
#endif
 | 
						|
#else /* !AMIGA */
 | 
						|
#ifdef MORE
 | 
						|
    static char Far local2[] = " -M  pipe through \"more\" pager";
 | 
						|
    static char Far local3[] = "\n";
 | 
						|
#else
 | 
						|
    static char Far local2[] = "";   /* Atari, Mac, etc. */
 | 
						|
    static char Far local3[] = "";
 | 
						|
#endif
 | 
						|
#endif /* ?AMIGA */
 | 
						|
#endif /* ?UNIX */
 | 
						|
#endif /* ?VMS */
 | 
						|
#endif /* ?DOS_OS2_W32 */
 | 
						|
#endif /* !SFX */
 | 
						|
 | 
						|
#ifndef NO_ZIPINFO
 | 
						|
#ifdef VMS
 | 
						|
   static char Far ZipInfoExample[] = "* or % (e.g., \"*font-%.zip\")";
 | 
						|
#else
 | 
						|
   static char Far ZipInfoExample[] = "*, ?, [] (e.g., \"[a-j]*.zip\")";
 | 
						|
#endif
 | 
						|
 | 
						|
static char Far ZipInfoUsageLine1[] = "\
 | 
						|
ZipInfo %d.%d%d%s of %s, by Greg Roelofs and the fine folks at Info-ZIP.\n\
 | 
						|
\n\
 | 
						|
List name, date/time, attribute, size, compression method, etc., about files\n\
 | 
						|
in list (excluding those in xlist) contained in the specified .zip archive(s).\
 | 
						|
\n\"file[.zip]\" may be a wildcard name containing %s.\n\n\
 | 
						|
   usage:  zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]\n\
 | 
						|
      or:  unzip %s-Z%s [-12smlvChMtTz] file[.zip] [list...] [-x xlist...]\n";
 | 
						|
 | 
						|
static char Far ZipInfoUsageLine2[] = "\nmain\
 | 
						|
 listing-format options:             -s  short Unix \"ls -l\" format (def.)\n\
 | 
						|
  -1  filenames ONLY, one per line       -m  medium Unix \"ls -l\" format\n\
 | 
						|
  -2  just filenames but allow -h/-t/-z  -l  long Unix \"ls -l\" format\n\
 | 
						|
                                         -v  verbose, multi-page format\n";
 | 
						|
 | 
						|
static char Far ZipInfoUsageLine3[] = "miscellaneous options:\n\
 | 
						|
  -h  print header line       -t  print totals for listed files or for all\n\
 | 
						|
  -z  print zipfile comment  %c-T%c print file times in sortable decimal format\
 | 
						|
\n %c-C%c be case-insensitive   %s\
 | 
						|
  -x  exclude filenames that follow from listing\n";
 | 
						|
#ifdef MORE
 | 
						|
#ifdef VMS
 | 
						|
   static char Far ZipInfoUsageLine4[] =
 | 
						|
     " \"-M\" page output through built-in \"more\"\n";
 | 
						|
#else
 | 
						|
   static char Far ZipInfoUsageLine4[] =
 | 
						|
     "  -M  page output through built-in \"more\"\n";
 | 
						|
#endif
 | 
						|
#else /* !MORE */
 | 
						|
   static char Far ZipInfoUsageLine4[] = "";
 | 
						|
#endif /* ?MORE */
 | 
						|
#endif /* !NO_ZIPINFO */
 | 
						|
 | 
						|
#ifdef BETA
 | 
						|
#  ifdef VMSCLI
 | 
						|
   /* BetaVersion[] is also used in vms/cmdline.c:  do not make it static */
 | 
						|
     char Far BetaVersion[] = "%s\
 | 
						|
        THIS IS STILL A BETA VERSION OF UNZIP%s -- DO NOT DISTRIBUTE.\n\n";
 | 
						|
#  else
 | 
						|
     static char Far BetaVersion[] = "%s\
 | 
						|
        THIS IS STILL A BETA VERSION OF UNZIP%s -- DO NOT DISTRIBUTE.\n\n";
 | 
						|
#  endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
#  ifdef VMSCLI
 | 
						|
   /* UnzipSFXBanner[] is also used in vms/cmdline.c:  do not make it static */
 | 
						|
     char Far UnzipSFXBanner[] =
 | 
						|
#  else
 | 
						|
     static char Far UnzipSFXBanner[] =
 | 
						|
#  endif
 | 
						|
     "UnZipSFX %d.%d%d%s of %s, by Info-ZIP (Zip-Bugs@lists.wku.edu).\n";
 | 
						|
#  ifdef SFX_EXDIR
 | 
						|
     static char Far UnzipSFXOpts[] =
 | 
						|
    "Valid options are -tfupcz and -d <exdir>; modifiers are -abjnoqCL%sV%s.\n";
 | 
						|
#  else
 | 
						|
     static char Far UnzipSFXOpts[] =
 | 
						|
       "Valid options are -tfupcz; modifiers are -abjnoqCL%sV%s.\n";
 | 
						|
#  endif
 | 
						|
#else /* !SFX */
 | 
						|
   static char Far CompileOptions[] = "UnZip special compilation options:\n";
 | 
						|
   static char Far CompileOptFormat[] = "\t%s\n";
 | 
						|
   static char Far EnvOptions[] = "\nUnZip and ZipInfo environment options:\n";
 | 
						|
   static char Far EnvOptFormat[] = "%16s:  %s\n";
 | 
						|
   static char Far None[] = "[none]";
 | 
						|
#  ifdef ASM_CRC
 | 
						|
     static char Far AsmCRC[] = "ASM_CRC";
 | 
						|
#  endif
 | 
						|
#  ifdef ASM_INFLATECODES
 | 
						|
     static char Far AsmInflateCodes[] = "ASM_INFLATECODES";
 | 
						|
#  endif
 | 
						|
#  ifdef CHECK_VERSIONS
 | 
						|
     static char Far Check_Versions[] = "CHECK_VERSIONS";
 | 
						|
#  endif
 | 
						|
#  ifdef COPYRIGHT_CLEAN
 | 
						|
     static char Far Copyright_Clean[] =
 | 
						|
     "COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)";
 | 
						|
#  endif
 | 
						|
#  ifdef DEBUG
 | 
						|
     static char Far UDebug[] = "DEBUG";
 | 
						|
#  endif
 | 
						|
#  ifdef DEBUG_TIME
 | 
						|
     static char Far DebugTime[] = "DEBUG_TIME";
 | 
						|
#  endif
 | 
						|
#  ifdef DLL
 | 
						|
     static char Far Dll[] = "DLL";
 | 
						|
#  endif
 | 
						|
#  ifdef DOSWILD
 | 
						|
     static char Far DosWild[] = "DOSWILD";
 | 
						|
#  endif
 | 
						|
#  ifdef LZW_CLEAN
 | 
						|
     static char Far LZW_Clean[] =
 | 
						|
     "LZW_CLEAN (PKZIP/Zip 1.x unshrinking method not supported)";
 | 
						|
#  endif
 | 
						|
#  ifndef MORE
 | 
						|
     static char Far No_More[] = "NO_MORE";
 | 
						|
#  endif
 | 
						|
#  ifdef NO_ZIPINFO
 | 
						|
     static char Far No_ZipInfo[] = "NO_ZIPINFO";
 | 
						|
#  endif
 | 
						|
#  ifdef NTSD_EAS
 | 
						|
     static char Far NTSDExtAttrib[] = "NTSD_EAS";
 | 
						|
#  endif
 | 
						|
#  ifdef OS2_EAS
 | 
						|
     static char Far OS2ExtAttrib[] = "OS2_EAS";
 | 
						|
#  endif
 | 
						|
#  ifdef REENTRANT
 | 
						|
     static char Far Reentrant[] = "REENTRANT";
 | 
						|
#  endif
 | 
						|
#  ifdef REGARGS
 | 
						|
     static char Far RegArgs[] = "REGARGS";
 | 
						|
#  endif
 | 
						|
#  ifdef RETURN_CODES
 | 
						|
     static char Far Return_Codes[] = "RETURN_CODES";
 | 
						|
#  endif
 | 
						|
#  ifdef TIMESTAMP
 | 
						|
     static char Far TimeStamp[] = "TIMESTAMP";
 | 
						|
#  endif
 | 
						|
#  ifdef UNIXBACKUP
 | 
						|
     static char Far UnixBackup[] = "UNIXBACKUP";
 | 
						|
#  endif
 | 
						|
#  ifdef USE_EF_UT_TIME
 | 
						|
     static char Far Use_EF_UT_time[] = "USE_EF_UT_TIME";
 | 
						|
#  endif
 | 
						|
#  ifndef LZW_CLEAN
 | 
						|
     static char Far Use_Unshrink[] =
 | 
						|
     "USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)";
 | 
						|
#  endif
 | 
						|
#  ifndef COPYRIGHT_CLEAN
 | 
						|
     static char Far Use_Smith_Code[] =
 | 
						|
     "USE_SMITH_CODE (PKZIP 0.9x unreducing method supported)";
 | 
						|
#  endif
 | 
						|
#  ifdef USE_VFAT
 | 
						|
     static char Far Use_VFAT_support[] = "USE_VFAT";
 | 
						|
#  endif
 | 
						|
#  ifdef USE_ZLIB
 | 
						|
     static char Far UseZlib[] =
 | 
						|
     "USE_ZLIB (compiled with version %s; using version %s)";
 | 
						|
#  endif
 | 
						|
#  ifdef VMS_TEXT_CONV
 | 
						|
     static char Far VmsTextConv[] = "VMS_TEXT_CONV";
 | 
						|
#  endif
 | 
						|
#  ifdef VMSCLI
 | 
						|
     static char Far VmsCLI[] = "VMSCLI";
 | 
						|
#  endif
 | 
						|
#  ifdef VMSWILD
 | 
						|
     static char Far VmsWild[] = "VMSWILD";
 | 
						|
#  endif
 | 
						|
#  if CRYPT
 | 
						|
#    ifdef PASSWD_FROM_STDIN
 | 
						|
       static char Far PasswdStdin[] = "PASSWD_FROM_STDIN";
 | 
						|
#    endif
 | 
						|
     static char Far Decryption[] = "\t[decryption, version %d.%d%s of %s]\n";
 | 
						|
     static char Far CryptDate[] = CR_VERSION_DATE;
 | 
						|
#  endif
 | 
						|
#  ifndef __RSXNT__
 | 
						|
#    ifdef __EMX__
 | 
						|
       static char Far EnvEMX[] = "EMX";
 | 
						|
       static char Far EnvEMXOPT[] = "EMXOPT";
 | 
						|
#    endif
 | 
						|
#    ifdef __GO32__
 | 
						|
       static char Far EnvGO32[] = "GO32";
 | 
						|
       static char Far EnvGO32TMP[] = "GO32TMP";
 | 
						|
#    endif
 | 
						|
#  endif /* !__RSXNT__ */
 | 
						|
 | 
						|
#ifdef VMS
 | 
						|
/* UnzipUsageLine1[] is also used in vms/cmdline.c:  do not make it static */
 | 
						|
   char Far UnzipUsageLine1[] = "\
 | 
						|
UnZip %d.%d%d%s of %s, by Info-ZIP.  For more details see: unzip -v.\n\n";
 | 
						|
#ifdef COPYRIGHT_CLEAN
 | 
						|
   static char Far UnzipUsageLine1v[] = "\
 | 
						|
UnZip %d.%d%d%s of %s, by Info-ZIP.  Maintained by Greg Roelofs.  Send\n\
 | 
						|
bug reports to the authors at Zip-Bugs@lists.wku.edu; see README for details.\
 | 
						|
\n\n";
 | 
						|
#else
 | 
						|
   static char Far UnzipUsageLine1v[] = "\
 | 
						|
UnZip %d.%d%d%s of %s, by Info-ZIP.  UnReduce (c) 1989 by S. H. Smith.\n\
 | 
						|
Send bug reports to authors at Zip-Bugs@lists.wku.edu; see README for details.\
 | 
						|
\n\n";
 | 
						|
#endif /* ?COPYRIGHT_CLEAN */
 | 
						|
#else /* !VMS */
 | 
						|
#ifdef COPYRIGHT_CLEAN
 | 
						|
   static char Far UnzipUsageLine1[] = "\
 | 
						|
UnZip %d.%d%d%s of %s, by Info-ZIP.  Maintained by Greg Roelofs.  Send\n\
 | 
						|
bug reports to the authors at Zip-Bugs@lists.wku.edu; see README for details.\
 | 
						|
\n\n";
 | 
						|
#else
 | 
						|
   static char Far UnzipUsageLine1[] = "\
 | 
						|
UnZip %d.%d%d%s of %s, by Info-ZIP.  UnReduce (c) 1989 by S. H. Smith.\n\
 | 
						|
Send bug reports to authors at Zip-Bugs@lists.wku.edu; see README for details.\
 | 
						|
\n\n";
 | 
						|
#endif /* ?COPYRIGHT_CLEAN */
 | 
						|
#define UnzipUsageLine1v        UnzipUsageLine1
 | 
						|
#endif /* ?VMS */
 | 
						|
 | 
						|
/*
 | 
						|
static char Far UnzipUsageLine2v[] = "\
 | 
						|
Latest sources and executables are always in ftp.uu.net:/pub/archiving/zip, at\
 | 
						|
\nleast as of date of this release; see \"Where\" for other ftp and non-ftp \
 | 
						|
sites.\n\n";
 | 
						|
 */
 | 
						|
static char Far UnzipUsageLine2v[] = "\
 | 
						|
Latest sources and executables are at ftp://ftp.cdrom.com/pub/infozip/ , as of\
 | 
						|
\nabove date; see http://www.cdrom.com/pub/infozip/UnZip.html for other sites.\
 | 
						|
\n\n";
 | 
						|
 | 
						|
static char Far UnzipUsageLine2[] = "\
 | 
						|
Usage: unzip %s[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]\n \
 | 
						|
 Default action is to extract files in list, except those in xlist, to exdir;\n\
 | 
						|
  file[.zip] may be a wildcard.  %s\n";
 | 
						|
 | 
						|
#ifdef NO_ZIPINFO
 | 
						|
#  define ZIPINFO_MODE_OPTION  ""
 | 
						|
   static char Far ZipInfoMode[] =
 | 
						|
     "(ZipInfo mode is disabled in this version.)";
 | 
						|
#else
 | 
						|
#  define ZIPINFO_MODE_OPTION  "[-Z] "
 | 
						|
#  ifdef VMS
 | 
						|
     static char Far ZipInfoMode[] =
 | 
						|
       "\"-Z\" => ZipInfo mode (`unzip \"-Z\"' for usage).";
 | 
						|
#  else
 | 
						|
     static char Far ZipInfoMode[] =
 | 
						|
       "-Z => ZipInfo mode (\"unzip -Z\" for usage).";
 | 
						|
#  endif
 | 
						|
#endif /* ?NO_ZIPINFO */
 | 
						|
 | 
						|
#ifdef VMS
 | 
						|
   static char Far VMSusageLine2b[] = "\
 | 
						|
=> define foreign command symbol in LOGIN.COM:  $ unzip :== $dev:[dir]unzip.exe\
 | 
						|
\n";
 | 
						|
#endif
 | 
						|
 | 
						|
static char Far UnzipUsageLine3[] = "\n\
 | 
						|
  -p  extract files to pipe, no messages     -l  list files (short format)\n\
 | 
						|
  -f  freshen existing files, create none    -t  test compressed archive data\n\
 | 
						|
  -u  update files, create if necessary      -z  display archive comment\n\
 | 
						|
  -x  exclude files that follow (in xlist)   -d  extract files into exdir\n\
 | 
						|
%s\n";
 | 
						|
 | 
						|
static char Far UnzipUsageLine4[] = "\
 | 
						|
modifiers:                                   -q  quiet mode (-qq => quieter)\n\
 | 
						|
  -n  never overwrite existing files         -a  auto-convert any text files\n\
 | 
						|
  -o  overwrite files WITHOUT prompting      -aa treat ALL files as text\n \
 | 
						|
 -j  junk paths (don't make directories)    -v  be verbose/print version info\n\
 | 
						|
 %c-C%c match filenames case-insensitively    %c-L%c make (some) names \
 | 
						|
lowercase\n %-42s %c-V%c retain VMS version numbers\n%s";
 | 
						|
 | 
						|
static char Far UnzipUsageLine5[] = "\
 | 
						|
Examples (see unzip.doc for more info):\n\
 | 
						|
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip\n\
 | 
						|
%s\
 | 
						|
  unzip -fo foo %-6s => quietly replace existing %s if archive file newer\n";
 | 
						|
#endif /* ?SFX */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*****************************/
 | 
						|
/*  main() / UzpMain() stub  */
 | 
						|
/*****************************/
 | 
						|
 | 
						|
int MAIN(argc, argv)   /* return PK-type error code (except under VMS) */
 | 
						|
    int argc;
 | 
						|
    char *argv[];
 | 
						|
{
 | 
						|
    int r;
 | 
						|
 | 
						|
    CONSTRUCTGLOBALS();
 | 
						|
    r = unzip(__G__ argc, argv);
 | 
						|
    DESTROYGLOBALS()
 | 
						|
    RETURN(r);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*******************************/
 | 
						|
/*  Primary UnZip entry point  */
 | 
						|
/*******************************/
 | 
						|
 | 
						|
int unzip(__G__ argc, argv)
 | 
						|
    __GDEF
 | 
						|
    int argc;
 | 
						|
    char *argv[];
 | 
						|
{
 | 
						|
#ifndef NO_ZIPINFO
 | 
						|
    char *p;
 | 
						|
#endif
 | 
						|
#ifdef DOS_H68_OS2_W32
 | 
						|
    int i;
 | 
						|
#endif
 | 
						|
    int retcode, error=FALSE;
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Macintosh initialization code.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef MACOS
 | 
						|
    int a;
 | 
						|
 | 
						|
    for (a = 0;  a < 4;  ++a)
 | 
						|
        G.rghCursor[a] = GetCursor(a+128);
 | 
						|
    G.giCursor = 0;
 | 
						|
    error = FALSE;
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(__IBMC__) && defined(__DEBUG_ALLOC__)
 | 
						|
    extern void DebugMalloc(void);
 | 
						|
 | 
						|
    atexit(DebugMalloc);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef MALLOC_WORK
 | 
						|
    G.area.Slide =(uch *)calloc(8193, sizeof(short)+sizeof(char)+sizeof(char));
 | 
						|
    G.area.shrink.Parent = (shrint *)G.area.Slide;
 | 
						|
    G.area.shrink.value = G.area.Slide + (sizeof(shrint)*(HSIZE+1));
 | 
						|
    G.area.shrink.Stack = G.area.Slide +
 | 
						|
                           (sizeof(shrint) + sizeof(uch))*(HSIZE+1);
 | 
						|
#endif
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Human68K initialization code.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef __human68k__
 | 
						|
    InitTwentyOne();
 | 
						|
#endif
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Acorn RISC OS initialization code.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef RISCOS
 | 
						|
    set_prefix();
 | 
						|
#endif
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Set signal handler for restoring echo, warn of zipfile corruption, etc.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#if (!defined(CMS_MVS))
 | 
						|
    signal(SIGINT, handler);
 | 
						|
#ifdef SIGTERM                 /* some systems really have no SIGTERM */
 | 
						|
    signal(SIGTERM, handler);
 | 
						|
#endif
 | 
						|
#ifdef SIGBUS
 | 
						|
    signal(SIGBUS, handler);
 | 
						|
#endif
 | 
						|
#ifdef SIGSEGV
 | 
						|
    signal(SIGSEGV, handler);
 | 
						|
#endif
 | 
						|
#endif /* !CMS_MVS */
 | 
						|
 | 
						|
#if (defined(WIN32) && defined(__RSXNT__))
 | 
						|
    for (i = 0 ; i < argc; i++) {
 | 
						|
       _ISO_INTERN(argv[i]);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    First figure out if we're running in UnZip mode or ZipInfo mode, and put
 | 
						|
    the appropriate environment-variable options into the queue.  Then rip
 | 
						|
    through any command-line options lurking about...
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
    G.argv0 = argv[0];
 | 
						|
#if defined(OS2) || defined(WIN32)
 | 
						|
    G.zipfn = GetLoadPath(__G);/* non-MSC NT puts path into G.filename[] */
 | 
						|
#else
 | 
						|
    G.zipfn = G.argv0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef VMSCLI
 | 
						|
    {
 | 
						|
        ulg status = vms_unzip_cmdline(&argc, &argv);
 | 
						|
        if (!(status & 1))
 | 
						|
            return status;
 | 
						|
    }
 | 
						|
#endif /* VMSCLI */
 | 
						|
 | 
						|
    G.zipinfo_mode = FALSE;
 | 
						|
    error = uz_opts(__G__ &argc, &argv);   /* UnZipSFX call only */
 | 
						|
 | 
						|
#else /* !SFX */
 | 
						|
 | 
						|
    G.noargs = (argc == 1);   /* no options, no zipfile, no anything */
 | 
						|
 | 
						|
#ifdef RISCOS
 | 
						|
    /* get the extensions to swap from environment */
 | 
						|
    getRISCOSexts(ENV_UNZIPEXTS);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef MSDOS
 | 
						|
    /* extract MKS extended argument list from environment (before envargs!) */
 | 
						|
    mksargs(&argc, &argv);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef VMSCLI
 | 
						|
    {
 | 
						|
        ulg status = vms_unzip_cmdline(&argc, &argv);
 | 
						|
        if (!(status & 1))
 | 
						|
            return status;
 | 
						|
    }
 | 
						|
#endif /* VMSCLI */
 | 
						|
 | 
						|
#ifndef NO_ZIPINFO
 | 
						|
    if ((p = strrchr(argv[0], DIR_END)) == (char *)NULL)
 | 
						|
        p = argv[0];
 | 
						|
    else
 | 
						|
        ++p;
 | 
						|
 | 
						|
    if (STRNICMP(p, LoadFarStringSmall(Zipnfo), 7) == 0 ||
 | 
						|
        STRNICMP(p, "ii", 2) == 0 ||
 | 
						|
        (argc > 1 && strncmp(argv[1], "-Z", 2) == 0))
 | 
						|
    {
 | 
						|
        G.zipinfo_mode = TRUE;
 | 
						|
        envargs(__G__ &argc, &argv, LoadFarStringSmall(EnvZipInfo),
 | 
						|
          LoadFarStringSmall2(EnvZipInfo2));
 | 
						|
        error = zi_opts(__G__ &argc, &argv);
 | 
						|
    } else
 | 
						|
#endif /* NO_ZIPINFO */
 | 
						|
    {
 | 
						|
        G.zipinfo_mode = FALSE;
 | 
						|
        envargs(__G__ &argc, &argv, LoadFarStringSmall(EnvUnZip),
 | 
						|
          LoadFarStringSmall2(EnvUnZip2));
 | 
						|
        error = uz_opts(__G__ &argc, &argv);
 | 
						|
    }
 | 
						|
 | 
						|
#endif /* ?SFX */
 | 
						|
 | 
						|
    if ((argc < 0) || error)
 | 
						|
        return error;
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Now get the zipfile name from the command line and then process any re-
 | 
						|
    maining options and file specifications.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef DOS_H68_OS2_W32
 | 
						|
    /* convert MSDOS-style directory separators to Unix-style ones for
 | 
						|
     * user's convenience (include zipfile name itself)
 | 
						|
     */
 | 
						|
    for (G.pfnames = argv, i = argc+1;  i > 0;  --i) {
 | 
						|
        char *q;
 | 
						|
 | 
						|
        for (q = *G.pfnames;  *q;  ++q)
 | 
						|
            if (*q == '\\')
 | 
						|
                *q = '/';
 | 
						|
        ++G.pfnames;
 | 
						|
    }
 | 
						|
#endif /* DOS_H68_OS2_W32 */
 | 
						|
 | 
						|
#ifndef SFX
 | 
						|
    G.wildzipfn = *argv++;
 | 
						|
#endif
 | 
						|
 | 
						|
#if (defined(SFX) && !defined(SFX_EXDIR)) /* only check for -x */
 | 
						|
 | 
						|
    G.filespecs = argc;
 | 
						|
    G.xfilespecs = 0;
 | 
						|
 | 
						|
    if (argc > 0) {
 | 
						|
        char **pp = argv-1;
 | 
						|
 | 
						|
        G.pfnames = argv;
 | 
						|
        while (*++pp)
 | 
						|
            if (strcmp(*pp, "-x") == 0) {
 | 
						|
                if (pp > argv) {
 | 
						|
                    *pp = 0;              /* terminate G.pfnames */
 | 
						|
                    G.filespecs = pp - G.pfnames;
 | 
						|
                } else {
 | 
						|
                    G.pfnames = fnames;  /* defaults */
 | 
						|
                    G.filespecs = 0;
 | 
						|
                }
 | 
						|
                G.pxnames = pp + 1;      /* excluded-names ptr: _after_ -x */
 | 
						|
                G.xfilespecs = argc - G.filespecs - 1;
 | 
						|
                break;                    /* skip rest of args */
 | 
						|
            }
 | 
						|
        G.process_all_files = FALSE;
 | 
						|
    } else
 | 
						|
        G.process_all_files = TRUE;      /* for speed */
 | 
						|
 | 
						|
#else /* !SFX || SFX_EXDIR */             /* check for -x or -d */
 | 
						|
 | 
						|
    G.filespecs = argc;
 | 
						|
    G.xfilespecs = 0;
 | 
						|
 | 
						|
    if (argc > 0) {
 | 
						|
        int in_files=FALSE, in_xfiles=FALSE;
 | 
						|
        char **pp = argv-1;
 | 
						|
 | 
						|
        G.process_all_files = FALSE;
 | 
						|
        G.pfnames = argv;
 | 
						|
        while (*++pp) {
 | 
						|
            Trace((stderr, "pp - argv = %d\n", pp-argv));
 | 
						|
#ifdef CMS_MVS
 | 
						|
            if (!G.dflag && STRNICMP(*pp, "-d", 2) == 0) {
 | 
						|
#else
 | 
						|
            if (!G.dflag && strncmp(*pp, "-d", 2) == 0) {
 | 
						|
#endif
 | 
						|
                char *q = *pp;
 | 
						|
                int firstarg = (pp == argv);
 | 
						|
 | 
						|
                G.dflag = TRUE;
 | 
						|
                if (in_files) {      /* ... zipfile ... -d exdir ... */
 | 
						|
                    *pp = (char *)NULL;         /* terminate G.pfnames */
 | 
						|
                    G.filespecs = pp - G.pfnames;
 | 
						|
                    in_files = FALSE;
 | 
						|
                } else if (in_xfiles) {
 | 
						|
                    *pp = (char *)NULL;         /* terminate G.pxnames */
 | 
						|
                    G.xfilespecs = pp - G.pxnames;
 | 
						|
                    /* "... -x xlist -d exdir":  nothing left */
 | 
						|
                }
 | 
						|
                /* first check for "-dexdir", then for "-d exdir" */
 | 
						|
                if (q[2])
 | 
						|
                    q += 2;
 | 
						|
                else if (*++pp)
 | 
						|
                    q = *pp;
 | 
						|
                else {
 | 
						|
                    Info(slide, 0x401, ((char *)slide,
 | 
						|
                      LoadFarString(MustGiveExdir)));
 | 
						|
                    return(PK_PARAM);  /* don't extract here by accident */
 | 
						|
                }
 | 
						|
                if (G.extract_flag) {
 | 
						|
                    G.create_dirs = !G.fflag;
 | 
						|
                    if ((error = checkdir(__G__ q, ROOT)) > 2) {
 | 
						|
                        return(error);  /* out of memory, or file in way */
 | 
						|
                    }
 | 
						|
                } else
 | 
						|
                    Info(slide, 0x401, ((char *)slide,
 | 
						|
                      LoadFarString(NotExtracting)));
 | 
						|
                if (firstarg)   /* ... zipfile -d exdir ... */
 | 
						|
                    if (pp[1]) {
 | 
						|
                        G.pfnames = pp + 1;  /* argv+2 */
 | 
						|
                        G.filespecs = argc - (G.pfnames-argv);  /* for now... */
 | 
						|
                    } else {
 | 
						|
                        G.process_all_files = TRUE;
 | 
						|
                        G.pfnames = fnames;  /* GRR: necessary? */
 | 
						|
                        G.filespecs = 0;     /* GRR: necessary? */
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
            } else if (!in_xfiles) {
 | 
						|
                if (strcmp(*pp, "-x") == 0) {
 | 
						|
                    in_xfiles = TRUE;
 | 
						|
                    if (pp == G.pfnames) {
 | 
						|
                        G.pfnames = fnames;  /* defaults */
 | 
						|
                        G.filespecs = 0;
 | 
						|
                    } else if (in_files) {
 | 
						|
                        *pp = 0;                   /* terminate G.pfnames */
 | 
						|
                        G.filespecs = pp - G.pfnames;  /* adjust count */
 | 
						|
                        in_files = FALSE;
 | 
						|
                    }
 | 
						|
                    G.pxnames = pp + 1; /* excluded-names ptr starts after -x */
 | 
						|
                    G.xfilespecs = argc - (G.pxnames-argv);  /* anything left */
 | 
						|
                } else
 | 
						|
                    in_files = TRUE;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    } else
 | 
						|
        G.process_all_files = TRUE;      /* for speed */
 | 
						|
 | 
						|
#endif /* ?(SFX && !SFX_EXDIR) */
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Okey dokey, we have everything we need to get started.  Let's roll.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
    retcode = process_zipfiles(__G);
 | 
						|
    return(retcode);
 | 
						|
 | 
						|
} /* end main()/unzip() */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************/
 | 
						|
/* Function uz_opts() */
 | 
						|
/**********************/
 | 
						|
 | 
						|
int uz_opts(__G__ pargc, pargv)
 | 
						|
    int *pargc;
 | 
						|
    char ***pargv;
 | 
						|
    __GDEF
 | 
						|
{
 | 
						|
    char **argv, *s;
 | 
						|
#if (!defined(SFX) || defined(SFX_EXDIR))
 | 
						|
    char *exdir = NULL;   /* initialized to shut up false GCC warning */
 | 
						|
#endif
 | 
						|
    int argc, c, error=FALSE, negative=0;
 | 
						|
 | 
						|
 | 
						|
    argc = *pargc;
 | 
						|
    argv = *pargv;
 | 
						|
 | 
						|
    while (--argc > 0 && (*++argv)[0] == '-') {
 | 
						|
        s = argv[0] + 1;
 | 
						|
        while ((c = *s++) != 0) {    /* "!= 0":  prevent Turbo C warning */
 | 
						|
#ifdef CMS_MVS
 | 
						|
            switch (tolower(c))
 | 
						|
#else
 | 
						|
            switch (c)
 | 
						|
#endif
 | 
						|
            {
 | 
						|
                case ('-'):
 | 
						|
                    ++negative;
 | 
						|
                    break;
 | 
						|
                case ('a'):
 | 
						|
                    if (negative) {
 | 
						|
                        G.aflag = MAX(G.aflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.aflag;
 | 
						|
                    break;
 | 
						|
#if (defined(DLL) && defined(API_DOC))
 | 
						|
                case ('A'):    /* extended help for API */
 | 
						|
                    APIhelp(__G__ argc,argv);
 | 
						|
                    *pargc = -1;  /* signal to exit successfully */
 | 
						|
                    return 0;
 | 
						|
#endif
 | 
						|
                case ('b'):
 | 
						|
                    if (negative) {
 | 
						|
#ifdef VMS
 | 
						|
                        G.bflag = MAX(G.bflag-negative,0);
 | 
						|
#endif
 | 
						|
                        negative = 0;   /* do nothing:  "-b" is default */
 | 
						|
                    } else {
 | 
						|
#ifdef VMS
 | 
						|
                        if (G.aflag == 0)
 | 
						|
                           ++G.bflag;
 | 
						|
#endif
 | 
						|
                        G.aflag = 0;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
#ifdef UNIXBACKUP
 | 
						|
                case ('B'): /* -B: back up existing files */
 | 
						|
                    if (negative)
 | 
						|
                        G.B_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.B_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif
 | 
						|
                case ('c'):
 | 
						|
                    if (negative) {
 | 
						|
                        G.cflag = FALSE, negative = 0;
 | 
						|
#ifdef NATIVE
 | 
						|
                        G.aflag = 0;
 | 
						|
#endif
 | 
						|
                    } else {
 | 
						|
                        G.cflag = TRUE;
 | 
						|
#ifdef NATIVE
 | 
						|
                        G.aflag = 2;  /* so you can read it on the screen */
 | 
						|
#endif
 | 
						|
#ifdef DLL
 | 
						|
                        if (G.redirect_text)
 | 
						|
                            G.redirect_data = 2;
 | 
						|
#endif
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
#ifndef CMS_MVS
 | 
						|
                case ('C'):    /* -C:  match filenames case-insensitively */
 | 
						|
                    if (negative)
 | 
						|
                        G.C_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.C_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* !CMS_MVS */
 | 
						|
#if (!defined(SFX) || defined(SFX_EXDIR))
 | 
						|
                case ('d'):
 | 
						|
                    if (negative) {   /* negative not allowed with -d exdir */
 | 
						|
                        Info(slide, 0x401, ((char *)slide,
 | 
						|
                          LoadFarString(MustGiveExdir)));
 | 
						|
                        return(PK_PARAM);  /* don't extract here by accident */
 | 
						|
                    }
 | 
						|
                    if (G.dflag) {
 | 
						|
                        Info(slide, 0x401, ((char *)slide,
 | 
						|
                          LoadFarString(OnlyOneExdir)));
 | 
						|
                        return(PK_PARAM);    /* GRR:  stupid restriction? */
 | 
						|
                    } else {
 | 
						|
                        G.dflag = TRUE;
 | 
						|
                        /* first check for "-dexdir", then for "-d exdir" */
 | 
						|
                        exdir = s;
 | 
						|
                        if (*exdir == 0) {
 | 
						|
                            if (argc > 1) {
 | 
						|
                                --argc;
 | 
						|
                                exdir = *++argv;
 | 
						|
                                if (*exdir == '-') {
 | 
						|
                                    Info(slide, 0x401, ((char *)slide,
 | 
						|
                                      LoadFarString(MustGiveExdir)));
 | 
						|
                                    return(PK_PARAM);
 | 
						|
                                }
 | 
						|
                                /* else exdir points at extraction dir */
 | 
						|
                            } else {
 | 
						|
                                Info(slide, 0x401, ((char *)slide,
 | 
						|
                                  LoadFarString(MustGiveExdir)));
 | 
						|
                                return(PK_PARAM);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        /* exdir now points at extraction dir (-dexdir or
 | 
						|
                         *  -d exdir); point s at end of exdir to avoid mis-
 | 
						|
                         *  interpretation of exdir characters as more options
 | 
						|
                         */
 | 
						|
                        if (*s != 0)
 | 
						|
                            while (*++s != 0)
 | 
						|
                                ;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
#endif /* !SFX || SFX_EXDIR */
 | 
						|
                case ('e'):    /* just ignore -e, -x options (extract) */
 | 
						|
                    break;
 | 
						|
                case ('f'):    /* "freshen" (extract only newer files) */
 | 
						|
                    if (negative)
 | 
						|
                        G.fflag = G.uflag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.fflag = G.uflag = TRUE;
 | 
						|
                    break;
 | 
						|
                case ('h'):    /* just print help message and quit */
 | 
						|
                    *pargc = -1;
 | 
						|
                    return USAGE(PK_OK);
 | 
						|
                case ('j'):    /* junk pathnames/directory structure */
 | 
						|
                    if (negative)
 | 
						|
                        G.jflag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.jflag = TRUE;
 | 
						|
                    break;
 | 
						|
#ifndef SFX
 | 
						|
                case ('l'):
 | 
						|
                    if (negative) {
 | 
						|
                        G.vflag = MAX(G.vflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.vflag;
 | 
						|
                    break;
 | 
						|
#endif /* !SFX */
 | 
						|
#ifndef CMS_MVS
 | 
						|
                case ('L'):    /* convert (some) filenames to lowercase */
 | 
						|
                    if (negative)
 | 
						|
                        G.L_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.L_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* !CMS_MVS */
 | 
						|
#ifdef MORE
 | 
						|
#ifdef CMS_MVS
 | 
						|
                case ('m'):
 | 
						|
#endif
 | 
						|
                case ('M'):    /* send all screen output through "more" fn. */
 | 
						|
/* GRR:  eventually check for numerical argument => height */
 | 
						|
                    if (negative)
 | 
						|
                        G.M_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.M_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* MORE */
 | 
						|
                case ('n'):    /* don't overwrite any files */
 | 
						|
                    if (negative)
 | 
						|
                        G.overwrite_none = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.overwrite_none = TRUE;
 | 
						|
                    break;
 | 
						|
#ifdef AMIGA
 | 
						|
                case ('N'):    /* restore comments as filenotes */
 | 
						|
                    if (negative)
 | 
						|
                        G.N_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.N_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* AMIGA */
 | 
						|
                case ('o'):    /* OK to overwrite files without prompting */
 | 
						|
                    if (negative) {
 | 
						|
                        G.overwrite_all = MAX(G.overwrite_all-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.overwrite_all;
 | 
						|
                    break;
 | 
						|
                case ('p'):    /* pipes:  extract to stdout, no messages */
 | 
						|
                    if (negative) {
 | 
						|
                        G.cflag = FALSE;
 | 
						|
                        G.qflag = MAX(G.qflag-999,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else {
 | 
						|
                        G.cflag = TRUE;
 | 
						|
                        G.qflag += 999;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
#if CRYPT
 | 
						|
                /* GRR:  yes, this is highly insecure, but dozens of people
 | 
						|
                 * have pestered us for this, so here we go... */
 | 
						|
                case ('P'):
 | 
						|
                    if (negative) {   /* negative not allowed with -P passwd */
 | 
						|
                        Info(slide, 0x401, ((char *)slide,
 | 
						|
                          LoadFarString(MustGivePasswd)));
 | 
						|
                        return(PK_PARAM);  /* don't extract here by accident */
 | 
						|
                    }
 | 
						|
                    if (G.P_flag) {
 | 
						|
/*
 | 
						|
                        GRR:  eventually support multiple passwords?
 | 
						|
                        Info(slide, 0x401, ((char *)slide,
 | 
						|
                          LoadFarString(OnlyOnePasswd)));
 | 
						|
                        return(PK_PARAM);
 | 
						|
 */
 | 
						|
                    } else {
 | 
						|
                        G.P_flag = TRUE;
 | 
						|
                        /* first check for "-dpasswd", then for "-d passwd" */
 | 
						|
                        G.pwdarg = s;
 | 
						|
                        if (*G.pwdarg == 0) {
 | 
						|
                            if (argc > 1) {
 | 
						|
                                --argc;
 | 
						|
                                G.pwdarg = *++argv;
 | 
						|
                                if (*G.pwdarg == '-') {
 | 
						|
                                    Info(slide, 0x401, ((char *)slide,
 | 
						|
                                      LoadFarString(MustGivePasswd)));
 | 
						|
                                    return(PK_PARAM);
 | 
						|
                                }
 | 
						|
                                /* else pwdarg points at decryption password */
 | 
						|
                            } else {
 | 
						|
                                Info(slide, 0x401, ((char *)slide,
 | 
						|
                                  LoadFarString(MustGivePasswd)));
 | 
						|
                                return(PK_PARAM);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        /* pwdarg now points at decryption password (-Ppasswd or
 | 
						|
                         *  -P passwd); point s at end of passwd to avoid mis-
 | 
						|
                         *  interpretation of passwd characters as more options
 | 
						|
                         */
 | 
						|
                        if (*s != 0)
 | 
						|
                            while (*++s != 0)
 | 
						|
                                ;
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
#endif /* CRYPT */
 | 
						|
                case ('q'):    /* quiet:  fewer comments/messages */
 | 
						|
                    if (negative) {
 | 
						|
                        G.qflag = MAX(G.qflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.qflag;
 | 
						|
                    break;
 | 
						|
#ifdef QDOS
 | 
						|
                case ('Q'):   /* QDOS flags */
 | 
						|
                    qlflag ^= strtol(s, &s, 10);
 | 
						|
                    break;    /* we XOR this as we can config qlflags */
 | 
						|
#endif
 | 
						|
#ifdef DOS_OS2_W32
 | 
						|
                case ('s'):    /* spaces in filenames:  allow by default */
 | 
						|
                    if (negative)
 | 
						|
                        G.sflag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.sflag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* DOS_OS2_W32 */
 | 
						|
                case ('t'):
 | 
						|
                    if (negative)
 | 
						|
                        G.tflag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.tflag = TRUE;
 | 
						|
                    break;
 | 
						|
#ifdef TIMESTAMP
 | 
						|
                case ('T'):
 | 
						|
                    if (negative)
 | 
						|
                        G.T_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.T_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif
 | 
						|
                case ('u'):    /* update (extract only new and newer files) */
 | 
						|
                    if (negative)
 | 
						|
                        G.uflag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.uflag = TRUE;
 | 
						|
                    break;
 | 
						|
#ifndef CMS_MVS
 | 
						|
                case ('U'):    /* obsolete; to be removed in version 6.0 */
 | 
						|
                    if (negative)
 | 
						|
                        G.L_flag = TRUE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.L_flag = FALSE;
 | 
						|
                    break;
 | 
						|
#endif /* !CMS_MVS */
 | 
						|
#ifndef SFX
 | 
						|
                case ('v'):    /* verbose */
 | 
						|
                    if (negative) {
 | 
						|
                        G.vflag = MAX(G.vflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else if (G.vflag)
 | 
						|
                        ++G.vflag;
 | 
						|
                    else
 | 
						|
                        G.vflag = 2;
 | 
						|
                    break;
 | 
						|
#endif /* !SFX */
 | 
						|
#ifndef CMS_MVS
 | 
						|
                case ('V'):    /* Version (retain VMS/DEC-20 file versions) */
 | 
						|
                    if (negative)
 | 
						|
                        G.V_flag = FALSE, negative = 0;
 | 
						|
                    else
 | 
						|
                        G.V_flag = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* !CMS_MVS */
 | 
						|
                case ('x'):    /* extract:  default */
 | 
						|
#ifdef SFX
 | 
						|
                    /* when 'x' is the only option in this argument, and the
 | 
						|
                     * next arg is not an option, assume this initiates an
 | 
						|
                     * exclusion list (-x xlist):  terminate option-scanning
 | 
						|
                     * and leave uz_opts with argv still pointing to "-x";
 | 
						|
                     * the xlist is processed later
 | 
						|
                     */
 | 
						|
                    if (s - argv[0] == 2 && *s == 0 &&
 | 
						|
                        argc > 1 && argv[1][0] != '-') {
 | 
						|
                        /* break out of nested loops without "++argv;--argc" */
 | 
						|
                        goto opts_done;
 | 
						|
                    }
 | 
						|
#endif /* SFX */
 | 
						|
                    break;
 | 
						|
#if defined(VMS) || defined(UNIX) || defined(OS2) || defined(WIN32)
 | 
						|
                case ('X'):   /* restore owner/protection info (need privs?) */
 | 
						|
                    if (negative) {
 | 
						|
                        G.X_flag = MAX(G.X_flag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.X_flag;
 | 
						|
                    break;
 | 
						|
#endif /* VMS || UNIX || OS2 || WIN32 */
 | 
						|
                case ('z'):    /* display only the archive comment */
 | 
						|
                    if (negative) {
 | 
						|
                        G.zflag = MAX(G.zflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.zflag;
 | 
						|
                    break;
 | 
						|
#ifndef SFX
 | 
						|
                case ('Z'):    /* should have been first option (ZipInfo) */
 | 
						|
                    Info(slide, 0x401, ((char *)slide, LoadFarString(Zfirst)));
 | 
						|
                    error = TRUE;
 | 
						|
                    break;
 | 
						|
#endif /* !SFX */
 | 
						|
#ifdef DOS_OS2_W32
 | 
						|
                case ('$'):
 | 
						|
                    if (negative) {
 | 
						|
                        G.volflag = MAX(G.volflag-negative,0);
 | 
						|
                        negative = 0;
 | 
						|
                    } else
 | 
						|
                        ++G.volflag;
 | 
						|
                    break;
 | 
						|
#endif /* DOS_OS2_W32 */
 | 
						|
                default:
 | 
						|
                    error = TRUE;
 | 
						|
                    break;
 | 
						|
 | 
						|
            } /* end switch */
 | 
						|
        } /* end while (not end of argument string) */
 | 
						|
    } /* end while (not done with switches) */
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Check for nonsensical combinations of options.
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
opts_done:  /* yes, very ugly...but only used by UnZipSFX with -x xlist */
 | 
						|
#endif
 | 
						|
 | 
						|
    if ((G.cflag && G.tflag) || (G.cflag && G.uflag) ||
 | 
						|
        (G.tflag && G.uflag) || (G.fflag && G.overwrite_none))
 | 
						|
    {
 | 
						|
        Info(slide, 0x401, ((char *)slide, LoadFarString(InvalidOptionsMsg)));
 | 
						|
        error = TRUE;
 | 
						|
    }
 | 
						|
    if (G.aflag > 2)
 | 
						|
        G.aflag = 2;
 | 
						|
#ifdef VMS
 | 
						|
    if (G.bflag > 2)
 | 
						|
        G.bflag = 2;
 | 
						|
#endif
 | 
						|
    if (G.overwrite_all && G.overwrite_none) {
 | 
						|
        Info(slide, 0x401, ((char *)slide, LoadFarString(IgnoreOOptionMsg)));
 | 
						|
        G.overwrite_all = FALSE;
 | 
						|
    }
 | 
						|
#ifdef MORE
 | 
						|
    if (G.M_flag && !isatty(1))  /* stdout redirected: "more" func. useless */
 | 
						|
        G.M_flag = 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
    if (error)
 | 
						|
#else
 | 
						|
    if ((argc-- == 0) || error)
 | 
						|
#endif
 | 
						|
    {
 | 
						|
        *pargc = argc;
 | 
						|
        *pargv = argv;
 | 
						|
#ifndef SFX
 | 
						|
        if (G.vflag >= 2 && argc == -1) {              /* "unzip -v" */
 | 
						|
            if (G.qflag > 3)                           /* "unzip -vqqqq" */
 | 
						|
                Info(slide, 0, ((char *)slide, "%d\n",
 | 
						|
                  (UZ_MAJORVER*100 + UZ_MINORVER*10 + PATCHLEVEL)));
 | 
						|
            else {
 | 
						|
                char *envptr, *getenv();
 | 
						|
                int numopts = 0;
 | 
						|
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(UnzipUsageLine1v),
 | 
						|
                  UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
 | 
						|
                  LoadFarStringSmall(VersionDate)));
 | 
						|
                Info(slide, 0, ((char *)slide,
 | 
						|
                  LoadFarString(UnzipUsageLine2v)));
 | 
						|
                version(__G);
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptions)));
 | 
						|
#ifdef ASM_CRC
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(AsmCRC)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef ASM_INFLATECODES
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(AsmInflateCodes)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef CHECK_VERSIONS
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Check_Versions)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef COPYRIGHT_CLEAN
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Copyright_Clean)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef DEBUG
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(UDebug)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef DEBUG_TIME
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(DebugTime)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef DLL
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Dll)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef DOSWILD
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(DosWild)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef LZW_CLEAN
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(LZW_Clean)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifndef MORE
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(No_More)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef NO_ZIPINFO
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(No_ZipInfo)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef NTSD_EAS
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(NTSDExtAttrib)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef OS2_EAS
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(OS2ExtAttrib)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef REENTRANT
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Reentrant)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef REGARGS
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(RegArgs)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef RETURN_CODES
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Return_Codes)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef TIMESTAMP
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(TimeStamp)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef UNIXBACKUP
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(UnixBackup)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef USE_EF_UT_TIME
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Use_EF_UT_time)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifndef COPYRIGHT_CLEAN
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Use_Smith_Code)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifndef LZW_CLEAN
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Use_Unshrink)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef USE_VFAT
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(Use_VFAT_support)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef USE_ZLIB
 | 
						|
                sprintf((char *)(slide+256), LoadFarStringSmall(UseZlib),
 | 
						|
                  ZLIB_VERSION, zlib_version);
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  (char *)(slide+256)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef VMS_TEXT_CONV
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(VmsTextConv)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef VMSCLI
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(VmsCLI)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#ifdef VMSWILD
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(VmsWild)));
 | 
						|
                ++numopts;
 | 
						|
#endif
 | 
						|
#if CRYPT
 | 
						|
# ifdef PASSWD_FROM_STDIN
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(CompileOptFormat),
 | 
						|
                  LoadFarStringSmall(PasswdStdin)));
 | 
						|
# endif
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(Decryption),
 | 
						|
                  CR_MAJORVER, CR_MINORVER, CR_BETA_VER,
 | 
						|
                  LoadFarStringSmall(CryptDate)));
 | 
						|
                ++numopts;
 | 
						|
#endif /* CRYPT */
 | 
						|
                if (numopts == 0)
 | 
						|
                    Info(slide, 0, ((char *)slide,
 | 
						|
                      LoadFarString(CompileOptFormat),
 | 
						|
                      LoadFarStringSmall(None)));
 | 
						|
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptions)));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvUnZip));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvUnZip),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvUnZip2));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvUnZip2),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvZipInfo));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvZipInfo),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvZipInfo2));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvZipInfo2),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
#ifndef __RSXNT__
 | 
						|
#ifdef __EMX__
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvEMX));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvEMX),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvEMXOPT));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvEMXOPT),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
#endif /* __EMX__ */
 | 
						|
#ifdef __GO32__
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvGO32));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvGO32),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvGO32TMP));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvGO32TMP),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
#endif /* __GO32__ */
 | 
						|
#endif /* !__RSXNT__ */
 | 
						|
#ifdef RISCOS
 | 
						|
                envptr = getenv(LoadFarStringSmall(EnvUnZipExts));
 | 
						|
                Info(slide, 0, ((char *)slide, LoadFarString(EnvOptFormat),
 | 
						|
                  LoadFarStringSmall(EnvUnZipExts),
 | 
						|
                  (envptr == (char *)NULL || *envptr == 0)?
 | 
						|
                  LoadFarStringSmall2(None) : envptr));
 | 
						|
#endif /* RISCOS */
 | 
						|
            }
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
        if (!G.noargs && !error)
 | 
						|
            error = PK_PARAM;   /* had options (not -h or -v) but no zipfile */
 | 
						|
#endif /* !SFX */
 | 
						|
        return USAGE(error);
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
    /* print our banner unless we're being fairly quiet */
 | 
						|
    if (G.qflag < 2)
 | 
						|
        Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner),
 | 
						|
          UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
 | 
						|
          LoadFarStringSmall(VersionDate)));
 | 
						|
#ifdef BETA
 | 
						|
    /* always print the beta warning:  no unauthorized distribution!! */
 | 
						|
    Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n",
 | 
						|
      "SFX"));
 | 
						|
#endif
 | 
						|
#endif /* SFX */
 | 
						|
 | 
						|
    if (G.cflag || G.tflag || G.vflag || G.zflag
 | 
						|
#ifdef TIMESTAMP
 | 
						|
                                                 || G.T_flag
 | 
						|
#endif
 | 
						|
                                                            )
 | 
						|
        G.extract_flag = FALSE;
 | 
						|
    else
 | 
						|
        G.extract_flag = TRUE;
 | 
						|
 | 
						|
#if (!defined(SFX) || defined(SFX_EXDIR))
 | 
						|
    if (G.dflag) {
 | 
						|
        if (G.extract_flag) {
 | 
						|
            G.create_dirs = !G.fflag;
 | 
						|
            if ((error = checkdir(__G__ exdir, ROOT)) > 2)
 | 
						|
                return error;   /* out of memory, or file in way */
 | 
						|
        } else /* -d ignored */
 | 
						|
            Info(slide, 0x401, ((char *)slide, LoadFarString(NotExtracting)));
 | 
						|
    }
 | 
						|
#endif /* !SFX || SFX_EXDIR */
 | 
						|
 | 
						|
    *pargc = argc;
 | 
						|
    *pargv = argv;
 | 
						|
    return 0;
 | 
						|
 | 
						|
} /* end function uz_opts() */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/********************/
 | 
						|
/* Function usage() */
 | 
						|
/********************/
 | 
						|
 | 
						|
#ifdef SFX
 | 
						|
#  ifdef VMS
 | 
						|
#    define LOCAL "X.  Quote uppercase options"
 | 
						|
#  endif
 | 
						|
#  ifdef UNIX
 | 
						|
#    define LOCAL "X"
 | 
						|
#  endif
 | 
						|
#  ifdef DOS_OS2_W32
 | 
						|
#    define LOCAL "s$"
 | 
						|
#  endif
 | 
						|
#  ifdef AMIGA
 | 
						|
#    define LOCAL "N"
 | 
						|
#  endif
 | 
						|
   /* Default for all other systems: */
 | 
						|
#  ifndef LOCAL
 | 
						|
#    define LOCAL ""
 | 
						|
#  endif
 | 
						|
 | 
						|
#  ifdef MORE
 | 
						|
#    define SFXOPT1 "M"
 | 
						|
#  else
 | 
						|
#    define SFXOPT1 ""
 | 
						|
#  endif
 | 
						|
 | 
						|
int usage(__G__ error)   /* return PK-type error code */
 | 
						|
    int error;
 | 
						|
     __GDEF
 | 
						|
{
 | 
						|
    Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXBanner),
 | 
						|
      UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
 | 
						|
      LoadFarStringSmall(VersionDate)));
 | 
						|
    Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(UnzipSFXOpts),
 | 
						|
      SFXOPT1, LOCAL));
 | 
						|
#ifdef BETA
 | 
						|
    Info(slide, error? 1 : 0, ((char *)slide, LoadFarString(BetaVersion), "\n",
 | 
						|
      "SFX"));
 | 
						|
#endif
 | 
						|
 | 
						|
    if (error)
 | 
						|
        return PK_PARAM;
 | 
						|
    else
 | 
						|
        return PK_COOL;     /* just wanted usage screen: no error */
 | 
						|
 | 
						|
} /* end function usage() */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#else /* !SFX */
 | 
						|
#  ifdef VMS
 | 
						|
#    define QUOT '\"'
 | 
						|
#    define QUOTS "\""
 | 
						|
#  else
 | 
						|
#    define QUOT ' '
 | 
						|
#    define QUOTS ""
 | 
						|
#  endif
 | 
						|
 | 
						|
int usage(__G__ error)   /* return PK-type error code */
 | 
						|
    int error;
 | 
						|
    __GDEF
 | 
						|
{
 | 
						|
    int flag = (error? 1 : 0);
 | 
						|
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------
 | 
						|
    Print either ZipInfo usage or UnZip usage, depending on incantation.
 | 
						|
    (Strings must be no longer than 512 bytes for Turbo C, apparently.)
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
    if (G.zipinfo_mode) {
 | 
						|
 | 
						|
#ifndef NO_ZIPINFO
 | 
						|
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine1),
 | 
						|
          ZI_MAJORVER, ZI_MINORVER, PATCHLEVEL, BETALEVEL,
 | 
						|
          LoadFarStringSmall(VersionDate),
 | 
						|
          LoadFarStringSmall2(ZipInfoExample), QUOTS,QUOTS));
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine2)));
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(ZipInfoUsageLine3),
 | 
						|
          QUOT,QUOT, QUOT,QUOT, LoadFarStringSmall(ZipInfoUsageLine4)));
 | 
						|
#ifdef VMS
 | 
						|
        Info(slide, flag, ((char *)slide, "\nRemember that non-lowercase\
 | 
						|
 filespecs must be quoted in VMS (e.g., \"Makefile\").\n"));
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* !NO_ZIPINFO */
 | 
						|
 | 
						|
    } else {   /* UnZip mode */
 | 
						|
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine1),
 | 
						|
          UZ_MAJORVER, UZ_MINORVER, PATCHLEVEL, BETALEVEL,
 | 
						|
          LoadFarStringSmall(VersionDate)));
 | 
						|
#ifdef BETA
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(BetaVersion), "", ""));
 | 
						|
#endif
 | 
						|
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine2),
 | 
						|
          ZIPINFO_MODE_OPTION, LoadFarStringSmall(ZipInfoMode)));
 | 
						|
#ifdef VMS
 | 
						|
        if (!error)  /* maybe no command-line tail found; show extra help */
 | 
						|
            Info(slide, flag, ((char *)slide, LoadFarString(VMSusageLine2b)));
 | 
						|
#endif
 | 
						|
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine3),
 | 
						|
          LoadFarStringSmall(local1)));
 | 
						|
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine4),
 | 
						|
          QUOT,QUOT, QUOT,QUOT, LoadFarStringSmall(local2), QUOT,QUOT,
 | 
						|
          LoadFarStringSmall2(local3)));
 | 
						|
 | 
						|
        /* This is extra work for SMALL_MEM, but it will work since
 | 
						|
         * LoadFarStringSmall2 uses the same buffer.  Remember, this
 | 
						|
         * is a hack. */
 | 
						|
        Info(slide, flag, ((char *)slide, LoadFarString(UnzipUsageLine5),
 | 
						|
          LoadFarStringSmall(Example2), LoadFarStringSmall2(Example3),
 | 
						|
          LoadFarStringSmall2(Example3)));
 | 
						|
 | 
						|
    } /* end if (G.zipinfo_mode) */
 | 
						|
 | 
						|
    if (error)
 | 
						|
        return PK_PARAM;
 | 
						|
    else
 | 
						|
        return PK_COOL;     /* just wanted usage screen: no error */
 | 
						|
 | 
						|
} /* end function usage() */
 | 
						|
 | 
						|
#endif /* ?SFX */
 | 
						|
#endif /* !WINDLL */
 |