summaryrefslogtreecommitdiff
path: root/gzlib.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-10-12 23:24:31 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-12-11 18:22:04 -0800
commit98f5779f4257682ba9b5fc490557618e3f15f84b (patch)
tree09082da8f556b04ba8aa299cf55eb979a3dfa063 /gzlib.c
parent70e3b1ca56f2ffe8944d3ac0d59b8781127bf94f (diff)
downloadzlib-98f5779f4257682ba9b5fc490557618e3f15f84b.tar.gz
Fix gzeof() to behave just like feof() when read is not past end of file.
Before, gzeof() would return true (accurately) when the last read request went just up to the end of the uncompressed data. In the analogous case, feof() would return false, only returning true when a read request goes past the end of the file. This patch corrects gzeof() to behave in the same way as feof(), as noted in the zlib.h documentation.
Diffstat (limited to 'gzlib.c')
-rw-r--r--gzlib.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/gzlib.c b/gzlib.c
index e53b6ab..d998d07 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -78,6 +78,7 @@ local void gz_reset(state)
state->x.have = 0; /* no output data available */
if (state->mode == GZ_READ) { /* for reading ... */
state->eof = 0; /* not at end of file */
+ state->past = 0; /* have not read past end yet */
state->how = LOOK; /* look for gzip header */
}
state->seek = 0; /* no seek request pending */
@@ -331,6 +332,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
return -1;
state->x.have = 0;
state->eof = 0;
+ state->past = 0;
state->seek = 0;
gz_error(state, Z_OK, NULL);
state->strm.avail_in = 0;
@@ -453,8 +455,7 @@ int ZEXPORT gzeof(file)
return 0;
/* return end-of-file state */
- return state->mode == GZ_READ ?
- (state->eof && state->strm.avail_in == 0 && state->x.have == 0) : 0;
+ return state->mode == GZ_READ ? state->past : 0;
}
/* -- see zlib.h -- */
@@ -491,8 +492,10 @@ void ZEXPORT gzclearerr(file)
return;
/* clear error and end-of-file */
- if (state->mode == GZ_READ)
+ if (state->mode == GZ_READ) {
state->eof = 0;
+ state->past = 0;
+ }
gz_error(state, Z_OK, NULL);
}