617 lines
18 KiB
C
617 lines
18 KiB
C
/*
|
|
win32/osdep.h
|
|
|
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
|
|
|
See the accompanying file LICENSE, version 2007-Mar-4 or later
|
|
(the contents of which are also included in zip.h) for terms of use.
|
|
If, for some reason, all these files are missing, the Info-ZIP license
|
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
|
*/
|
|
|
|
/* Automatic setting of the common Microsoft C idenfifier MSC.
|
|
* NOTE: Watcom also defines M_I*86 !
|
|
*/
|
|
#if defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__))
|
|
# ifndef MSC
|
|
# define MSC /* This should work for older MSC, too! */
|
|
# endif
|
|
#endif
|
|
|
|
/* Tell Microsoft Visual C++ 2005 to leave us alone and
|
|
* let us use standard C functions the way we're supposed to.
|
|
*/
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
|
# ifndef _CRT_SECURE_NO_DEPRECATE
|
|
# define _CRT_SECURE_NO_DEPRECATE
|
|
# endif
|
|
# ifndef _CRT_NONSTDC_NO_DEPRECATE
|
|
# define _CRT_NONSTDC_NO_DEPRECATE
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(__WATCOMC__) && defined(__386__)
|
|
# define WATCOMC_386
|
|
#endif
|
|
|
|
#if (defined(__CYGWIN32__) && !defined(__CYGWIN__))
|
|
# define __CYGWIN__ /* compatibility for CygWin B19 and older */
|
|
#endif
|
|
|
|
/* enable multibyte character set support by default */
|
|
#ifndef _MBCS
|
|
# define _MBCS
|
|
#endif
|
|
#if defined(__CYGWIN__)
|
|
# undef _MBCS
|
|
#endif
|
|
|
|
/* Get types and stat */
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <io.h>
|
|
|
|
#ifndef MSDOS
|
|
/*
|
|
* Windows 95 (and Windows NT) file systems are (to some extend)
|
|
* extensions of MSDOS. Common features include for example:
|
|
* FAT or (FAT like) file systems,
|
|
* '\\' as directory separator in paths,
|
|
* "\r\n" as record (line) terminator in text files, ...
|
|
*/
|
|
# define MSDOS
|
|
/* inherit MS-DOS file system etc. stuff */
|
|
#endif
|
|
|
|
#define USE_CASE_MAP
|
|
#define PROCNAME(n) (action == ADD || action == UPDATE ? wild(n) : \
|
|
procname(n, filter_match_case))
|
|
#define BROKEN_FSEEK
|
|
#ifndef __RSXNT__
|
|
# define HAVE_FSEEKABLE
|
|
#endif
|
|
|
|
|
|
/* popen
|
|
*
|
|
* On Win32 must map to _popen() and _pclose()
|
|
*/
|
|
#define popen _popen
|
|
#define pclose _pclose
|
|
|
|
/* WIN32_OEM
|
|
*
|
|
* This enables storing paths in archives on WIN32 in OEM format
|
|
* which is more work but seems the standard now. It also enables
|
|
* converting paths in read DOS archives from assumed OEM to ANSI.
|
|
*/
|
|
#ifndef NO_WIN32_OEM
|
|
# define WIN32_OEM
|
|
#endif
|
|
|
|
/* Large File Support
|
|
*
|
|
* If this is set it is assumed that the port
|
|
* supports 64-bit file calls. The types are
|
|
* defined here. Any local implementations are
|
|
* in Win32.c and the prototypes for the calls are
|
|
* in tailor.h. Note that a port must support
|
|
* these calls fully or should not set
|
|
* LARGE_FILE_SUPPORT.
|
|
*/
|
|
|
|
/* Note also that ZOFF_T_FORMAT_SIZE_PREFIX has to be defined here
|
|
or tailor.h will define defaults */
|
|
|
|
/* If port has LARGE_FILE_SUPPORT then define here
|
|
to make large file support automatic unless overridden */
|
|
|
|
|
|
#ifndef LARGE_FILE_SUPPORT
|
|
# ifndef NO_LARGE_FILE_SUPPORT
|
|
/* MS C and VC */
|
|
# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__)
|
|
# define LARGE_FILE_SUPPORT
|
|
# endif
|
|
# if defined(__WATCOMC__)
|
|
# define LARGE_FILE_SUPPORT
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef LARGE_FILE_SUPPORT
|
|
/* 64-bit Large File Support */
|
|
|
|
/* Only types and the printf format stuff go here. Functions
|
|
go in tailor.h since ANSI prototypes are required and the OF define
|
|
is not defined here. */
|
|
|
|
# if (defined(_MSC_VER) && (_MSC_VER >= 1100)) || defined(__MINGW32__)
|
|
/* MS C and VC, MinGW32 */
|
|
/* these compiler systems use the Microsoft C RTL */
|
|
|
|
/* base types for file offsets and file sizes */
|
|
typedef __int64 zoff_t;
|
|
typedef unsigned __int64 uzoff_t;
|
|
|
|
/* 64-bit stat struct */
|
|
typedef struct _stati64 z_stat;
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "I64"
|
|
|
|
# elif (defined(__GNUC__) || defined(ULONG_LONG_MAX))
|
|
/* GNU C */
|
|
|
|
/* base types for file offsets and file sizes */
|
|
typedef long long zoff_t;
|
|
typedef unsigned long long uzoff_t;
|
|
|
|
# ifdef __CYGWIN__
|
|
/* Use Cygwin's own stat struct */
|
|
typedef struct stat z_stat;
|
|
# else
|
|
/* 64-bit stat struct */
|
|
typedef struct _stati64 z_stat;
|
|
# endif
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "ll"
|
|
|
|
# elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100))
|
|
/* WATCOM C */
|
|
|
|
/* base types for file offsets and file sizes */
|
|
typedef __int64 zoff_t;
|
|
typedef unsigned __int64 uzoff_t;
|
|
|
|
/* 64-bit stat struct */
|
|
typedef struct _stati64 z_stat;
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "ll"
|
|
|
|
# elif (defined(__IBMC__) && (__IBMC__ >= 350))
|
|
/* IBM C */
|
|
|
|
/* base types for file offsets and file sizes */
|
|
typedef __int64 zoff_t;
|
|
typedef unsigned __int64 uzoff_t;
|
|
|
|
/* 64-bit stat struct */
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "I64"
|
|
|
|
# else
|
|
# undef LARGE_FILE_SUPPORT
|
|
# endif
|
|
|
|
#endif
|
|
|
|
#if 0
|
|
# ifndef ZOFF_T_FORMAT_SIZE_PREFIX
|
|
/* unsupported WIN32 */
|
|
|
|
/* base types for file offsets and file sizes */
|
|
typedef long long zoff_t;
|
|
typedef unsigned long long uzoff_t;
|
|
|
|
/* 64-bit stat struct */
|
|
typedef struct stat z_stat;
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "ll"
|
|
# endif
|
|
#endif
|
|
|
|
|
|
/* Automatically set ZIP64_SUPPORT if supported */
|
|
|
|
/* MS C and VC */
|
|
#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__WATCOMC__)
|
|
# ifdef LARGE_FILE_SUPPORT
|
|
# ifndef NO_ZIP64_SUPPORT
|
|
# ifndef ZIP64_SUPPORT
|
|
# define ZIP64_SUPPORT
|
|
# endif
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
|
|
#ifndef LARGE_FILE_SUPPORT
|
|
/* No Large File Support */
|
|
|
|
/* base type for file offsets and file sizes */
|
|
typedef long zoff_t;
|
|
typedef unsigned long uzoff_t;
|
|
|
|
/* stat struct */
|
|
typedef struct stat z_stat;
|
|
|
|
/* printf format size prefix for zoff_t values */
|
|
# define ZOFF_T_FORMAT_SIZE_PREFIX "l"
|
|
#endif
|
|
|
|
|
|
/* UNICODE */
|
|
#ifdef WIN32
|
|
/* assume wide character conversion functions */
|
|
# ifndef UNICODE_SUPPORT
|
|
# ifndef NO_UNICODE_SUPPORT
|
|
# define UNICODE_SUPPORT
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
#if 0
|
|
/* this is now generic */
|
|
# ifdef UNICODE_SUPPORT
|
|
/* Set up Unicode support - 9/27/05 EG */
|
|
|
|
/* type of wide string characters */
|
|
# define zchar wchar_t
|
|
|
|
/* default char string used if a wide char can't be converted */
|
|
# define zchar_default "_"
|
|
|
|
# else
|
|
# define zchar char
|
|
# endif
|
|
#endif
|
|
|
|
|
|
/* File operations--use "b" for binary if allowed or fixed length 512 on VMS
|
|
* use "S" for sequential access on NT to prevent the NT
|
|
* file cache eating up memory with large .zip files
|
|
*/
|
|
#define FOPR "rb"
|
|
#define FOPM "r+b"
|
|
#define FOPW "wbS"
|
|
|
|
#if (defined(__CYGWIN__) && !defined(NO_MKTIME))
|
|
# define NO_MKTIME /* Cygnus' mktime() implementation is buggy */
|
|
#endif
|
|
#if (!defined(NT_TZBUG_WORKAROUND) && !defined(NO_NT_TZBUG_WORKAROUND))
|
|
# define NT_TZBUG_WORKAROUND
|
|
#endif
|
|
#if (defined(UTIL) && defined(NT_TZBUG_WORKAROUND))
|
|
# undef NT_TZBUG_WORKAROUND /* the Zip utilities do not use time-stamps */
|
|
#endif
|
|
#if !defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)
|
|
# define USE_EF_UT_TIME
|
|
#endif
|
|
#if (!defined(NO_NTSD_EAS) && !defined(NTSD_EAS))
|
|
# define NTSD_EAS
|
|
#endif
|
|
|
|
#if (defined(NTSD_EAS) && !defined(ZP_NEED_MEMCOMPR))
|
|
# define ZP_NEED_MEMCOMPR
|
|
#endif
|
|
|
|
#ifdef WINDLL
|
|
# ifndef NO_ASM
|
|
# define NO_ASM
|
|
# endif
|
|
# ifndef MSWIN
|
|
# define MSWIN
|
|
# endif
|
|
# ifndef REENTRANT
|
|
# define REENTRANT
|
|
# endif
|
|
#endif /* WINDLL */
|
|
|
|
/* Enable use of optimized x86 assembler version of longest_match() for
|
|
MSDOS, WIN32 and OS2 per default. */
|
|
#if !defined(NO_ASM) && !defined(ASMV)
|
|
# define ASMV
|
|
#endif
|
|
|
|
/* Enable use of optimized x86 assembler version of crc32() for
|
|
MSDOS, WIN32 and OS2 per default. */
|
|
#if !defined(NO_ASM) && !defined(ASM_CRC) && !defined(NO_ASM_CRC)
|
|
# define ASM_CRC
|
|
#endif
|
|
|
|
#if !defined(__GO32__) && !defined(__EMX__) && !defined(__CYGWIN__)
|
|
# define NO_UNISTD_H
|
|
#endif
|
|
|
|
/* Microsoft C requires additional attributes attached to all RTL function
|
|
* declarations when linking against the CRTL dll.
|
|
*/
|
|
#ifdef MSC
|
|
# ifdef IZ_IMP
|
|
# undef IZ_IMP
|
|
# endif
|
|
# define IZ_IMP _CRTIMP
|
|
#else
|
|
# ifndef IZ_IMP
|
|
# define IZ_IMP
|
|
# endif
|
|
#endif
|
|
|
|
/* WIN32 runs solely on little-endian processors; enable support
|
|
* for the 32-bit optimized CRC-32 C code by default.
|
|
*/
|
|
#ifdef IZ_CRC_BE_OPTIMIZ
|
|
# undef IZ_CRC_BE_OPTIMIZ
|
|
#endif
|
|
#if !defined(IZ_CRC_LE_OPTIMIZ) && !defined(NO_CRC_OPTIMIZ)
|
|
# define IZ_CRC_LE_OPTIMIZ
|
|
#endif
|
|
|
|
/* the following definitions are considered as "obsolete" by Microsoft and
|
|
* might be missing in some versions of <windows.h>
|
|
*/
|
|
#ifndef AnsiToOem
|
|
# define AnsiToOem CharToOemA
|
|
#endif
|
|
#ifndef OemToAnsi
|
|
# define OemToAnsi OemToCharA
|
|
#endif
|
|
|
|
/* handlers for OEM <--> ANSI string conversions */
|
|
#if defined(__RSXNT__) || defined(WIN32_CRT_OEM)
|
|
/* RSXNT uses OEM coded strings in functions supplied by C RTL */
|
|
# ifdef CRTL_CP_IS_ISO
|
|
# undef CRTL_CP_IS_ISO
|
|
# endif
|
|
# ifndef CRTL_CP_IS_OEM
|
|
# define CRTL_CP_IS_OEM
|
|
# endif
|
|
#else
|
|
/* "real" native WIN32 compilers use ANSI coded strings in C RTL calls */
|
|
# ifndef CRTL_CP_IS_ISO
|
|
# define CRTL_CP_IS_ISO
|
|
# endif
|
|
# ifdef CRTL_CP_IS_OEM
|
|
# undef CRTL_CP_IS_OEM
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CRTL_CP_IS_ISO
|
|
/* C RTL's file system support assumes ANSI coded strings */
|
|
# define ISO_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));}
|
|
# define OEM_TO_INTERN(src, dst) OemToAnsi(src, dst)
|
|
# define INTERN_TO_ISO(src, dst) {if ((src) != (dst)) strcpy((dst), (src));}
|
|
# define INTERN_TO_OEM(src, dst) AnsiToOem(src, dst)
|
|
# define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1)
|
|
# define _ISO_INTERN(str1) {;}
|
|
# define _INTERN_OEM(str1) INTERN_TO_OEM(str1, str1)
|
|
# define _INTERN_ISO(str1) {;}
|
|
#endif /* CRTL_CP_IS_ISO */
|
|
#ifdef CRTL_CP_IS_OEM
|
|
/* C RTL's file system support assumes OEM coded strings */
|
|
# define ISO_TO_INTERN(src, dst) AnsiToOem(src, dst)
|
|
# define OEM_TO_INTERN(src, dst) {if ((src) != (dst)) strcpy((dst), (src));}
|
|
# define INTERN_TO_ISO(src, dst) OemToAnsi(src, dst)
|
|
# define INTERN_TO_OEM(src, dst) {if ((src) != (dst)) strcpy((dst), (src));}
|
|
# define _OEM_INTERN(str1) {;}
|
|
# define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1)
|
|
# define _INTERN_OEM(str1) {;}
|
|
# define _INTERN_ISO(str1) INTERN_TO_ISO(str1, str1)
|
|
#endif /* CRTL_CP_IS_OEM */
|
|
|
|
/* The following "OEM vs. ISO Zip entry names" code has been copied from UnZip.
|
|
* It should be applicable to the generic Zip code. However, currently only
|
|
* the Win32 port of Zip supplies the required charset conversion functions.
|
|
* (The Win32 port uses conversion functions supplied by the OS.)
|
|
*/
|
|
/* Convert filename (and file comment string) into "internal" charset.
|
|
* This macro assumes that Zip entry filenames are coded in OEM (IBM DOS)
|
|
* codepage when made on
|
|
* -> DOS (this includes 16-bit Windows 3.1) (FS_FAT_)
|
|
* -> OS/2 (FS_HPFS_)
|
|
* -> Win95/WinNT with Nico Mak's WinZip (FS_NTFS_ && hostver == "5.0")
|
|
* EXCEPTIONS:
|
|
* PKZIP for Windows 2.5, 2.6, and 4.0 flag their entries as "FS_FAT_", but
|
|
* the filename stored in the local header is coded in Windows ANSI (CP 1252
|
|
* resp. ISO 8859-1 on US and western Europe locale settings).
|
|
* Likewise, PKZIP for UNIX 2.51 flags its entries as "FS_FAT_", but the
|
|
* filenames stored in BOTH the local and the central header are coded
|
|
* in the local system's codepage (usually ANSI codings like ISO 8859-1,
|
|
* but could also be UTF-8 on "modern" setups...).
|
|
*
|
|
* All other ports are assumed to code zip entry filenames in ISO (8859-1
|
|
* on "Western" localisations).
|
|
*/
|
|
#define FS_FAT_ 0 /* filesystem used by MS-DOS, OS/2, Win32 */
|
|
#define FS_HPFS_ 6 /* filesystem used by OS/2 (and NT 3.x) */
|
|
#define FS_NTFS_ 11 /* filesystem used by Windows NT */
|
|
#ifndef Ext_ASCII_TO_Native
|
|
# define Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr) \
|
|
if (((hostnum) == FS_FAT_ && \
|
|
!(((islochdr) || (isuxatt)) && \
|
|
((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \
|
|
(hostnum) == FS_HPFS_ || \
|
|
((hostnum) == FS_NTFS_ && (hostver) == 50)) { \
|
|
_OEM_INTERN((string)); \
|
|
} else { \
|
|
_ISO_INTERN((string)); \
|
|
}
|
|
#endif
|
|
|
|
#if (defined(__RSXNT__) && defined(__CRTRSXNT__))
|
|
# include <crtrsxnt.h>
|
|
#endif
|
|
|
|
#ifdef _MBCS
|
|
# if (!defined(__EMX__) && !defined(__MINGW32__) && !defined(__CYGWIN__))
|
|
# include <stdlib.h>
|
|
# include <mbstring.h>
|
|
# endif
|
|
# if (defined(__MINGW32__) && !defined(MB_CUR_MAX))
|
|
# ifdef __MSVCRT__
|
|
IZ_IMP extern int *__p___mb_cur_max(void);
|
|
# define MB_CUR_MAX (*__p___mb_cur_max())
|
|
# else
|
|
IZ_IMP extern int *_imp____mb_cur_max_dll;
|
|
# define MB_CUR_MAX (*_imp____mb_cur_max_dll)
|
|
# endif
|
|
# endif
|
|
# if (defined(__LCC__) && !defined(MB_CUR_MAX))
|
|
IZ_IMP extern int *_imp____mb_cur_max;
|
|
# define MB_CUR_MAX (*_imp____mb_cur_max)
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef __LCC__
|
|
# include <time.h>
|
|
# ifndef tzset
|
|
# define tzset _tzset
|
|
# endif
|
|
# ifndef utime
|
|
# define utime _utime
|
|
# endif
|
|
#endif
|
|
#ifdef __MINGW32__
|
|
IZ_IMP extern void _tzset(void); /* this is missing in <time.h> */
|
|
# ifndef tzset
|
|
# define tzset _tzset
|
|
# endif
|
|
#endif
|
|
#if (defined(__RSXNT__) || defined(__EMX__)) && !defined(tzset)
|
|
# define tzset _tzset
|
|
#endif
|
|
#ifdef W32_USE_IZ_TIMEZONE
|
|
# ifdef __BORLANDC__
|
|
# define tzname tzname
|
|
# define IZTZ_DEFINESTDGLOBALS
|
|
# endif
|
|
# ifndef tzset
|
|
# define tzset _tzset
|
|
# endif
|
|
# ifndef timezone
|
|
# define timezone _timezone
|
|
# endif
|
|
# ifndef daylight
|
|
# define daylight _daylight
|
|
# endif
|
|
# ifndef tzname
|
|
# define tzname _tzname
|
|
# endif
|
|
# if (!defined(NEED__ISINDST) && !defined(__BORLANDC__))
|
|
# define NEED__ISINDST
|
|
# endif
|
|
# ifdef IZTZ_GETLOCALETZINFO
|
|
# undef IZTZ_GETLOCALETZINFO
|
|
# endif
|
|
# define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone
|
|
#endif /* W32_USE_IZ_TIMEZONE */
|
|
|
|
#ifdef MATCH
|
|
# undef MATCH
|
|
#endif
|
|
#define MATCH dosmatch /* use DOS style wildcard matching */
|
|
#ifdef UNICODE_SUPPORT
|
|
# ifdef WIN32
|
|
# define MATCHW dosmatchw
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef ZCRYPT_INTERNAL
|
|
# ifdef WINDLL
|
|
# define ZCR_SEED2 (unsigned)3141592654L /* use PI as seed pattern */
|
|
# else
|
|
# include <process.h> /* getpid() declaration for srand seed */
|
|
# endif
|
|
#endif
|
|
|
|
/* Up to now, all versions of Microsoft C runtime libraries lack the support
|
|
* for customized (non-US) switching rules between daylight saving time and
|
|
* standard time in the TZ environment variable string.
|
|
* But non-US timezone rules are correctly supported when timezone information
|
|
* is read from the OS system settings in the Win32 registry.
|
|
* The following work-around deletes any TZ environment setting from
|
|
* the process environment. This results in a fallback of the RTL time
|
|
* handling code to the (correctly interpretable) OS system settings, read
|
|
* from the registry.
|
|
*/
|
|
#ifdef USE_EF_UT_TIME
|
|
# if (defined(__WATCOMC__) || defined(__CYGWIN__) || \
|
|
defined(W32_USE_IZ_TIMEZONE))
|
|
# define iz_w32_prepareTZenv()
|
|
# else
|
|
# define iz_w32_prepareTZenv() putenv("TZ=")
|
|
# endif
|
|
#endif
|
|
|
|
/* This patch of stat() is useful for at least three compilers. It is */
|
|
/* difficult to take a stat() of a root directory under Windows95, so */
|
|
/* zstat_zipwin32() detects that case and fills in suitable values. */
|
|
#ifndef __RSXNT__
|
|
# ifndef W32_STATROOT_FIX
|
|
# define W32_STATROOT_FIX
|
|
# endif
|
|
#endif /* !__RSXNT__ */
|
|
|
|
#if (defined(NT_TZBUG_WORKAROUND) || defined(W32_STATROOT_FIX))
|
|
# define W32_STAT_BANDAID
|
|
# ifdef LARGE_FILE_SUPPORT /* E. Gordon 9/12/03 */
|
|
int zstat_zipwin32(const char *path, z_stat *buf);
|
|
# else
|
|
int zstat_zipwin32(const char *path, struct stat *buf);
|
|
# endif
|
|
# ifdef UNICODE_SUPPORT
|
|
# ifdef LARGE_FILE_SUPPORT
|
|
int zstat_zipwin32w(const wchar_t *pathw, struct _stati64 *buf);
|
|
# else
|
|
int zstat_zipwin32w(const wchar_t *pathw, struct _stat *buf);
|
|
# endif
|
|
# endif
|
|
# ifdef SSTAT
|
|
# undef SSTAT
|
|
# endif
|
|
# define SSTAT zstat_zipwin32
|
|
# ifdef UNICODE_SUPPORT
|
|
# define SSTATW zstat_zipwin32w
|
|
# endif
|
|
#endif /* NT_TZBUG_WORKAROUND || W32_STATROOT_FIX */
|
|
|
|
int getch_win32(void);
|
|
|
|
#ifdef __GNUC__
|
|
# define IZ_PACKED __attribute__((packed))
|
|
#else
|
|
# define IZ_PACKED
|
|
#endif
|
|
|
|
/* for some (all ?) versions of IBM C Set/2 and IBM C Set++ */
|
|
#ifndef S_IFMT
|
|
# define S_IFMT 0xF000
|
|
#endif /* !S_IFMT */
|
|
|
|
#ifdef __WATCOMC__
|
|
# include <stdio.h> /* PATH_MAX is defined here */
|
|
# define NO_MKTEMP
|
|
|
|
/* Get asm routines to link properly without using "__cdecl": */
|
|
# ifdef __386__
|
|
# ifdef ASMV
|
|
# pragma aux match_init "_*" parm caller [] modify []
|
|
# pragma aux longest_match "_*" parm caller [] value [eax] \
|
|
modify [eax ecx edx]
|
|
# endif
|
|
# if defined(ASM_CRC) && !defined(USE_ZLIB)
|
|
# pragma aux crc32 "_*" parm caller [] value [eax] modify [eax]
|
|
# pragma aux get_crc_table "_*" parm caller [] value [eax] \
|
|
modify [eax ecx edx]
|
|
# endif /* ASM_CRC && !USE_ZLIB */
|
|
# endif /* __386__ */
|
|
/* Watcom C (like the other Win32 C compiler systems) does not support
|
|
* symlinks on Win32, but defines the S_IFLNK symbol nevertheless.
|
|
* However, the existence of this symbol is used as "symlinks supported"
|
|
* indicator in the generic Zip code (see tailor.h). So, for a simple
|
|
* work-around, this symbol is undefined here. */
|
|
# ifdef S_IFLNK
|
|
# undef S_IFLNK
|
|
# endif
|
|
# ifdef UNICODE_SUPPORT
|
|
/* Watcom C does not supply wide-char definitions in the "standard"
|
|
* headers like MSC; so we have to pull in a wchar-specific header.
|
|
*/
|
|
# include <wchar.h>
|
|
# endif
|
|
#endif /* __WATCOMC__ */
|