diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:26:58 -0700 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:26:58 -0700 |
commit | dc5a43ebfadb6b775f6e64bfeb5a461c66acb394 (patch) | |
tree | 00e122ba59ad883db198dc6adf24d020cac924d3 /examples/gun.c | |
parent | d004b047838a7e803818b4973a2e39e0ff8c1fa2 (diff) | |
download | zlib-1.2.3.6.tar.gz zlib-1.2.3.6.tar.bz2 zlib-1.2.3.6.zip |
zlib 1.2.3.6v1.2.3.6
Diffstat (limited to 'examples/gun.c')
-rw-r--r-- | examples/gun.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/examples/gun.c b/examples/gun.c index bfec590..72b0882 100644 --- a/examples/gun.c +++ b/examples/gun.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* gun.c -- simple gunzip to give an example of the use of inflateBack() | 1 | /* gun.c -- simple gunzip to give an example of the use of inflateBack() |
2 | * Copyright (C) 2003, 2005 Mark Adler | 2 | * Copyright (C) 2003, 2005, 2008, 2010 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | Version 1.3 12 June 2005 Mark Adler */ | 4 | Version 1.6 17 January 2010 Mark Adler */ |
5 | 5 | ||
6 | /* Version history: | 6 | /* Version history: |
7 | 1.0 16 Feb 2003 First version for testing of inflateBack() | 7 | 1.0 16 Feb 2003 First version for testing of inflateBack() |
@@ -15,6 +15,9 @@ | |||
15 | 1.2 20 Mar 2005 Add Unix compress (LZW) decompression | 15 | 1.2 20 Mar 2005 Add Unix compress (LZW) decompression |
16 | Copy file attributes from input file to output file | 16 | Copy file attributes from input file to output file |
17 | 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] | 17 | 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] |
18 | 1.4 8 Dec 2006 LZW decompression speed improvements | ||
19 | 1.5 9 Feb 2008 Avoid warning in latest version of gcc | ||
20 | 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings | ||
18 | */ | 21 | */ |
19 | 22 | ||
20 | /* | 23 | /* |
@@ -197,14 +200,14 @@ local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, | |||
197 | int outfile, z_stream *strm) | 200 | int outfile, z_stream *strm) |
198 | { | 201 | { |
199 | int last; /* last byte read by NEXT(), or -1 if EOF */ | 202 | int last; /* last byte read by NEXT(), or -1 if EOF */ |
200 | int chunk; /* bytes left in current chunk */ | 203 | unsigned chunk; /* bytes left in current chunk */ |
201 | int left; /* bits left in rem */ | 204 | int left; /* bits left in rem */ |
202 | unsigned rem; /* unused bits from input */ | 205 | unsigned rem; /* unused bits from input */ |
203 | int bits; /* current bits per code */ | 206 | int bits; /* current bits per code */ |
204 | unsigned code; /* code, table traversal index */ | 207 | unsigned code; /* code, table traversal index */ |
205 | unsigned mask; /* mask for current bits codes */ | 208 | unsigned mask; /* mask for current bits codes */ |
206 | int max; /* maximum bits per code for this stream */ | 209 | int max; /* maximum bits per code for this stream */ |
207 | int flags; /* compress flags, then block compress flag */ | 210 | unsigned flags; /* compress flags, then block compress flag */ |
208 | unsigned end; /* last valid entry in prefix/suffix tables */ | 211 | unsigned end; /* last valid entry in prefix/suffix tables */ |
209 | unsigned temp; /* current code */ | 212 | unsigned temp; /* current code */ |
210 | unsigned prev; /* previous code */ | 213 | unsigned prev; /* previous code */ |
@@ -212,6 +215,7 @@ local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, | |||
212 | unsigned stack; /* next position for reversed string */ | 215 | unsigned stack; /* next position for reversed string */ |
213 | unsigned outcnt; /* bytes in output buffer */ | 216 | unsigned outcnt; /* bytes in output buffer */ |
214 | struct outd outd; /* output structure */ | 217 | struct outd outd; /* output structure */ |
218 | unsigned char *p; | ||
215 | 219 | ||
216 | /* set up output */ | 220 | /* set up output */ |
217 | outd.outfile = outfile; | 221 | outd.outfile = outfile; |
@@ -322,10 +326,12 @@ local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, | |||
322 | } | 326 | } |
323 | 327 | ||
324 | /* walk through linked list to generate output in reverse order */ | 328 | /* walk through linked list to generate output in reverse order */ |
329 | p = match + stack; | ||
325 | while (code >= 256) { | 330 | while (code >= 256) { |
326 | match[stack++] = suffix[code]; | 331 | *p++ = suffix[code]; |
327 | code = prefix[code]; | 332 | code = prefix[code]; |
328 | } | 333 | } |
334 | stack = p - match; | ||
329 | match[stack++] = (unsigned char)code; | 335 | match[stack++] = (unsigned char)code; |
330 | final = code; | 336 | final = code; |
331 | 337 | ||
@@ -349,9 +355,11 @@ local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, | |||
349 | } | 355 | } |
350 | outcnt = 0; | 356 | outcnt = 0; |
351 | } | 357 | } |
358 | p = match + stack; | ||
352 | do { | 359 | do { |
353 | outbuf[outcnt++] = match[--stack]; | 360 | outbuf[outcnt++] = *--p; |
354 | } while (stack); | 361 | } while (p > match); |
362 | stack = 0; | ||
355 | 363 | ||
356 | /* loop for next code with final and prev as the last match, rem and | 364 | /* loop for next code with final and prev as the last match, rem and |
357 | left provide the first 0..7 bits of the next code, end is the last | 365 | left provide the first 0..7 bits of the next code, end is the last |
@@ -375,7 +383,7 @@ local int gunpipe(z_stream *strm, int infile, int outfile) | |||
375 | { | 383 | { |
376 | int ret, first, last; | 384 | int ret, first, last; |
377 | unsigned have, flags, len; | 385 | unsigned have, flags, len; |
378 | unsigned char *next; | 386 | unsigned char *next = NULL; |
379 | struct ind ind, *indp; | 387 | struct ind ind, *indp; |
380 | struct outd outd; | 388 | struct outd outd; |
381 | 389 | ||
@@ -471,10 +479,10 @@ local int gunpipe(z_stream *strm, int infile, int outfile) | |||
471 | 479 | ||
472 | /* check trailer */ | 480 | /* check trailer */ |
473 | ret = Z_BUF_ERROR; | 481 | ret = Z_BUF_ERROR; |
474 | if (NEXT() != (outd.crc & 0xff) || | 482 | if (NEXT() != (int)(outd.crc & 0xff) || |
475 | NEXT() != ((outd.crc >> 8) & 0xff) || | 483 | NEXT() != (int)((outd.crc >> 8) & 0xff) || |
476 | NEXT() != ((outd.crc >> 16) & 0xff) || | 484 | NEXT() != (int)((outd.crc >> 16) & 0xff) || |
477 | NEXT() != ((outd.crc >> 24) & 0xff)) { | 485 | NEXT() != (int)((outd.crc >> 24) & 0xff)) { |
478 | /* crc error */ | 486 | /* crc error */ |
479 | if (last != -1) { | 487 | if (last != -1) { |
480 | strm->msg = (char *)"incorrect data check"; | 488 | strm->msg = (char *)"incorrect data check"; |
@@ -482,10 +490,10 @@ local int gunpipe(z_stream *strm, int infile, int outfile) | |||
482 | } | 490 | } |
483 | break; | 491 | break; |
484 | } | 492 | } |
485 | if (NEXT() != (outd.total & 0xff) || | 493 | if (NEXT() != (int)(outd.total & 0xff) || |
486 | NEXT() != ((outd.total >> 8) & 0xff) || | 494 | NEXT() != (int)((outd.total >> 8) & 0xff) || |
487 | NEXT() != ((outd.total >> 16) & 0xff) || | 495 | NEXT() != (int)((outd.total >> 16) & 0xff) || |
488 | NEXT() != ((outd.total >> 24) & 0xff)) { | 496 | NEXT() != (int)((outd.total >> 24) & 0xff)) { |
489 | /* length error */ | 497 | /* length error */ |
490 | if (last != -1) { | 498 | if (last != -1) { |
491 | strm->msg = (char *)"incorrect length check"; | 499 | strm->msg = (char *)"incorrect length check"; |
@@ -642,8 +650,8 @@ int main(int argc, char **argv) | |||
642 | argv++; | 650 | argv++; |
643 | test = 0; | 651 | test = 0; |
644 | if (argc && strcmp(*argv, "-h") == 0) { | 652 | if (argc && strcmp(*argv, "-h") == 0) { |
645 | fprintf(stderr, "gun 1.3 (12 Jun 2005)\n"); | 653 | fprintf(stderr, "gun 1.6 (17 Jan 2010)\n"); |
646 | fprintf(stderr, "Copyright (c) 2005 Mark Adler\n"); | 654 | fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n"); |
647 | fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); | 655 | fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); |
648 | return 0; | 656 | return 0; |
649 | } | 657 | } |