mirror of https://github.com/BOINC/boinc.git
130 lines
3.5 KiB
C
130 lines
3.5 KiB
C
|
/*
|
||
|
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 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
|
||
|
*/
|
||
|
/*---------------------------------------------------------------------------
|
||
|
|
||
|
win32/win32i64.c - UnZip 6
|
||
|
|
||
|
64-bit filesize support for WIN32 Zip and UnZip.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "../zip.h"
|
||
|
|
||
|
/* --------------------------------------------------- */
|
||
|
/* Large File Support
|
||
|
*
|
||
|
* Initial functions by E. Gordon and R. Nausedat
|
||
|
* 9/10/2003
|
||
|
*
|
||
|
* These implement 64-bit file support for Windows. The
|
||
|
* defines and headers are in win32/osdep.h.
|
||
|
*
|
||
|
* These moved from win32.c by Mike White to avoid conflicts
|
||
|
* in WiZ of same name functions in UnZip and Zip libraries.
|
||
|
* 9/25/04 EG
|
||
|
*/
|
||
|
|
||
|
#if defined(LARGE_FILE_SUPPORT) && !defined(__CYGWIN__)
|
||
|
# ifdef USE_STRM_INPUT
|
||
|
|
||
|
# ifndef zftello
|
||
|
/* 64-bit buffered ftello
|
||
|
*
|
||
|
* Win32 does not provide a 64-bit buffered
|
||
|
* ftell (in the published api anyway) so below provides
|
||
|
* hopefully close version.
|
||
|
* We have not gotten _telli64 to work with buffered
|
||
|
* streams. Below cheats by using fgetpos improperly and
|
||
|
* may not work on other ports.
|
||
|
*/
|
||
|
|
||
|
zoff_t zftello(stream)
|
||
|
FILE *stream;
|
||
|
{
|
||
|
fpos_t fpos = 0;
|
||
|
|
||
|
if (fgetpos(stream, &fpos) != 0) {
|
||
|
return -1L;
|
||
|
} else {
|
||
|
return fpos;
|
||
|
}
|
||
|
}
|
||
|
# endif /* ndef zftello */
|
||
|
|
||
|
|
||
|
# ifndef zfseeko
|
||
|
/* 64-bit buffered fseeko
|
||
|
*
|
||
|
* Win32 does not provide a 64-bit buffered
|
||
|
* fseeko, so use _lseeki64 and fflush. Note
|
||
|
* that SEEK_CUR can lose track of location
|
||
|
* if fflush is done between the last buffered
|
||
|
* io and this call.
|
||
|
*/
|
||
|
|
||
|
int zfseeko(stream, offset, origin)
|
||
|
FILE *stream;
|
||
|
zoff_t offset;
|
||
|
int origin;
|
||
|
{
|
||
|
|
||
|
/* fseek() or its replacements are supposed to clear the eof status
|
||
|
of the stream. fflush() and _lseeki64() do not touch the stream's
|
||
|
eof flag, so we have to do it manually. */
|
||
|
#if ((defined(_MSC_VER) && (_MSC_VER >= 1200)) || \
|
||
|
(defined(__MINGW32__) && defined(__MSVCRT_VERSION__)))
|
||
|
/* For the MSC environment (VS 6 or higher), and for recent releases of
|
||
|
the MinGW environment, we "know" the internals of the FILE structure.
|
||
|
So, we can clear just the EOF bit of the status flag. */
|
||
|
stream->_flag &= ~_IOEOF;
|
||
|
#else
|
||
|
/* Unfortunately, there is no standard "cleareof()" function, so we have
|
||
|
to use clearerr(). This has the unwanted side effect of clearing the
|
||
|
ferror() state as well. */
|
||
|
clearerr(stream);
|
||
|
#endif
|
||
|
|
||
|
if (origin == SEEK_CUR) {
|
||
|
/* instead of synching up lseek easier just to figure and
|
||
|
use an absolute offset */
|
||
|
offset += zftello(stream);
|
||
|
origin = SEEK_SET;
|
||
|
}
|
||
|
fflush(stream);
|
||
|
if (_lseeki64(fileno(stream), offset, origin) == (zoff_t)-1L) {
|
||
|
return -1;
|
||
|
} else {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
# endif /* ndef fseeko */
|
||
|
# endif /* USE_STRM_INPUT */
|
||
|
#endif /* Win32 LARGE_FILE_SUPPORT */
|
||
|
|
||
|
#if 0
|
||
|
FILE* zfopen(filename, mode)
|
||
|
const char *filename;
|
||
|
const char *mode;
|
||
|
{
|
||
|
FILE* fTemp;
|
||
|
|
||
|
fTemp = fopen(filename, mode);
|
||
|
if( fTemp == NULL )
|
||
|
return NULL;
|
||
|
|
||
|
/* sorry, could not make VC60 and its rtl work properly without setting the
|
||
|
* file buffer to NULL. the problem seems to be _telli64 which seems to
|
||
|
* return the max stream position, comments are welcome
|
||
|
*/
|
||
|
setbuf(fTemp, NULL);
|
||
|
|
||
|
return fTemp;
|
||
|
}
|
||
|
#endif
|
||
|
/* --------------------------------------------------- */
|