example.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:17k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* example.c -- usage example of the zlib compression library
  2.  * Copyright (C) 1995-2003 Jean-loup Gailly.
  3.  * For conditions of distribution and use, see copyright notice in zlib.h
  4.  */
  5. /* @(#) $Id$ */
  6. #include <stdio.h>
  7. #include "zlib.h"
  8. #ifdef STDC
  9. #  include <string.h>
  10. #  include <stdlib.h>
  11. #else
  12.    extern void exit  OF((int));
  13. #endif
  14. #if defined(VMS) || defined(RISCOS)
  15. #  define TESTFILE "foo-gz"
  16. #else
  17. #  define TESTFILE "foo.gz"
  18. #endif
  19. #define CHECK_ERR(err, msg) { 
  20.     if (err != Z_OK) { 
  21.         fprintf(stderr, "%s error: %dn", msg, err); 
  22.         exit(1); 
  23.     } 
  24. }
  25. const char hello[] = "hello, hello!";
  26. /* "hello world" would be more standard, but the repeated "hello"
  27.  * stresses the compression code better, sorry...
  28.  */
  29. const char dictionary[] = "hello";
  30. uLong dictId; /* Adler32 value of the dictionary */
  31. void test_compress      OF((Byte *compr, uLong comprLen,
  32.                             Byte *uncompr, uLong uncomprLen));
  33. void test_gzio          OF((const char *fname,
  34.                             Byte *uncompr, uLong uncomprLen));
  35. void test_deflate       OF((Byte *compr, uLong comprLen));
  36. void test_inflate       OF((Byte *compr, uLong comprLen,
  37.                             Byte *uncompr, uLong uncomprLen));
  38. void test_large_deflate OF((Byte *compr, uLong comprLen,
  39.                             Byte *uncompr, uLong uncomprLen));
  40. void test_large_inflate OF((Byte *compr, uLong comprLen,
  41.                             Byte *uncompr, uLong uncomprLen));
  42. void test_flush         OF((Byte *compr, uLong *comprLen));
  43. void test_sync          OF((Byte *compr, uLong comprLen,
  44.                             Byte *uncompr, uLong uncomprLen));
  45. void test_dict_deflate  OF((Byte *compr, uLong comprLen));
  46. void test_dict_inflate  OF((Byte *compr, uLong comprLen,
  47.                             Byte *uncompr, uLong uncomprLen));
  48. int  main               OF((int argc, char *argv[]));
  49. /* ===========================================================================
  50.  * Test compress() and uncompress()
  51.  */
  52. void test_compress(compr, comprLen, uncompr, uncomprLen)
  53.     Byte *compr, *uncompr;
  54.     uLong comprLen, uncomprLen;
  55. {
  56.     int err;
  57.     uLong len = (uLong)strlen(hello)+1;
  58.     err = compress(compr, &comprLen, (const Bytef*)hello, len);
  59.     CHECK_ERR(err, "compress");
  60.     strcpy((char*)uncompr, "garbage");
  61.     err = uncompress(uncompr, &uncomprLen, compr, comprLen);
  62.     CHECK_ERR(err, "uncompress");
  63.     if (strcmp((char*)uncompr, hello)) {
  64.         fprintf(stderr, "bad uncompressn");
  65.         exit(1);
  66.     } else {
  67.         printf("uncompress(): %sn", (char *)uncompr);
  68.     }
  69. }
  70. /* ===========================================================================
  71.  * Test read/write of .gz files
  72.  */
  73. void test_gzio(fname, uncompr, uncomprLen)
  74.     const char *fname; /* compressed file name */
  75.     Byte *uncompr;
  76.     uLong uncomprLen;
  77. {
  78. #ifdef NO_GZCOMPRESS
  79.     fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compressn");
  80. #else
  81.     int err;
  82.     int len = (int)strlen(hello)+1;
  83.     gzFile file;
  84.     z_off_t pos;
  85.     file = gzopen(fname, "wb");
  86.     if (file == NULL) {
  87.         fprintf(stderr, "gzopen errorn");
  88.         exit(1);
  89.     }
  90.     gzputc(file, 'h');
  91.     if (gzputs(file, "ello") != 4) {
  92.         fprintf(stderr, "gzputs err: %sn", gzerror(file, &err));
  93.         exit(1);
  94.     }
  95.     if (gzprintf(file, ", %s!", "hello") != 8) {
  96.         fprintf(stderr, "gzprintf err: %sn", gzerror(file, &err));
  97.         exit(1);
  98.     }
  99.     gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
  100.     gzclose(file);
  101.     file = gzopen(fname, "rb");
  102.     if (file == NULL) {
  103.         fprintf(stderr, "gzopen errorn");
  104.         exit(1);
  105.     }
  106.     strcpy((char*)uncompr, "garbage");
  107.     if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
  108.         fprintf(stderr, "gzread err: %sn", gzerror(file, &err));
  109.         exit(1);
  110.     }
  111.     if (strcmp((char*)uncompr, hello)) {
  112.         fprintf(stderr, "bad gzread: %sn", (char*)uncompr);
  113.         exit(1);
  114.     } else {
  115.         printf("gzread(): %sn", (char*)uncompr);
  116.     }
  117.     pos = gzseek(file, -8L, SEEK_CUR);
  118.     if (pos != 6 || gztell(file) != pos) {
  119.         fprintf(stderr, "gzseek error, pos=%ld, gztell=%ldn",
  120.                 (long)pos, (long)gztell(file));
  121.         exit(1);
  122.     }
  123.     if (gzgetc(file) != ' ') {
  124.         fprintf(stderr, "gzgetc errorn");
  125.         exit(1);
  126.     }
  127.     if (gzungetc(' ', file) != ' ') {
  128.         fprintf(stderr, "gzungetc errorn");
  129.         exit(1);
  130.     }
  131.     gzgets(file, (char*)uncompr, (int)uncomprLen);
  132.     if (strlen((char*)uncompr) != 7) { /* " hello!" */
  133.         fprintf(stderr, "gzgets err after gzseek: %sn", gzerror(file, &err));
  134.         exit(1);
  135.     }
  136.     if (strcmp((char*)uncompr, hello + 6)) {
  137.         fprintf(stderr, "bad gzgets after gzseekn");
  138.         exit(1);
  139.     } else {
  140.         printf("gzgets() after gzseek: %sn", (char*)uncompr);
  141.     }
  142.     gzclose(file);
  143. #endif
  144. }
  145. /* ===========================================================================
  146.  * Test deflate() with small buffers
  147.  */
  148. void test_deflate(compr, comprLen)
  149.     Byte *compr;
  150.     uLong comprLen;
  151. {
  152.     z_stream c_stream; /* compression stream */
  153.     int err;
  154.     uLong len = (uLong)strlen(hello)+1;
  155.     c_stream.zalloc = (alloc_func)0;
  156.     c_stream.zfree = (free_func)0;
  157.     c_stream.opaque = (voidpf)0;
  158.     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
  159.     CHECK_ERR(err, "deflateInit");
  160.     c_stream.next_in  = (Bytef*)hello;
  161.     c_stream.next_out = compr;
  162.     while (c_stream.total_in != len && c_stream.total_out < comprLen) {
  163.         c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
  164.         err = deflate(&c_stream, Z_NO_FLUSH);
  165.         CHECK_ERR(err, "deflate");
  166.     }
  167.     /* Finish the stream, still forcing small buffers: */
  168.     for (;;) {
  169.         c_stream.avail_out = 1;
  170.         err = deflate(&c_stream, Z_FINISH);
  171.         if (err == Z_STREAM_END) break;
  172.         CHECK_ERR(err, "deflate");
  173.     }
  174.     err = deflateEnd(&c_stream);
  175.     CHECK_ERR(err, "deflateEnd");
  176. }
  177. /* ===========================================================================
  178.  * Test inflate() with small buffers
  179.  */
  180. void test_inflate(compr, comprLen, uncompr, uncomprLen)
  181.     Byte *compr, *uncompr;
  182.     uLong comprLen, uncomprLen;
  183. {
  184.     int err;
  185.     z_stream d_stream; /* decompression stream */
  186.     strcpy((char*)uncompr, "garbage");
  187.     d_stream.zalloc = (alloc_func)0;
  188.     d_stream.zfree = (free_func)0;
  189.     d_stream.opaque = (voidpf)0;
  190.     d_stream.next_in  = compr;
  191.     d_stream.avail_in = 0;
  192.     d_stream.next_out = uncompr;
  193.     err = inflateInit(&d_stream);
  194.     CHECK_ERR(err, "inflateInit");
  195.     while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
  196.         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
  197.         err = inflate(&d_stream, Z_NO_FLUSH);
  198.         if (err == Z_STREAM_END) break;
  199.         CHECK_ERR(err, "inflate");
  200.     }
  201.     err = inflateEnd(&d_stream);
  202.     CHECK_ERR(err, "inflateEnd");
  203.     if (strcmp((char*)uncompr, hello)) {
  204.         fprintf(stderr, "bad inflaten");
  205.         exit(1);
  206.     } else {
  207.         printf("inflate(): %sn", (char *)uncompr);
  208.     }
  209. }
  210. /* ===========================================================================
  211.  * Test deflate() with large buffers and dynamic change of compression level
  212.  */
  213. void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
  214.     Byte *compr, *uncompr;
  215.     uLong comprLen, uncomprLen;
  216. {
  217.     z_stream c_stream; /* compression stream */
  218.     int err;
  219.     c_stream.zalloc = (alloc_func)0;
  220.     c_stream.zfree = (free_func)0;
  221.     c_stream.opaque = (voidpf)0;
  222.     err = deflateInit(&c_stream, Z_BEST_SPEED);
  223.     CHECK_ERR(err, "deflateInit");
  224.     c_stream.next_out = compr;
  225.     c_stream.avail_out = (uInt)comprLen;
  226.     /* At this point, uncompr is still mostly zeroes, so it should compress
  227.      * very well:
  228.      */
  229.     c_stream.next_in = uncompr;
  230.     c_stream.avail_in = (uInt)uncomprLen;
  231.     err = deflate(&c_stream, Z_NO_FLUSH);
  232.     CHECK_ERR(err, "deflate");
  233.     if (c_stream.avail_in != 0) {
  234.         fprintf(stderr, "deflate not greedyn");
  235.         exit(1);
  236.     }
  237.     /* Feed in already compressed data and switch to no compression: */
  238.     deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
  239.     c_stream.next_in = compr;
  240.     c_stream.avail_in = (uInt)comprLen/2;
  241.     err = deflate(&c_stream, Z_NO_FLUSH);
  242.     CHECK_ERR(err, "deflate");
  243.     /* Switch back to compressing mode: */
  244.     deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
  245.     c_stream.next_in = uncompr;
  246.     c_stream.avail_in = (uInt)uncomprLen;
  247.     err = deflate(&c_stream, Z_NO_FLUSH);
  248.     CHECK_ERR(err, "deflate");
  249.     err = deflate(&c_stream, Z_FINISH);
  250.     if (err != Z_STREAM_END) {
  251.         fprintf(stderr, "deflate should report Z_STREAM_ENDn");
  252.         exit(1);
  253.     }
  254.     err = deflateEnd(&c_stream);
  255.     CHECK_ERR(err, "deflateEnd");
  256. }
  257. /* ===========================================================================
  258.  * Test inflate() with large buffers
  259.  */
  260. void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
  261.     Byte *compr, *uncompr;
  262.     uLong comprLen, uncomprLen;
  263. {
  264.     int err;
  265.     z_stream d_stream; /* decompression stream */
  266.     strcpy((char*)uncompr, "garbage");
  267.     d_stream.zalloc = (alloc_func)0;
  268.     d_stream.zfree = (free_func)0;
  269.     d_stream.opaque = (voidpf)0;
  270.     d_stream.next_in  = compr;
  271.     d_stream.avail_in = (uInt)comprLen;
  272.     err = inflateInit(&d_stream);
  273.     CHECK_ERR(err, "inflateInit");
  274.     for (;;) {
  275.         d_stream.next_out = uncompr;            /* discard the output */
  276.         d_stream.avail_out = (uInt)uncomprLen;
  277.         err = inflate(&d_stream, Z_NO_FLUSH);
  278.         if (err == Z_STREAM_END) break;
  279.         CHECK_ERR(err, "large inflate");
  280.     }
  281.     err = inflateEnd(&d_stream);
  282.     CHECK_ERR(err, "inflateEnd");
  283.     if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
  284.         fprintf(stderr, "bad large inflate: %ldn", d_stream.total_out);
  285.         exit(1);
  286.     } else {
  287.         printf("large_inflate(): OKn");
  288.     }
  289. }
  290. /* ===========================================================================
  291.  * Test deflate() with full flush
  292.  */
  293. void test_flush(compr, comprLen)
  294.     Byte *compr;
  295.     uLong *comprLen;
  296. {
  297.     z_stream c_stream; /* compression stream */
  298.     int err;
  299.     uInt len = (uInt)strlen(hello)+1;
  300.     c_stream.zalloc = (alloc_func)0;
  301.     c_stream.zfree = (free_func)0;
  302.     c_stream.opaque = (voidpf)0;
  303.     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
  304.     CHECK_ERR(err, "deflateInit");
  305.     c_stream.next_in  = (Bytef*)hello;
  306.     c_stream.next_out = compr;
  307.     c_stream.avail_in = 3;
  308.     c_stream.avail_out = (uInt)*comprLen;
  309.     err = deflate(&c_stream, Z_FULL_FLUSH);
  310.     CHECK_ERR(err, "deflate");
  311.     compr[3]++; /* force an error in first compressed block */
  312.     c_stream.avail_in = len - 3;
  313.     err = deflate(&c_stream, Z_FINISH);
  314.     if (err != Z_STREAM_END) {
  315.         CHECK_ERR(err, "deflate");
  316.     }
  317.     err = deflateEnd(&c_stream);
  318.     CHECK_ERR(err, "deflateEnd");
  319.     *comprLen = c_stream.total_out;
  320. }
  321. /* ===========================================================================
  322.  * Test inflateSync()
  323.  */
  324. void test_sync(compr, comprLen, uncompr, uncomprLen)
  325.     Byte *compr, *uncompr;
  326.     uLong comprLen, uncomprLen;
  327. {
  328.     int err;
  329.     z_stream d_stream; /* decompression stream */
  330.     strcpy((char*)uncompr, "garbage");
  331.     d_stream.zalloc = (alloc_func)0;
  332.     d_stream.zfree = (free_func)0;
  333.     d_stream.opaque = (voidpf)0;
  334.     d_stream.next_in  = compr;
  335.     d_stream.avail_in = 2; /* just read the zlib header */
  336.     err = inflateInit(&d_stream);
  337.     CHECK_ERR(err, "inflateInit");
  338.     d_stream.next_out = uncompr;
  339.     d_stream.avail_out = (uInt)uncomprLen;
  340.     inflate(&d_stream, Z_NO_FLUSH);
  341.     CHECK_ERR(err, "inflate");
  342.     d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
  343.     err = inflateSync(&d_stream);           /* but skip the damaged part */
  344.     CHECK_ERR(err, "inflateSync");
  345.     err = inflate(&d_stream, Z_FINISH);
  346.     if (err != Z_DATA_ERROR) {
  347.         fprintf(stderr, "inflate should report DATA_ERRORn");
  348.         /* Because of incorrect adler32 */
  349.         exit(1);
  350.     }
  351.     err = inflateEnd(&d_stream);
  352.     CHECK_ERR(err, "inflateEnd");
  353.     printf("after inflateSync(): hel%sn", (char *)uncompr);
  354. }
  355. /* ===========================================================================
  356.  * Test deflate() with preset dictionary
  357.  */
  358. void test_dict_deflate(compr, comprLen)
  359.     Byte *compr;
  360.     uLong comprLen;
  361. {
  362.     z_stream c_stream; /* compression stream */
  363.     int err;
  364.     c_stream.zalloc = (alloc_func)0;
  365.     c_stream.zfree = (free_func)0;
  366.     c_stream.opaque = (voidpf)0;
  367.     err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
  368.     CHECK_ERR(err, "deflateInit");
  369.     err = deflateSetDictionary(&c_stream,
  370.                                (const Bytef*)dictionary, sizeof(dictionary));
  371.     CHECK_ERR(err, "deflateSetDictionary");
  372.     dictId = c_stream.adler;
  373.     c_stream.next_out = compr;
  374.     c_stream.avail_out = (uInt)comprLen;
  375.     c_stream.next_in = (Bytef*)hello;
  376.     c_stream.avail_in = (uInt)strlen(hello)+1;
  377.     err = deflate(&c_stream, Z_FINISH);
  378.     if (err != Z_STREAM_END) {
  379.         fprintf(stderr, "deflate should report Z_STREAM_ENDn");
  380.         exit(1);
  381.     }
  382.     err = deflateEnd(&c_stream);
  383.     CHECK_ERR(err, "deflateEnd");
  384. }
  385. /* ===========================================================================
  386.  * Test inflate() with a preset dictionary
  387.  */
  388. void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
  389.     Byte *compr, *uncompr;
  390.     uLong comprLen, uncomprLen;
  391. {
  392.     int err;
  393.     z_stream d_stream; /* decompression stream */
  394.     strcpy((char*)uncompr, "garbage");
  395.     d_stream.zalloc = (alloc_func)0;
  396.     d_stream.zfree = (free_func)0;
  397.     d_stream.opaque = (voidpf)0;
  398.     d_stream.next_in  = compr;
  399.     d_stream.avail_in = (uInt)comprLen;
  400.     err = inflateInit(&d_stream);
  401.     CHECK_ERR(err, "inflateInit");
  402.     d_stream.next_out = uncompr;
  403.     d_stream.avail_out = (uInt)uncomprLen;
  404.     for (;;) {
  405.         err = inflate(&d_stream, Z_NO_FLUSH);
  406.         if (err == Z_STREAM_END) break;
  407.         if (err == Z_NEED_DICT) {
  408.             if (d_stream.adler != dictId) {
  409.                 fprintf(stderr, "unexpected dictionary");
  410.                 exit(1);
  411.             }
  412.             err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
  413.                                        sizeof(dictionary));
  414.         }
  415.         CHECK_ERR(err, "inflate with dict");
  416.     }
  417.     err = inflateEnd(&d_stream);
  418.     CHECK_ERR(err, "inflateEnd");
  419.     if (strcmp((char*)uncompr, hello)) {
  420.         fprintf(stderr, "bad inflate with dictn");
  421.         exit(1);
  422.     } else {
  423.         printf("inflate with dictionary: %sn", (char *)uncompr);
  424.     }
  425. }
  426. /* ===========================================================================
  427.  * Usage:  example [output.gz  [input.gz]]
  428.  */
  429. int main(argc, argv)
  430.     int argc;
  431.     char *argv[];
  432. {
  433.     Byte *compr, *uncompr;
  434.     uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
  435.     uLong uncomprLen = comprLen;
  436.     static const char* myVersion = ZLIB_VERSION;
  437.     if (zlibVersion()[0] != myVersion[0]) {
  438.         fprintf(stderr, "incompatible zlib versionn");
  439.         exit(1);
  440.     } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
  441.         fprintf(stderr, "warning: different zlib versionn");
  442.     }
  443.     printf("zlib version %s = 0x%04x, compile flags = 0x%lxn",
  444.             ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
  445.     compr    = (Byte*)calloc((uInt)comprLen, 1);
  446.     uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
  447.     /* compr and uncompr are cleared to avoid reading uninitialized
  448.      * data and to ensure that uncompr compresses well.
  449.      */
  450.     if (compr == Z_NULL || uncompr == Z_NULL) {
  451.         printf("out of memoryn");
  452.         exit(1);
  453.     }
  454.     test_compress(compr, comprLen, uncompr, uncomprLen);
  455.     test_gzio((argc > 1 ? argv[1] : TESTFILE),
  456.               uncompr, uncomprLen);
  457.     test_deflate(compr, comprLen);
  458.     test_inflate(compr, comprLen, uncompr, uncomprLen);
  459.     test_large_deflate(compr, comprLen, uncompr, uncomprLen);
  460.     test_large_inflate(compr, comprLen, uncompr, uncomprLen);
  461.     test_flush(compr, &comprLen);
  462.     test_sync(compr, comprLen, uncompr, uncomprLen);
  463.     comprLen = uncomprLen;
  464.     test_dict_deflate(compr, comprLen);
  465.     test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
  466.     free(compr);
  467.     free(uncompr);
  468.     return 0;
  469. }