summaryrefslogtreecommitdiff
path: root/win32/osdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'win32/osdep.h')
-rw-r--r--win32/osdep.h617
1 files changed, 617 insertions, 0 deletions
diff --git a/win32/osdep.h b/win32/osdep.h
new file mode 100644
index 0000000..eaf6507
--- /dev/null
+++ b/win32/osdep.h
@@ -0,0 +1,617 @@
+/*
+ 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__ */