1/*
2  Copyright (c) 1990-2008 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    MS-DOS specific configuration section:
11  ---------------------------------------------------------------------------*/
12
13#ifndef __doscfg_h
14#define __doscfg_h
15
16#include <dos.h>           /* for REGS macro (TC) or _dos_setftime (MSC) */
17
18#ifdef __TURBOC__          /* includes Power C */
19#  include <sys/timeb.h>   /* for structure ftime */
20#  ifndef __BORLANDC__     /* there appears to be a bug (?) in Borland's */
21#    include <mem.h>       /*  MEM.H related to __STDC__ and far poin-   */
22#  endif                   /*  ters. (dpk)  [mem.h included for memcpy]  */
23#endif
24
25#ifdef WINDLL
26#  if (defined(MSC) || defined(__WATCOMC__))
27#    include <sys/utime.h>
28#  else /* !(MSC || __WATCOMC__) ==> may be BORLANDC, or GNU environment */
29#    include <utime.h>
30#  endif /* ?(MSC || __WATCOMC__) */
31#endif
32
33#ifdef __WATCOMC__
34#  define DOS_STAT_BANDAID
35
36#  ifdef __386__
37#    ifndef WATCOMC_386
38#      define WATCOMC_386
39#    endif
40#    define __32BIT__
41#    undef far
42#    define far
43#    undef near
44#    define near
45
46/* Get asm routines to link properly without using "__cdecl": */
47#    ifndef USE_ZLIB
48#      pragma aux crc32         "_*" parm caller [] value [eax] modify [eax]
49#      pragma aux get_crc_table "_*" parm caller [] value [eax] \
50                                      modify [eax ecx edx]
51#    endif /* !USE_ZLIB */
52#  else /* !__386__ */
53#    ifndef USE_ZLIB
54#      pragma aux crc32         "_*" parm caller [] value [ax dx] \
55                                      modify [ax cx dx bx]
56#      pragma aux get_crc_table "_*" parm caller [] value [ax] \
57                                      modify [ax cx dx bx]
58#    endif /* !USE_ZLIB */
59#  endif /* ?__386__ */
60#endif /* __WATCOMC__ */
61
62#ifdef __EMX__
63#  ifndef __32BIT__
64#    define __32BIT__
65#  endif
66#  define far
67#  ifndef HAVE_MKTIME
68#    define HAVE_MKTIME
69#  endif
70#endif
71
72#if defined(__GO32__) || defined(__DJGPP__)    /* MS-DOS compiler, not OS/2 */
73#  ifndef __32BIT__
74#    define __32BIT__
75#  endif
76#  ifndef __GO32__
77#    define __GO32__
78#  endif
79#  ifndef HAVE_MKTIME
80#    define HAVE_MKTIME
81#  endif
82#  include <sys/timeb.h>           /* for structure ftime and ftime() */
83#  if (defined(__DJGPP__) && (__DJGPP__ > 1))
84#    include <unistd.h>            /* for prototypes for read/write etc. */
85#    include <dir.h>               /* for FA_LABEL */
86#    if ((__DJGPP__ == 2) && (__DJGPP_MINOR__ == 0))
87#      include <libc/dosio.h>      /* for _USE_LFN, djgpp 2.0 only */
88#    endif
89#    define USE_LFN _USE_LFN       /* runtime test:  support long filenames? */
90#  else
91     int setmode(int, int);        /* not in older djgpp's include files */
92#  endif
93#endif
94
95#ifndef __32BIT__
96#  define __16BIT__
97#endif
98
99#if (defined(M_I86CM) || defined(M_I86LM)) || defined(WINDLL)
100#  define MED_MEM
101#endif
102#if (defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__))
103#  define MED_MEM
104#endif
105#ifdef __16BIT__
106#  ifndef MED_MEM
107#    define SMALL_MEM
108#  endif
109#endif
110
111#define EXE_EXTENSION ".exe"  /* OS/2 has GetLoadPath() function instead */
112
113#ifdef __16BIT__
114#  if defined(MSC) || defined(__WATCOMC__)
115#    include <malloc.h>
116#    define nearmalloc _nmalloc
117#    define nearfree _nfree
118#  endif
119#  if defined(__TURBOC__) && defined(DYNALLOC_CRCTAB)
120#    if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
121#      undef DYNALLOC_CRCTAB
122#    endif
123#  endif
124#  ifndef nearmalloc
125#    define nearmalloc malloc
126#    define nearfree free
127#  endif
128#  if defined(DEBUG) && defined(MSC) && (!defined(_MSC_VER) || _MSC_VER < 600)
129     /* for MSC 5.1, prevent macro expansion space overflow in DEBUG mode */
130#    define NO_DEBUG_IN_MACROS
131#  endif
132#  ifdef USE_DEFLATE64
133#    if (defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM))
134#      error Deflate64(tm) requires compact or large memory model
135#    endif
136#    if (defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__))
137#      error Deflate64(tm) requires compact or large memory model
138#    endif
139     /* the 64k history buffer for Deflate64 must be allocated specially */
140#    define MALLOC_WORK
141#    define MY_ZCALLOC
142#  endif
143#endif
144
145/* 32-bit MSDOS supports the 32-bit optimized CRC-32 C code */
146#ifdef IZ_CRC_BE_OPTIMIZ
147# undef IZ_CRC_BE_OPTIMIZ
148#endif
149#ifdef __32BIT__
150# if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ)
151#  define IZ_CRC_LE_OPTIMIZ
152# endif
153#else /* __16BIT__ does not support optimized C crc32 code */
154# ifdef IZ_CRC_LE_OPTIMIZ
155#  undef IZ_CRC_LE_OPTIMIZ
156# endif
157#endif
158
159/* another stat()/fopen() bug with some 16-bit compilers on Novell drives;
160 * very dangerous (silently overwrites executables in other directories)
161 */
162#define NOVELL_BUG_WORKAROUND
163
164/* enables additional test and message code that directs UnZip to fail safely
165 * in case the "workaround" enabled above does not work as intended
166 */
167#define NOVELL_BUG_FAILSAFE
168
169/* Some implementations of stat() tend to fail on "." in root directories
170 * or on remote (root) directories specified by an UNC network path. This
171 * patch of stat() is useful for at least the WATCOM compilers. The
172 * stat_bandaid() wrapper detects stat failures on root directories and
173 * fills in suitable values.
174 */
175#ifdef DOS_STAT_BANDAID
176#  ifdef SSTAT
177#    undef SSTAT
178#  endif
179#  ifdef WILD_STAT_BUG
180#    define SSTAT(path,pbuf) (iswild(path) || stat_bandaid(path,pbuf))
181#  else
182#    define SSTAT stat_bandaid
183#  endif
184   int stat_bandaid(const char *path, struct stat *buf);
185#endif
186
187/* the TIMESTAMP feature is now supported on MSDOS, enable it per default */
188#if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
189#  define TIMESTAMP
190#endif
191
192/* check that TZ environment variable is defined before using UTC times */
193#if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ))
194#  define IZ_CHECK_TZ
195#endif
196
197/* The optional "long filename" support available with some MSDOS compiler
198 * environments running under VFAT systems (Win95) is controlled with the
199 * help of the two preprocessor symbols USE_VFAT and USE_LFN:
200 *  - USE_VFAT is a compile time switch that selects the long filename
201 *             semantics in mapname()
202 *  - USE_LFN  is a macro equating to a boolean expression indicating
203 *             whether long filenames are supported. If available, this
204 *             macro should make use of a runtime function checking the
205 *             LFN support.
206 *
207 * The code in msdos.c distinguishes three cases:
208 * 1.) USE_VFAT is not defined:
209 *     No support of LFN is included; filenames are mapped to 8+3 plain FAT
210 *     syntax unconditionally.
211 *     This is achieved by ``#define MAYBE_PLAIN_FAT'' to include the plain
212 *     FAT name mapping code and by ``#undef USE_LFN'' to disable bypassing
213 *     of the FAT mapping at runtime.
214 * 2.) USE_VFAT is defined:
215 *     Support for LFN is enabled.
216 *  a) USE_LFN is undefined:
217 *     There is no (runtime) check available to distinguish between OS
218 *     environments that support VFAT extensions and those that do not.
219 *     In this case, filenames are mapped to the more liberal VFAT LFN
220 *     syntax unconditionally. The internal switch MAYBE_PLAIN_FAT remains
221 *     undefined to exclude to "map to plain FAT" code parts.
222 *  b) USE_LFN is defined (hopefully to a boolean runtime LFN check function):
223 *     "#define MAYBE_PLAIN_FAT" is applied to include the plain FAT mapping
224 *     code; the programs checks at runtime whether the OS supports LFN and
225 *     uses the appropiate mapping syntax.
226 */
227/* Some environments, like DJGPP v2, can support long filenames on VFAT
228 * systems and DOS 8.3 filenames on FAT systems in the same executable.  If
229 * such support is available, USE_LFN should be defined to an expression
230 * that will return non-zero when long filenames API should be used, zero
231 * otherwise.
232 */
233#ifndef USE_VFAT
234#  ifdef USE_LFN
235#    undef USE_LFN
236#  endif
237#  ifndef MAYBE_PLAIN_FAT
238#    define MAYBE_PLAIN_FAT
239#  endif
240#else
241#  ifdef USE_LFN
242#    define MAYBE_PLAIN_FAT
243#  endif
244#endif
245
246#ifdef ACORN_FTYPE_NFS
247#  undef ACORN_FTYPE_NFS        /* no commas allowed in short filenames */
248#endif
249
250/* handlers for OEM <--> ANSI string conversions */
251#ifdef WINDLL
252#  if 1
253     /* C RTL's file system support assumes OEM-coded strings */
254#    ifdef CRTL_CP_IS_ISO
255#      undef CRTL_CP_IS_ISO
256#    endif
257#    ifndef CRTL_CP_IS_OEM
258#      define CRTL_CP_IS_OEM
259#    endif
260#  else
261     /* C RTL's file system support assumes ISO-coded strings */
262#    ifndef CRTL_CP_IS_ISO
263#      define CRTL_CP_IS_ISO
264#    endif
265#    ifdef CRTL_CP_IS_OEM
266#      undef CRTL_CP_IS_OEM
267#    endif
268#  endif /* ?(code page of 16bit Windows compilers) */
269   /* include Win API declarations only in sources where conversion is
270    * actually used (skip __EXTRACT_C, extract.c includes windll.h instead)
271    */
272#  if defined(__ENVARGS_C) || defined(__UNZIP_C) || defined(ZCRYPT_INTERNAL)
273#    include <windows.h>
274#  endif
275   /* use conversion functions of Windows API */
276#  ifdef CRTL_CP_IS_ISO
277#   define ISO_TO_INTERN(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
278#   define OEM_TO_INTERN(src, dst)  OemToAnsi(src, dst)
279#   define INTERN_TO_ISO(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
280#   define INTERN_TO_OEM(src, dst)  AnsiToOem(src, dst)
281#  endif
282#  ifdef CRTL_CP_IS_OEM
283#   define ISO_TO_INTERN(src, dst)  AnsiToOem(src, dst)
284#   define OEM_TO_INTERN(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
285#   define INTERN_TO_ISO(src, dst)  OemToAnsi(src, dst)
286#   define INTERN_TO_OEM(src, dst)  {if ((src) != (dst)) strcpy((dst), (src));}
287#  endif
288#  define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1)
289#  define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1)
290   /* UzpPassword supplies ANSI-coded string regardless of C RTL's native CP */
291#  define STR_TO_CP2(dst, src)  (AnsiToOem(src, dst), dst)
292   /* dummy defines to disable these functions, they are not needed */
293#  define STR_TO_ISO
294#  define STR_TO_OEM
295#else
296   /* use home-brewed conversion functions; internal charset is OEM */
297#  ifdef CRTL_CP_IS_ISO
298#    undef CRTL_CP_IS_ISO
299#  endif
300#  ifndef CRTL_CP_IS_OEM
301#    define CRTL_CP_IS_OEM
302#  endif
303#endif
304#ifndef NEED_ISO_OEM_INIT
305#  define NEED_ISO_OEM_INIT
306#endif
307
308/* SCREENLINES macros for 16-bit and djgpp compilers */
309#ifdef __16BIT__
310#  define SCREENLINES (int)(*((unsigned char far*)0x00400084L) + 1)
311#  define SCREENWIDTH (int)(*(unsigned short far*)0x0040004AL)
312#endif
313
314#if defined(__GO32__) || defined(__DJGPP__)    /* djgpp v1.x and v2.x */
315#  include <pc.h>
316#  define SCREENLINES ScreenRows()
317#  define SCREENWIDTH ScreenCols()
318#endif
319
320#ifdef __EMX__
321#  define SCREENWIDTH 80
322#  define SCREENSIZE(scrrows, scrcols)  screensize(scrrows, scrcols)
323   int screensize(int *tt_rows, int *tt_cols);
324#endif
325
326#ifdef WATCOMC_386
327#  define SCREENWIDTH 80
328#  define SCREENSIZE(scrrows, scrcols)  screensize(scrrows, scrcols)
329   int screensize(int *tt_rows, int *tt_cols);
330#endif
331
332#ifndef SCREENSIZE
333#  define SCREENSIZE(scrrows, scrcols) { \
334        if ((scrrows) != NULL) *(scrrows) = SCREENLINES; \
335        if ((scrcols) != NULL) *(scrcols) = SCREENWIDTH; }
336#endif
337
338/* on the DOS console screen, line-wraps are always enabled */
339#define SCREENLWRAP 1
340#define TABSIZE 8
341
342#endif /* !__doscfg_h */
343