summaryrefslogtreecommitdiff
path: root/gzlib.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-26 22:50:28 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-26 22:50:28 -0700
commitacfc85772a811f4c0efec835a3087b53f83f6079 (patch)
treefda6596291da38d9d3c8eaf5c521413b2b32fcd8 /gzlib.c
parent8e0d212910a42b3f856bbaebed970e8ddc081ca3 (diff)
downloadzlib-acfc85772a811f4c0efec835a3087b53f83f6079.tar.gz
zlib-acfc85772a811f4c0efec835a3087b53f83f6079.tar.bz2
zlib-acfc85772a811f4c0efec835a3087b53f83f6079.zip
Change gzgetc() to a macro for speed (~40% speedup in testing).
Diffstat (limited to 'gzlib.c')
-rw-r--r--gzlib.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/gzlib.c b/gzlib.c
index b26b0c2..61da8fd 100644
--- a/gzlib.c
+++ b/gzlib.c
@@ -71,15 +71,15 @@ char ZLIB_INTERNAL *gz_strwinerror (error)
71local void gz_reset(state) 71local void gz_reset(state)
72 gz_statep state; 72 gz_statep state;
73{ 73{
74 state->x.have = 0; /* no output data available */
74 if (state->mode == GZ_READ) { /* for reading ... */ 75 if (state->mode == GZ_READ) { /* for reading ... */
75 state->have = 0; /* no output data available */
76 state->eof = 0; /* not at end of file */ 76 state->eof = 0; /* not at end of file */
77 state->how = LOOK; /* look for gzip header */ 77 state->how = LOOK; /* look for gzip header */
78 state->direct = 1; /* default for empty file */ 78 state->direct = 1; /* default for empty file */
79 } 79 }
80 state->seek = 0; /* no seek request pending */ 80 state->seek = 0; /* no seek request pending */
81 gz_error(state, Z_OK, NULL); /* clear error */ 81 gz_error(state, Z_OK, NULL); /* clear error */
82 state->pos = 0; /* no uncompressed data yet */ 82 state->x.pos = 0; /* no uncompressed data yet */
83 state->strm.avail_in = 0; /* no input data yet */ 83 state->strm.avail_in = 0; /* no input data yet */
84} 84}
85 85
@@ -303,31 +303,31 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
303 303
304 /* normalize offset to a SEEK_CUR specification */ 304 /* normalize offset to a SEEK_CUR specification */
305 if (whence == SEEK_SET) 305 if (whence == SEEK_SET)
306 offset -= state->pos; 306 offset -= state->x.pos;
307 else if (state->seek) 307 else if (state->seek)
308 offset += state->skip; 308 offset += state->skip;
309 state->seek = 0; 309 state->seek = 0;
310 310
311 /* if within raw area while reading, just go there */ 311 /* if within raw area while reading, just go there */
312 if (state->mode == GZ_READ && state->how == COPY && 312 if (state->mode == GZ_READ && state->how == COPY &&
313 state->pos + offset >= 0) { 313 state->x.pos + offset >= 0) {
314 ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); 314 ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
315 if (ret == -1) 315 if (ret == -1)
316 return -1; 316 return -1;
317 state->have = 0; 317 state->x.have = 0;
318 state->eof = 0; 318 state->eof = 0;
319 state->seek = 0; 319 state->seek = 0;
320 gz_error(state, Z_OK, NULL); 320 gz_error(state, Z_OK, NULL);
321 state->strm.avail_in = 0; 321 state->strm.avail_in = 0;
322 state->pos += offset; 322 state->x.pos += offset;
323 return state->pos; 323 return state->x.pos;
324 } 324 }
325 325
326 /* calculate skip amount, rewinding if needed for back seek when reading */ 326 /* calculate skip amount, rewinding if needed for back seek when reading */
327 if (offset < 0) { 327 if (offset < 0) {
328 if (state->mode != GZ_READ) /* writing -- can't go backwards */ 328 if (state->mode != GZ_READ) /* writing -- can't go backwards */
329 return -1; 329 return -1;
330 offset += state->pos; 330 offset += state->x.pos;
331 if (offset < 0) /* before start of file! */ 331 if (offset < 0) /* before start of file! */
332 return -1; 332 return -1;
333 if (gzrewind(file) == -1) /* rewind, then skip to offset */ 333 if (gzrewind(file) == -1) /* rewind, then skip to offset */
@@ -336,11 +336,11 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
336 336
337 /* if reading, skip what's in output buffer (one less gzgetc() check) */ 337 /* if reading, skip what's in output buffer (one less gzgetc() check) */
338 if (state->mode == GZ_READ) { 338 if (state->mode == GZ_READ) {
339 n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? 339 n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
340 (unsigned)offset : state->have; 340 (unsigned)offset : state->x.have;
341 state->have -= n; 341 state->x.have -= n;
342 state->next += n; 342 state->x.next += n;
343 state->pos += n; 343 state->x.pos += n;
344 offset -= n; 344 offset -= n;
345 } 345 }
346 346
@@ -349,7 +349,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
349 state->seek = 1; 349 state->seek = 1;
350 state->skip = offset; 350 state->skip = offset;
351 } 351 }
352 return state->pos + offset; 352 return state->x.pos + offset;
353} 353}
354 354
355/* -- see zlib.h -- */ 355/* -- see zlib.h -- */
@@ -378,7 +378,7 @@ z_off64_t ZEXPORT gztell64(file)
378 return -1; 378 return -1;
379 379
380 /* return position */ 380 /* return position */
381 return state->pos + (state->seek ? state->skip : 0); 381 return state->x.pos + (state->seek ? state->skip : 0);
382} 382}
383 383
384/* -- see zlib.h -- */ 384/* -- see zlib.h -- */
@@ -439,7 +439,7 @@ int ZEXPORT gzeof(file)
439 439
440 /* return end-of-file state */ 440 /* return end-of-file state */
441 return state->mode == GZ_READ ? 441 return state->mode == GZ_READ ?
442 (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; 442 (state->eof && state->strm.avail_in == 0 && state->x.have == 0) : 0;
443} 443}
444 444
445/* -- see zlib.h -- */ 445/* -- see zlib.h -- */
@@ -499,6 +499,10 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
499 state->msg = NULL; 499 state->msg = NULL;
500 } 500 }
501 501
502 /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
503 if (err != Z_OK && err != Z_BUF_ERROR)
504 state->x.have = 0;
505
502 /* set error code, and if no message, then done */ 506 /* set error code, and if no message, then done */
503 state->err = err; 507 state->err = err;
504 if (msg == NULL) 508 if (msg == NULL)