/* Copyright (c) 1990-2009 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2009-Jan-02 or later (the contents of which are also included in unzip.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 */ /*--------------------------------------------------------------------------- Win32 specific configuration section: ---------------------------------------------------------------------------*/ #ifndef __w32cfg_h #define __w32cfg_h #ifdef __MINGW32__ # define USE_STRM_INPUT #endif #ifdef __CYGWIN__ /* We treat the file system underneath the Cygwin Unix emulator environment * as "native VFAT/NTFS" and use the WIN32 API for its special attributes... */ # ifdef UNIX # undef UNIX # endif #endif #if (defined(_MSC_VER) && !defined(MSC)) # define MSC #endif /* enable multibyte character set support by default */ #if (!defined(_MBCS) && !defined(NO_MBCS)) # define _MBCS #endif #if (defined(_MBCS) && defined(NO_MBCS)) # undef _MBCS #endif #if (defined(__CYGWIN__) && defined(_MBCS)) # undef _MBCS /* Cygwin RTL lacks support for __mb_cur_max */ #endif #if (defined(__DJGPP__) && !defined(__EMX__) && defined(_MBCS)) # undef _MBCS /* __mb_cur_max missing for RSXNTdj 1.6 beta */ #endif #include /* off_t, time_t, dev_t, ... */ #include #include /* read(), open(), etc. */ #include #if ((defined(__RSXNT__) || defined(__EMX__)) && !defined(tzset)) # define tzset _tzset #endif #if (defined(__LCC__) && !defined(tzset)) # define tzset _tzset #endif #ifdef W32_USE_IZ_TIMEZONE # ifdef __BORLANDC__ # define tzname tzname # define IZTZ_DEFINESTDGLOBALS # endif # ifdef __WATCOMC__ # 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 */ #include #if (!defined(__RSXNT__) && !defined(__CYGWIN__)) # include /* mkdir() */ #endif #include #ifdef __CYGWIN__ # include extern int setmode(int, int); /* this is missing in */ #endif #if (defined(MSC) || defined(__WATCOMC__) || defined(__MINGW32__)) # include #else # include #endif #define GOT_UTIMBUF #ifdef _MBCS # if (!defined(__EMX__) && !defined(__DJGPP__) && !defined(__CYGWIN__)) # if (!defined(__MINGW32__) || defined(__MSVCRT__)) # include # include /* for MSC (and compatible compilers), use routines supplied by RTL */ # define CLEN(ptr) _mbclen((const uch *)(ptr)) # define PREINCSTR(ptr) (ptr = (char *)_mbsinc((const uch *)(ptr))) # define MBSCHR(str, c) (char *)_mbschr((const uch *)(str), (c)) # define MBSRCHR(str, c) (char *)_mbsrchr((const uch *)(str), (c)) # endif # endif # if (defined(__MINGW32__) && !defined(MB_CUR_MAX)) # ifdef __MSVCRT__ extern int *__p___mb_cur_max(void); # define MB_CUR_MAX (*__p___mb_cur_max()) # else 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)) extern int *_imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # endif # if (defined(__DJGPP__) && !defined(__EMX__) && !defined(MB_CUR_MAX)) extern int *_imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # endif #endif /* for UnZip, the "basic" part of the win32 api is sufficient */ #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #if defined(__FILEIO_C) # ifndef __CYGWIN__ # include # endif # include # ifdef __RSXNT__ # include "../win32/rsxntwin.h" # endif # ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL # endif #endif #if (defined(__ENVARGS_C) || defined(__EXTRACT_C) || defined(__UNZIP_C) || \ defined(ZCRYPT_INTERNAL)) # include # ifdef __RSXNT__ # include "../win32/rsxntwin.h" # endif # ifndef TIME_ZONE_ID_INVALID # define TIME_ZONE_ID_INVALID (DWORD)0xFFFFFFFFL # endif #endif #ifndef Cdecl # define Cdecl __cdecl #endif /* the following definitions are considered as "obsolete" by Microsoft and * might be missing in some versions of */ #ifndef AnsiToOem # define AnsiToOem CharToOemA #endif #ifndef OemToAnsi # define OemToAnsi OemToCharA #endif #define DIR_END '\\' /* OS uses '\\' as directory separator */ #define DIR_END2 '/' /* also check for '/' (RTL may convert) */ #ifdef DATE_FORMAT # undef DATE_FORMAT #endif #define DATE_FORMAT dateformat() #ifdef DATE_SEPCHAR # undef DATE_SEPCHAR #endif #define DATE_SEPCHAR dateseparator() #define lenEOL 2 #define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} #if (defined(__RSXNT__) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (defined(MSC) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (defined(__CYGWIN__) && defined(HAVE_MKTIME)) # undef HAVE_MKTIME /* Cygnus' mktime() implementation is buggy */ #endif #if (defined(W32_USE_IZ_TIMEZONE) && !defined(HAVE_MKTIME)) # define HAVE_MKTIME /* use mktime() in time conversion routines */ #endif #if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) # define USE_EF_UT_TIME #endif #if (!defined(NO_DIR_ATTRIB) && !defined(SET_DIR_ATTRIB)) # define SET_DIR_ATTRIB #endif #if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) # define TIMESTAMP #endif #if (!defined(NO_NTSD_EAS) && !defined(NTSD_EAS)) # define NTSD_EAS /* enable NTSD support unless explicitly suppressed */ #endif #if (defined(NTSD_EAS) && !defined(RESTORE_ACL)) # define RESTORE_ACL /* "restore ACLs" only needed when NTSD_EAS active */ #endif #if (!defined(NO_UNICODE_SUPPORT) && !defined(UNICODE_SUPPORT)) # define UNICODE_SUPPORT /* enable UTF-8 filename support by default */ #endif #if (defined(UNICODE_SUPPORT) && !defined(UNICODE_WCHAR)) # define UNICODE_WCHAR /* wchar_t is UTF-16 encoded on WIN32 */ #endif #ifdef UTF8_MAYBE_NATIVE # undef UTF8_MAYBE_NATIVE /* UTF-8 cannot be system charset on WIN32 */ #endif /* The following compiler systems provide or use a runtime library with a * locale-aware isprint() implementation. For these systems, the "enhanced" * unprintable charcode detection in fnfilter() gets enabled. */ #if (!defined(HAVE_WORKING_ISPRINT) && !defined(NO_WORKING_ISPRINT)) # if defined(MSC) || defined(__BORLANDC__) # define HAVE_WORKING_ISPRINT # endif # if defined(__MINGW32__) && defined(__MSVCRT__) # define HAVE_WORKING_ISPRINT # 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 /* handlers for OEM <--> ANSI string conversions */ #ifdef __RSXNT__ /* 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) #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));} #endif /* CRTL_CP_IS_OEM */ #define _OEM_INTERN(str1) OEM_TO_INTERN(str1, str1) #define _ISO_INTERN(str1) ISO_TO_INTERN(str1, str1) #ifndef WINDLL /* Despite best intentions, for the command-line version UzpPassword() * could return either character set, depending on whether running under * Win95 (DOS-session) or WinNT (native WinNT command interpreter)! */ # define STR_TO_CP2(dst, src) (AnsiToOem(src, dst), dst) # define STR_TO_CP3(dst, src) (OemToAnsi(src, dst), dst) #else /* The WINDLL front end is known to supply ISO/ANSI-coded passwords! */ # define STR_TO_CP2(dst, src) (AnsiToOem(src, dst), dst) #endif /* dummy defines to disable these functions, they are not needed */ #define STR_TO_OEM #define STR_TO_ISO /* Static variables that we have to add to Uz_Globs: */ #define SYSTEM_SPECIFIC_GLOBALS \ int created_dir, renamed_fullpath, fnlen;\ unsigned nLabelDrive;\ char lastRootPath[4];\ int lastVolOldFAT, lastVolLocTim;\ char *rootpath, *buildpathHPFS, *buildpathFAT, *endHPFS, *endFAT;\ ZCONST char *wildname;\ char *dirname, matchname[FILNAMSIZ];\ int rootlen, have_dirname, dirnamelen, notfirstcall;\ zvoid *wild_dir; /* created_dir, renamed_fullpath, fnlen, and nLabelDrive are used by */ /* both mapname() and checkdir(). */ /* lastRootPath, lastVolOldFAT and lastVolLocTim are used by */ /* IsVolumeOldFAT() and NTQueryVolInfo(). */ /* rootlen, rootpath, buildpathHPFS, buildpathFAT, endHPFS, and endFAT */ /* are used by checkdir(). */ /* wild_dir, dirname, wildname, matchname[], dirnamelen, have_dirname, */ /* and notfirstcall are used by do_wild(). */ /* This replacement for C-RTL-supplied getch() (or similar) functionality * avoids leaving unabsorbed LFs in the keyboard buffer under Windows95, * and supports the +[0] feature. */ int getch_win32 OF((void)); /* 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 two compilers. It is */ /* difficult to take a stat() of a root directory under Windows95, so */ /* zstat_win32() detects that case and fills in suitable values. */ #ifndef __RSXNT__ # ifndef W32_STATROOT_FIX # define W32_STATROOT_FIX # endif #endif /* !__RSXNT__ */ #define W32_STAT_BANDAID #if defined(REENTRANT) # define __W32STAT_GLOBALS__ Uz_Globs *pG, # define __W32STAT_G__ pG, #else # define __W32STAT_GLOBALS__ # define __W32STAT_G__ #endif #ifdef SSTAT # undef SSTAT #endif #ifdef WILD_STAT_BUG # define SSTAT(path, pbuf) (iswild(path) || zstat_win32(__W32STAT_G__ path, pbuf)) #else # define SSTAT(path, pbuf) zstat_win32(__W32STAT_G__ path, pbuf) #endif #ifdef __WATCOMC__ # ifdef __386__ # ifndef WATCOMC_386 # define WATCOMC_386 # endif # define __32BIT__ # undef far # define far # undef near # define near # undef Cdecl # define Cdecl /* gaah -- Watcom's docs claim that _get_osfhandle exists, but it doesn't. */ # define _get_osfhandle _os_handle /* Get asm routines to link properly without using "__cdecl": */ # ifndef 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 /* !USE_ZLIB */ # endif /* __386__ */ #endif /* __WATCOMC__ */ #define SCREENWIDTH 80 #define SCREENSIZE(scrrows, scrcols) screensize(scrrows, scrcols) int screensize(int *tt_rows, int *tt_cols); /* on the DOS or NT console screen, line-wraps are always enabled */ #define SCREENLWRAP 1 #define TABSIZE 8 /* 64-bit-Integers & Large File Support * (pasted here from Zip 3b, osdep.h - Myles Bennett 7-jun-2004) * (updated from Zip 3.0d - Ed Gordon 6-oct-2004) * * 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 w32i64.c and the prototypes for the calls are * in unzip.h. Note that a port must support * these calls fully or should not set * LARGE_FILE_SUPPORT. */ /* Automatically set ZIP64_SUPPORT if supported */ #ifndef NO_ZIP64_SUPPORT # ifndef ZIP64_SUPPORT # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__) # define ZIP64_SUPPORT # elif defined(__LCC__) /* LCC links against crtdll.dll -> no support of 64-bit offsets :( */ # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) # define ZIP64_SUPPORT # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C RTL lacks any support to get/set 64-bit file pointer :( */ # endif # endif #endif #ifdef ZIP64_SUPPORT /* base type for file offsets and file sizes */ # if (defined(__GNUC__) || defined(ULONG_LONG_MAX)) typedef long long zoff_t; # else /* all other compilers use this as intrinsic 64-bit type */ typedef __int64 zoff_t; # endif # define ZOFF_T_DEFINED /* user-defined types and format strings for 64-bit numbers and * file pointer functions (these depend on the rtl library and library * headers used; they are NOT compiler-specific) */ # if defined(_MSC_VER) || defined(__MINGW32__) || defined(__LCC__) /* MS C and VC, MinGW32, lcc32 */ /* these systems use the Microsoft C RTL */ /* 64-bit stat struct */ typedef struct _stati64 z_stat; # define Z_STAT_DEFINED # ifdef __LCC__ /* The LCC headers lack these declarations of MSC rtl functions in sys/stat.h. */ struct _stati64 { unsigned int st_dev; unsigned short st_ino; unsigned short st_mode; short st_nlink; short st_uid; short st_gid; unsigned int st_rdev; __int64 st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; }; int _stati64(const char *, struct _stati64 *); int _fstati64(int, struct _stati64 *); __int64 _lseeki64(int, __int64, int); # endif /* __LCC__ */ /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "I64" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9I64u %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9I64u %9lu file%s\n" # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C 5.2 or newer */ /* 64-bit stat struct */ typedef struct stati64 z_stat; # define Z_STAT_DEFINED /* Borland C does not provide a 64-bit-capable _lseeki64(), so we need to use the stdio.h stream functions instead. */ # ifndef USE_STRM_INPUT # define USE_STRM_INPUT # endif /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "L" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9Lu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9Lu %9lu file%s\n" # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) /* WATCOM C */ /* 64-bit stat struct */ typedef struct _stati64 z_stat; # define Z_STAT_DEFINED /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "ll" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9llu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9llu %9lu file%s\n" # elif (defined(__IBMC__) && (__IBMC__ >= 350)) /* IBM C */ /* 64-bit stat struct */ /* printf format size prefix for zoff_t values */ # define FZOFFT_FMT "I64" # define FZOFFT_HEX_WID_VALUE "16" # define SHORTHDRSTATS "%9I64u %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9I64u %9lu file%s\n" # endif #endif /* If port has LARGE_FILE_SUPPORT then define here to make automatic unless overridden */ #ifndef LARGE_FILE_SUPPORT # ifndef NO_LARGE_FILE_SUPPORT # if defined(_MSC_VER) || defined(__MINGW32__) # define LARGE_FILE_SUPPORT # elif defined(__LCC__) /* LCC links against crtdll.dll -> no support of 64-bit offsets :( */ # elif defined(__CYGWIN__) # define LARGE_FILE_SUPPORT # elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) # define LARGE_FILE_SUPPORT # elif (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520)) /* Borland C RTL lacks any support to get/set 64-bit file pointer :( */ # endif # endif #endif #ifndef LARGE_FILE_SUPPORT /* No Large File Support */ /* base type for file offsets and file sizes */ typedef long zoff_t; # define ZOFF_T_DEFINED /* stat struct */ typedef struct stat z_stat; # define Z_STAT_DEFINED # define FZOFFT_FMT "l" # define FZOFFT_HEX_WID_VALUE "8" # define SHORTHDRSTATS "%9lu %02u%c%02u%c%02u %02u:%02u %c" # define SHORTFILETRAILER " -------- -------\n%9lu %9lu file%s\n" #endif /* LARGE_FILE_SUPPORT */ #endif /* !__w32cfg_h */