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