123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617 |
- /*
- 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__ */
|