8#if defined(_WIN32) && !defined(__BORLANDC__)
9# define LSEEK _lseeki64
11#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
29char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
30 static char buf[1024];
33 DWORD lasterr = GetLastError();
34 DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
35 | FORMAT_MESSAGE_ALLOCATE_BUFFER,
45 && msgbuf[chars - 2] ==
'\r' && msgbuf[chars - 1] ==
'\n') {
50 if (chars >
sizeof (buf) - 1) {
51 chars =
sizeof (buf) - 1;
55 wcstombs(buf, msgbuf, chars + 1);
59 sprintf(buf,
"unknown win32 error (%ld)", error);
62 SetLastError(lasterr);
69local
void gz_reset(gz_statep state) {
71 if (state->mode == GZ_READ) {
79 gz_error(state, Z_OK, NULL);
81 state->strm.avail_in = 0;
85local gzFile gz_open(
const void *path,
int fd,
const char *mode) {
101 state = (gz_statep)malloc(
sizeof(
gz_state));
105 state->want = GZBUFSIZE;
109 state->mode = GZ_NONE;
110 state->level = Z_DEFAULT_COMPRESSION;
111 state->strategy = Z_DEFAULT_STRATEGY;
114 if (*mode >=
'0' && *mode <=
'9')
115 state->level = *mode -
'0';
119 state->mode = GZ_READ;
123 state->mode = GZ_WRITE;
126 state->mode = GZ_APPEND;
145 state->strategy = Z_FILTERED;
148 state->strategy = Z_HUFFMAN_ONLY;
151 state->strategy = Z_RLE;
154 state->strategy = Z_FIXED;
166 if (state->mode == GZ_NONE) {
172 if (state->mode == GZ_READ) {
183 len = wcstombs(NULL, path, 0);
184 if (len == (z_size_t)-1)
189 len = strlen((
const char *)path);
190 state->path = (
char *)malloc(len + 1);
191 if (state->path == NULL) {
198 wcstombs(state->path, path, len + 1);
203#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
204 (void)snprintf(state->path, len + 1,
"%s", (
const char *)path);
206 strcpy(state->path, path);
218 (cloexec ? O_CLOEXEC : 0) |
220 (state->mode == GZ_READ ?
222 (O_WRONLY | O_CREAT |
224 (exclusive ? O_EXCL : 0) |
226 (state->mode == GZ_WRITE ?
231 state->fd = fd > -1 ? fd : (
233 fd == -2 ? _wopen(path, oflag, 0666) :
235 open((const char *)path, oflag, 0666));
236 if (state->fd == -1) {
241 if (state->mode == GZ_APPEND) {
242 LSEEK(state->fd, 0, SEEK_END);
243 state->mode = GZ_WRITE;
247 if (state->mode == GZ_READ) {
248 state->start = LSEEK(state->fd, 0, SEEK_CUR);
249 if (state->start == -1) state->start = 0;
256 return (gzFile)state;
260gzFile ZEXPORT gzopen(
const char *path,
const char *mode) {
261 return gz_open(path, -1, mode);
265gzFile ZEXPORT gzopen64(
const char *path,
const char *mode) {
266 return gz_open(path, -1, mode);
270gzFile ZEXPORT gzdopen(
int fd,
const char *mode) {
274 if (fd == -1 || (path = (
char *)malloc(7 + 3 *
sizeof(
int))) == NULL)
276#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
277 (void)snprintf(path, 7 + 3 *
sizeof(
int),
"<fd:%d>", fd);
279 sprintf(path,
"<fd:%d>", fd);
281 gz = gz_open(path, fd, mode);
288gzFile ZEXPORT gzopen_w(
const wchar_t *path,
const char *mode) {
289 return gz_open(path, -2, mode);
294int ZEXPORT gzbuffer(gzFile file,
unsigned size) {
300 state = (gz_statep)file;
301 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
305 if (state->size != 0)
309 if ((size << 1) < size)
318int ZEXPORT gzrewind(gzFile file) {
324 state = (gz_statep)file;
327 if (state->mode != GZ_READ ||
328 (state->err != Z_OK && state->err != Z_BUF_ERROR))
332 if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
339z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset,
int whence) {
347 state = (gz_statep)file;
348 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
352 if (state->err != Z_OK && state->err != Z_BUF_ERROR)
356 if (whence != SEEK_SET && whence != SEEK_CUR)
360 if (whence == SEEK_SET)
361 offset -= state->x.pos;
362 else if (state->seek)
363 offset += state->skip;
367 if (state->mode == GZ_READ && state->how == COPY &&
368 state->x.pos + offset >= 0) {
369 ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR);
376 gz_error(state, Z_OK, NULL);
377 state->strm.avail_in = 0;
378 state->x.pos += offset;
384 if (state->mode != GZ_READ)
386 offset += state->x.pos;
389 if (gzrewind(file) == -1)
394 if (state->mode == GZ_READ) {
395 n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
396 (
unsigned)offset : state->x.have;
406 state->skip = offset;
408 return state->x.pos + offset;
412z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset,
int whence) {
415 ret = gzseek64(file, (z_off64_t)offset, whence);
416 return ret == (z_off_t)ret ? (z_off_t)ret : -1;
420z_off64_t ZEXPORT gztell64(gzFile file) {
426 state = (gz_statep)file;
427 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
431 return state->x.pos + (state->seek ? state->skip : 0);
435z_off_t ZEXPORT gztell(gzFile file) {
438 ret = gztell64(file);
439 return ret == (z_off_t)ret ? (z_off_t)ret : -1;
443z_off64_t ZEXPORT gzoffset64(gzFile file) {
450 state = (gz_statep)file;
451 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
455 offset = LSEEK(state->fd, 0, SEEK_CUR);
458 if (state->mode == GZ_READ)
459 offset -= state->strm.avail_in;
464z_off_t ZEXPORT gzoffset(gzFile file) {
467 ret = gzoffset64(file);
468 return ret == (z_off_t)ret ? (z_off_t)ret : -1;
472int ZEXPORT gzeof(gzFile file) {
478 state = (gz_statep)file;
479 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
483 return state->mode == GZ_READ ? state->past : 0;
487const char * ZEXPORT gzerror(gzFile file,
int *errnum) {
493 state = (gz_statep)file;
494 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
499 *errnum = state->err;
500 return state->err == Z_MEM_ERROR ?
"out of memory" :
501 (state->msg == NULL ?
"" : state->msg);
505void ZEXPORT gzclearerr(gzFile file) {
511 state = (gz_statep)file;
512 if (state->mode != GZ_READ && state->mode != GZ_WRITE)
516 if (state->mode == GZ_READ) {
520 gz_error(state, Z_OK, NULL);
529void ZLIB_INTERNAL gz_error(gz_statep state,
int err,
const char *msg) {
531 if (state->msg != NULL) {
532 if (state->err != Z_MEM_ERROR)
538 if (err != Z_OK && err != Z_BUF_ERROR)
547 if (err == Z_MEM_ERROR)
551 if ((state->msg = (
char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
553 state->err = Z_MEM_ERROR;
556#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
557 (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
558 "%s%s%s", state->path,
": ", msg);
560 strcpy(state->msg, state->path);
561 strcat(state->msg,
": ");
562 strcat(state->msg, msg);
570unsigned ZLIB_INTERNAL gz_intmax(
void) {