diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2011-09-26 22:50:28 -0700 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2011-09-26 22:50:28 -0700 |
commit | acfc85772a811f4c0efec835a3087b53f83f6079 (patch) | |
tree | fda6596291da38d9d3c8eaf5c521413b2b32fcd8 /gzlib.c | |
parent | 8e0d212910a42b3f856bbaebed970e8ddc081ca3 (diff) | |
download | zlib-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.c | 38 |
1 files changed, 21 insertions, 17 deletions
@@ -71,15 +71,15 @@ char ZLIB_INTERNAL *gz_strwinerror (error) | |||
71 | local void gz_reset(state) | 71 | local 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) |