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 */
 |