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