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