Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/win32/win32.c view on Meta::CPAN
" later than 6.0",
# endif
#elif defined(__LCC__)
"LCC-Win32", "",
#elif defined(__GNUC__)
# if defined(__RSXNT__)
# if (defined(__DJGPP__) && !defined(__EMX__))
(sprintf(buf, "rsxnt(djgpp v%d.%02d) / gcc ",
__DJGPP__, __DJGPP_MINOR__), buf),
# elif defined(__DJGPP__)
(sprintf(buf, "rsxnt(emx+djgpp v%d.%02d) / gcc ",
__DJGPP__, __DJGPP_MINOR__), buf),
# elif (defined(__GO32__) && !defined(__EMX__))
"rsxnt(djgpp v1.x) / gcc ",
# elif defined(__GO32__)
"rsxnt(emx + djgpp v1.x) / gcc ",
# elif defined(__EMX__)
"rsxnt(emx)+gcc ",
# else
"rsxnt(unknown) / gcc ",
# endif
# elif defined(__CYGWIN__)
"cygnus win32 / gcc ",
# elif defined(__MINGW32__)
"mingw32 / gcc ",
# else
"gcc ",
# endif
__VERSION__,
#else /* !_MSC_VER, !__WATCOMC__, !__BORLANDC__, !__LCC__, !__GNUC__ */
"unknown compiler (SDK?)", "",
#endif /* ?compilers */
"\nWindows 9x / Windows NT/2K/XP/2K3", " (32-bit)",
#ifdef __DATE__
" on ", __DATE__
#else
"", ""
#endif
);
(*G.message)((zvoid *)&G, slide, (ulg)len, 0);
return;
} /* end function version() */
#endif /* !WINDLL */
#endif /* !SFX */
#ifdef MORE
int screensize(int *tt_rows, int *tt_cols)
{
HANDLE hstdout;
CONSOLE_SCREEN_BUFFER_INFO scr;
hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hstdout, &scr);
if (tt_rows != NULL) *tt_rows = scr.srWindow.Bottom - scr.srWindow.Top + 1;
if (tt_cols != NULL) *tt_cols = scr.srWindow.Right - scr.srWindow.Left + 1;
return 0; /* signal success */
}
#endif /* MORE */
#ifdef W32_STAT_BANDAID
/* All currently known variants of WIN32 operating systems (Windows 95/98,
* WinNT 3.x, 4.0, 5.x) have a nasty bug in the OS kernel concerning
* conversions between UTC and local time: In the time conversion functions
* of the Win32 API, the timezone offset (including seasonal daylight saving
* shift) between UTC and local time evaluation is erratically based on the
* current system time. The correct evaluation must determine the offset
* value as it {was/is/will be} for the actual time to be converted.
*
* Newer versions of MS C runtime lib's stat() returns utc time-stamps so
* that localtime(timestamp) corresponds to the (potentially false) local
* time shown by the OS' system programs (Explorer, command shell dir, etc.)
* The RSXNT port follows the same strategy, but fails to recognize the
* access-time attribute.
*
* For the NTFS file system (and other filesystems that store time-stamps
* as UTC values), this results in st_mtime (, st_{c|a}time) fields which
* are not stable but vary according to the seasonal change of "daylight
* saving time in effect / not in effect".
*
* Other C runtime libs (CygWin), or the crtdll.dll supplied with Win9x/NT
* return the unix-time equivalent of the UTC FILETIME values as got back
* from the Win32 API call. This time, return values from NTFS are correct
* whereas utimes from files on (V)FAT volumes vary according to the DST
* switches.
*
* To achieve timestamp consistency of UTC (UT extra field) values in
* Zip archives, the Info-ZIP programs require work-around code for
* proper time handling in stat() (and other time handling routines).
*
* However, nowadays most other programs on Windows systems use the
* time conversion strategy of Microsofts C runtime lib "msvcrt.dll".
* To improve interoperability in environments where a "consistent" (but
* false) "UTC<-->LocalTime" conversion is preferred over "stable" time
* stamps, the Info-ZIP specific time conversion handling can be
* deactivated by defining the preprocessor flag NO_W32TIMES_IZFIX.
*/
/* stat() functions under Windows95 tend to fail for root directories. *
* Watcom and Borland, at least, are affected by this bug. Watcom made *
* a partial fix for 11.0 but still missed some cases. This substitute *
* detects the case and fills in reasonable values. Otherwise we get *
* effects like failure to extract to a root dir because it's not found. */
int zstat_win32(__W32STAT_GLOBALS__ const char *path, z_stat *buf)
{
if (!zstat(path, buf))
{
/* stat was successful, now redo the time-stamp fetches */
#ifndef NO_W32TIMES_IZFIX
unzip-6.0/win32/win32.c view on Meta::CPAN
conv_to_rule(&(tzinfo.StandardDate), &stoprule);
conv_to_rule(&(tzinfo.DaylightDate), &startrule);
sp->timecnt = 0;
sp->ttis[0].tt_abbrind = 0;
if ((sp->charcnt =
WideCharToMultiByte(CP_ACP, 0, tzinfo.StandardName, -1,
sp->chars, sizeof(sp->chars), NULL, NULL))
== 0)
sp->chars[sp->charcnt++] = '\0';
sp->ttis[1].tt_abbrind = sp->charcnt;
sp->charcnt +=
WideCharToMultiByte(CP_ACP, 0, tzinfo.DaylightName, -1,
sp->chars + sp->charcnt,
sizeof(sp->chars) - sp->charcnt, NULL, NULL);
if ((sp->charcnt - sp->ttis[1].tt_abbrind) == 0)
sp->chars[sp->charcnt++] = '\0';
sp->ttis[0].tt_gmtoff = - (tzinfo.Bias + tzinfo.StandardBias)
* MINSPERHOUR;
sp->ttis[1].tt_gmtoff = - (tzinfo.Bias + tzinfo.DaylightBias)
* MINSPERHOUR;
sp->ttis[0].tt_isdst = 0;
sp->ttis[1].tt_isdst = 1;
sp->typecnt = (startrule.r_mon == 0 && stoprule.r_mon == 0) ? 1 : 2;
if (sp->typecnt > 1)
(*fill_tzstate_from_rules)(sp, &startrule, &stoprule);
return TRUE;
}
return FALSE;
}
#endif /* W32_USE_IZ_TIMEZONE */
#endif /* !FUNZIP */
#ifndef WINDLL
/* This replacement getch() function was originally created for Watcom C
* and then additionally used with CYGWIN. Since UnZip 5.4, all other Win32
* ports apply this replacement rather that their supplied getch() (or
* alike) function. There are problems with unabsorbed LF characters left
* over in the keyboard buffer under Win95 (and 98) when ENTER was pressed.
* (Under Win95, ENTER returns two(!!) characters: CR-LF.) This problem
* does not appear when run on a WinNT console prompt!
*/
/* Watcom 10.6's getch() does not handle Alt+<digit><digit><digit>. */
/* Note that if PASSWD_FROM_STDIN is defined, the file containing */
/* the password must have a carriage return after the word, not a */
/* Unix-style newline (linefeed only). This discards linefeeds. */
int getch_win32(void)
{
HANDLE stin;
DWORD rc;
unsigned char buf[2];
int ret = -1;
DWORD odemode = ~(DWORD)0;
# ifdef PASSWD_FROM_STDIN
stin = GetStdHandle(STD_INPUT_HANDLE);
# else
stin = CreateFileA("CONIN$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (stin == INVALID_HANDLE_VALUE)
return -1;
# endif
if (GetConsoleMode(stin, &odemode))
SetConsoleMode(stin, ENABLE_PROCESSED_INPUT); /* raw except ^C noticed */
if (ReadFile(stin, &buf, 1, &rc, NULL) && rc == 1)
ret = buf[0];
/* when the user hits return we get CR LF. We discard the LF, not the CR,
* because when we call this for the first time after a previous input
* such as the one for "replace foo? [y]es, ..." the LF may still be in
* the input stream before whatever the user types at our prompt. */
if (ret == '\n')
if (ReadFile(stin, &buf, 1, &rc, NULL) && rc == 1)
ret = buf[0];
if (odemode != ~(DWORD)0)
SetConsoleMode(stin, odemode);
# ifndef PASSWD_FROM_STDIN
CloseHandle(stin);
# endif
return ret;
}
#endif /* !WINDLL */
#if (defined(UNICODE_SUPPORT) && !defined(FUNZIP))
/* convert wide character string to multi-byte character string */
char *wide_to_local_string(wide_string, escape_all)
ZCONST zwchar *wide_string;
int escape_all;
{
int i;
wchar_t wc;
int bytes_char;
int default_used;
int wsize = 0;
int max_bytes = 9;
char buf[9];
char *buffer = NULL;
char *local_string = NULL;
for (wsize = 0; wide_string[wsize]; wsize++) ;
if (max_bytes < MB_CUR_MAX)
max_bytes = MB_CUR_MAX;
if ((buffer = (char *)malloc(wsize * max_bytes + 1)) == NULL) {
return NULL;
}
/* convert it */
buffer[0] = '\0';
for (i = 0; i < wsize; i++) {
if (sizeof(wchar_t) < 4 && wide_string[i] > 0xFFFF) {
/* wchar_t probably 2 bytes */
/* could do surrogates if state_dependent and wctomb can do */
wc = zwchar_to_wchar_t_default_char;
} else {
wc = (wchar_t)wide_string[i];
}
/* Unter some vendor's C-RTL, the Wide-to-MultiByte conversion functions
* (like wctomb() et. al.) do not use the same codepage as the other
* string arguments I/O functions (fopen, mkdir, rmdir etc.).
* Therefore, we have to fall back to the underlying Win32-API call to
* achieve a consistent behaviour for all supported compiler environments.
( run in 0.579 second using v1.01-cache-2.11-cpan-d7f47b0818f )