1/*
2  win32/win32i64.c - Zip 3
3
4  Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
5
6  See the accompanying file LICENSE, version 2005-Feb-10 or later
7  (the contents of which are also included in zip.h) for terms of use.
8  If, for some reason, all these files are missing, the Info-ZIP license
9  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
10*/
11
12#include "../zip.h"
13
14#include <stdlib.h>
15#include <stdio.h>
16#include <limits.h>
17#include <time.h>
18#include <ctype.h>
19#include <windows.h>
20/* for LARGE_FILE_SUPPORT but may not be needed */
21#include <io.h>
22
23
24/* --------------------------------------------------- */
25/* Large File Support
26 *
27 * Initial functions by E. Gordon and R. Nausedat
28 * 9/10/2003
29 *
30 * These implement 64-bit file support for Windows.  The
31 * defines and headers are in win32/osdep.h.
32 *
33 * These moved from win32.c by Mike White to avoid conflicts
34 * in WiZ of same name functions in UnZip and Zip libraries.
35 * 9/25/04 EG
36 */
37
38#if defined(LARGE_FILE_SUPPORT) && !defined(__CYGWIN__)
39
40/* 64-bit buffered ftello
41 *
42 * Win32 does not provide a 64-bit buffered
43 * ftell (in the published api anyway) so below provides
44 * hopefully close version.
45 * We have not gotten _telli64 to work with buffered
46 * streams.  Below cheats by using fgetpos improperly and
47 * may not work on other ports.
48 */
49
50zoff_t zftello(stream)
51  FILE *stream;
52{
53  fpos_t fpos = 0;
54
55  if (fgetpos(stream, &fpos) != 0) {
56    return -1L;
57  } else {
58    return fpos;
59  }
60}
61
62
63/* 64-bit buffered fseeko
64 *
65 * Win32 does not provide a 64-bit buffered
66 * fseeko so use _lseeki64 and fflush.  Note
67 * that SEEK_CUR can lose track of location
68 * if fflush is done between the last buffered
69 * io and this call.
70 */
71
72int zfseeko(stream, offset, origin)
73  FILE *stream;
74  zoff_t offset;
75  int origin;
76{
77  zoff_t location;
78
79  location = zftello(stream);
80  fflush(stream);
81  if (origin == SEEK_CUR) {
82    /* instead of synching up lseek easier just to figure and
83       use an absolute offset */
84    offset = location + offset;
85    location = _lseeki64(fileno(stream), offset, SEEK_SET);
86  } else {
87    location = _lseeki64(fileno(stream), offset, origin);
88  }
89  if (location == -1L) {
90    return -1L;
91  } else {
92    return 0;
93  }
94}
95#endif  /* Win32 LARGE_FILE_SUPPORT */
96
97#if 0
98FILE* zfopen(filename,mode)
99char *filename;
100char *mode;
101{
102FILE* fTemp;
103
104  fTemp = fopen(filename,mode);
105  if( fTemp == NULL )
106    return NULL;
107
108  /* sorry, could not make VC60 and its rtl work properly without setting the file buffer to NULL. the  */
109  /* problem seems to be _telli64 which seems to return the max stream position, comments are welcome   */
110  setbuf(fTemp,NULL);
111
112  return fTemp;
113}
114#endif
115/* --------------------------------------------------- */
116