diff options
| -rw-r--r-- | gzguts.h | 5 | ||||
| -rw-r--r-- | gzlib.c | 9 | ||||
| -rw-r--r-- | gzread.c | 15 |
3 files changed, 19 insertions, 10 deletions
| @@ -155,9 +155,10 @@ typedef struct { | |||
| 155 | unsigned char *out; /* output buffer (double-sized when reading) */ | 155 | unsigned char *out; /* output buffer (double-sized when reading) */ |
| 156 | int direct; /* 0 if processing gzip, 1 if transparent */ | 156 | int direct; /* 0 if processing gzip, 1 if transparent */ |
| 157 | /* just for reading */ | 157 | /* just for reading */ |
| 158 | int eof; /* true if end of input file reached */ | ||
| 159 | z_off64_t start; /* where the gzip data started, for rewinding */ | ||
| 160 | int how; /* 0: get header, 1: copy, 2: decompress */ | 158 | int how; /* 0: get header, 1: copy, 2: decompress */ |
| 159 | z_off64_t start; /* where the gzip data started, for rewinding */ | ||
| 160 | int eof; /* true if end of input file reached */ | ||
| 161 | int past; /* true if read requested past end */ | ||
| 161 | /* just for writing */ | 162 | /* just for writing */ |
| 162 | int level; /* compression level */ | 163 | int level; /* compression level */ |
| 163 | int strategy; /* compression strategy */ | 164 | int strategy; /* compression strategy */ |
| @@ -78,6 +78,7 @@ local void gz_reset(state) | |||
| 78 | state->x.have = 0; /* no output data available */ | 78 | state->x.have = 0; /* no output data available */ |
| 79 | if (state->mode == GZ_READ) { /* for reading ... */ | 79 | if (state->mode == GZ_READ) { /* for reading ... */ |
| 80 | state->eof = 0; /* not at end of file */ | 80 | state->eof = 0; /* not at end of file */ |
| 81 | state->past = 0; /* have not read past end yet */ | ||
| 81 | state->how = LOOK; /* look for gzip header */ | 82 | state->how = LOOK; /* look for gzip header */ |
| 82 | } | 83 | } |
| 83 | state->seek = 0; /* no seek request pending */ | 84 | state->seek = 0; /* no seek request pending */ |
| @@ -331,6 +332,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) | |||
| 331 | return -1; | 332 | return -1; |
| 332 | state->x.have = 0; | 333 | state->x.have = 0; |
| 333 | state->eof = 0; | 334 | state->eof = 0; |
| 335 | state->past = 0; | ||
| 334 | state->seek = 0; | 336 | state->seek = 0; |
| 335 | gz_error(state, Z_OK, NULL); | 337 | gz_error(state, Z_OK, NULL); |
| 336 | state->strm.avail_in = 0; | 338 | state->strm.avail_in = 0; |
| @@ -453,8 +455,7 @@ int ZEXPORT gzeof(file) | |||
| 453 | return 0; | 455 | return 0; |
| 454 | 456 | ||
| 455 | /* return end-of-file state */ | 457 | /* return end-of-file state */ |
| 456 | return state->mode == GZ_READ ? | 458 | return state->mode == GZ_READ ? state->past : 0; |
| 457 | (state->eof && state->strm.avail_in == 0 && state->x.have == 0) : 0; | ||
| 458 | } | 459 | } |
| 459 | 460 | ||
| 460 | /* -- see zlib.h -- */ | 461 | /* -- see zlib.h -- */ |
| @@ -491,8 +492,10 @@ void ZEXPORT gzclearerr(file) | |||
| 491 | return; | 492 | return; |
| 492 | 493 | ||
| 493 | /* clear error and end-of-file */ | 494 | /* clear error and end-of-file */ |
| 494 | if (state->mode == GZ_READ) | 495 | if (state->mode == GZ_READ) { |
| 495 | state->eof = 0; | 496 | state->eof = 0; |
| 497 | state->past = 0; | ||
| 498 | } | ||
| 496 | gz_error(state, Z_OK, NULL); | 499 | gz_error(state, Z_OK, NULL); |
| 497 | } | 500 | } |
| 498 | 501 | ||
| @@ -329,8 +329,10 @@ int ZEXPORT gzread(file, buf, len) | |||
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | /* output buffer empty -- return if we're at the end of the input */ | 331 | /* output buffer empty -- return if we're at the end of the input */ |
| 332 | else if (state->eof && strm->avail_in == 0) | 332 | else if (state->eof && strm->avail_in == 0) { |
| 333 | state->past = 1; /* tried to read past end */ | ||
| 333 | break; | 334 | break; |
| 335 | } | ||
| 334 | 336 | ||
| 335 | /* need output data -- for small len or new stream load up our output | 337 | /* need output data -- for small len or new stream load up our output |
| 336 | buffer */ | 338 | buffer */ |
| @@ -437,6 +439,7 @@ int ZEXPORT gzungetc(c, file) | |||
| 437 | state->x.next = state->out + (state->size << 1) - 1; | 439 | state->x.next = state->out + (state->size << 1) - 1; |
| 438 | state->x.next[0] = c; | 440 | state->x.next[0] = c; |
| 439 | state->x.pos--; | 441 | state->x.pos--; |
| 442 | state->past = 0; | ||
| 440 | return c; | 443 | return c; |
| 441 | } | 444 | } |
| 442 | 445 | ||
| @@ -458,6 +461,7 @@ int ZEXPORT gzungetc(c, file) | |||
| 458 | state->x.next--; | 461 | state->x.next--; |
| 459 | state->x.next[0] = c; | 462 | state->x.next[0] = c; |
| 460 | state->x.pos--; | 463 | state->x.pos--; |
| 464 | state->past = 0; | ||
| 461 | return c; | 465 | return c; |
| 462 | } | 466 | } |
| 463 | 467 | ||
| @@ -499,9 +503,8 @@ char * ZEXPORT gzgets(file, buf, len) | |||
| 499 | if (state->x.have == 0 && gz_fetch(state) == -1) | 503 | if (state->x.have == 0 && gz_fetch(state) == -1) |
| 500 | return NULL; /* error */ | 504 | return NULL; /* error */ |
| 501 | if (state->x.have == 0) { /* end of file */ | 505 | if (state->x.have == 0) { /* end of file */ |
| 502 | if (buf == str) /* got bupkus */ | 506 | state->past = 1; /* read past end */ |
| 503 | return NULL; | 507 | break; /* return what we have */ |
| 504 | break; /* got something -- return it */ | ||
| 505 | } | 508 | } |
| 506 | 509 | ||
| 507 | /* look for end-of-line in current output buffer */ | 510 | /* look for end-of-line in current output buffer */ |
| @@ -519,7 +522,9 @@ char * ZEXPORT gzgets(file, buf, len) | |||
| 519 | buf += n; | 522 | buf += n; |
| 520 | } while (left && eol == NULL); | 523 | } while (left && eol == NULL); |
| 521 | 524 | ||
| 522 | /* found end-of-line or out of space -- terminate string and return it */ | 525 | /* return terminated string, or if nothing, end of file */ |
| 526 | if (buf == str) | ||
| 527 | return NULL; | ||
| 523 | buf[0] = 0; | 528 | buf[0] = 0; |
| 524 | return str; | 529 | return str; |
| 525 | } | 530 | } |
