bszlib.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:275k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       BusinessSkinForm                                            }
  5. {                                                                   }
  6. {       Copyright (c) 2000-2004 Almediadev                          }
  7. {       ALL RIGHTS RESERVED                                         }
  8. {                                                                   }
  9. {       Home:  http://www.almdev.com                                }
  10. {       Support: support@almdev.com                                 }
  11. {                                                                   }
  12. {*******************************************************************}
  13. { Original:
  14.   zlib.h -- interface of the 'zlib' general purpose compression library
  15.   version 1.1.2, Mar, 1998
  16.   Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
  17.   This software is provided 'as-is', without any express or implied
  18.   warranty.  In no event will the authors be held liable for any damages
  19.   arising from the use of this software.
  20.   Permission is granted to anyone to use this software for any purpose,
  21.   including commercial applications, and to alter it and redistribute it
  22.   freely, subject to the following restrictions:
  23.   1. The origin of this software must not be misrepresented; you must not
  24.      claim that you wrote the original software. If you use this software
  25.      in a product, an acknowledgment in the product documentation would be
  26.      appreciated but is not required.
  27.   2. Altered source versions must be plainly marked as such, and must not be
  28.      misrepresented as being the original software.
  29.   3. This notice may not be removed or altered from any source distribution.
  30.   Jean-loup Gailly        Mark Adler
  31.   jloup@gzip.org          madler@alumni.caltech.edu
  32.   The data format used by the zlib library is described by RFCs (Request for
  33.   Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
  34.   (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
  35.   Pascal tranlastion
  36.   Copyright (C) 1998 by Jacques Nomssi Nzali
  37. }
  38. unit bszlib;
  39. {$WARNINGS OFF}
  40. {$HINTS OFF}
  41. {$T-}
  42. {$define patch112}        { apply patch from the zlib home page }
  43. {$define ORG_DEBUG}
  44. {$DEFINE MAX_MATCH_IS_258}
  45. interface
  46. type
  47.   {Byte   = usigned char;  8 bits}
  48.   Bytef  = byte;
  49.   charf  = byte;
  50.   int    = integer;
  51.   intf   = int;
  52.   uInt   = cardinal;     { 16 bits or more }
  53.   uIntf  = uInt;
  54.   Long   = longint;
  55.   uLong  = LongInt;      { 32 bits or more }
  56.   uLongf = uLong;
  57.   voidp  = pointer;
  58.   voidpf = voidp;
  59.   pBytef = ^Bytef;
  60.   pIntf  = ^intf;
  61.   puIntf = ^uIntf;
  62.   puLong = ^uLongf;
  63.   ptr2int = uInt;
  64. { a pointer to integer casting is used to do pointer arithmetic.
  65.   ptr2int must be an integer type and sizeof(ptr2int) must be less
  66.   than sizeof(pointer) - Nomssi }
  67. type
  68.   zByteArray = array[0..(MaxInt div SizeOf(Bytef))-1] of Bytef;
  69.   pzByteArray = ^zByteArray;
  70. type
  71.   zIntfArray = array[0..(MaxInt div SizeOf(Intf))-1] of Intf;
  72.   pzIntfArray = ^zIntfArray;
  73. type
  74.   zuIntArray = array[0..(MaxInt div SizeOf(uInt))-1] of uInt;
  75.   PuIntArray = ^zuIntArray;
  76. { Type declarations - only for deflate }
  77. type
  78.   uch  = Byte;
  79.   uchf = uch; { FAR }
  80.   ush  = Word;
  81.   ushf = ush;
  82.   ulg  = LongInt;
  83.   unsigned = uInt;
  84.   pcharf = ^charf;
  85.   puchf = ^uchf;
  86.   pushf = ^ushf;
  87. type
  88.   zuchfArray = zByteArray;
  89.   puchfArray = ^zuchfArray;
  90. type
  91.   zushfArray = array[0..(MaxInt div SizeOf(ushf))-1] of ushf;
  92.   pushfArray = ^zushfArray;
  93. procedure zmemcpy(destp : pBytef; sourcep : pBytef; len : uInt);
  94. function zmemcmp(s1p, s2p : pBytef; len : uInt) : int;
  95. procedure zmemzero(destp : pBytef; len : uInt);
  96. procedure zcfree(opaque : voidpf; ptr : voidpf);
  97. function zcalloc (opaque : voidpf; items : uInt; size : uInt) : voidpf;
  98. { zlib.h }
  99. { Maximum value for memLevel in deflateInit2 }
  100. const
  101.   MAX_MEM_LEVEL = 9;
  102.   DEF_MEM_LEVEL = 8; { if MAX_MEM_LEVEL > 8 }
  103. { Maximum value for windowBits in deflateInit2 and inflateInit2 }
  104. const
  105.   MAX_WBITS = 15; { 32K LZ77 window }
  106. { default windowBits for decompression. MAX_WBITS is for compression only }
  107. const
  108.   DEF_WBITS = MAX_WBITS;
  109. { The memory requirements for deflate are (in bytes):
  110.             1 shl (windowBits+2)   +  1 shl (memLevel+9)
  111.  that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
  112.  plus a few kilobytes for small objects. For example, if you want to reduce
  113.  the default memory requirements from 256K to 128K, compile with
  114.      DMAX_WBITS=14 DMAX_MEM_LEVEL=7
  115.  Of course this will generally degrade compression (there's no free lunch).
  116.  The memory requirements for inflate are (in bytes) 1 shl windowBits
  117.  that is, 32K for windowBits=15 (default value) plus a few kilobytes
  118.  for small objects. }
  119. { Huffman code lookup table entry--this entry is four bytes for machines
  120.   that have 16-bit pointers (e.g. PC's in the small or medium model). }
  121. type
  122.   pInflate_huft = ^inflate_huft;
  123.   inflate_huft = Record
  124.     Exop,             { number of extra bits or operation }
  125.     bits : Byte;      { number of bits in this code or subcode }
  126.     {pad : uInt;}       { pad structure to a power of 2 (4 bytes for }
  127.                       {  16-bit, 8 bytes for 32-bit int's) }
  128.     base : uInt;      { literal, length base, or distance base }
  129.                       { or table offset }
  130.   End;
  131. type
  132.   huft_field = Array[0..(MaxInt div SizeOf(inflate_huft))-1] of inflate_huft;
  133.   huft_ptr = ^huft_field;
  134. type
  135.   ppInflate_huft = ^pInflate_huft;
  136. type
  137.   inflate_codes_mode = ( { waiting for "i:"=input, "o:"=output, "x:"=nothing }
  138.         START,    { x: set up for LEN }
  139.         LEN,      { i: get length/literal/eob next }
  140.         LENEXT,   { i: getting length extra (have base) }
  141.         DIST,     { i: get distance next }
  142.         DISTEXT,  { i: getting distance extra }
  143.         COPY,     { o: copying bytes in window, waiting for space }
  144.         LIT,      { o: got literal, waiting for output space }
  145.         WASH,     { o: got eob, possibly still output waiting }
  146.         ZEND,     { x: got eob and all data flushed }
  147.         BADCODE); { x: got error }
  148. { inflate codes private state }
  149. type
  150.   pInflate_codes_state = ^inflate_codes_state;
  151.   inflate_codes_state = record
  152.     mode : inflate_codes_mode;        { current inflate_codes mode }
  153.     { mode dependent information }
  154.     len : uInt;
  155.     sub : record                      { submode }
  156.       Case Byte of
  157.       0:(code : record                { if LEN or DIST, where in tree }
  158.           tree : pInflate_huft;       { pointer into tree }
  159.           need : uInt;                { bits needed }
  160.          end);
  161.       1:(lit : uInt);                 { if LIT, literal }
  162.       2:(copy: record                 { if EXT or COPY, where and how much }
  163.            get : uInt;                { bits to get for extra }
  164.            dist : uInt;               { distance back to copy from }
  165.          end);
  166.     end;
  167.     { mode independent information }
  168.     lbits : Byte;                     { ltree bits decoded per branch }
  169.     dbits : Byte;                     { dtree bits decoder per branch }
  170.     ltree : pInflate_huft;            { literal/length/eob tree }
  171.     dtree : pInflate_huft;            { distance tree }
  172.   end;
  173. type
  174.   check_func = function(check : uLong;
  175.                         buf : pBytef;
  176.                         {const buf : array of byte;}
  177.                 len : uInt) : uLong;
  178. type
  179.   inflate_block_mode =
  180.      (ZTYPE,    { get type bits (3, including end bit) }
  181.       LENS,     { get lengths for stored }
  182.       STORED,   { processing stored block }
  183.       TABLE,    { get table lengths }
  184.       BTREE,    { get bit lengths tree for a dynamic block }
  185.       DTREE,    { get length, distance trees for a dynamic block }
  186.       CODES,    { processing fixed or dynamic block }
  187.       DRY,      { output remaining window bytes }
  188.       BLKDONE,  { finished last block, done }
  189.       BLKBAD);  { got a data error--stuck here }
  190. type
  191.   pInflate_blocks_state = ^inflate_blocks_state;
  192. { inflate blocks semi-private state }
  193.   inflate_blocks_state = record
  194.     mode : inflate_block_mode;     { current inflate_block mode }
  195.     { mode dependent information }
  196.     sub : record                  { submode }
  197.     case Byte of
  198.     0:(left : uInt);              { if STORED, bytes left to copy }
  199.     1:(trees : record             { if DTREE, decoding info for trees }
  200.         table : uInt;               { table lengths (14 bits) }
  201.         index : uInt;               { index into blens (or border) }
  202.         blens : PuIntArray;         { bit lengths of codes }
  203.         bb : uInt;                  { bit length tree depth }
  204.         tb : pInflate_huft;         { bit length decoding tree }
  205.       end);
  206.     2:(decode : record            { if CODES, current state }
  207.         tl : pInflate_huft;
  208.         td : pInflate_huft;         { trees to free }
  209.         codes : pInflate_codes_state;
  210.       end);
  211.     end;
  212.     last : boolean;               { true if this block is the last block }
  213.     { mode independent information }
  214.     bitk : uInt;            { bits in bit buffer }
  215.     bitb : uLong;           { bit buffer }
  216.     hufts : huft_ptr; {pInflate_huft;}  { single malloc for tree space }
  217.     window : pBytef;        { sliding window }
  218.     zend : pBytef;          { one byte after sliding window }
  219.     read : pBytef;          { window read pointer }
  220.     write : pBytef;         { window write pointer }
  221.     checkfn : check_func;   { check function }
  222.     check : uLong;          { check on output }
  223.   end;
  224. type
  225.   inflate_mode = (
  226.       METHOD,   { waiting for method byte }
  227.       FLAG,     { waiting for flag byte }
  228.       DICT4,    { four dictionary check bytes to go }
  229.       DICT3,    { three dictionary check bytes to go }
  230.       DICT2,    { two dictionary check bytes to go }
  231.       DICT1,    { one dictionary check byte to go }
  232.       DICT0,    { waiting for inflateSetDictionary }
  233.       BLOCKS,   { decompressing blocks }
  234.       CHECK4,   { four check bytes to go }
  235.       CHECK3,   { three check bytes to go }
  236.       CHECK2,   { two check bytes to go }
  237.       CHECK1,   { one check byte to go }
  238.       DONE,     { finished check, done }
  239.       BAD);     { got an error--stay here }
  240. { inflate private state }
  241. type
  242.   pInternal_state = ^internal_state; { or point to a deflate_state record }
  243.   internal_state = record
  244.      mode : inflate_mode;  { current inflate mode }
  245.      { mode dependent information }
  246.      sub : record          { submode }
  247.        case byte of
  248.        0:(method : uInt);  { if FLAGS, method byte }
  249.        1:(check : record   { if CHECK, check values to compare }
  250.            was : uLong;        { computed check value }
  251.            need : uLong;       { stream check value }
  252.           end);
  253.        2:(marker : uInt);  { if BAD, inflateSync's marker bytes count }
  254.      end;
  255.      { mode independent information }
  256.      nowrap : boolean;      { flag for no wrapper }
  257.      wbits : uInt;          { log2(window size)  (8..15, defaults to 15) }
  258.      blocks : pInflate_blocks_state;    { current inflate_blocks state }
  259.    end;
  260. type
  261.   alloc_func = function(opaque : voidpf; items : uInt; size : uInt) : voidpf;
  262.   free_func = procedure(opaque : voidpf; address : voidpf);
  263. type
  264.   z_streamp = ^z_stream;
  265.   z_stream = record
  266.     next_in : pBytef;     { next input byte }
  267.     avail_in : uInt;      { number of bytes available at next_in }
  268.     total_in : uLong;     { total nb of input bytes read so far }
  269.     next_out : pBytef;    { next output byte should be put there }
  270.     avail_out : uInt;     { remaining free space at next_out }
  271.     total_out : uLong;    { total nb of bytes output so far }
  272.     msg : string;         { last error message, '' if no error }
  273.     state : pInternal_state; { not visible by applications }
  274.     zalloc : alloc_func;  { used to allocate the internal state }
  275.     zfree : free_func;    { used to free the internal state }
  276.     opaque : voidpf;      { private data object passed to zalloc and zfree }
  277.     data_type : int;      { best guess about the data type: ascii or binary }
  278.     adler : uLong;        { adler32 value of the uncompressed data }
  279.     reserved : uLong;     { reserved for future use }
  280.   end;
  281. {  The application must update next_in and avail_in when avail_in has
  282.    dropped to zero. It must update next_out and avail_out when avail_out
  283.    has dropped to zero. The application must initialize zalloc, zfree and
  284.    opaque before calling the init function. All other fields are set by the
  285.    compression library and must not be updated by the application.
  286.    The opaque value provided by the application will be passed as the first
  287.    parameter for calls of zalloc and zfree. This can be useful for custom
  288.    memory management. The compression library attaches no meaning to the
  289.    opaque value.
  290.    zalloc must return Z_NULL if there is not enough memory for the object.
  291.    On 16-bit systems, the functions zalloc and zfree must be able to allocate
  292.    exactly 65536 bytes, but will not be required to allocate more than this
  293.    if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
  294.    pointers returned by zalloc for objects of exactly 65536 bytes *must*
  295.    have their offset normalized to zero. The default allocation function
  296.    provided by this library ensures this (see zutil.c). To reduce memory
  297.    requirements and avoid any allocation of 64K objects, at the expense of
  298.    compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
  299.    The fields total_in and total_out can be used for statistics or
  300.    progress reports. After compression, total_in holds the total size of
  301.    the uncompressed data and may be saved for use in the decompressor
  302.    (particularly if the decompressor wants to decompress everything in
  303.    a single step). }
  304. const  { constants }
  305.    Z_NO_FLUSH      = 0;
  306.    Z_PARTIAL_FLUSH = 1;
  307.    Z_SYNC_FLUSH    = 2;
  308.    Z_FULL_FLUSH    = 3;
  309.    Z_FINISH        = 4;
  310. { Allowed flush values; see deflate() below for details }
  311.    Z_OK            = 0;
  312.    Z_STREAM_END    = 1;
  313.    Z_NEED_DICT     = 2;
  314.    Z_ERRNO         = (-1);
  315.    Z_STREAM_ERROR  = (-2);
  316.    Z_DATA_ERROR    = (-3);
  317.    Z_MEM_ERROR     = (-4);
  318.    Z_BUF_ERROR     = (-5);
  319.    Z_VERSION_ERROR = (-6);
  320. { Return codes for the compression/decompression functions. Negative
  321.   values are errors, positive values are used for special but normal events.}
  322.    Z_NO_COMPRESSION         = 0;
  323.    Z_BEST_SPEED             = 1;
  324.    Z_BEST_COMPRESSION       = 9;
  325.    Z_DEFAULT_COMPRESSION    = (-1);
  326. { compression levels }
  327.    Z_FILTERED            = 1;
  328.    Z_HUFFMAN_ONLY        = 2;
  329.    Z_DEFAULT_STRATEGY    = 0;
  330. { compression strategy; see deflateInit2() below for details }
  331.    Z_BINARY   = 0;
  332.    Z_ASCII    = 1;
  333.    Z_UNKNOWN  = 2;
  334. { Possible values of the data_type field }
  335.    Z_DEFLATED   = 8;
  336. { The deflate compression method (the only one supported in this version) }
  337.    Z_NULL  = NIL;  { for initializing zalloc, zfree, opaque }
  338.   {$IFDEF GZIO}
  339. var
  340.   errno : int;
  341.   {$ENDIF}
  342.         { common constants }
  343. { The three kinds of block type }
  344. const
  345.   STORED_BLOCK = 0;
  346.   STATIC_TREES = 1;
  347.   DYN_TREES = 2;
  348. { The minimum and maximum match lengths }
  349. const
  350.   MIN_MATCH = 3;
  351. {$ifdef MAX_MATCH_IS_258}
  352.   MAX_MATCH = 258;
  353. {$else}
  354.   MAX_MATCH = ??;    { deliberate syntax error }
  355. {$endif}
  356.   MIN_LOOKAHEAD = (MAX_MATCH+MIN_MATCH+1);
  357. const
  358.   PRESET_DICT = $20; { preset dictionary flag in zlib header }
  359.   {$IFDEF DEBUG}
  360.   procedure Assert(cond : boolean; msg : string);
  361.   {$ENDIF}
  362.   procedure Trace(x : string);
  363.   procedure Tracev(x : string);
  364.   procedure Tracevv(x : string);
  365.   procedure Tracevvv(x : string);
  366.   procedure Tracec(c : boolean; x : string);
  367.   procedure Tracecv(c : boolean; x : string);
  368. function zlibVersion : string;
  369. { The application can compare zlibVersion and ZLIB_VERSION for consistency.
  370.   If the first character differs, the library code actually used is
  371.   not compatible with the zlib.h header file used by the application.
  372.   This check is automatically made by deflateInit and inflateInit. }
  373. function zError(err : int) : string;
  374. function ZALLOC (var strm : z_stream; items : uInt; size : uInt) : voidpf;
  375. procedure ZFREE (var strm : z_stream; ptr : voidpf);
  376. procedure TRY_FREE (var strm : z_stream; ptr : voidpf);
  377. const
  378.   ZLIB_VERSION : string[10] = '1.1.2';
  379. const
  380.   z_errbase = Z_NEED_DICT;
  381.   z_errmsg : Array[0..9] of string[21] = { indexed by 2-zlib_error }
  382.            ('need dictionary',     { Z_NEED_DICT       2  }
  383.             'stream end',          { Z_STREAM_END      1  }
  384.             '',                    { Z_OK              0  }
  385.             'file error',          { Z_ERRNO         (-1) }
  386.             'stream error',        { Z_STREAM_ERROR  (-2) }
  387.             'data error',          { Z_DATA_ERROR    (-3) }
  388.             'insufficient memory', { Z_MEM_ERROR     (-4) }
  389.             'buffer error',        { Z_BUF_ERROR     (-5) }
  390.             'incompatible version',{ Z_VERSION_ERROR (-6) }
  391.             '');
  392. const
  393.   z_verbose : int = 1;
  394. {$IFDEF DEBUG}
  395. procedure z_error (m : string);
  396. {$ENDIF}
  397. function adler32(adler : uLong; buf : pBytef; len : uInt) : uLong;
  398. {    Update a running Adler-32 checksum with the bytes buf[0..len-1] and
  399.    return the updated checksum. If buf is NIL, this function returns
  400.    the required initial value for the checksum.
  401.    An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
  402.    much faster. Usage example:
  403.    var
  404.      adler : uLong;
  405.    begin
  406.      adler := adler32(0, Z_NULL, 0);
  407.      while (read_buffer(buffer, length) <> EOF) do
  408.        adler := adler32(adler, buffer, length);
  409.      if (adler <> original_adler) then
  410.        error();
  411.    end;
  412. }
  413. { Orginal: deflate.h -- internal compression state
  414.            deflate.c -- compress data using the deflation algorithm
  415.   Copyright (C) 1995-1996 Jean-loup Gailly.
  416.   Pascal tranlastion
  417.   Copyright (C) 1998 by Jacques Nomssi Nzali
  418.   For conditions of distribution and use, see copyright notice in readme.txt
  419. }
  420. {  ALGORITHM
  421.        The "deflation" process depends on being able to identify portions
  422.        of the input text which are identical to earlier input (within a
  423.        sliding window trailing behind the input currently being processed).
  424.        The most straightforward technique turns out to be the fastest for
  425.        most input files: try all possible matches and select the longest.
  426.        The key feature of this algorithm is that insertions into the string
  427.        dictionary are very simple and thus fast, and deletions are avoided
  428.        completely. Insertions are performed at each input character, whereas
  429.        string matches are performed only when the previous match ends. So it
  430.        is preferable to spend more time in matches to allow very fast string
  431.        insertions and avoid deletions. The matching algorithm for small
  432.        strings is inspired from that of Rabin & Karp. A brute force approach
  433.        is used to find longer strings when a small match has been found.
  434.        A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
  435.        (by Leonid Broukhis).
  436.           A previous version of this file used a more sophisticated algorithm
  437.        (by Fiala and Greene) which is guaranteed to run in linear amortized
  438.        time, but has a larger average cost, uses more memory and is patented.
  439.        However the F&G algorithm may be faster for some highly redundant
  440.        files if the parameter max_chain_length (described below) is too large.
  441.    ACKNOWLEDGEMENTS
  442.        The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
  443.        I found it in 'freeze' written by Leonid Broukhis.
  444.        Thanks to many people for bug reports and testing.
  445.    REFERENCES
  446.        Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
  447.        Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
  448.        A description of the Rabin and Karp algorithm is given in the book
  449.           "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
  450.        Fiala,E.R., and Greene,D.H.
  451.           Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595}
  452. function deflateInit_(strm : z_streamp;
  453.                       level : int;
  454.                       const version : string;
  455.                       stream_size : int) : int;
  456. function deflateInit (var strm : z_stream; level : int) : int;
  457. {  Initializes the internal stream state for compression. The fields
  458.    zalloc, zfree and opaque must be initialized before by the caller.
  459.    If zalloc and zfree are set to Z_NULL, deflateInit updates them to
  460.    use default allocation functions.
  461.      The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
  462.    1 gives best speed, 9 gives best compression, 0 gives no compression at
  463.    all (the input data is simply copied a block at a time).
  464.    Z_DEFAULT_COMPRESSION requests a default compromise between speed and
  465.    compression (currently equivalent to level 6).
  466.      deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
  467.    enough memory, Z_STREAM_ERROR if level is not a valid compression level,
  468.    Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
  469.    with the version assumed by the caller (ZLIB_VERSION).
  470.    msg is set to null if there is no error message.  deflateInit does not
  471.    perform any compression: this will be done by deflate(). }
  472. {EXPORT}
  473. function deflate (var strm : z_stream; flush : int) : int;
  474. { Performs one or both of the following actions:
  475.   - Compress more input starting at next_in and update next_in and avail_in
  476.     accordingly. If not all input can be processed (because there is not
  477.     enough room in the output buffer), next_in and avail_in are updated and
  478.     processing will resume at this point for the next call of deflate().
  479.   - Provide more output starting at next_out and update next_out and avail_out
  480.     accordingly. This action is forced if the parameter flush is non zero.
  481.     Forcing flush frequently degrades the compression ratio, so this parameter
  482.     should be set only when necessary (in interactive applications).
  483.     Some output may be provided even if flush is not set.
  484.   Before the call of deflate(), the application should ensure that at least
  485.   one of the actions is possible, by providing more input and/or consuming
  486.   more output, and updating avail_in or avail_out accordingly; avail_out
  487.   should never be zero before the call. The application can consume the
  488.   compressed output when it wants, for example when the output buffer is full
  489.   (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
  490.   and with zero avail_out, it must be called again after making room in the
  491.   output buffer because there might be more output pending.
  492.     If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression
  493.   block is terminated and flushed to the output buffer so that the
  494.   decompressor can get all input data available so far. For method 9, a future
  495.   variant on method 8, the current block will be flushed but not terminated.
  496.   Z_SYNC_FLUSH has the same effect as partial flush except that the compressed
  497.   output is byte aligned (the compressor can clear its internal bit buffer)
  498.   and the current block is always terminated; this can be useful if the
  499.   compressor has to be restarted from scratch after an interruption (in which
  500.   case the internal state of the compressor may be lost).
  501.     If flush is set to Z_FULL_FLUSH, the compression block is terminated, a
  502.   special marker is output and the compression dictionary is discarded; this
  503.   is useful to allow the decompressor to synchronize if one compressed block
  504.   has been damaged (see inflateSync below).  Flushing degrades compression and
  505.   so should be used only when necessary.  Using Z_FULL_FLUSH too often can
  506.   seriously degrade the compression. If deflate returns with avail_out == 0,
  507.   this function must be called again with the same value of the flush
  508.   parameter and more output space (updated avail_out), until the flush is
  509.   complete (deflate returns with non-zero avail_out).
  510.     If the parameter flush is set to Z_FINISH, all pending input is processed,
  511.   all pending output is flushed and deflate returns with Z_STREAM_END if there
  512.   was enough output space; if deflate returns with Z_OK, this function must be
  513.   called again with Z_FINISH and more output space (updated avail_out) but no
  514.   more input data, until it returns with Z_STREAM_END or an error. After
  515.   deflate has returned Z_STREAM_END, the only possible operations on the
  516.   stream are deflateReset or deflateEnd.
  517.     Z_FINISH can be used immediately after deflateInit if all the compression
  518.   is to be done in a single step. In this case, avail_out must be at least
  519.   0.1% larger than avail_in plus 12 bytes.  If deflate does not return
  520.   Z_STREAM_END, then it must be called again as described above.
  521.     deflate() may update data_type if it can make a good guess about
  522.   the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
  523.   binary. This field is only for information purposes and does not affect
  524.   the compression algorithm in any manner.
  525.     deflate() returns Z_OK if some progress has been made (more input
  526.   processed or more output produced), Z_STREAM_END if all input has been
  527.   consumed and all output has been produced (only when flush is set to
  528.   Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
  529.   if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible. }
  530. function deflateEnd (var strm : z_stream) : int;
  531. {     All dynamically allocated data structures for this stream are freed.
  532.    This function discards any unprocessed input and does not flush any
  533.    pending output.
  534.      deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
  535.    stream state was inconsistent, Z_DATA_ERROR if the stream was freed
  536.    prematurely (some input or output was discarded). In the error case,
  537.    msg may be set but then points to a static string (which must not be
  538.    deallocated). }
  539.                         { Advanced functions }
  540. { The following functions are needed only in some special applications. }
  541. {EXPORT}
  542. function deflateInit2 (var strm : z_stream;
  543.                        level : int;
  544.                        method : int;
  545.                        windowBits : int;
  546.                        memLevel : int;
  547.                        strategy : int) : int;
  548. {  This is another version of deflateInit with more compression options. The
  549.    fields next_in, zalloc, zfree and opaque must be initialized before by
  550.    the caller.
  551.      The method parameter is the compression method. It must be Z_DEFLATED in
  552.    this version of the library. (Method 9 will allow a 64K history buffer and
  553.    partial block flushes.)
  554.      The windowBits parameter is the base two logarithm of the window size
  555.    (the size of the history buffer).  It should be in the range 8..15 for this
  556.    version of the library (the value 16 will be allowed for method 9). Larger
  557.    values of this parameter result in better compression at the expense of
  558.    memory usage. The default value is 15 if deflateInit is used instead.
  559.      The memLevel parameter specifies how much memory should be allocated
  560.    for the internal compression state. memLevel=1 uses minimum memory but
  561.    is slow and reduces compression ratio; memLevel=9 uses maximum memory
  562.    for optimal speed. The default value is 8. See zconf.h for total memory
  563.    usage as a function of windowBits and memLevel.
  564.      The strategy parameter is used to tune the compression algorithm. Use the
  565.    value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
  566.    filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
  567.    string match).  Filtered data consists mostly of small values with a
  568.    somewhat random distribution. In this case, the compression algorithm is
  569.    tuned to compress them better. The effect of Z_FILTERED is to force more
  570.    Huffman coding and less string matching; it is somewhat intermediate
  571.    between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
  572.    the compression ratio but not the correctness of the compressed output even
  573.    if it is not set appropriately.
  574.      If next_in is not null, the library will use this buffer to hold also
  575.    some history information; the buffer must either hold the entire input
  576.    data, or have at least 1<<(windowBits+1) bytes and be writable. If next_in
  577.    is null, the library will allocate its own history buffer (and leave next_in
  578.    null). next_out need not be provided here but must be provided by the
  579.    application for the next call of deflate().
  580.      If the history buffer is provided by the application, next_in must
  581.    must never be changed by the application since the compressor maintains
  582.    information inside this buffer from call to call; the application
  583.    must provide more input only by increasing avail_in. next_in is always
  584.    reset by the library in this case.
  585.       deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
  586.    not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
  587.    an invalid method). msg is set to null if there is no error message.
  588.    deflateInit2 does not perform any compression: this will be done by
  589.    deflate(). }
  590. {EXPORT}
  591. function deflateSetDictionary (var strm : z_stream;
  592.                                dictionary : pBytef; {const bytes}
  593.        dictLength : uint) : int;
  594. {    Initializes the compression dictionary (history buffer) from the given
  595.    byte sequence without producing any compressed output. This function must
  596.    be called immediately after deflateInit or deflateInit2, before any call
  597.    of deflate. The compressor and decompressor must use exactly the same
  598.    dictionary (see inflateSetDictionary).
  599.      The dictionary should consist of strings (byte sequences) that are likely
  600.    to be encountered later in the data to be compressed, with the most commonly
  601.    used strings preferably put towards the end of the dictionary. Using a
  602.    dictionary is most useful when the data to be compressed is short and
  603.    can be predicted with good accuracy; the data can then be compressed better
  604.    than with the default empty dictionary. In this version of the library,
  605.    only the last 32K bytes of the dictionary are used.
  606.      Upon return of this function, strm->adler is set to the Adler32 value
  607.    of the dictionary; the decompressor may later use this value to determine
  608.    which dictionary has been used by the compressor. (The Adler32 value
  609.    applies to the whole dictionary even if only a subset of the dictionary is
  610.    actually used by the compressor.)
  611.      deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
  612.    parameter is invalid (such as NULL dictionary) or the stream state
  613.    is inconsistent (for example if deflate has already been called for this
  614.    stream). deflateSetDictionary does not perform any compression: this will
  615.    be done by deflate(). }
  616. {EXPORT}
  617. function deflateCopy (dest : z_streamp;
  618.                       source : z_streamp) : int;
  619. {  Sets the destination stream as a complete copy of the source stream.  If
  620.    the source stream is using an application-supplied history buffer, a new
  621.    buffer is allocated for the destination stream.  The compressed output
  622.    buffer is always application-supplied. It's the responsibility of the
  623.    application to provide the correct values of next_out and avail_out for the
  624.    next call of deflate.
  625.      This function can be useful when several compression strategies will be
  626.    tried, for example when there are several ways of pre-processing the input
  627.    data with a filter. The streams that will be discarded should then be freed
  628.    by calling deflateEnd.  Note that deflateCopy duplicates the internal
  629.    compression state which can be quite large, so this strategy is slow and
  630.    can consume lots of memory.
  631.      deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
  632.    enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
  633.    (such as zalloc being NULL). msg is left unchanged in both source and
  634.    destination. }
  635. {EXPORT}
  636. function deflateReset (var strm : z_stream) : int;
  637. {   This function is equivalent to deflateEnd followed by deflateInit,
  638.    but does not free and reallocate all the internal compression state.
  639.    The stream will keep the same compression level and any other attributes
  640.    that may have been set by deflateInit2.
  641.       deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
  642.    stream state was inconsistent (such as zalloc or state being NIL). }
  643. {EXPORT}
  644. function deflateParams (var strm : z_stream; level : int; strategy : int) : int;
  645. {    Dynamically update the compression level and compression strategy.
  646.    This can be used to switch between compression and straight copy of
  647.    the input data, or to switch to a different kind of input data requiring
  648.    a different strategy. If the compression level is changed, the input
  649.    available so far is compressed with the old level (and may be flushed);
  650.    the new level will take effect only at the next call of deflate().
  651.      Before the call of deflateParams, the stream state must be set as for
  652.    a call of deflate(), since the currently available input may have to
  653.    be compressed and flushed. In particular, strm->avail_out must be non-zero.
  654.      deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
  655.    stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
  656.    if strm->avail_out was zero. }
  657. const
  658.    deflate_copyright : string = ' deflate 1.1.2 Copyright 1995-1998 Jean-loup Gailly ';
  659. { If you use the zlib library in a product, an acknowledgment is welcome
  660.   in the documentation of your product. If for some reason you cannot
  661.   include such an acknowledgment, I would appreciate that you keep this
  662.   copyright string in the executable of your product. }
  663. function inflate_blocks_new(var z : z_stream;
  664.                             c : check_func;  { check function }
  665.                             w : uInt     { window size }
  666.                             ) : pInflate_blocks_state;
  667. function inflate_blocks (var s : inflate_blocks_state;
  668.                          var z : z_stream;
  669.                          r : int             { initial return code }
  670.                          ) : int;
  671. procedure inflate_blocks_reset (var s : inflate_blocks_state;
  672.                                 var z : z_stream;
  673.                                 c : puLong); { check value on output }
  674. function inflate_blocks_free(s : pInflate_blocks_state;
  675.                              var z : z_stream) : int;
  676. procedure inflate_set_dictionary(var s : inflate_blocks_state;
  677.                                  const d : array of byte;  { dictionary }
  678.                                  n : uInt);         { dictionary length }
  679. function inflate_blocks_sync_point(var s : inflate_blocks_state) : int;
  680. function inflate_codes_new (bl : uInt;
  681.                             bd : uInt;
  682.                             tl : pInflate_huft;
  683.                             td : pInflate_huft;
  684.                             var z : z_stream): pInflate_codes_state;
  685. function inflate_codes(var s : inflate_blocks_state;
  686.                        var z : z_stream;
  687.                        r : int) : int;
  688. procedure inflate_codes_free(c : pInflate_codes_state;
  689.                              var z : z_stream);
  690. function inflate_fast( bl : uInt;
  691.                        bd : uInt;
  692.                        tl : pInflate_huft;
  693.                        td : pInflate_huft;
  694.                       var s : inflate_blocks_state;
  695.                       var z : z_stream) : int;
  696. function inflateInit(var z : z_stream) : int;
  697. {    Initializes the internal stream state for decompression. The fields
  698.    zalloc, zfree and opaque must be initialized before by the caller.  If
  699.    zalloc and zfree are set to Z_NULL, inflateInit updates them to use default
  700.    allocation functions.
  701.      inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
  702.    enough memory, Z_VERSION_ERROR if the zlib library version is incompatible
  703.    with the version assumed by the caller.  msg is set to null if there is no
  704.    error message. inflateInit does not perform any decompression: this will be
  705.    done by inflate(). }
  706. function inflateInit_(z : z_streamp;
  707.                       const version : string;
  708.                       stream_size : int) : int;
  709. function inflateInit2_(var z: z_stream;
  710.                        w : int;
  711.                        const version : string;
  712.                        stream_size : int) : int;
  713. {
  714.      This is another version of inflateInit with an extra parameter. The
  715.    fields next_in, avail_in, zalloc, zfree and opaque must be initialized
  716.    before by the caller.
  717.      The windowBits parameter is the base two logarithm of the maximum window
  718.    size (the size of the history buffer).  It should be in the range 8..15 for
  719.    this version of the library. The default value is 15 if inflateInit is used
  720.    instead. If a compressed stream with a larger window size is given as
  721.    input, inflate() will return with the error code Z_DATA_ERROR instead of
  722.    trying to allocate a larger window.
  723.       inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
  724.    memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
  725.    memLevel). msg is set to null if there is no error message.  inflateInit2
  726.    does not perform any decompression apart from reading the zlib header if
  727.    present: this will be done by inflate(). (So next_in and avail_in may be
  728.    modified, but next_out and avail_out are unchanged.)
  729. }
  730. function inflateEnd(var z : z_stream) : int;
  731. {
  732.    All dynamically allocated data structures for this stream are freed.
  733.    This function discards any unprocessed input and does not flush any
  734.    pending output.
  735.      inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
  736.    was inconsistent. In the error case, msg may be set but then points to a
  737.    static string (which must not be deallocated).
  738. }
  739. function inflateReset(var z : z_stream) : int;
  740. {
  741.    This function is equivalent to inflateEnd followed by inflateInit,
  742.    but does not free and reallocate all the internal decompression state.
  743.    The stream will keep attributes that may have been set by inflateInit2.
  744.       inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
  745.    stream state was inconsistent (such as zalloc or state being NULL).
  746. }
  747. function inflate(var z : z_stream;
  748.                  f : int) : int;
  749. {
  750.   inflate decompresses as much data as possible, and stops when the input
  751.   buffer becomes empty or the output buffer becomes full. It may introduce
  752.   some output latency (reading input without producing any output)
  753.   except when forced to flush.
  754.   The detailed semantics are as follows. inflate performs one or both of the
  755.   following actions:
  756.   - Decompress more input starting at next_in and update next_in and avail_in
  757.     accordingly. If not all input can be processed (because there is not
  758.     enough room in the output buffer), next_in is updated and processing
  759.     will resume at this point for the next call of inflate().
  760.   - Provide more output starting at next_out and update next_out and avail_out
  761.     accordingly.  inflate() provides as much output as possible, until there
  762.     is no more input data or no more space in the output buffer (see below
  763.     about the flush parameter).
  764.   Before the call of inflate(), the application should ensure that at least
  765.   one of the actions is possible, by providing more input and/or consuming
  766.   more output, and updating the next_* and avail_* values accordingly.
  767.   The application can consume the uncompressed output when it wants, for
  768.   example when the output buffer is full (avail_out == 0), or after each
  769.   call of inflate(). If inflate returns Z_OK and with zero avail_out, it
  770.   must be called again after making room in the output buffer because there
  771.   might be more output pending.
  772.     If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
  773.   output as possible to the output buffer. The flushing behavior of inflate is
  774.   not specified for values of the flush parameter other than Z_SYNC_FLUSH
  775.   and Z_FINISH, but the current implementation actually flushes as much output
  776.   as possible anyway.
  777.     inflate() should normally be called until it returns Z_STREAM_END or an
  778.   error. However if all decompression is to be performed in a single step
  779.   (a single call of inflate), the parameter flush should be set to
  780.   Z_FINISH. In this case all pending input is processed and all pending
  781.   output is flushed; avail_out must be large enough to hold all the
  782.   uncompressed data. (The size of the uncompressed data may have been saved
  783.   by the compressor for this purpose.) The next operation on this stream must
  784.   be inflateEnd to deallocate the decompression state. The use of Z_FINISH
  785.   is never required, but can be used to inform inflate that a faster routine
  786.   may be used for the single inflate() call.
  787.      If a preset dictionary is needed at this point (see inflateSetDictionary
  788.   below), inflate sets strm-adler to the adler32 checksum of the
  789.   dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise 
  790.   it sets strm->adler to the adler32 checksum of all output produced
  791.   so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
  792.   an error code as described below. At the end of the stream, inflate()
  793.   checks that its computed adler32 checksum is equal to that saved by the
  794.   compressor and returns Z_STREAM_END only if the checksum is correct.
  795.     inflate() returns Z_OK if some progress has been made (more input processed
  796.   or more output produced), Z_STREAM_END if the end of the compressed data has
  797.   been reached and all uncompressed output has been produced, Z_NEED_DICT if a
  798.   preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
  799.   corrupted (input stream not conforming to the zlib format or incorrect
  800.   adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
  801.   (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
  802.   enough memory, Z_BUF_ERROR if no progress is possible or if there was not
  803.   enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
  804.   case, the application may then call inflateSync to look for a good
  805.   compression block.
  806. }
  807. function inflateSetDictionary(var z : z_stream;
  808.                               dictionary : pBytef; {const array of byte}
  809.                               dictLength : uInt) : int;
  810. {
  811.      Initializes the decompression dictionary from the given uncompressed byte
  812.    sequence. This function must be called immediately after a call of inflate
  813.    if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
  814.    can be determined from the Adler32 value returned by this call of
  815.    inflate. The compressor and decompressor must use exactly the same
  816.    dictionary (see deflateSetDictionary).
  817.      inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
  818.    parameter is invalid (such as NULL dictionary) or the stream state is
  819.    inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
  820.    expected one (incorrect Adler32 value). inflateSetDictionary does not
  821.    perform any decompression: this will be done by subsequent calls of
  822.    inflate().
  823. }
  824. function inflateSync(var z : z_stream) : int;
  825. {
  826.   Skips invalid compressed data until a full flush point (see above the
  827.   description of deflate with Z_FULL_FLUSH) can be found, or until all
  828.   available input is skipped. No output is provided.
  829.     inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
  830.   if no more input was provided, Z_DATA_ERROR if no flush point has been found,
  831.   or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
  832.   case, the application may save the current current value of total_in which
  833.   indicates where valid compressed data was found. In the error case, the
  834.   application may repeatedly call inflateSync, providing more input each time,
  835.   until success or end of the input data.
  836. }
  837. function inflateSyncPoint(var z : z_stream) : int;
  838. { Maximum size of dynamic tree.  The maximum found in a long but non-
  839.   exhaustive search was 1004 huft structures (850 for length/literals
  840.   and 154 for distances, the latter actually the result of an
  841.   exhaustive search).  The actual maximum is not known, but the
  842.   value below is more than safe. }
  843. const
  844.   MANY = 1440;
  845. {$ifdef DEBUG}
  846. var
  847.   inflate_hufts : uInt;
  848. {$endif}
  849. function inflate_trees_bits(
  850.   var c : array of uIntf;  { 19 code lengths }
  851.   var bb : uIntf;          { bits tree desired/actual depth }
  852.   var tb : pinflate_huft;  { bits tree result }
  853.   var hp : array of Inflate_huft;      { space for trees }
  854.   var z : z_stream         { for messages }
  855.     ) : int;
  856. function inflate_trees_dynamic(
  857.     nl : uInt;                    { number of literal/length codes }
  858.     nd : uInt;                    { number of distance codes }
  859.     var c : Array of uIntf;           { that many (total) code lengths }
  860.     var bl : uIntf;               { literal desired/actual bit depth }
  861.     var bd : uIntf;               { distance desired/actual bit depth }
  862. var tl : pInflate_huft;           { literal/length tree result }
  863. var td : pInflate_huft;           { distance tree result }
  864. var hp : array of Inflate_huft;   { space for trees }
  865. var z : z_stream                  { for messages }
  866.      ) : int;
  867. function inflate_trees_fixed (
  868.     var bl : uInt;                { literal desired/actual bit depth }
  869.     var bd : uInt;                { distance desired/actual bit depth }
  870.     var tl : pInflate_huft;       { literal/length tree result }
  871.     var td : pInflate_huft;       { distance tree result }
  872.     var z : z_stream              { for memory allocation }
  873.      ) : int;
  874. { copy as much as possible from the sliding window to the output area }
  875. function inflate_flush(var s : inflate_blocks_state;
  876.                        var z : z_stream;
  877.                        r : int) : int;
  878. { And'ing with mask[n] masks the lower n bits }
  879. const
  880.   inflate_mask : array[0..17-1] of uInt = (
  881.     $0000,
  882.     $0001, $0003, $0007, $000f, $001f, $003f, $007f, $00ff,
  883.     $01ff, $03ff, $07ff, $0fff, $1fff, $3fff, $7fff, $ffff);
  884. {procedure GRABBITS(j : int);}
  885. {procedure DUMPBITS(j : int);}
  886. {procedure NEEDBITS(j : int);}
  887. const
  888.   LENGTH_CODES = 29;
  889.   LITERALS = 256;
  890.   L_CODES = (LITERALS+1+LENGTH_CODES);
  891.   D_CODES = 30;
  892.   BL_CODES = 19;
  893.   HEAP_SIZE = (2*L_CODES+1);
  894.   MAX_BITS = 15;
  895.   INIT_STATE =  42;
  896.   BUSY_STATE =  113;
  897.   FINISH_STATE = 666;
  898. type
  899.   ct_data_ptr = ^ct_data;
  900.   ct_data = record
  901.     fc : record
  902.       case byte of
  903.       0:(freq : ush);       { frequency count }
  904.       1:(code : ush);       { bit string }
  905.     end;
  906.     dl : record
  907.       case byte of
  908.       0:(dad : ush);        { father node in Huffman tree }
  909.       1:(len : ush);        { length of bit string }
  910.     end;
  911.   end;
  912.   ltree_type = array[0..HEAP_SIZE-1] of ct_data;    { literal and length tree }
  913.   dtree_type = array[0..2*D_CODES+1-1] of ct_data;  { distance tree }
  914.   htree_type = array[0..2*BL_CODES+1-1] of ct_data;  { Huffman tree for bit lengths }
  915.   { generic tree type }
  916.   tree_type = array[0..(MaxInt div SizeOf(ct_data))-1] of ct_data;
  917.   tree_ptr = ^tree_type;
  918.   ltree_ptr = ^ltree_type;
  919.   dtree_ptr = ^dtree_type;
  920.   htree_ptr = ^htree_type;
  921.   static_tree_desc_ptr = ^static_tree_desc;
  922.   static_tree_desc =
  923.          record
  924.     {const} static_tree : tree_ptr;     { static tree or NIL }
  925.     {const} extra_bits : pzIntfArray;   { extra bits for each code or NIL }
  926.             extra_base : int;           { base index for extra_bits }
  927.             elems : int;                { max number of elements in the tree }
  928.             max_length : int;           { max bit length for the codes }
  929.           end;
  930.   tree_desc_ptr = ^tree_desc;
  931.   tree_desc = record
  932.     dyn_tree : tree_ptr;    { the dynamic tree }
  933.     max_code : int;            { largest code with non zero frequency }
  934.     stat_desc : static_tree_desc_ptr; { the corresponding static tree }
  935.   end;
  936.   Pos = ush;
  937.   Posf = Pos; {FAR}
  938.   IPos = uInt;
  939.   pPosf = ^Posf;
  940.   zPosfArray = array[0..(MaxInt div SizeOf(Posf))-1] of Posf;
  941.   pzPosfArray = ^zPosfArray;
  942.   deflate_state_ptr = ^deflate_state;
  943.   deflate_state = record
  944.     strm : z_streamp;          { pointer back to this zlib stream }
  945.     status : int;              { as the name implies }
  946.     pending_buf : pzByteArray; { output still pending }
  947.     pending_buf_size : ulg;    { size of pending_buf }
  948.     pending_out : pBytef;      { next pending byte to output to the stream }
  949.     pending : int;             { nb of bytes in the pending buffer }
  950.     noheader : int;            { suppress zlib header and adler32 }
  951.     data_type : Byte;          { UNKNOWN, BINARY or ASCII }
  952.     method : Byte;             { STORED (for zip only) or DEFLATED }
  953.     last_flush : int;          { value of flush param for previous deflate call }
  954.     w_size : uInt;             { LZ77 window size (32K by default) }
  955.     w_bits : uInt;             { log2(w_size)  (8..16) }
  956.     w_mask : uInt;             { w_size - 1 }
  957.     window : pzByteArray;
  958.     window_size : ulg;
  959.     prev : pzPosfArray;
  960.     head : pzPosfArray;    { Heads of the hash chains or NIL. }
  961.     ins_h : uInt;          { hash index of string to be inserted }
  962.     hash_size : uInt;      { number of elements in hash table }
  963.     hash_bits : uInt;      { log2(hash_size) }
  964.     hash_mask : uInt;      { hash_size-1 }
  965.     hash_shift : uInt;
  966.     block_start : long;
  967.     match_length : uInt;           { length of best match }
  968.     prev_match : IPos;             { previous match }
  969.     match_available : boolean;     { set if previous match exists }
  970.     strstart : uInt;               { start of string to insert }
  971.     match_start : uInt;            { start of matching string }
  972.     lookahead : uInt;              { number of valid bytes ahead in window }
  973.     prev_length : uInt;
  974.     max_chain_length : uInt;
  975.     level : int;    { compression level (1..9) }
  976.     strategy : int; { favor or force Huffman coding}
  977.     good_match : uInt;
  978.     nice_match : int; { Stop searching when current match exceeds this }
  979.     dyn_ltree : ltree_type;    { literal and length tree }
  980.     dyn_dtree : dtree_type;  { distance tree }
  981.     bl_tree : htree_type;   { Huffman tree for bit lengths }
  982.     l_desc : tree_desc;                { desc. for literal tree }
  983.     d_desc : tree_desc;                { desc. for distance tree }
  984.     bl_desc : tree_desc;               { desc. for bit length tree }
  985.     bl_count : array[0..MAX_BITS+1-1] of ush;
  986.     heap : array[0..2*L_CODES+1-1] of int; { heap used to build the Huffman trees }
  987.     heap_len : int;                   { number of elements in the heap }
  988.     heap_max : int;                   { element of largest frequency }
  989.     depth : array[0..2*L_CODES+1-1] of uch;
  990.     l_buf : puchfArray;       { buffer for literals or lengths }
  991.     lit_bufsize : uInt;
  992.     last_lit : uInt;      { running index in l_buf }
  993.     d_buf : pushfArray;
  994.     opt_len : ulg;        { bit length of current block with optimal trees }
  995.     static_len : ulg;     { bit length of current block with static trees }
  996.     compressed_len : ulg; { total bit length of compressed file }
  997.     matches : uInt;       { number of string matches in current block }
  998.     last_eob_len : int;   { bit length of EOB code for last block }
  999. {$ifdef DEBUG}
  1000.     bits_sent : ulg;    { bit length of the compressed data }
  1001. {$endif}
  1002.     bi_buf : ush;
  1003.     bi_valid : int;
  1004.     case byte of
  1005.     0:(max_lazy_match : uInt);
  1006.     1:(max_insert_length : uInt);
  1007.   end;
  1008. procedure _tr_init (var s : deflate_state);
  1009. function _tr_tally (var s : deflate_state;
  1010.                     dist : unsigned;
  1011.                     lc : unsigned) : boolean;
  1012. function _tr_flush_block (var s : deflate_state;
  1013.                           buf : pcharf;
  1014.                           stored_len : ulg;
  1015.   eof : boolean) : ulg;
  1016. procedure _tr_align(var s : deflate_state);
  1017. procedure _tr_stored_block(var s : deflate_state;
  1018.                            buf : pcharf;
  1019.                            stored_len : ulg;
  1020.                            eof : boolean);
  1021. implementation
  1022. {$IFDEF CALLDOS}
  1023. { reduce your application memory footprint with $M before using this }
  1024. function dosAlloc (Size : Longint) : Pointer;
  1025. var
  1026.   regs: TRegisters;
  1027. begin
  1028.   regs.bx := (Size + 15) div 16; { number of 16-bytes-paragraphs }
  1029.   regs.ah := $48;                { Allocate memory block }
  1030.   msdos(regs);
  1031.   if regs.Flags and FCarry <> 0 then
  1032.     DosAlloc := NIL
  1033.   else
  1034.     DosAlloc := Ptr(regs.ax, 0);
  1035. end;
  1036. function dosFree(P : pointer) : boolean;
  1037. var
  1038.   regs: TRegisters;
  1039. begin
  1040.   dosFree := FALSE;
  1041.   regs.bx := Seg(P^);             { segment }
  1042.   if Ofs(P) <> 0 then
  1043.     exit;
  1044.   regs.ah := $49;                { Free memory block }
  1045.   msdos(regs);
  1046.   dosFree := (regs.Flags and FCarry = 0);
  1047. end;
  1048. {$ENDIF}
  1049. type
  1050.   LH = record
  1051.     L, H : word;
  1052.   end;
  1053. {$IFDEF HugeMem}
  1054.   {$define HEAP_LIST}
  1055. {$endif}
  1056. {$IFDEF HEAP_LIST} {--- to avoid Mark and Release --- }
  1057. const
  1058.   MaxAllocEntries = 50;
  1059. type
  1060.   TMemRec = record
  1061.     orgvalue,
  1062.     value : pointer;
  1063.     size: longint;
  1064.   end;
  1065. const
  1066.   allocatedCount : 0..MaxAllocEntries = 0;
  1067. var
  1068.   allocatedList : array[0..MaxAllocEntries-1] of TMemRec;
  1069.  function NewAllocation(ptr0, ptr : pointer; memsize : longint) : boolean;
  1070.  begin
  1071.    if (allocatedCount < MaxAllocEntries) and (ptr0 <> NIL) then
  1072.    begin
  1073.      with allocatedList[allocatedCount] do
  1074.      begin
  1075.        orgvalue := ptr0;
  1076.        value := ptr;
  1077.        size := memsize;
  1078.      end;
  1079.      Inc(allocatedCount);  { we don't check for duplicate }
  1080.      NewAllocation := TRUE;
  1081.    end
  1082.    else
  1083.      NewAllocation := FALSE;
  1084.  end;
  1085. {$ENDIF}
  1086. {$IFDEF HugeMem}
  1087. { The code below is extremely version specific to the TP 6/7 heap manager!!}
  1088. type
  1089.   PFreeRec = ^TFreeRec;
  1090.   TFreeRec = record
  1091.     next: PFreeRec;
  1092.     size: Pointer;
  1093.   end;
  1094. type
  1095.   HugePtr = voidpf;
  1096.  procedure IncPtr(var p:pointer;count:word);
  1097.  { Increments pointer }
  1098.  begin
  1099.    inc(LH(p).L,count);
  1100.    if LH(p).L < count then
  1101.      inc(LH(p).H,SelectorInc);  { $1000 }
  1102.  end;
  1103.  procedure DecPtr(var p:pointer;count:word);
  1104.  { decrements pointer }
  1105.  begin
  1106.    if count > LH(p).L then
  1107.      dec(LH(p).H,SelectorInc);
  1108.    dec(LH(p).L,Count);
  1109.  end;
  1110.  procedure IncPtrLong(var p:pointer;count:longint);
  1111.  { Increments pointer; assumes count > 0 }
  1112.  begin
  1113.    inc(LH(p).H,SelectorInc*LH(count).H);
  1114.    inc(LH(p).L,LH(Count).L);
  1115.    if LH(p).L < LH(count).L then
  1116.      inc(LH(p).H,SelectorInc);
  1117.  end;
  1118.  procedure DecPtrLong(var p:pointer;count:longint);
  1119.  { Decrements pointer; assumes count > 0 }
  1120.  begin
  1121.    if LH(count).L > LH(p).L then
  1122.      dec(LH(p).H,SelectorInc);
  1123.    dec(LH(p).L,LH(Count).L);
  1124.    dec(LH(p).H,SelectorInc*LH(Count).H);
  1125.  end;
  1126.  { The next section is for real mode only }
  1127. function Normalized(p : pointer)  : pointer;
  1128. var
  1129.   count : word;
  1130. begin
  1131.   count := LH(p).L and $FFF0;
  1132.   Normalized := Ptr(LH(p).H + (count shr 4), LH(p).L and $F);
  1133. end;
  1134. procedure FreeHuge(var p:HugePtr; size : longint);
  1135. const
  1136.   blocksize = $FFF0;
  1137. var
  1138.   block : word;
  1139. begin
  1140.   while size > 0 do
  1141.   begin
  1142.     { block := minimum(size, blocksize); }
  1143.     if size > blocksize then
  1144.       block := blocksize
  1145.     else
  1146.       block := size;
  1147.     dec(size,block);
  1148.     freemem(p,block);
  1149.     IncPtr(p,block);    { we may get ptr($xxxx, $fff8) and 31 bytes left }
  1150.     p := Normalized(p); { to free, so we must normalize }
  1151.   end;
  1152. end;
  1153. function FreeMemHuge(ptr : pointer) : boolean;
  1154. var
  1155.   i : integer; { -1..MaxAllocEntries }
  1156. begin
  1157.   FreeMemHuge := FALSE;
  1158.   i := allocatedCount - 1;
  1159.   while (i >= 0) do
  1160.   begin
  1161.     if (ptr = allocatedList[i].value) then
  1162.     begin
  1163.       with allocatedList[i] do
  1164.         FreeHuge(orgvalue, size);
  1165.       Move(allocatedList[i+1], allocatedList[i],
  1166.            SizeOf(TMemRec)*(allocatedCount - 1 - i));
  1167.       Dec(allocatedCount);
  1168.       FreeMemHuge := TRUE;
  1169.       break;
  1170.     end;
  1171.     Dec(i);
  1172.   end;
  1173. end;
  1174. procedure GetMemHuge(var p:HugePtr;memsize:Longint);
  1175. const
  1176.   blocksize = $FFF0;
  1177. var
  1178.   size : longint;
  1179.   prev,free : PFreeRec;
  1180.   save,temp : pointer;
  1181.   block : word;
  1182. begin
  1183.   p := NIL;
  1184.   { Handle the easy cases first }
  1185.   if memsize > maxavail then
  1186.     exit
  1187.   else
  1188.     if memsize <= blocksize then
  1189.     begin
  1190.       getmem(p, memsize);
  1191.       if not NewAllocation(p, p, memsize) then
  1192.       begin
  1193.         FreeMem(p, memsize);
  1194.         p := NIL;
  1195.       end;
  1196.     end
  1197.     else
  1198.     begin
  1199.       size := memsize + 15;
  1200.       { Find the block that has enough space }
  1201.       prev := PFreeRec(@freeList);
  1202.       free := prev^.next;
  1203.       while (free <> heapptr) and (ptr2int(free^.size) < size) do
  1204.       begin
  1205.         prev := free;
  1206.         free := prev^.next;
  1207.       end;
  1208.       { Now free points to a region with enough space; make it the first one and
  1209.         multiple allocations will be contiguous. }
  1210.       save := freelist;
  1211.       freelist := free;
  1212.       { In TP 6, this works; check against other heap managers }
  1213.       while size > 0 do
  1214.       begin
  1215.         { block := minimum(size, blocksize); }
  1216.         if size > blocksize then
  1217.           block := blocksize
  1218.         else
  1219.           block := size;
  1220.         dec(size,block);
  1221.         getmem(temp,block);
  1222.       end;
  1223.       { We've got what we want now; just sort things out and restore the
  1224.         free list to normal }
  1225.       p := free;
  1226.       if prev^.next <> freelist then
  1227.       begin
  1228.         prev^.next := freelist;
  1229.         freelist := save;
  1230.       end;
  1231.       if (p <> NIL) then
  1232.       begin
  1233.         { return pointer with 0 offset }
  1234.         temp := p;
  1235.         if Ofs(p^)<>0 Then
  1236.           p := Ptr(Seg(p^)+1,0);  { hack }
  1237.         if not NewAllocation(temp, p, memsize + 15) then
  1238.         begin
  1239.           FreeHuge(temp, size);
  1240.           p := NIL;
  1241.         end;
  1242.       end;
  1243.     end;
  1244. end;
  1245. {$ENDIF}
  1246. procedure zmemcpy(destp : pBytef; sourcep : pBytef; len : uInt);
  1247. begin
  1248.   Move(sourcep^, destp^, len);
  1249. end;
  1250. function zmemcmp(s1p, s2p : pBytef; len : uInt) : int;
  1251. var
  1252.   j : uInt;
  1253.   source,
  1254.   dest : pBytef;
  1255. begin
  1256.   source := s1p;
  1257.   dest := s2p;
  1258.   for j := 0 to pred(len) do
  1259.   begin
  1260.     if (source^ <> dest^) then
  1261.     begin
  1262.       zmemcmp := 2*Ord(source^ > dest^)-1;
  1263.       exit;
  1264.     end;
  1265.     Inc(source);
  1266.     Inc(dest);
  1267.   end;
  1268.   zmemcmp := 0;
  1269. end;
  1270. procedure zmemzero(destp : pBytef; len : uInt);
  1271. begin
  1272.   FillChar(destp^, len, 0);
  1273. end;
  1274. procedure zcfree(opaque : voidpf; ptr : voidpf);
  1275. {$ifdef Delphi16}
  1276. var
  1277.   Handle : THandle;
  1278. {$endif}
  1279. {$IFDEF FPC}
  1280. var
  1281.   memsize : uint;
  1282. {$ENDIF}
  1283. begin
  1284.   {$IFDEF DPMI}
  1285.   {h :=} GlobalFreePtr(ptr);
  1286.   {$ELSE}
  1287.     {$IFDEF CALL_DOS}
  1288.     dosFree(ptr);
  1289.     {$ELSE}
  1290.       {$ifdef HugeMem}
  1291.       FreeMemHuge(ptr);
  1292.       {$else}
  1293.         {$ifdef Delphi16}
  1294.         Handle := GlobalHandle(LH(ptr).H); { HiWord(LongInt(ptr)) }
  1295.         GlobalUnLock(Handle);
  1296.         GlobalFree(Handle);
  1297.         {$else}
  1298.           {$IFDEF FPC}
  1299.           Dec(puIntf(ptr));
  1300.           memsize := puIntf(ptr)^;
  1301.           FreeMem(ptr, memsize+SizeOf(uInt));
  1302.           {$ELSE}
  1303.           FreeMem(ptr);  { Delphi 2,3,4 }
  1304.           {$ENDIF}
  1305.         {$endif}
  1306.       {$endif}
  1307.     {$ENDIF}
  1308.   {$ENDIF}
  1309. end;
  1310. function zcalloc (opaque : voidpf; items : uInt; size : uInt) : voidpf;
  1311. var
  1312.   p : voidpf;
  1313.   memsize : uLong;
  1314. {$ifdef Delphi16}
  1315.   handle : THandle;
  1316. {$endif}
  1317. begin
  1318.   memsize := uLong(items) * size;
  1319.   {$IFDEF DPMI}
  1320.   p := GlobalAllocPtr(gmem_moveable, memsize);
  1321.   {$ELSE}
  1322.     {$IFDEF CALLDOS}
  1323.     p := dosAlloc(memsize);
  1324.     {$ELSE}
  1325.       {$ifdef HugeMem}
  1326.       GetMemHuge(p, memsize);
  1327.       {$else}
  1328.         {$ifdef Delphi16}
  1329.         Handle := GlobalAlloc(HeapAllocFlags, memsize);
  1330.         p := GlobalLock(Handle);
  1331.         {$else}
  1332.           {$IFDEF FPC}
  1333.           GetMem(p, memsize+SizeOf(uInt));
  1334.           puIntf(p)^:= memsize;
  1335.           Inc(puIntf(p));
  1336.           {$ELSE}
  1337.           GetMem(p, memsize);  { Delphi: p := AllocMem(memsize); }
  1338.           {$ENDIF}
  1339.         {$endif}
  1340.       {$endif}
  1341.     {$ENDIF}
  1342.   {$ENDIF}
  1343.   zcalloc := p;
  1344. end;
  1345. function zError(err : int) : string;
  1346. begin
  1347.   zError := z_errmsg[Z_NEED_DICT-err];
  1348. end;
  1349. function zlibVersion : string;
  1350. begin
  1351.   zlibVersion := ZLIB_VERSION;
  1352. end;
  1353. procedure z_error (m : string);
  1354. begin
  1355.   WriteLn(output, m);
  1356.   Write('Zlib - Halt...');
  1357.   ReadLn;
  1358.   Halt(1);
  1359. end;
  1360. procedure Assert(cond : boolean; msg : string);
  1361. begin
  1362.   if not cond then
  1363.     z_error(msg);
  1364. end;
  1365. procedure Trace(x : string);
  1366. begin
  1367.   WriteLn(x);
  1368. end;
  1369. procedure Tracev(x : string);
  1370. begin
  1371.  if (z_verbose>0) then
  1372.    WriteLn(x);
  1373. end;
  1374. procedure Tracevv(x : string);
  1375. begin
  1376.   if (z_verbose>1) then
  1377.     WriteLn(x);
  1378. end;
  1379. procedure Tracevvv(x : string);
  1380. begin
  1381.   if (z_verbose>2) then
  1382.     WriteLn(x);
  1383. end;
  1384. procedure Tracec(c : boolean; x : string);
  1385. begin
  1386.   if (z_verbose>0) and (c) then
  1387.     WriteLn(x);
  1388. end;
  1389. procedure Tracecv(c : boolean; x : string);
  1390. begin
  1391.   if (z_verbose>1) and c then
  1392.     WriteLn(x);
  1393. end;
  1394. function ZALLOC (var strm : z_stream; items : uInt; size : uInt) : voidpf;
  1395. begin
  1396.   ZALLOC := strm.zalloc(strm.opaque, items, size);
  1397. end;
  1398. procedure ZFREE (var strm : z_stream; ptr : voidpf);
  1399. begin
  1400.   strm.zfree(strm.opaque, ptr);
  1401. end;
  1402. procedure TRY_FREE (var strm : z_stream; ptr : voidpf);
  1403. begin
  1404.   {if @strm <> Z_NULL then}
  1405.     strm.zfree(strm.opaque, ptr);
  1406. end;
  1407. const
  1408.   BASE = Long(65521); { largest prime smaller than 65536 }
  1409.   {NMAX = 5552; original code with unsigned 32 bit integer }
  1410.   { NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 }
  1411.   NMAX = 3854;        { code with signed 32 bit integer }
  1412.   { NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^31-1 }
  1413.   { The penalty is the time loss in the extra MOD-calls. }
  1414. { ========================================================================= }
  1415. function adler32(adler : uLong; buf : pBytef; len : uInt) : uLong;
  1416. var
  1417.   s1, s2 : uLong;
  1418.   k : int;
  1419. begin
  1420.   s1 := adler and $ffff;
  1421.   s2 := (adler shr 16) and $ffff;
  1422.   if not Assigned(buf) then
  1423.   begin
  1424.     adler32 := uLong(1);
  1425.     exit;
  1426.   end;
  1427.   while (len > 0) do
  1428.   begin
  1429.     if len < NMAX then
  1430.       k := len
  1431.     else
  1432.       k := NMAX;
  1433.     Dec(len, k);
  1434.     while (k > 0) do
  1435.     begin
  1436.       Inc(s1, buf^);
  1437.       Inc(s2, s1);
  1438.       Inc(buf);
  1439.       Dec(k);
  1440.     end;
  1441.     s1 := s1 mod BASE;
  1442.     s2 := s2 mod BASE;
  1443.   end;
  1444.   adler32 := (s2 shl 16) or s1;
  1445. end;
  1446. {  ===========================================================================
  1447.    Function prototypes. }
  1448. type
  1449.    block_state = (
  1450.     need_more,      { block not completed, need more input or more output }
  1451.     block_done,     { block flush performed }
  1452.     finish_started, { finish started, need only more output at next deflate }
  1453.     finish_done);   { finish done, accept no more input or output }
  1454. { Compression function. Returns the block state after the call. }
  1455. type
  1456.   compress_func = function(var s : deflate_state; flush : int) : block_state;
  1457. {local}
  1458. procedure fill_window(var s : deflate_state); forward;
  1459. {local}
  1460. function deflate_stored(var s : deflate_state; flush : int) : block_state; far; forward;
  1461. {local}
  1462. function deflate_fast(var s : deflate_state; flush : int) : block_state; far; forward;
  1463. {local}
  1464. function deflate_slow(var s : deflate_state; flush : int) : block_state; far; forward;
  1465. {local}
  1466. procedure lm_init(var s : deflate_state); forward;
  1467. {local}
  1468. procedure putShortMSB(var s : deflate_state; b : uInt); forward;
  1469. {local}
  1470. procedure  flush_pending (var strm : z_stream); forward;
  1471. {local}
  1472. function read_buf(strm : z_streamp;
  1473.                   buf : pBytef;
  1474.                   size : unsigned) : int; forward;
  1475. {$ifdef ASMV}
  1476. procedure match_init; { asm code initialization }
  1477. function longest_match(var deflate_state; cur_match : IPos) : uInt; forward;
  1478. {$else}
  1479. {local}
  1480. function longest_match(var s : deflate_state; cur_match : IPos) : uInt;
  1481.   forward;
  1482. {$endif}
  1483. {$ifdef DEBUG}
  1484. {local}
  1485. procedure check_match(var s : deflate_state;
  1486.                       start, match : IPos;
  1487.                       length : int); forward;
  1488. {$endif}
  1489. {  ==========================================================================
  1490.   local data }
  1491. const
  1492.   ZNIL = 0;
  1493. { Tail of hash chains }
  1494. const
  1495.   TOO_FAR = 4096;
  1496. { Matches of length 3 are discarded if their distance exceeds TOO_FAR }
  1497. {const
  1498.   MIN_LOOKAHEAD = (MAX_MATCH+MIN_MATCH+1);}
  1499. { Minimum amount of lookahead, except at the end of the input file.
  1500.   See deflate.c for comments about the MIN_MATCH+1. }
  1501. {macro MAX_DIST(var s : deflate_state) : uInt;
  1502. begin
  1503.   MAX_DIST := (s.w_size - MIN_LOOKAHEAD);
  1504. end;
  1505.   In order to simplify the code, particularly on 16 bit machines, match
  1506.   distances are limited to MAX_DIST instead of WSIZE. }
  1507. { Values for max_lazy_match, good_match and max_chain_length, depending on
  1508.   the desired pack level (0..9). The values given below have been tuned to
  1509.   exclude worst case performance for pathological files. Better values may be
  1510.   found for specific files. }
  1511. type
  1512.   config = record
  1513.    good_length : ush; { reduce lazy search above this match length }
  1514.    max_lazy : ush;    { do not perform lazy search above this match length }
  1515.    nice_length : ush; { quit search above this match length }
  1516.    max_chain : ush;
  1517.    func : compress_func;
  1518.   end;
  1519. {local}
  1520. const
  1521.   configuration_table : array[0..10-1] of config = (
  1522. {      good lazy nice chain }
  1523. {0} (good_length:0;  max_lazy:0;   nice_length:0;   max_chain:0;    func:deflate_stored),  { store only }
  1524. {1} (good_length:4;  max_lazy:4;   nice_length:8;   max_chain:4;    func:deflate_fast), { maximum speed, no lazy matches }
  1525. {2} (good_length:4;  max_lazy:5;   nice_length:16;  max_chain:8;    func:deflate_fast),
  1526. {3} (good_length:4;  max_lazy:6;   nice_length:32;  max_chain:32;   func:deflate_fast),
  1527. {4} (good_length:4;  max_lazy:4;   nice_length:16;  max_chain:16;   func:deflate_slow),  { lazy matches }
  1528. {5} (good_length:8;  max_lazy:16;  nice_length:32;  max_chain:32;   func:deflate_slow),
  1529. {6} (good_length:8;  max_lazy:16;  nice_length:128; max_chain:128;  func:deflate_slow),
  1530. {7} (good_length:8;  max_lazy:32;  nice_length:128; max_chain:256;  func:deflate_slow),
  1531. {8} (good_length:32; max_lazy:128; nice_length:258; max_chain:1024; func:deflate_slow),
  1532. {9} (good_length:32; max_lazy:258; nice_length:258; max_chain:4096; func:deflate_slow)); { maximum compression }
  1533. { Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
  1534.   For deflate_fast() (levels <= 3) good is ignored and lazy has a different
  1535.   meaning. }
  1536. const
  1537.   EQUAL = 0;
  1538. { result of memcmp for equal strings }
  1539. { ==========================================================================
  1540.   Update a hash value with the given input byte
  1541.   IN  assertion: all calls to to UPDATE_HASH are made with consecutive
  1542.      input characters, so that a running hash key can be computed from the
  1543.      previous key instead of complete recalculation each time.
  1544. macro UPDATE_HASH(s,h,c)
  1545.    h := (( (h) shl s^.hash_shift) xor (c)) and s^.hash_mask;
  1546. }
  1547. { ===========================================================================
  1548.   Insert string str in the dictionary and set match_head to the previous head
  1549.   of the hash chain (the most recent string with same hash key). Return
  1550.   the previous length of the hash chain.
  1551.   If this file is compiled with -DFASTEST, the compression level is forced
  1552.   to 1, and no hash chains are maintained.
  1553.   IN  assertion: all calls to to INSERT_STRING are made with consecutive
  1554.      input characters and the first MIN_MATCH bytes of str are valid
  1555.      (except for the last MIN_MATCH-1 bytes of the input file). }
  1556. procedure INSERT_STRING(var s : deflate_state;
  1557.                         str : uInt;
  1558.                         var match_head : IPos);
  1559. begin
  1560. {$ifdef FASTEST}
  1561.    {UPDATE_HASH(s, s.ins_h, s.window[(str) + (MIN_MATCH-1)])}
  1562.     s.ins_h := ((s.ins_h shl s.hash_shift) xor
  1563.                  (s.window^[(str) + (MIN_MATCH-1)])) and s.hash_mask;
  1564.     match_head := s.head[s.ins_h]
  1565.     s.head[s.ins_h] := Pos(str);
  1566. {$else}
  1567.    {UPDATE_HASH(s, s.ins_h, s.window[(str) + (MIN_MATCH-1)])}
  1568.     s.ins_h := ((s.ins_h shl s.hash_shift) xor
  1569.                  (s.window^[(str) + (MIN_MATCH-1)])) and s.hash_mask;
  1570.     match_head := s.head^[s.ins_h];
  1571.     s.prev^[(str) and s.w_mask] := match_head;
  1572.     s.head^[s.ins_h] := Pos(str);
  1573. {$endif}
  1574. end;
  1575. {  =========================================================================
  1576.   Initialize the hash table (avoiding 64K overflow for 16 bit systems).
  1577.   prev[] will be initialized on the fly.
  1578. macro CLEAR_HASH(s)
  1579.     s^.head[s^.hash_size-1] := ZNIL;
  1580.     zmemzero(pBytef(s^.head), unsigned(s^.hash_size-1)*sizeof(s^.head^[0]));
  1581. }
  1582. {  ======================================================================== }
  1583. function deflateInit2_(var strm : z_stream;
  1584.                        level : int;
  1585.                        method : int;
  1586.                        windowBits : int;
  1587.                        memLevel : int;
  1588.                        strategy : int;
  1589.                        const version : string;
  1590.                        stream_size : int) : int;
  1591. var
  1592.   s : deflate_state_ptr;
  1593.   noheader : int;
  1594.   overlay : pushfArray;
  1595.   { We overlay pending_buf and d_buf+l_buf. This works since the average
  1596.     output size for (length,distance) codes is <= 24 bits. }
  1597. begin
  1598.   noheader := 0;
  1599.   if (version  =  '') or (version[1] <> ZLIB_VERSION[1]) or
  1600.      (stream_size <> sizeof(z_stream)) then
  1601.   begin
  1602.     deflateInit2_ := Z_VERSION_ERROR;
  1603.     exit;
  1604.   end;
  1605.   {
  1606.   if (strm = Z_NULL) then
  1607.   begin
  1608.     deflateInit2_ := Z_STREAM_ERROR;
  1609.     exit;
  1610.   end;
  1611.   }
  1612.   { SetLength(strm.msg, 255); }
  1613.   strm.msg := '';
  1614.   if not Assigned(strm.zalloc) then
  1615.   begin
  1616.     strm.zalloc := zcalloc;
  1617.     strm.opaque := voidpf(0);
  1618.   end;
  1619.   if not Assigned(strm.zfree) then
  1620.     strm.zfree := zcfree;
  1621.   if (level  =  Z_DEFAULT_COMPRESSION) then
  1622.     level := 6;
  1623. {$ifdef FASTEST}
  1624.     level := 1;
  1625. {$endif}
  1626.   if (windowBits < 0) then { undocumented feature: suppress zlib header }
  1627.   begin
  1628.     noheader := 1;
  1629.     windowBits := -windowBits;
  1630.   end;
  1631.   if (memLevel < 1) or (memLevel > MAX_MEM_LEVEL) or (method <> Z_DEFLATED)
  1632.     or (windowBits < 8) or (windowBits > 15) or (level < 0)
  1633.     or (level > 9) or (strategy < 0) or (strategy > Z_HUFFMAN_ONLY) then
  1634.   begin
  1635.     deflateInit2_ := Z_STREAM_ERROR;
  1636.     exit;
  1637.   end;
  1638.   s := deflate_state_ptr (ZALLOC(strm, 1, sizeof(deflate_state)));
  1639.   if (s = Z_NULL) then
  1640.   begin
  1641.     deflateInit2_ := Z_MEM_ERROR;
  1642.     exit;
  1643.   end;
  1644.   strm.state := pInternal_state(s);
  1645.   s^.strm := @strm;
  1646.   s^.noheader := noheader;
  1647.   s^.w_bits := windowBits;
  1648.   s^.w_size := 1 shl s^.w_bits;
  1649.   s^.w_mask := s^.w_size - 1;
  1650.   s^.hash_bits := memLevel + 7;
  1651.   s^.hash_size := 1 shl s^.hash_bits;
  1652.   s^.hash_mask := s^.hash_size - 1;
  1653.   s^.hash_shift :=  ((s^.hash_bits+MIN_MATCH-1) div MIN_MATCH);
  1654.   s^.window := pzByteArray (ZALLOC(strm, s^.w_size, 2*sizeof(Byte)));
  1655.   s^.prev   := pzPosfArray (ZALLOC(strm, s^.w_size, sizeof(Pos)));
  1656.   s^.head   := pzPosfArray (ZALLOC(strm, s^.hash_size, sizeof(Pos)));
  1657.   s^.lit_bufsize := 1 shl (memLevel + 6); { 16K elements by default }
  1658.   overlay := pushfArray (ZALLOC(strm, s^.lit_bufsize, sizeof(ush)+2));
  1659.   s^.pending_buf := pzByteArray (overlay);
  1660.   s^.pending_buf_size := ulg(s^.lit_bufsize) * (sizeof(ush)+Long(2));
  1661.   if (s^.window = Z_NULL) or (s^.prev = Z_NULL) or (s^.head = Z_NULL)
  1662.    or (s^.pending_buf = Z_NULL) then
  1663.   begin
  1664.     {ERR_MSG(Z_MEM_ERROR);}
  1665.     strm.msg := z_errmsg[z_errbase-Z_MEM_ERROR];
  1666.     deflateEnd (strm);
  1667.     deflateInit2_ := Z_MEM_ERROR;
  1668.     exit;
  1669.   end;
  1670.   s^.d_buf := pushfArray( @overlay^[s^.lit_bufsize div sizeof(ush)] );
  1671.   s^.l_buf := puchfArray( @s^.pending_buf^[(1+sizeof(ush))*s^.lit_bufsize] );
  1672.   s^.level := level;
  1673.   s^.strategy := strategy;
  1674.   s^.method := Byte(method);
  1675.   deflateInit2_ := deflateReset(strm);
  1676. end;
  1677. {  ========================================================================= }
  1678. function deflateInit2(var strm : z_stream;
  1679.                       level : int;
  1680.                       method : int;
  1681.                       windowBits : int;
  1682.                       memLevel : int;
  1683.                       strategy : int) : int;
  1684. { a macro }
  1685. begin
  1686.   deflateInit2 := deflateInit2_(strm, level, method, windowBits,
  1687.                    memLevel, strategy, ZLIB_VERSION, sizeof(z_stream));
  1688. end;
  1689. {  ========================================================================= }
  1690. function deflateInit_(strm : z_streamp;
  1691.                       level : int;
  1692.                       const version : string;
  1693.                       stream_size : int) : int;
  1694. begin
  1695.   if (strm = Z_NULL) then
  1696.     deflateInit_ := Z_STREAM_ERROR
  1697.   else
  1698.     deflateInit_ := deflateInit2_(strm^, level, Z_DEFLATED, MAX_WBITS,
  1699.                    DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size);
  1700.   { To do: ignore strm^.next_in if we use it as window }
  1701. end;
  1702. {  ========================================================================= }
  1703. function deflateInit(var strm : z_stream; level : int) : int;
  1704. { deflateInit is a macro to allow checking the zlib version
  1705.   and the compiler's view of z_stream: }
  1706. begin
  1707.   deflateInit := deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS,
  1708.          DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, ZLIB_VERSION, sizeof(z_stream));
  1709. end;
  1710. {  ======================================================================== }
  1711. function deflateSetDictionary (var strm : z_stream;
  1712.                                dictionary : pBytef;
  1713.                                dictLength : uInt) : int;
  1714. var
  1715.   s : deflate_state_ptr;
  1716.   length : uInt;
  1717.   n : uInt;
  1718.   hash_head : IPos;
  1719. var
  1720.   MAX_DIST : uInt;  {macro}
  1721. begin
  1722.   length := dictLength;
  1723.   hash_head := 0;
  1724.   if {(@strm  =  Z_NULL) or}
  1725.      (strm.state  =  Z_NULL) or (dictionary  =  Z_NULL)
  1726.     or (deflate_state_ptr(strm.state)^.status <> INIT_STATE) then
  1727.   begin
  1728.     deflateSetDictionary := Z_STREAM_ERROR;
  1729.     exit;
  1730.   end;
  1731.   s := deflate_state_ptr(strm.state);
  1732.   strm.adler := adler32(strm.adler, dictionary, dictLength);
  1733.   if (length < MIN_MATCH) then
  1734.   begin
  1735.     deflateSetDictionary := Z_OK;
  1736.     exit;
  1737.   end;
  1738.   MAX_DIST := (s^.w_size - MIN_LOOKAHEAD);
  1739.   if (length > MAX_DIST) then
  1740.   begin
  1741.     length := MAX_DIST;
  1742. {$ifndef USE_DICT_HEAD}
  1743.     Inc(dictionary, dictLength - length);  { use the tail of the dictionary }
  1744. {$endif}
  1745.   end;
  1746.   zmemcpy( pBytef(s^.window), dictionary, length);
  1747.   s^.strstart := length;
  1748.   s^.block_start := long(length);
  1749.   { Insert all strings in the hash table (except for the last two bytes).
  1750.     s^.lookahead stays null, so s^.ins_h will be recomputed at the next
  1751.     call of fill_window. }
  1752.   s^.ins_h := s^.window^[0];
  1753.   {UPDATE_HASH(s, s^.ins_h, s^.window[1]);}
  1754.   s^.ins_h := ((s^.ins_h shl s^.hash_shift) xor (s^.window^[1]))
  1755.               and s^.hash_mask;
  1756.   for n := 0 to length - MIN_MATCH do
  1757.   begin
  1758.     INSERT_STRING(s^, n, hash_head);
  1759.   end;
  1760.   {if (hash_head <> 0) then
  1761.     hash_head := 0;  - to make compiler happy }
  1762.   deflateSetDictionary := Z_OK;
  1763. end;
  1764. {  ======================================================================== }
  1765. function deflateReset (var strm : z_stream) : int;
  1766. var
  1767.   s : deflate_state_ptr;
  1768. begin
  1769.   if {(@strm = Z_NULL) or}
  1770.    (strm.state = Z_NULL)
  1771.    or (not Assigned(strm.zalloc)) or (not Assigned(strm.zfree)) then
  1772.   begin
  1773.     deflateReset := Z_STREAM_ERROR;
  1774.     exit;
  1775.   end;
  1776.   strm.total_out := 0;
  1777.   strm.total_in := 0;
  1778.   strm.msg := '';      { use zfree if we ever allocate msg dynamically }
  1779.   strm.data_type := Z_UNKNOWN;
  1780.   s := deflate_state_ptr(strm.state);
  1781.   s^.pending := 0;
  1782.   s^.pending_out := pBytef(s^.pending_buf);
  1783.   if (s^.noheader < 0) then
  1784.   begin
  1785.     s^.noheader := 0; { was set to -1 by deflate(..., Z_FINISH); }
  1786.   end;
  1787.   if s^.noheader <> 0 then
  1788.     s^.status := BUSY_STATE
  1789.   else
  1790.     s^.status := INIT_STATE;
  1791.   strm.adler := 1;
  1792.   s^.last_flush := Z_NO_FLUSH;
  1793.   _tr_init(s^);
  1794.   lm_init(s^);
  1795.   deflateReset := Z_OK;
  1796. end;
  1797. {  ======================================================================== }
  1798. function deflateParams(var strm : z_stream;
  1799.                        level : int;
  1800.                        strategy : int) : int;
  1801. var
  1802.   s : deflate_state_ptr;
  1803.   func : compress_func;
  1804.   err : int;
  1805. begin
  1806.   err := Z_OK;
  1807.   if {(@strm  =  Z_NULL) or} (strm.state  =  Z_NULL) then
  1808.   begin
  1809.     deflateParams := Z_STREAM_ERROR;
  1810.     exit;
  1811.   end;
  1812.   s := deflate_state_ptr(strm.state);
  1813.   if (level = Z_DEFAULT_COMPRESSION) then
  1814.   begin
  1815.     level := 6;
  1816.   end;
  1817.   if (level < 0) or (level > 9) or (strategy < 0)
  1818.   or (strategy > Z_HUFFMAN_ONLY) then
  1819.   begin
  1820.     deflateParams := Z_STREAM_ERROR;
  1821.     exit;
  1822.   end;
  1823.   func := configuration_table[s^.level].func;
  1824.   if (@func <> @configuration_table[level].func)
  1825.     and (strm.total_in <> 0) then
  1826.   begin
  1827.       { Flush the last buffer: }
  1828.       err := deflate(strm, Z_PARTIAL_FLUSH);
  1829.   end;
  1830.   if (s^.level <> level) then
  1831.   begin
  1832.     s^.level := level;
  1833.     s^.max_lazy_match   := configuration_table[level].max_lazy;
  1834.     s^.good_match       := configuration_table[level].good_length;
  1835.     s^.nice_match       := configuration_table[level].nice_length;
  1836.     s^.max_chain_length := configuration_table[level].max_chain;
  1837.   end;
  1838.   s^.strategy := strategy;
  1839.   deflateParams := err;
  1840. end;
  1841. { =========================================================================
  1842.   Put a short in the pending buffer. The 16-bit value is put in MSB order.
  1843.   IN assertion: the stream state is correct and there is enough room in
  1844.   pending_buf. }
  1845. {local}
  1846. procedure putShortMSB (var s : deflate_state; b : uInt);
  1847. begin
  1848.   s.pending_buf^[s.pending] := Byte(b shr 8);
  1849.   Inc(s.pending);
  1850.   s.pending_buf^[s.pending] := Byte(b and $ff);
  1851.   Inc(s.pending);
  1852. end;
  1853. { =========================================================================
  1854.   Flush as much pending output as possible. All deflate() output goes
  1855.   through this function so some applications may wish to modify it
  1856.   to avoid allocating a large strm^.next_out buffer and copying into it.
  1857.   (See also read_buf()). }
  1858. {local}
  1859. procedure flush_pending(var strm : z_stream);
  1860. var
  1861.   len : unsigned;
  1862.   s : deflate_state_ptr;
  1863. begin
  1864.   s := deflate_state_ptr(strm.state);
  1865.   len := s^.pending;
  1866.   if (len > strm.avail_out) then
  1867.     len := strm.avail_out;
  1868.   if (len = 0) then
  1869.     exit;
  1870.   zmemcpy(strm.next_out, s^.pending_out, len);
  1871.   Inc(strm.next_out, len);
  1872.   Inc(s^.pending_out, len);
  1873.   Inc(strm.total_out, len);
  1874.   Dec(strm.avail_out, len);
  1875.   Dec(s^.pending, len);
  1876.   if (s^.pending = 0) then
  1877.   begin
  1878.     s^.pending_out := pBytef(s^.pending_buf);
  1879.   end;
  1880. end;
  1881. { ========================================================================= }
  1882. function deflate (var strm : z_stream; flush : int) : int;
  1883. var
  1884.   old_flush : int; { value of flush param for previous deflate call }
  1885.   s : deflate_state_ptr;
  1886. var
  1887.   header : uInt;
  1888.   level_flags : uInt;
  1889. var
  1890.   bstate : block_state;
  1891. begin
  1892.   if {(@strm = Z_NULL) or} (strm.state = Z_NULL)
  1893.     or (flush > Z_FINISH) or (flush < 0) then
  1894.   begin
  1895.     deflate := Z_STREAM_ERROR;
  1896.     exit;
  1897.   end;
  1898.   s := deflate_state_ptr(strm.state);
  1899.   if (strm.next_out = Z_NULL) or
  1900.      ((strm.next_in = Z_NULL) and (strm.avail_in <> 0)) or
  1901.      ((s^.status = FINISH_STATE) and (flush <> Z_FINISH)) then
  1902.   begin
  1903.     {ERR_RETURN(strm^, Z_STREAM_ERROR);}
  1904.     strm.msg := z_errmsg[z_errbase - Z_STREAM_ERROR];
  1905.     deflate := Z_STREAM_ERROR;
  1906.     exit;
  1907.   end;
  1908.   if (strm.avail_out = 0) then
  1909.   begin
  1910.     {ERR_RETURN(strm^, Z_BUF_ERROR);}
  1911.     strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
  1912.     deflate := Z_BUF_ERROR;
  1913.     exit;
  1914.   end;
  1915.   s^.strm := @strm; { just in case }
  1916.   old_flush := s^.last_flush;
  1917.   s^.last_flush := flush;
  1918.   { Write the zlib header }
  1919.   if (s^.status = INIT_STATE) then
  1920.   begin
  1921.     header := (Z_DEFLATED + ((s^.w_bits-8) shl 4)) shl 8;
  1922.     level_flags := (s^.level-1) shr 1;
  1923.     if (level_flags > 3) then
  1924.       level_flags := 3;
  1925.     header := header or (level_flags shl 6);
  1926.     if (s^.strstart <> 0) then
  1927.       header := header or PRESET_DICT;
  1928.     Inc(header, 31 - (header mod 31));
  1929.     s^.status := BUSY_STATE;
  1930.     putShortMSB(s^, header);
  1931.     { Save the adler32 of the preset dictionary: }
  1932.     if (s^.strstart <> 0) then
  1933.     begin
  1934.       putShortMSB(s^, uInt(strm.adler shr 16));
  1935.       putShortMSB(s^, uInt(strm.adler and $ffff));
  1936.     end;
  1937.     strm.adler := long(1);
  1938.   end;
  1939.   { Flush as much pending output as possible }
  1940.   if (s^.pending <> 0) then
  1941.   begin
  1942.     flush_pending(strm);
  1943.     if (strm.avail_out = 0) then
  1944.     begin
  1945.       { Since avail_out is 0, deflate will be called again with
  1946. more output space, but possibly with both pending and
  1947. avail_in equal to zero. There won't be anything to do,
  1948. but this is not an error situation so make sure we
  1949. return OK instead of BUF_ERROR at next call of deflate: }
  1950.       s^.last_flush := -1;
  1951.       deflate := Z_OK;
  1952.       exit;
  1953.     end;
  1954.   { Make sure there is something to do and avoid duplicate consecutive
  1955.     flushes. For repeated and useless calls with Z_FINISH, we keep
  1956.     returning Z_STREAM_END instead of Z_BUFF_ERROR. }
  1957.   end
  1958.   else
  1959.     if (strm.avail_in = 0) and (flush <= old_flush)
  1960.       and (flush <> Z_FINISH) then
  1961.     begin
  1962.       {ERR_RETURN(strm^, Z_BUF_ERROR);}
  1963.       strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
  1964.       deflate := Z_BUF_ERROR;
  1965.       exit;
  1966.     end;
  1967.   { User must not provide more input after the first FINISH: }
  1968.   if (s^.status = FINISH_STATE) and (strm.avail_in <> 0) then
  1969.   begin
  1970.     {ERR_RETURN(strm^, Z_BUF_ERROR);}
  1971.     strm.msg := z_errmsg[z_errbase - Z_BUF_ERROR];
  1972.     deflate := Z_BUF_ERROR;
  1973.     exit;
  1974.   end;
  1975.   { Start a new block or continue the current one. }
  1976.   if (strm.avail_in <> 0) or (s^.lookahead <> 0)
  1977.     or ((flush <> Z_NO_FLUSH) and (s^.status <> FINISH_STATE)) then
  1978.   begin
  1979.     bstate := configuration_table[s^.level].func(s^, flush);
  1980.     if (bstate = finish_started) or (bstate = finish_done) then
  1981.       s^.status := FINISH_STATE;
  1982.     if (bstate = need_more) or (bstate = finish_started) then
  1983.     begin
  1984.       if (strm.avail_out = 0) then
  1985.         s^.last_flush := -1; { avoid BUF_ERROR next call, see above }
  1986.       deflate := Z_OK;
  1987.       exit;
  1988.       { If flush != Z_NO_FLUSH && avail_out == 0, the next call
  1989. of deflate should use the same flush parameter to make sure
  1990. that the flush is complete. So we don't have to output an
  1991. empty block here, this will be done at next call. This also
  1992. ensures that for a very small output buffer, we emit at most
  1993.  one empty block. }
  1994.     end;
  1995.     if (bstate = block_done) then
  1996.     begin
  1997.       if (flush = Z_PARTIAL_FLUSH) then
  1998.         _tr_align(s^)
  1999.       else
  2000.       begin  { FULL_FLUSH or SYNC_FLUSH }
  2001.         _tr_stored_block(s^, pcharf(NIL), Long(0), FALSE);
  2002.         { For a full flush, this empty block will be recognized
  2003.           as a special marker by inflate_sync(). }
  2004.         if (flush = Z_FULL_FLUSH) then
  2005.         begin
  2006.           {macro CLEAR_HASH(s);}             { forget history }
  2007.           s^.head^[s^.hash_size-1] := ZNIL;
  2008.           zmemzero(pBytef(s^.head), unsigned(s^.hash_size-1)*sizeof(s^.head^[0]));
  2009.         end;
  2010.       end;
  2011.       flush_pending(strm);
  2012.       if (strm.avail_out = 0) then
  2013.       begin
  2014.         s^.last_flush := -1; { avoid BUF_ERROR at next call, see above }
  2015. deflate := Z_OK;
  2016.         exit;
  2017.       end;
  2018.     end;
  2019.   end;
  2020.   {$IFDEF DEBUG}
  2021.   Assert(strm.avail_out > 0, 'bug2');
  2022.   {$ENDIF}
  2023.   if (flush <> Z_FINISH) then
  2024.   begin
  2025.     deflate := Z_OK;
  2026.     exit;
  2027.   end;
  2028.   if (s^.noheader <> 0) then
  2029.   begin
  2030.     deflate := Z_STREAM_END;
  2031.     exit;
  2032.   end;
  2033.   { Write the zlib trailer (adler32) }
  2034.   putShortMSB(s^, uInt(strm.adler shr 16));
  2035.   putShortMSB(s^, uInt(strm.adler and $ffff));
  2036.   flush_pending(strm);
  2037.   { If avail_out is zero, the application will call deflate again
  2038.     to flush the rest. }
  2039.   s^.noheader := -1; { write the trailer only once! }
  2040.   if s^.pending <> 0 then
  2041.     deflate := Z_OK
  2042.   else
  2043.     deflate := Z_STREAM_END;
  2044. end;
  2045. { ========================================================================= }
  2046. function deflateEnd (var strm : z_stream) : int;
  2047. var
  2048.   status : int;
  2049.   s : deflate_state_ptr;
  2050. begin
  2051.   if {(@strm = Z_NULL) or} (strm.state = Z_NULL) then
  2052.   begin
  2053.     deflateEnd := Z_STREAM_ERROR;
  2054.     exit;
  2055.   end;
  2056.   s := deflate_state_ptr(strm.state);
  2057.   status := s^.status;
  2058.   if (status <> INIT_STATE) and (status <> BUSY_STATE) and
  2059.      (status <> FINISH_STATE) then
  2060.   begin
  2061.     deflateEnd := Z_STREAM_ERROR;
  2062.     exit;
  2063.   end;
  2064.   { Deallocate in reverse order of allocations: }
  2065.   TRY_FREE(strm, s^.pending_buf);
  2066.   TRY_FREE(strm, s^.head);
  2067.   TRY_FREE(strm, s^.prev);
  2068.   TRY_FREE(strm, s^.window);
  2069.   ZFREE(strm, s);
  2070.   strm.state := Z_NULL;
  2071.   if status = BUSY_STATE then
  2072.     deflateEnd := Z_DATA_ERROR
  2073.   else
  2074.     deflateEnd := Z_OK;
  2075. end;
  2076. { =========================================================================
  2077.   Copy the source state to the destination state.
  2078.   To simplify the source, this is not supported for 16-bit MSDOS (which
  2079.   doesn't have enough memory anyway to duplicate compression states). }
  2080. { ========================================================================= }
  2081. function deflateCopy (dest, source : z_streamp) : int;
  2082. {$ifndef MAXSEG_64K}
  2083. var
  2084.   ds : deflate_state_ptr;
  2085.   ss : deflate_state_ptr;
  2086.   overlay : pushfArray;
  2087. {$endif}
  2088. begin
  2089. {$ifdef MAXSEG_64K}
  2090.   deflateCopy := Z_STREAM_ERROR;
  2091.   exit;
  2092. {$else}
  2093.   if (source = Z_NULL) or (dest = Z_NULL) or (source^.state = Z_NULL) then
  2094.   begin
  2095.     deflateCopy := Z_STREAM_ERROR;
  2096.     exit;
  2097.   end;
  2098.   ss := deflate_state_ptr(source^.state);
  2099.   dest^ := source^;
  2100.   ds := deflate_state_ptr( ZALLOC(dest^, 1, sizeof(deflate_state)) );
  2101.   if (ds = Z_NULL) then
  2102.   begin
  2103.     deflateCopy := Z_MEM_ERROR;
  2104.     exit;
  2105.   end;
  2106.   dest^.state := pInternal_state(ds);
  2107.   ds^ := ss^;
  2108.   ds^.strm := dest;
  2109.   ds^.window := pzByteArray ( ZALLOC(dest^, ds^.w_size, 2*sizeof(Byte)) );
  2110.   ds^.prev   := pzPosfArray ( ZALLOC(dest^, ds^.w_size, sizeof(Pos)) );
  2111.   ds^.head   := pzPosfArray ( ZALLOC(dest^, ds^.hash_size, sizeof(Pos)) );
  2112.   overlay := pushfArray ( ZALLOC(dest^, ds^.lit_bufsize, sizeof(ush)+2) );
  2113.   ds^.pending_buf := pzByteArray ( overlay );
  2114.   if (ds^.window = Z_NULL) or (ds^.prev = Z_NULL) or (ds^.head = Z_NULL)
  2115.      or (ds^.pending_buf = Z_NULL) then
  2116.   begin
  2117.     deflateEnd (dest^);
  2118.     deflateCopy := Z_MEM_ERROR;
  2119.     exit;
  2120.   end;
  2121.   { following zmemcpy do not work for 16-bit MSDOS }
  2122.   zmemcpy(pBytef(ds^.window), pBytef(ss^.window), ds^.w_size * 2 * sizeof(Byte));
  2123.   zmemcpy(pBytef(ds^.prev), pBytef(ss^.prev), ds^.w_size * sizeof(Pos));
  2124.   zmemcpy(pBytef(ds^.head), pBytef(ss^.head), ds^.hash_size * sizeof(Pos));
  2125.   zmemcpy(pBytef(ds^.pending_buf), pBytef(ss^.pending_buf), uInt(ds^.pending_buf_size));
  2126.   ds^.pending_out := @ds^.pending_buf^[ptr2int(ss^.pending_out) - ptr2int(ss^.pending_buf)];
  2127.   ds^.d_buf := pushfArray (@overlay^[ds^.lit_bufsize div sizeof(ush)] );
  2128.   ds^.l_buf := puchfArray (@ds^.pending_buf^[(1+sizeof(ush))*ds^.lit_bufsize]);
  2129.   ds^.l_desc.dyn_tree := tree_ptr(@ds^.dyn_ltree);
  2130.   ds^.d_desc.dyn_tree := tree_ptr(@ds^.dyn_dtree);
  2131.   ds^.bl_desc.dyn_tree := tree_ptr(@ds^.bl_tree);
  2132.   deflateCopy := Z_OK;
  2133. {$endif}
  2134. end;
  2135. { ===========================================================================
  2136.   Read a new buffer from the current input stream, update the adler32
  2137.   and total number of bytes read.  All deflate() input goes through
  2138.   this function so some applications may wish to modify it to avoid
  2139.   allocating a large strm^.next_in buffer and copying from it.
  2140.   (See also flush_pending()). }
  2141. {local}
  2142. function read_buf(strm : z_streamp; buf : pBytef; size : unsigned) : int;
  2143. var
  2144.   len : unsigned;
  2145. begin
  2146.   len := strm^.avail_in;
  2147.   if (len > size) then
  2148.     len := size;
  2149.   if (len = 0) then
  2150.   begin
  2151.     read_buf := 0;
  2152.     exit;
  2153.   end;
  2154.   Dec(strm^.avail_in, len);
  2155.   if deflate_state_ptr(strm^.state)^.noheader = 0 then
  2156.   begin
  2157.     strm^.adler := adler32(strm^.adler, strm^.next_in, len);
  2158.   end;
  2159.   zmemcpy(buf, strm^.next_in, len);
  2160.   Inc(strm^.next_in, len);
  2161.   Inc(strm^.total_in, len);
  2162.   read_buf := int(len);
  2163. end;
  2164. { ===========================================================================
  2165.   Initialize the "longest match" routines for a new zlib stream }
  2166. {local}
  2167. procedure lm_init (var s : deflate_state);
  2168. begin
  2169. {$WARNINGS OFF}
  2170.   s.window_size := ulg(uLong(2)*s.w_size);
  2171. {$WARNINGS ON}
  2172.   {macro CLEAR_HASH(s);}
  2173.   s.head^[s.hash_size-1] := ZNIL;
  2174.   zmemzero(pBytef(s.head), unsigned(s.hash_size-1)*sizeof(s.head^[0]));
  2175.   { Set the default configuration parameters: }
  2176.   s.max_lazy_match   := configuration_table[s.level].max_lazy;
  2177.   s.good_match       := configuration_table[s.level].good_length;
  2178.   s.nice_match       := configuration_table[s.level].nice_length;
  2179.   s.max_chain_length := configuration_table[s.level].max_chain;
  2180.   s.strstart := 0;
  2181.   s.block_start := long(0);
  2182.   s.lookahead := 0;
  2183.   s.prev_length := MIN_MATCH-1;
  2184.   s.match_length := MIN_MATCH-1;
  2185.   s.match_available := FALSE;
  2186.   s.ins_h := 0;
  2187. {$ifdef ASMV}
  2188.   match_init; { initialize the asm code }
  2189. {$endif}
  2190. end;
  2191. { ===========================================================================
  2192.   Set match_start to the longest match starting at the given string and
  2193.   return its length. Matches shorter or equal to prev_length are discarded,
  2194.   in which case the result is equal to prev_length and match_start is
  2195.   garbage.
  2196.   IN assertions: cur_match is the head of the hash chain for the current
  2197.     string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  2198.   OUT assertion: the match length is not greater than s^.lookahead. }
  2199. {$ifndef ASMV}
  2200. { For 80x86 and 680x0, an optimized version will be provided in match.asm or
  2201.   match.S. The code will be functionally equivalent. }
  2202. {$ifndef FASTEST}
  2203. {local}
  2204. function longest_match(var s : deflate_state;
  2205.                        cur_match : IPos  { current match }
  2206.                        ) : uInt;
  2207. label
  2208.   nextstep;
  2209. var
  2210.   chain_length : unsigned;    { max hash chain length }
  2211.   {register} scan : pBytef;   { current string }
  2212.   {register} match : pBytef;  { matched string }
  2213.   {register} len : int;       { length of current match }
  2214.   best_len : int;             { best match length so far }
  2215.   nice_match : int;           { stop if match long enough }
  2216.   limit : IPos;
  2217.   prev : pzPosfArray;
  2218.   wmask : uInt;
  2219. {$ifdef UNALIGNED_OK}
  2220.   {register} strend : pBytef;
  2221.   {register} scan_start : ush;
  2222.   {register} scan_end : ush;
  2223. {$else}
  2224.   {register} strend : pBytef;
  2225.   {register} scan_end1 : Byte;
  2226.   {register} scan_end : Byte;
  2227. {$endif}
  2228. var
  2229.   MAX_DIST : uInt;
  2230. begin
  2231.   chain_length := s.max_chain_length; { max hash chain length }
  2232.   scan := @(s.window^[s.strstart]);
  2233.   best_len := s.prev_length;              { best match length so far }
  2234.   nice_match := s.nice_match;             { stop if match long enough }
  2235.   MAX_DIST := s.w_size - MIN_LOOKAHEAD;
  2236. {In order to simplify the code, particularly on 16 bit machines, match
  2237. distances are limited to MAX_DIST instead of WSIZE. }
  2238.   if s.strstart > IPos(MAX_DIST) then
  2239.     limit := s.strstart - IPos(MAX_DIST)
  2240.   else
  2241.     limit := ZNIL;
  2242.   { Stop when cur_match becomes <= limit. To simplify the code,
  2243.     we prevent matches with the string of window index 0. }
  2244.   prev := s.prev;
  2245.   wmask := s.w_mask;
  2246. {$ifdef UNALIGNED_OK}
  2247.   { Compare two bytes at a time. Note: this is not always beneficial.
  2248.     Try with and without -DUNALIGNED_OK to check. }
  2249.   strend := pBytef(@(s.window^[s.strstart + MAX_MATCH - 1]));
  2250.   scan_start := pushf(scan)^;
  2251.   scan_end   := pushfArray(scan)^[best_len-1];   { fix }
  2252. {$else}
  2253.   strend := pBytef(@(s.window^[s.strstart + MAX_MATCH]));
  2254.   {$IFOPT R+} {$R-} {$DEFINE NoRangeCheck} {$ENDIF}
  2255.   scan_end1  := pzByteArray(scan)^[best_len-1];
  2256.   {$IFDEF NoRangeCheck} {$R+} {$UNDEF NoRangeCheck} {$ENDIF}
  2257.   scan_end   := pzByteArray(scan)^[best_len];
  2258. {$endif}
  2259.     { The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
  2260.       It is easy to get rid of this optimization if necessary. }
  2261.     {$IFDEF DEBUG}
  2262.     Assert((s.hash_bits >= 8) and (MAX_MATCH = 258), 'Code too clever');
  2263.     {$ENDIF}
  2264.     { Do not waste too much time if we already have a good match: }
  2265.     if (s.prev_length >= s.good_match) then
  2266.     begin
  2267.       chain_length := chain_length shr 2;
  2268.     end;
  2269.     { Do not look for matches beyond the end of the input. This is necessary
  2270.       to make deflate deterministic. }
  2271.     if (uInt(nice_match) > s.lookahead) then
  2272.       nice_match := s.lookahead;
  2273.     {$IFDEF DEBUG}
  2274.     Assert(ulg(s.strstart) <= s.window_size-MIN_LOOKAHEAD, 'need lookahead');
  2275.     {$ENDIF}
  2276.     repeat
  2277.         {$IFDEF DEBUG}
  2278.         Assert(cur_match < s.strstart, 'no future');
  2279.         {$ENDIF}
  2280.         match := @(s.window^[cur_match]);
  2281.         { Skip to next match if the match length cannot increase
  2282.           or if the match length is less than 2: }
  2283. {$undef DO_UNALIGNED_OK}
  2284. {$ifdef UNALIGNED_OK}
  2285.   {$ifdef MAX_MATCH_IS_258}
  2286.     {$define DO_UNALIGNED_OK}
  2287.   {$endif}
  2288. {$endif}
  2289. {$ifdef DO_UNALIGNED_OK}
  2290.         { This code assumes sizeof(unsigned short) = 2. Do not use
  2291.           UNALIGNED_OK if your compiler uses a different size. }
  2292.   {$IFOPT R+} {$R-} {$DEFINE NoRangeCheck} {$ENDIF}
  2293.         if (pushfArray(match)^[best_len-1] <> scan_end) or
  2294.            (pushf(match)^ <> scan_start) then
  2295.           goto nextstep; {continue;}
  2296.   {$IFDEF NoRangeCheck} {$R+} {$UNDEF NoRangeCheck} {$ENDIF}
  2297.         { It is not necessary to compare scan[2] and match[2] since they are
  2298.           always equal when the other bytes match, given that the hash keys
  2299.           are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
  2300.           strstart+3, +5, ... up to strstart+257. We check for insufficient
  2301.           lookahead only every 4th comparison; the 128th check will be made
  2302.           at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
  2303.           necessary to put more guard bytes at the end of the window, or
  2304.           to check more often for insufficient lookahead. }
  2305.         {$IFDEF DEBUG}
  2306.         Assert(pzByteArray(scan)^[2] = pzByteArray(match)^[2], 'scan[2]?');
  2307.         {$ENDIF}
  2308.         Inc(scan);
  2309.         Inc(match);
  2310.         repeat
  2311.           Inc(scan,2); Inc(match,2); if (pushf(scan)^<>pushf(match)^) then break;
  2312.           Inc(scan,2); Inc(match,2); if (pushf(scan)^<>pushf(match)^) then break;
  2313.           Inc(scan,2); Inc(match,2); if (pushf(scan)^<>pushf(match)^) then break;
  2314.           Inc(scan,2); Inc(match,2); if (pushf(scan)^<>pushf(match)^) then break;
  2315.         until (ptr2int(scan) >= ptr2int(strend));
  2316.         { The funny "do while" generates better code on most compilers }
  2317.         { Here, scan <= window+strstart+257 }
  2318.         {$IFDEF DEBUG}
  2319.         Assert(ptr2int(scan) <=
  2320.                ptr2int(@(s.window^[unsigned(s.window_size-1)])),
  2321.                'wild scan');
  2322.         {$ENDIF}
  2323.         if (scan^ = match^) then
  2324.           Inc(scan);
  2325.         len := (MAX_MATCH - 1) - int(ptr2int(strend)-ptr2int(scan));
  2326.         scan := strend;
  2327.         Dec(scan, (MAX_MATCH-1));
  2328. {$else} { UNALIGNED_OK }
  2329.   {$IFOPT R+} {$R-} {$DEFINE NoRangeCheck} {$ENDIF}
  2330.         if (pzByteArray(match)^[best_len]   <> scan_end) or
  2331.            (pzByteArray(match)^[best_len-1] <> scan_end1) or
  2332.            (match^ <> scan^) then
  2333.           goto nextstep; {continue;}
  2334.   {$IFDEF NoRangeCheck} {$R+} {$UNDEF NoRangeCheck} {$ENDIF}
  2335.         Inc(match);
  2336.         if (match^ <> pzByteArray(scan)^[1]) then
  2337.           goto nextstep; {continue;}
  2338.         { The check at best_len-1 can be removed because it will be made
  2339.           again later. (This heuristic is not always a win.)
  2340.           It is not necessary to compare scan[2] and match[2] since they
  2341.           are always equal when the other bytes match, given that
  2342.           the hash keys are equal and that HASH_BITS >= 8. }
  2343.         Inc(scan, 2);
  2344.         Inc(match);
  2345.         {$IFDEF DEBUG}
  2346.         Assert( scan^ = match^, 'match[2]?');
  2347.         {$ENDIF}
  2348.         { We check for insufficient lookahead only every 8th comparison;
  2349.           the 256th check will be made at strstart+258. }
  2350.         repeat
  2351.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2352.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2353.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2354.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2355.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2356.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2357.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2358.           Inc(scan); Inc(match); if (scan^ <> match^) then break;
  2359.         until (ptr2int(scan) >= ptr2int(strend));
  2360.         {$IFDEF DEBUG}
  2361.         Assert(ptr2int(scan) <=
  2362.                ptr2int(@(s.window^[unsigned(s.window_size-1)])),
  2363.                'wild scan');
  2364.         {$ENDIF}
  2365.         len := MAX_MATCH - int(ptr2int(strend) - ptr2int(scan));
  2366.         scan := strend;
  2367.         Dec(scan, MAX_MATCH);
  2368. {$endif} { UNALIGNED_OK }
  2369.         if (len > best_len) then
  2370.         begin